Magento: шаблон на основе набора атрибутов - PullRequest
4 голосов
/ 19 января 2011

Я хочу создать различные представления продукта на основе набора атрибутов, к которому принадлежит продукт: предоставляет ли Magento способ сделать это?

- ОБНОВЛЕНИЕ -

Следуя предложению dan.codes, я добавил

$update->addHandle('PRODUCT_ATTRIBUTE_SET_ID_'.$product->getAttributeSetId());

в Mage_Catalog_ProductController (я продублировал ProductController.php и поместил егов local / Mage / Catalogue / controllers /).

Затем я добавил это в catalog.xml

<PRODUCT_ATTRIBUTE_SET_ID_9> // PRODUCT ID of Book Attribute Set
    <label>Catalog Product View (Book)</label>
    <reference name="product.info">
        <block type="catalog/product_view_type_book" name="product.info.book" as="product_type_data" template="catalog/product/view/attribute_set/book.phtml">
            <block type="core/text_list" name="product.info.book.extra" as="product_type_data_extra"/>
        </block>
    </reference>
</PRODUCT_ATTRIBUTE_SET_ID_9>

сразу после

<PRODUCT_TYPE_virtual translate="label" module="catalog">
    <label>Catalog Product View (Virtual)</label>
    <reference name="product.info">
        <block type="catalog/product_view_type_virtual" name="product.info.virtual" as="product_type_data" template="catalog/product/view/type/virtual.phtml">
            <block type="core/text_list" name="product.info.virtual.extra" as="product_type_data_extra"/>
        </block>
    </reference>
</PRODUCT_TYPE_virtual>

Затем я создал каталог /product / view / attribute_set / book.phtml, но он не отображается на странице просмотра моего продукта.

- ОБНОВЛЕНИЕ MAGENTO 1.5 -

Я заметил, чтоОбновление обработчика перенесено в последний выпуск Magento.

$update->addHandle('PRODUCT_TYPE_'.$product->getTypeId());
$update->addHandle('PRODUCT_'.$product->getId());

сейчас в Mage / Catalog / Helper / Product / View.php.
Я тестировал, и он все еще прекрасно работает!

Ответы [ 3 ]

4 голосов
/ 19 января 2011

Нет, это не так, но вы можете расширить функциональность, сделав это, расширив метод _initProductLayout в Mage_Catalog_ProductController в соответствии с кодом этого кода

    $update = $this->getLayout()->getUpdate();
    $update->addHandle('default');
    $this->addActionLayoutHandles();

    $update->addHandle('PRODUCT_TYPE_'.$product->getTypeId());
    $update->addHandle('PRODUCT_'.$product->getId());

Вы можете добавить

$update->addHandle('PRODUCT_ATTRIBUTE_SET_ID_'.$product->getAttributeSetId());

Тогда в вашем layout.xml вы можете иметь

<PRODUCT_ATTRIBUTE_SET_ID_IDHERE>
  <reference name="root">
            <action method="setTemplate"><template>template/path/here.html</template></action>
        </reference>
</PRODUCT_ATTRIBUTE_SET_ID_IDHERE>
2 голосов
/ 14 марта 2013

Есть хороший урок по этому вопросу: http://magebase.com/magento-tutorials/creating-custom-layout-handles/

Используется следующее событие: controller_action_layout_load_before

Для этого я настроил в config.xml следующее

<events>
    <controller_action_layout_load_before>
        <observers>
            <mymodule>
                <class>mymodule/observer</class>
                <method>addAttributeSetHandle</method>
            </mymodule>
        </observers>
    </controller_action_layout_load_before>
</events>

И в Observer.php у меня будет

public function addAttributeSetHandle(Varien_Event_Observer $observer)
{
    $product = Mage::registry('current_product');

    /**
     * Return if it is not product page
     */
    if (!$this->isBookProduct($product)) {
        return;
    }

    $niceName = 'book';

    /* @var $update Mage_Core_Model_Layout_Update */
    $update = $observer
            ->getEvent()
            ->getLayout()
            ->getUpdate();
    $handles = $update->getHandles(); // Store all handles in a variable
    $update->resetHandles(); // Remove all handles

    /**
     * Rearrange layout handles to ensure PRODUCT_<product_id>
     * handle is added last
     */
    foreach ($handles as $handle) {
        $update->addHandle($handle);
        if ($handle == 'PRODUCT_TYPE_' . $product->getTypeId()) {
            $update->addHandle('PRODUCT_ATTRIBUTE_SET_' . $niceName);
        }
    }
}

protected function isBookProduct($product)
{
    if (null === $product || !($product instanceof Mage_Catalog_Model_Product)) {
        return false;
    }
    // TODO instead of hardcoded value we could use here something neat to get by name thru eav/entity_attribute_set model, some config value which hold that ID or use some other approach...
    $book_set_id = 9;

    if ($product->getAttributeSetId() != $book_set_id) {
        return false;
    }
    return true;
}

Это дает возможность использовать в макете XML следующее:

    <?xml version="1.0"?>
    <layout version="0.1.0">
        <PRODUCT_ATTRIBUTE_SET_book>
            <reference name="product.info">
                <action method="setTemplate">
                    <template>mymodule/book/product/view.phtml</template>
                </action>
            </reference>
        </PRODUCT_ATTRIBUTE_SET_book>
    </layout>
2 голосов
/ 12 января 2012

Если вы хотите переключить view.phtml на основе набора атрибутов, то вот что вам нужно сделать:

<PRODUCT_ATTRIBUTE_SET_ID_9>
    <label>Catalog Product View (Default)</label>
    <reference name="product.info">
        <action method="setTemplate"><template>catalog/product/custom-view.phtml</template></action>
    </reference>
</PRODUCT_ATTRIBUTE_SET_ID_9>

Просто добавьте это в ваш catalog.xml или local.xmlНадеюсь это поможет.Спасибо

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