如何'强迫'Magento加载不同的布局

Tob*_*ing 3 layout magento

背景:我需要能够在灯箱中加载追加销售/交叉销售产品,并提供添加到购物车的功能.

我实现这一目标的想法是"迫使"Magento以不同的布局加载产品.我想在controller_action_layout_generate_xml_before事件上使用观察者(下面的代码).

不幸的是,我所拥有的不起作用.任何指针(或完全不同/更好的想法)都非常感谢.

<?php 
class My_ForceLayout_Model_Observer
{
    public function changeLayoutEvent($observer)
    {
        $action = $observer->getEvent()->getAction();
        $layout = $observer->getEvent()->getLayout();

        if($action->getRequest()->getControllerName() == 'product'
            && $action->getRequest()->getActionName() == 'view') 
        {

            $update = $layout->getUpdate();
            $update->load('popup'); // for testing only
            $layout->generateXml();
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

Tob*_*ing 7

我设法让这个工作完全按照我的预期.感谢@Jonathan Day让我意识到它不工作的原因是微不足道的.

config.xml文件:

<config>
    ....
<frontend>
    <events>
        <controller_action_layout_generate_blocks_before>
            <observers>
                <forcelayout>
                    <type>singleton</type>
                    <class>forcelayout/observer</class>
                    <method>changeLayoutEvent</method>
                </forcelayout>
            </observers>
        </controller_action_layout_generate_blocks_before>
    </events>
</frontend>
    ....
</config>
Run Code Online (Sandbox Code Playgroud)

Observer.php:

class Unleaded_ForceLayout_Model_Observer
{
    public function changeLayoutEvent($observer)
    {
        $action = $observer->getEvent()->getAction();
        $layout = $observer->getEvent()->getLayout();

        if($action->getRequest()->getControllerName() == 'product'
          && $action->getRequest()->getActionName() == 'view')
        {
            $template = $action->getRequest()->template;
            if (isset($template) && $template != '')
            {
                $update = $layout->getUpdate();
                $update->load($template);
                $layout->generateXml();
            }
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

local.xml中:

<popup translate="label">
    <label>Catalog Product View Lightbox</label>
    <remove name="right"/>
    <remove name="left"/>
    <reference name="root">
        <action method="setTemplate">
            <template>page/popup.phtml</template>
        </action>
    </reference>
    <reference name="content">
        <remove name="product.info.upsell"/>
    </reference>
</popup>
Run Code Online (Sandbox Code Playgroud)

.phtml文件中的产品网址:

echo $this->getProductUrl($_item) . '?template=popup';
Run Code Online (Sandbox Code Playgroud)