gpt4 book ai didi

layout - 使用 CMS 页面进行布局更新的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-02 11:50:46 25 4
gpt4 key购买 nike

我编写了一个特色产品模块,该模块在页面上放置了一个自定义 block ,其中包含与我在 block 中定义的任何属性相匹配的产品列表。最初我通过添加 {{block...}} 让它工作行到 CMS 页面的内容部分。这工作得很好,但我没有得到寻呼机。因此,我通过删除 {{block...}} 来解决这个问题从内容部分添加 XML 到布局更新 XML 部分,如下所示:

<reference name="content">
<block type="cms/block" name="product_list_top" />
<block type="vps_featured/list" name="vps_featured_list" template="catalog/product/sale_list.phtml">
<block type="catalog/product_list_toolbar" name="product_list_toolbar" template="catalog/product/list/toolbar.phtml">
<block type="page/html_pager" name="product_list_toolbar_pager"/>
</block>
<action method="setToolbarBlockName"><name>product_list_toolbar</name></action>
<action method="setAttributeName"><name>my_attribute</name></action>
</block>
</reference>

这也很有效。然后我决定,由于该 block 有如此多的实例,如果我将一个 XML 文件添加到我的主题的布局文件夹中并将此代码放入其中,则会更加清晰。然后,在布局更新部分,我可以简单地使用这个:

<reference name="vps_featured_list">
<action method="setAttributeName"><name>other_attribute</name></action>
</reference>

所以,我创建了一个名为 vps_featured.xml 的文件并将其添加到其中:

<layout version="0.1.0">
<default>
<reference name="content">
<block type="cms/block" name="product_list_top" />
<block type="vps_featured/list" name="vps_featured_list" template="catalog/product/sale_list.phtml">
<block type="catalog/product_list_toolbar" name="product_list_toolbar" template="catalog/product/list/toolbar.phtml">
<block type="page/html_pager" name="product_list_toolbar_pager" />
</block>
<action method="setToolbarBlockName"><name>product_list_toolbar</name></action>
</block>
</reference>
</default>
</layout>

config.xml 中引用了此布局更新 XML 文件。对于我的自定义特色模块。我天真地认为vps_featured.xml仅当我的 VPS 特色 block 位于页面上时,才会合并到页面布局中,这种​​情况只会发生在特殊 CMS 页面上的少数情况下。显然事实并非如此。我猜这破坏了所有其他页面,因为它覆盖了默认句柄。

因此,这引出了问题 #1:布局 xml 文件何时包含在页面布局中?它们是否用于所有页面,无论引用它们的模块是否实际使用?

然后,我决定尝试添加一个新的布局句柄,当我需要在 CMS 页面中引用时,我可以引用它。我修改了布局 XML 文件,因此主要部分位于 <vps_featured_list> 内标签而不是 <default>标签。这使其他页面恢复了生机,但当然,我的 CMS 页面不再工作,因为这些页面上没有使用布局更新句柄。我尝试添加 <update handle="vps_featured_list" />到 CMS 页面的布局更新 XML 部分,但这不起作用(我没想到它会起作用)。

这让我想到了问题#2:完成此任务的正确方法是什么?

这听起来并不应该这么困难,但显然我错过了一些东西。我已经阅读了我能在布局上找到的所有内容,但它们总是简单的示例,例如“将其添加到每个产品页面”。我不想在每个 cms 页面中添加一些内容...只是其中的几个。我是否在使用相关 CMS 页面的布局更新 XML 部分时遇到困难?我觉得必须有一种更干净的方法。

谢谢

布莱恩

最佳答案

节点<default/>是一种称为“布局句柄”的东西。每个对 Magent 的请求都会生成许多这样的句柄。查看Layout tab on the Commerce Bug demo站点以了解生成的句柄类型。

Magento 将所有布局 XML 文件合并到一棵称为包布局的巨型树中。然后,句柄确定哪些布局 XML 更新片段用于特定请求。这些片段被组合到页面布局中。正如您的直觉,<default/>句柄总是添加,这就是为什么您要屏蔽系统中的每个站点。

坏消息是,虽然有 CMS 页面的句柄 ( <cms_page_view /> ),但它仍然是一件要么全有要么全无的事情。您可以向所有 CMS 页面添加内容,但不能向特定CMS 页面添加内容。所以,是的,CMS 管理的布局更新 XML 部分是执行您想要的操作的“正确”方法。

好消息是,您可以采取两种比您迄今为止提出的更干净的方法。 首先,您可以通过在 XML 文件中定义自己的句柄来清理一些内容,然后使用特殊的布局 XML 命令来包含该句柄。

在 XML 中,将布局更新 XML 片段添加到自定义句柄内。

<layout version="0.1.0"> <my_fancy_pants_unique_handle_name_which_doesnt_conflict_with_existing_names>
<reference name="content">
<block type="cms/block" name="product_list_top" />
<block type="vps_featured/list" name="vps_featured_list" template="catalog/product/sale_list.phtml">
<block type="catalog/product_list_toolbar" name="product_list_toolbar" template="catalog/product/list/toolbar.phtml">
<block type="page/html_pager" name="product_list_toolbar_pager" />
</block>
<action method="setToolbarBlockName"><name>product_list_toolbar</name></action>
</block>
</reference>
</my_fancy_pants_unique_handle_name_which_doesnt_conflict_with_existing_names>
</layout>

Then in the CMS Admin, add the following Layout Update XML for the pages you want

<update handle="my_fancy_pants_unique_handle_name_which_doesnt_conflict_with_existing_names" />

Magento allows Layout Update XML fragments to add additional handles to the request. That's what you're doing above. This cleans things up a bit, and if you wanted to change some of the XML, there's a centralized place for it.

Update: It turns out that that the <update/> command can only be used from the Layout XML files themselves. The code that loads the Layout Update XML for CMS pages isn't the same code that loads and processes updates for the XML files. Magento will literally add anything in the CMS form as a Layout update. It won't processes it for recursive updates. So, adding something like this to local.xml would work

<mock_product_list>
<reference name="head">
<label>Mock Product List</label>
<action method="addItem"><type>skin_js</type><name>js/sw/wall.js</name></action>
</reference>
</mock_product_list>

<cms_page_view>
<update handle="mock_product_list" />
</cms_page_view>

但您无法直接通过 CMS 管理员应用更新来执行此操作。活到老,学到老。

尽管如此,小部件方法可能仍然可行,并且可以替代上述方法。

  1. 使用自定义 block 类创建自定义模块

  2. block 类不渲染 HTML

  3. block 类包含一个名为“addFooToLayout”的方法

然后,在您的 CMS 页面中添加如下更新

<block type="yourmodule/yourblock" name="unique_name" alias="unique_name">
<action method="addFooToLayout" />
</block>

然后在你的 block 定义中

public addFooToLayout()
{
$layout = Mage::getSingleton('core/layout');
$head = $layout->getBlock('head');
$head->addItem('skin_js','js/sw/wall.js');
//etc...
}

类似的东西应该可以工作并且更清晰一些(取决于您想要添加多少布局更新XML)。然而,我还没有测试过它,我的可信度已经被破坏了,所以买家要小心。

第二种方法是create a single widget其中包含您想要添加到页面的内容,然后使用小部件实例管理将该小部件添加到特定页面上的特定 block 。该链接应该可以帮助您入门。

最后,冒着被骗的风险,我最近自行出版了 a book on Magento Layouts深入涵盖了此类问题。如果您有兴趣了解整个系统的工作原理,那么值得您花时间。

关于layout - 使用 CMS 页面进行布局更新的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5791512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com