【问题标题】:How to modify Page Layout with Layout Handles如何使用布局句柄修改页面布局
【发布时间】:2014-10-30 12:03:47
【问题描述】:

我正在创建自定义页面布局。我已将必要的 XML 添加到模块的 config.xml 文件中,创建了模板,并且可以在管理面板中选择模板。

我似乎无法使用布局句柄修改页面布局。通过修改,我的意思是在头部添加 JS,添加一个 body 类等。在我的 config.xml 中,我有以下内容:

<config>
    <frontend>
        ....
        <layout>
            <updates>
                <mymodule_layout>
                   <file>mymodule.xml</file>
                </mymodule_layout>
            </updates>
        </layout>
    </frontend>
    ...
    <global>
        <page>
            <layouts>
                <mymodlue_pagelayout module="page" translate="label">
                    <label>My Module - A Custom Layout</label>
                    <template>page/customlayouttest.phtml</template>
                    <layout_handle>mymodlue_pagelayout</layout_handle>
                </mymodlue_pagelayout>
            </layouts>
        </page>
    ....
    </global>
</config>

然后在 mymodule.xml 中,我有以下 XML。它都不起作用。当我访问应用了我的页面布局的类别时,以下更改绝对不会生效。我错过了什么?

<mymodlue_pagelayout translate="label">
    <label>My Module - A Custom Layout</label>
    <reference name="root">
        <action method="setTemplate"><template>page/customlayouttest.phtml</template></action>
        <!-- Mark root page block that template is applied -->
        <action method="setIsHandle"><applied>1</applied></action>
        <action method="addBodyClass"><className>grid-4</className></action>
        <action method="addBodyClass"><className>stl-category</className></action> 
    </reference>

    <reference name="product_list">
        <action method="setTemplate"><template>catalog/product/list-alternate.phtml</template></action>
        <action method="setData"><name>list_golfers</name><value>true</value></action>
    </reference>

    <reference name="product_list_toolbar">
        <action method="setDefaultGridPerPage"><limit>15</limit></action>
        <action method="addPagerLimit"><mode>grid</mode><limit>15</limit></action>
        <action method="addPagerLimit"><mode>grid</mode><limit>all</limit></action>
    </reference>

    <reference name="head">
        <action method="addJs"><script>jquery/jquery-1.7.1-min.js</script></action>
        <action method="addJs"><script>varien/product.js</script></action>
        <action method="addJs"><script>varien/configurable.js</script></action>
        <action method="addJs"><script>amasty/amconf/configurable.js</script></action>
        <action method="addJs"><script>jquery/magiczoom.js</script></action>
        <action method="addJs"><script>prototype/window.js</script></action>
        <action method="addJs"><script>jquery/jquery-magnificPopup.0.9.9.js</script></action>
    </reference>
</mymodlue_pagelayout>

【问题讨论】:

  • 可能是错字? mymodlue_pagelayout

标签: xml magento layout page-layout


【解决方案1】:

这个问题的简短回答是 Magento 根本不使用类别页面上的布局句柄中的信息,它实际上被忽略了。 Alan Storm 在类似的 SO 问题中为我们提供了解释:https://stackoverflow.com/a/20257191/2124039

虽然我们现在知道为什么布局句柄不起作用,但我们仍然需要一个解决方案 - 我们如何使用布局句柄修改页面布局?我发现最简单的解决方案是创建一个观察者来监听事件controller_action_layout_load_before,确定正在查看的页面是否是类别页面,然后将布局句柄添加到我们正在使用的布局页面的布局对象中(如果有的话) )。

作为一个独立的模块构建,它会是这样的:

config.xml

<config>
    <modules>
        <Callmetwan_CategoryLayoutHandler>
            <version>1.0.0.0</version>
        </Callmetwan_CategoryLayoutHandler>
    </modules>
    <frontend>
        <events>
            <controller_action_layout_load_before>
                <observers>
                    <pm_shopthelook_model_observer>
                        <class>Callmetwan_CategoryLayoutHandler_Model_Observer</class>
                        <method>addCustomHandles</method>
                    </pm_shopthelook_model_observer>
                </observers>
            </controller_action_layout_load_before>
        </events>
    </frontend>
</config>

observer.php:

class Callmetwan_CategoryLayoutHandler_Model_Observer extends Varien_Object
{
    public function addCustomHandles($observer) {

        $pageConfig         = (object) Mage::getModel('page/config');
        $allLayoutHandles   = (array) $pageConfig->getPageLayoutHandles();


        // Determine if we are in a category
        $category = Mage::registry('current_category');
        $product = Mage::registry('current_product');

        if ($category && !$product)
        {

            // Get all design settings applied to current category
            $design = (object) Mage::getSingleton('catalog/design')->getDesignSettings($category);

            // Get current page layout current category is using
            $pageLayout = (string) $design->getPageLayout();


            foreach ($allLayoutHandles as $layout => $handle)
            {
                // Cycle through each layout to find current layout, then add current page's layout handle to the layout object
                if ($pageLayout === $layout)
                {
                    $update = (object) Mage::getSingleton('core/layout')->getUpdate();
                    $update->addHandle($handle);
                    break;
                }
            }
        }
    }
}

回顾一下,您最终会得到两个独立的模块。您的布局页面将是一个模块的一部分(使用问题中的示例,它将是 Mymodule),它将定义一个自定义 mymyodule.xml 布局文件,其中包含布局页面的所有更新。然后上面的代码(Callmetwan_CategoryLayoutHandler)将负责将布局处理程序添加到布局对象。

【讨论】:

    猜你喜欢
    • 2013-12-13
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    相关资源
    最近更新 更多