Интересный вопрос: я просмотрел класс 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
, а также добавляется как дочерний элемент текущего блока. Функция не принимает другие параметры, что неудобно.
Вот как все вкладки отображаются в 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
.
- Метод
addTab
использует наш новый блок и его шаблон вместо шаблона dummy_example.phtml
, когда он ищет блок с псевдонимом "product_options
", и чистый эффект заключается в том, что наш блок и его options.phtml
шаблон отображается вместо dummy_example.phtml
.
UPDATE . Заменено block
создание с reference
на уже существующее. Теперь это решение более надежно.