我正在尝试更改Magento安装上的产品页面。在当前主题中,产品选项显示在页面的主要部分中。我试图让它们显示在更多信息选项卡中。问题似乎是产品选项是由XML的结构块创建的,我不能把它移到另一个位置,它需要被“翻译”。
以下是XML的产品选项块:
<block type="catalog/product_view" name="product.info.options.wrapper" as="product_options_wrapper" template="catalog/product/view/options/wrapper.phtml" translate="label">
<label>Info Column Options Wrapper</label>
<block type="core/template" name="options_js" template="catalog/product/view/options/js.phtml"/>
<block type="catalog/product_view_options" name="product.info.options" as="product_options" template="catalog/product/view/options.phtml">
<action method="addOptionRenderer"><type>text</type><block>catalog/product_view_options_type_text</block><template>catalog/product/view/options/type/text.phtml</template></action>
<action method="addOptionRenderer"><type>file</type><block>catalog/product_view_options_type_file</block><template>catalog/product/view/options/type/file.phtml</template></action>
<action method="addOptionRenderer"><type>select</type><block>catalog/product_view_options_type_select</block><template>catalog/product/view/options/type/select.phtml</template></action>
<action method="addOptionRenderer"><type>date</type><block>catalog/product_view_options_type_date</block><template>catalog/product/view/options/type/date.phtml</template></action>
</block>
</block>
因此有一个catalog/product_view
块,其中添加了几个PHTML chucnks。好的。但是,创建选项卡的XML会要求提供不同的选项。这是一个示例:
<block type="catalog/product_view_tabs" name="product.info.tabs" as="info_tabs" template="catalog/product/view/tabs.phtml">
<action method="addTab" translate="title" module="catalog">
<alias>options</alias>
<title>Options</title>
<block>catalog/product_view</block>
<template>catalog/product/view/options/wrapper.phtml</template>
</action>
</block>
<block>foo/bar_baz</block>
位显然存在与此处主要块不同的块类型。如何在那里插入结构块?我试图得到它,以便第一个引用的XML blob生成的整个内容包可以嵌套在<block>
内的<action method="addTab">
标记中使用。
对于奖励积分,<block>
的两个不同用例的实际名称是什么,<block>
标记的内容与其< em>属性,这个可爱的绿色地球上的任何一个记录在哪里?
根据谢尔盖的回答,这是最终为我工作的XML块。
<block type="catalog/product_view_tabs" name="product.info.tabs" as="info_tabs" template="catalog/product/view/tabs.phtml" >
<action method="addTab" translate="title" module="catalog">
<alias>product_options_wrapper</alias>
<title>Options</title>
<block>catalog/product_view_description</block>
<template>catalog/product/view/options/wrapper.phtml</template>
</action>
<!-- Inserting an extra block that will generate the content of the Options tab. -->
<block type="catalog/product_view" name="product.info.options.wrapper" as="product_options_wrapper" template="catalog/product/view/options/wrapper.phtml">
<block type="catalog/product_view_options" name="product.info.options" as="product_options" template="catalog/product/view/options.phtml">
<action method="addOptionRenderer"><type>text</type><block>catalog/product_view_options_type_text</block><template>catalog/product/view/options/type/text.phtml</template></action>
<action method="addOptionRenderer"><type>file</type><block>catalog/product_view_options_type_file</block><template>catalog/product/view/options/type/file.phtml</template></action>
<action method="addOptionRenderer"><type>select</type><block>catalog/product_view_options_type_select</block><template>catalog/product/view/options/type/select.phtml</template></action>
<action method="addOptionRenderer"><type>date</type><block>catalog/product_view_options_type_date</block><template>catalog/product/view/options/type/date.phtml</template></action>
</block>
</block>
</block>
答案 0 :(得分:2)
有趣的问题:我查看了Mage_Catalog_Block_Product_View_Tabs
课并检查了addTab
函数:
function addTab($alias, $title, $block, $template) {
if (!$title || !$block || !$template) {
return false;
}
$this->_tabs[] = array(
'alias' => $alias,
'title' => $title
);
$this->setChild($alias,
$this->getLayout()->createBlock($block, $alias)->setTemplate($template)
);
}
因此,您可以看到作为参数传递的每个元素都被添加到私有_tabs
数组中,并且还被添加为当前块的Child。该功能不接受其他参数,这是不方便的。
这是catalog/product/view/tabs.phtml
中所有标签的呈现方式:
<?php foreach ($this->getTabs() as $_index => $_tab): ?>
<?php if($this->getChildHtml($_tab['alias'])): ?>
这告诉我们一个选项卡只会呈现分配给私有_tabs
数组的内容,而有一个子块,其alias
属性与$_tab['alias']
。但是,我们可以添加一个选项卡,然后使用标准Magento方法替换我们想要的块内容,以定义具有相同名称和覆盖的块。
以下是基于您的代码的工作示例:
<block type="catalog/product_view_tabs" name="product.info.tabs" as="info_tabs" template="catalog/product/view/tabs.phtml" >
<action method="addTab" translate="title" module="catalog">
<alias>description</alias>
<title>description</title>
<block>catalog/product_view_description</block>
<template>catalog/product/view/description.phtml</template>
</action>
<action method="addTab" translate="title" module="catalog">
<alias>product_options</alias>
<title>test</title>
<block>catalog/product_view_description</block>
<template>catalog/product/view/dummy_example.phtml</template>
</action>
<reference name="product_options">
<action method="addOptionRenderer"><type>text</type><block>catalog/product_view_options_type_text</block><template>catalog/product/view/options/type/text.phtml</template></action>
<action method="addOptionRenderer"><type>file</type><block>catalog/product_view_options_type_file</block><template>catalog/product/view/options/type/file.phtml</template></action>
<action method="addOptionRenderer"><type>select</type><block>catalog/product_view_options_type_select</block><template>catalog/product/view/options/type/select.phtml</template></action>
<action method="addOptionRenderer"><type>date</type><block>catalog/product_view_options_type_date</block><template>catalog/product/view/options/type/date.phtml</template></action>
</reference>
</block>
这为我们提供了在前端呈现的标签,其中的选项显示在他们自己的标签中。
以下是我们实际得到的结果:
childHtml
标记生成了<action method="addTab">
块列表。product.info.options
,并使用as="product_options"
为其提供与addTab
方法正在查找的块相同的别名。< / LI>
addTab
方法在查找别名为“dummy_example.phtml
”的块时使用我们的新块及其模板而不是product_options
模板,其净效果是我们的阻止及其options.phtml
模板呈现而不是dummy_example.phtml
。 <强>更新即可。将block
创建reference
替换为已存在的{{1}}。现在这个解决方案更可靠。