Как заставить Magento загрузить другой макет - PullRequest
3 голосов
/ 09 февраля 2011

Справочная информация. Мне нужно иметь возможность загружать продукты с высокой и высокой стоимостью в лайтбокс в комплекте с функцией добавления в корзину.

Моя идея для достижения этой цели состояла в том, чтобы заставить Magento загружать продукты в другом формате. Я думал об использовании наблюдателя на событии controller_action_layout_generate_xml_before (код ниже).

к сожалению то что у меня не работает. Любые указатели (или совершенно другие / лучшие идеи) очень ценятся.

<?php 
class My_ForceLayout_Model_Observer
{
    public function changeLayoutEvent($observer)
    {
        $action = $observer->getEvent()->getAction();
        $layout = $observer->getEvent()->getLayout();

        if($action->getRequest()->getControllerName() == 'product'
            && $action->getRequest()->getActionName() == 'view') 
        {

            $update = $layout->getUpdate();
            $update->load('popup'); // for testing only
            $layout->generateXml();
        } 
    }
}

Ответы [ 2 ]

7 голосов
/ 09 февраля 2011

Мне удалось заставить это работать именно так, как я и задумал. Спасибо @Jonathan Day за то, что я понял, что причина, по которой он не работал, была тривиальной.

Config.xml:

<config>
    ....
<frontend>
    <events>
        <controller_action_layout_generate_blocks_before>
            <observers>
                <forcelayout>
                    <type>singleton</type>
                    <class>forcelayout/observer</class>
                    <method>changeLayoutEvent</method>
                </forcelayout>
            </observers>
        </controller_action_layout_generate_blocks_before>
    </events>
</frontend>
    ....
</config>

Observer.php:

class Unleaded_ForceLayout_Model_Observer
{
    public function changeLayoutEvent($observer)
    {
        $action = $observer->getEvent()->getAction();
        $layout = $observer->getEvent()->getLayout();

        if($action->getRequest()->getControllerName() == 'product'
          && $action->getRequest()->getActionName() == 'view')
        {
            $template = $action->getRequest()->template;
            if (isset($template) && $template != '')
            {
                $update = $layout->getUpdate();
                $update->load($template);
                $layout->generateXml();
            }
        } 
    }
}

local.xml:

<popup translate="label">
    <label>Catalog Product View Lightbox</label>
    <remove name="right"/>
    <remove name="left"/>
    <reference name="root">
        <action method="setTemplate">
            <template>page/popup.phtml</template>
        </action>
    </reference>
    <reference name="content">
        <remove name="product.info.upsell"/>
    </reference>
</popup>

URL продукта в файле .phtml:

echo $this->getProductUrl($_item) . '?template=popup';
1 голос
/ 09 февраля 2011

Почему вы не хотите использовать обычные обновления макетов?

<catalog_product_view translate="label">
    <label>Catalog Product View (Any)</label>
    <!-- Mage_Catalog -->
    <remove name="right"/>
    <remove name="left"/>
    <reference name="content">
        <block type="new_catalog/product_view" 
            name="new.product.info" 
            template="new/catalog/product/view_popup.phtml">
            ...
        </block>
    </reference>
</catalog_product_view> 

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

if ($this->check_parameters()) {
    $update->addHandle('new_magic_handler');
    $this->loadLayoutUpdates();
}

И в макете:

<new_magic_handler translate="label">
    <label>New Magic</label>
    ...
</new_magic_handler> 

Проверьте детали Mage_Catalog_ProductController::_initProductLayout()

...