Скворечники разных типов в Magento - PullRequest
3 голосов
/ 20 марта 2012

Я пытаюсь изменить страницы продукта в моей установке 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.Хорошо.Тем не менее, 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, можно было использовать в теге <block>, вложенном в <action method="addTab">.


Для бонусных баллов, каковы фактические названия этих двух разных вариантов использования для <block>, в чем разница между содержимым тега <block> и его атрибуты , а где на этой прекрасной зеленой Земле что-нибудь из этого документировано?


Вот блок 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 Ответ

2 голосов
/ 21 марта 2012

Интересный вопрос: я просмотрел класс 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>

Это дает нам вкладки, отображаемые на веб-интерфейсе, с параметрами, отображаемыми на их собственной вкладке.

Вот как мы на самом деле это получили:

  1. Мы создали список childHtml блоков с тегами <action method="addTab">.
  2. Мы создали новый блок product.info.options с требуемым содержимым и использовали as="product_options", чтобы присвоить ему тот же псевдоним, что и у блока, который ищет метод addTab.
  3. Метод addTab использует наш новый блок и его шаблон вместо шаблона dummy_example.phtml, когда он ищет блок с псевдонимом "product_options", и чистый эффект заключается в том, что наш блок и его options.phtml шаблон отображается вместо dummy_example.phtml.

UPDATE . Заменено block создание с reference на уже существующее. Теперь это решение более надежно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...