首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用布局句柄修改页面布局

如何使用布局句柄修改页面布局
EN

Stack Overflow用户
提问于 2014-09-05 13:51:50
回答 1查看 1K关注 0票数 0

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

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

代码语言:javascript
复制
<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。都不管用。当我访问我的页面布局应用的类别时,下面的任何更改都不会生效。我遗漏了什么?

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-08 17:07:05

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

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

它是作为独立模块构建的,如下所示:

config.xml

代码语言:javascript
复制
<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:

代码语言:javascript
复制
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)将负责将布局处理程序添加到布局对象中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25687494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档