Вопрос

Я использую вкладки для страницы просмотра продукта.В моем local.xml у меня есть следующее:

<catalog_product_view>
    <reference name="product.info">
        <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>videos</alias>
                <title>Videos</title>
                <block>catalog/product_view_attributes</block>
                <template>catalog/product/view/videos.phtml</template>
            </action>
        </block>
    </reference>
    <reference name="product.description">
        <block type="core/template"
               name="namespace.inline"
               as="namespace_inline"
               template="catalog/view/gallery/inline.phtml" />
    </reference>
</catalog_product_view>

В моем каталоге/продукте/представлении/описании.phtml у меня есть следующее:

<?php echo $this->getChildHtml('namespace_inline') ?>

Но дочерний шаблон не отображается.

Я попробовал переключиться на тему по умолчанию, и это работает, но тема по умолчанию не использует вкладки.

Что-то происходит с блоком Mage_Catalog_Block_Product_View_Tabs, что не позволяет ему иметь дочерние блоки?

Это было полезно?

Решение

Вы добавляете свой блок в ссылочный блок.Поскольку родительский блок вашего пользовательского блока является ссылочным блоком, необходимо, чтобы этот блок был определен до того, как на него ссылаются в другом месте.

Вы сказали, что когда вы пробуете это в базовой теме, это работает.Но в вашей кастомной теме это не работает.Поэтому я твердо верю, что базовая тема содержит блоки, определяющие product.description внутри это catalog.xml файл макета.Но ваша пользовательская тема не использует это имя для этого блока, вместо этого она может использовать другое имя.

Вам нужно найти имя блока из catalog.xml файл (в вашей пользовательской теме), указав его тип.(В базовой теме и пользовательской теме type блока будет таким же).Затем используйте это имя в своем local.xml файл.

Другие советы

Чтобы узнать имя блока, добавленного в виде вкладки, взглянем на 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)
        );
}

Второй параметр createBlock() это имя.Итак, в вашем примере имя совпадает с псевдонимом. description.

Использование ссылки в макете по-прежнему не будет работать, поскольку при построении дерева макета действия еще не выполняются и description блока не существует.Это означает, что вы можете нет используйте псевдоним в XML, как и следовало ожидать:

<reference name="description">
    <block type="core/template"
           name="namespace.inline"
           as="namespace_inline"
           template="catalog/view/gallery/inline.phtml" />
</reference>

Вместо этого следует создать полный блок описания без ссылки и заменить дочернюю вкладку другим. action, так что это произойдет после addTab действие выполнено:

<block type="catalog/product_view_description"
           name="product.description"
           template="catalog/product/view/description.phtml">
    <block type="core/template"
           name="namespace.inline"
           as="namespace_inline"
           template="catalog/view/gallery/inline.phtml" />
</block>
<reference name="product.info.tabs">
    <action method="setChild">
        <alias>description</alias>
        <block>product.description</block>
    </action>
</reference>

Чтобы не инициализировать блок описания дважды, можно дополнительно заменить исходную вкладку фиктивным заполнителем, значение имеют только псевдоним и заголовок:

        <action method="addTab" translate="title" module="catalog">
            <alias>description</alias>
            <title>Description</title>
            <block>core/text</block>
        </action>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top