- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了一个特色产品模块,该模块在页面上放置了一个自定义 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 管理员应用更新来执行此操作。活到老,学到老。
尽管如此,小部件方法可能仍然可行,并且可以替代上述方法。
使用自定义 block 类创建自定义模块
block 类不渲染 HTML
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/
我不确定是否理解好几个 Android /res/layout 文件夹所起的作用。 layout:一般布局 layout-port:必须更改为纵向的小部件布局 layout-land:小部件的布局,必
我在 Qt 4.7 中有一个界面,但我很难按照自己的意愿行事。 所需行为的基本描述:用户在组合框中进行选择,这会导致查询转到另一个函数,该函数返回一个 QHBoxLayout 对象,该对象通常包括多个
我在 res 文件夹中创建了 layout-large、layout-normal 和 layout-xlarge 并且我将所有 xml 文件复制到那些布局文件夹中 首先,我想问一下 layout(d
如图所示。我想在布局上方显示星图。我是这种编码的新手。 我的查询是1)是否可以在我的布局端显示星标(图像)? 2) 如果每次点击我的 Activity 时我都想显示星标并显示第二张图片,这可能吗?意味
关闭。这个问题需要debugging details .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 上个月关闭。 Improve this questio
我正在使用 android studio 中的 Material 设计为 pre lollipop 设备创建一个 android 应用程序,我是 android studio 的新手我正在我的项目中创
我对 Android 布局设计感到困惑。我想实现下图中的布局: 但是下面的代码产生了类似这张图片的东西: 我的代码
如果我有: Some Element.... Other Element
我有一个单元格(称为A),它在更高层次的单元格(称为P)中使用一次。当我将 A 放在 P 中时,它的边框比 A 的实际内容大得多。当我下降到 A 并进行缩放时,它被缩小了,表明边缘存在一些东西。 我可
我有一个“auth-redirect”模块,位于所有页面布局文件(1column、2column 等)的开头。这可以确保在渲染任何页面之前,如果用户未经过正确身份验证,则会重定向到登录页面。 我允许呈
我的app只支持landscape模式(这是业务需求)。 我在 layout-land 文件夹中有一个布局 xml 文件,但我没有费心创建一个 layout 文件夹,因为我在 Android list
我正在尝试为我的 Android 应用程序创建启动屏幕,如链接 http://developer.xamarin.com/guides/android/user_interface/creating_
我目前正在开发一个应用程序,我正在使用 swdp为了创建对多个屏幕的支持。 我添加了 sw400dp文件夹,根据 Android Studio 的 XML 渲染器,它基本上包含所有较小的手机。 这意味
Android 在“layout-normal”和“layout”文件夹中处理布局的方式有什么不同吗?如果我有一个被认为布局很小的设备,如果只有这两个选项,它会查看哪个文件夹? 最佳答案 是的,在您给
我已经看到了在单个页面上创建多个强制布局的解决方案,其中每个布局都包含在其自己的SVG中。但是,我一直无法找到有关如何在单个SVG中包括多个力布局的帮助。每个布局都有自己的数据与之关联。 可以在htt
我听说 Constraint-Layout 中的指南和 RTL 存在一些错误。但是这些方法都没有帮助我。我的BottomNavigation 的两边都有指南,一切都在LTR 中工作,但在RTL 中,其
我有以下渲染函数: render() { return ( Header
我知道如何使用以下文件夹,但例如我不知道 layout-small 和 layout-sw320dp 有什么区别? 此外,建议我哪些文件夹对优化很重要。我不喜欢我的程序被用户视为不规则。我希望得到您的
layout-latest.js ui-layout-west 面板 west: { paneSelector: ".ui-layout-west"
我是 Android 开发的新手,对我来说,了解图形布局和 xml 如何相互关联的一个好方法是尝试 xml 属性并查看图形 UI 中的变化。有没有一种方法可以同时并排查看,而不必从一个切换到另一个?图
我是一名优秀的程序员,十分优秀!