如何在Magento 1.9扩展中注入纯粹的javascript?

时间:2016-02-10 22:16:51

标签: magento magento-1.9

我正在开发一个处理分析的Magento扩展。它需要做的一件事是将事件(例如checkout_cart_add_product_completecatalog_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最佳实践来正确处理它。

1 个答案:

答案 0 :(得分:0)

您可能知道,Magento使用javascript变量var spConfig(在视图页面中)存储要在javascript中用于更改价格和其他thigs的产品数据。

你不能使用这样的js变量存储产品/购物车信息并在你所包含的js文件中使用它们(即file.js)