在Magento产品页面上添加动态JS代码

时间:2015-06-25 13:50:33

标签: javascript magento

在我的magento产品页面上,我需要在产品页面上的显示向上销售产品上添加动态JavaScript数组。目标是在用户更改主要产品的颜色时更改向上销售产品的图像。

为了实现我的目标,我需要在每个产品页面上都有一个自定义JavaScript数组,它为我提供有关交叉索引产品和相关产品图像的信息。

这样做的最佳方式是什么?

我试试这个

在我的config.xml中添加一个观察者事件

<controller_action_layout_load_before>
    <observers>
       <crossselling_product_view>
           <type>singleton</type>
           <class>XXXXXXXX_Crossselling_Model_Observer</class>
           <method>productview</method>
        </crossselling_product_view>
    </observers>
</controller_action_layout_load_before>

添加观察者以添加特定的JS代码

<?php
class XXXXXXXX_Crossselling_Model_Observer {

    public function productview(Varien_Event_Observer $observer) {

        $product = Mage::registry('current_product');

        //only on product page
        if (!($product instanceof Mage_Catalog_Model_Product)) {
            return;
        }

        $controller = $observer->getAction();
        $layout = $controller->getLayout();
        $block = $layout->createBlock('core/text');
        $block->setText(
            '<script type="text/javascript">
            function main_pulsestorm_hellojavascript()
            {
                alert("Foo");
            }
            main_pulsestorm_hellojavascript();
        </script>'
        );
        $layout->getBlock('head')->append($block);
    }

}

我的错误: 致命错误:在非对象上调用成员函数append()

我的问题是什么,是添加动态js代码的正确方法吗?

2 个答案:

答案 0 :(得分:1)

我可能会从不同的角度来看待这个问题。由于您只对与加售块的数据和输出进行交互感兴趣,因此您可以通过观察其输出并附加额外的JavaScript来更改该块的行为。为简洁起见,本答案假定您了解Magento扩展的基础知识。

  1. 观察<include src="/artifacts/componente_to_reuse.zul"/> 事件:
  2. <强>等/ config.xml中

    core_block_abstract_to_html_after
    1. 通过附加将读取其数据的新块的输出来对<core_block_abstract_to_html_after> <observers> <addCustomUpsellFormat> <class>XXXXXXXX_Crossselling_Model_Observer</class> <method>addCustomUpsellFormat</method> </addCustomUpsellFormat> </observers> </core_block_abstract_to_html_after> 的实例执行操作:
    2. <强>模型/ Observer.php

      Mage_Catalog_Block_Product_List_Upsell
      1. 创建一个解释加售数据并以您想要的方式输出的模板,在上面的示例中,我创建了一个可以执行此类操作的模板(我的示例创建了一个新模板,因此它应该进入基本主题) :
      2. 应用/设计/前端/碱/默认/模板/目录/产品/列表/ upsell_json.phtml

        public function addCustomUpsellFormat(Varien_Event_Observer $observer)
        {
            /* @var Mage_Core_Block_Abstract $block */
            $block = $observer->getBlock();
            if ($block instanceof Mage_Catalog_Block_Product_List_Upsell) {
                /* @var Varien_Object $transport */
                $transport = $observer->getTransport();
                // Receive the standard output for the block.
                $output = $transport->getHtml();
        
                /* @var Mage_Core_Model_Layout $layout */
                $layout = $block->getLayout();
                $json = $layout->createBlock('core/template')
                    ->setTemplate('catalog/product/list/upsell_json.phtml')
                    ->setItems($block->getItems())
                    ->toHtml();
        
                // Append new JSON data to block output.
                $transport->setHtml($output . $json);
            }
            return $this;
        }
        

答案 1 :(得分:0)

使用

$controller = $observer->getEvent()->getAction();

而不是

$controller = $observer->getAction();