Magento在小部件中使用自己的句柄不起作用

Rol*_*oós 4 widget magento

我发现我可以使用此脚本添加自己的布局句柄:

$this->getLayout()->getUpdate()->addHandle('myhandle');
Run Code Online (Sandbox Code Playgroud)

然后我检查了Alan Storm Layout的观众:http://alanstorm.com/2005/projects/MagentoLayoutViewer.tar.gz

?showLayout =把手

处理此请求

  1. 默认
  2. cms_page
  3. STORE_default
  4. THEME_frontend_default_default
  5. cms_index_index
  6. page_two_columns_left
  7. customer_logged_out
  8. 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中写入句柄代码,但页面不使用它.

Ala*_*orm 7

这方面的长期和短期是你真的不想以这种方式注入布局句柄.它变得相当复杂(复杂到足以让我无法一直快速地关注它以获得Stack Overflow答案),但是

  1. 如果在从控制器调用$ this-> loadLayout()之前添加句柄,那就太快了.

  2. 如果在调用$ 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)