我正在开发一个处理分析的Magento扩展。它需要做的一件事是将事件(例如checkout_cart_add_product_complete
和catalog_controller_product_view
)从后端PHP观察者类传递到前端javascript。
我在myextension的config.xml中使用了这些事件:
<events>
...
<catalog_controller_product_view>
<observers>
<myextension>
<type>model</type>
<class>myextension/observer</class>
<method>productViewContent</method>
</myextension>
</observers>
</catalog_controller_product_view>
<checkout_cart_add_product_complete>
<observers>
<myextension>
<type>model</type>
<class>myextension/observer</class>
<method>productAddToCart</method>
</myextension>
</observers>
</checkout_cart_add_product_complete>
...
</events>
我实现了Observer.php模型以便当前写入日志:
public function productViewContent($observer) {
$product = $observer->getProduct();
Mage::log('('.$product->getId() .') '. $product->getName().' has been viewed.', null, 'product.log');
}
public function productAddToCart($observer) {
$product = $observer->getProduct();
Mage::log('('.$product->getId() .') '. $product->getName().' has been added to cart.', null, 'product.log');
}
我在product.log中看到了正确的产品详情。
现在,我被困在这个班级:
class Mynamespace_Myextension_Block_Html_Head extends Mage_Page_Block_Html_Head {
// some session code here
$this->addJs('myextension/file.js');
}
我已成功检测到myextension / file.js正在加载,但我需要能够将动态事件信息传递给JS文件。我希望能够做到这样的事情:
class Mynamespace_Myextension_Block_Html_Head extends Mage_Page_Block_Html_Head {
// some session code here
$this->addRawHTML('<script>var myevent='addtocart';var myproduct=$product_id</script>');
$this->addJs('myextension/file.js');
}
...以便myevent和myproduct可用于file.js中运行的代码。显然没有这样的方法addRawHTML
。
希望这是有道理的。我试过了
echo "<script>alert('add_to_cart');</script>";
在我的扩展程序的Head.php块中,我按预期收到警报,但它当然是在html的第一行之前打印,这不是正确的方法。
此外,我目前正在使用会话从Observer写入有关该事件的详细信息,以便Mynamespace_Myextension_Block_Html_Head中的_prepareLayout方法可以读取它们并将它们转发到布局中的JS。有没有更好的办法?
简而言之,我无法修改layout.xml / theme.xml,因为这是一个扩展,我不能单独使用addJs,因为我需要动态的JS文件生成或检测动态写入页面的JS变量。
使用PHP文件调用add JS是不好的做法?
$this->addJs('myextension/file.php?myevent=add_to_cart&product_id='.$product_id);
使用PHP动态呈现JS文件?这可能有用,但看起来像是黑客。
感谢您的建议。
更新:我已经设法让一些工作变得有效,但是采用了非品质的方式&#34;。我遵循this answer这样的东西,基本上直接从观察者生成Javascript:
public function generateLayout($observer)
{
// I do this if there's an event in a custom session variable
$layout = $observer->getEvent()->getLayout();
$headBlock = $layout->getBlock('head');
$block = $layout->getBlock('head');
$block->setText("
<script>
var myevent = '$event';
var myproduct = '$product';
</script>
");
$headBlock->append($block);
}
我仍然希望使用Magento最佳实践来正确处理它。
答案 0 :(得分:0)
您可能知道,Magento使用javascript变量var spConfig
(在视图页面中)存储要在javascript中用于更改价格和其他thigs的产品数据。
你不能使用这样的js变量存储产品/购物车信息并在你所包含的js文件中使用它们(即file.js)