在Magento嵌套不同类型的块

时间:2012-03-20 19:56:12

标签: php xml magento

我正在尝试更改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>

1 个答案:

答案 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>

这为我们提供了在前端呈现的标签,其中的选项显示在他们自己的标签中。

以下是我们实际得到的结果:

  1. 我们使用childHtml标记生成了<action method="addTab">块列表。
  2. 我们使用我们想要的内容创建了一个新的块product.info.options,并使用as="product_options"为其提供与addTab方法正在查找的块相同的别名。< / LI>
  3. addTab方法在查找别名为“dummy_example.phtml”的块时使用我们的新块及其模板而不是product_options模板,其净效果是我们的阻止及其options.phtml模板呈现而不是dummy_example.phtml
  4. <强>更新即可。将block创建reference替换为已存在的{{1}}。现在这个解决方案更可靠。