我发现我可以使用此脚本添加自己的布局句柄:
$this->getLayout()->getUpdate()->addHandle('myhandle');
Run Code Online (Sandbox Code Playgroud)
然后我检查了Alan Storm Layout的观众:http://alanstorm.com/2005/projects/MagentoLayoutViewer.tar.gz
?showLayout =把手
处理此请求
- 默认
- cms_page
- STORE_default
- THEME_frontend_default_default
- cms_index_index
- page_two_columns_left
- customer_logged_out
- myhandle
有我的句柄,但我的自定义布局xml没有使用.
这是我的xml:
<?xml version="1.0"?>
<layout version="0.1.0">
<myhandle>
<reference name="head">
<action method="addJs"><script>test/your.js</script></action>
</reference>
</myhandle>
</layout>
Run Code Online (Sandbox Code Playgroud)
这工作正常,因此加载了xml文件:
<?xml version="1.0"?>
<layout version="0.1.0">
<default>
<reference name="head">
<action method="addJs"><script>test/your.js</script></action>
</reference>
</default>
</layout>
Run Code Online (Sandbox Code Playgroud)
怎么了?为什么不能使用这个解决方案?
如果它不是正确的方法,我如何为小部件使用的页面添加自定义css和javascript?
更新:这可能是接近解决方案的东西:
如果我在向页面添加新句柄后添加此代码:
$this->getLayout()->getUpdate()->fetchPackageLayoutUpdates('myhandle');
$this->getLayout()->generateXml();
Run Code Online (Sandbox Code Playgroud)
在此之后,"index.php?showLayout = page"调用在xml中写入句柄代码,但页面不使用它.
这方面的长期和短期是你真的不想以这种方式注入布局句柄.它变得相当复杂(复杂到足以让我无法一直快速地关注它以获得Stack Overflow答案),但是
如果在从控制器调用$ this-> loadLayout()之前添加句柄,那就太快了.
如果在调用$ this-> loadLayout()后添加句柄,则为时已晚.
这是一个实验,尝试修改基本Action Controller中的loadLayout方法
File: app/code/core/Mage/Core/Controller/Varien/Action.php
public function loadLayout($handles=null, $generateBlocks=true, $generateXml=true)
{
// if handles were specified in arguments load them first
if (false!==$handles && ''!==$handles) {
$this->getLayout()->getUpdate()->addHandle($handles ? $handles : 'default');
}
//YOUR NEW CALL HERE
$this->getLayout()->getUpdate()->addHandle('myhandle');
...
Run Code Online (Sandbox Code Playgroud)
这应该适用并应用您的布局.现在,在生产中执行此操作将是一个坏主意,我只提到它,以显示需要在非常特定的时间布局渲染过程中添加句柄.作为一个终端程序员,插入布局句柄并不是你真正的工作.
布局系统旨在成为设计者和原始PHP系统代码之间的层.既然你显然能够编写PHP代码,我会考虑直接将你的javascript注入head block pre-render.
//from a controller, but could be modified to be used elsewhere
//also pseudo code
$this->getLayout()->getBlock('header')->append(
$this->getLayout()
->createBlock('core/text', 'some-unique-name')
->setText('<script type="text/javascript" src="/foo/baz/bar.js"></script>')
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3033 次 |
| 最近记录: |