背景:我需要能够在灯箱中加载追加销售/交叉销售产品,并提供添加购物车功能。
我实现这一目标的想法是“迫使”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();
}
}
}
答案 0 :(得分:7)
我设法完全按照我的预期使用它。感谢@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>
.phtml文件中的产品网址:
echo $this->getProductUrl($_item) . '?template=popup';
答案 1 :(得分:1)
为什么不想只使用常规布局udates?
<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()