【问题标题】:Add Dynamic JS Code on Magento Product Page在 Magento 产品页面上添加动态 JS 代码
【发布时间】:2015-06-25 13:50:33
【问题描述】:

在我的 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代码的正确方法是什么?

【问题讨论】:

    标签: javascript magento


    【解决方案1】:

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

    1. 观察core_block_abstract_to_html_after事件:

    etc/config.xml

    <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>
    
    1. Mage_Catalog_Block_Product_List_Upsell 的实例采取行动,附加一个读取其数据的新块的输出:

    模型/观察者.php

    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. 创建一个解释加售数据并以您想要的方式输出的模板,在我上面的示例中,我创建了一个可以执行类似操作的模板(我的示例创建了一个新模板,因此它应该进入基本主题) :

    app/design/frontend/base/default/template/catalog/product/list/upsell_json.phtml

    <?php
    $_json = array(); // Add data in here to convert to JSON for output.
    $_items = $this->getItems();
    /* @var Mage_Catalog_Model_Product $_product */
    foreach ($_items as $_product) {
        $_json[$_product->getId()] = array(
            'image' => (string)Mage::helper('catalog/image')->init($_product, 'image')
        );
    }
    ?>
    <script type="text/javascript">var upsellData = <?php echo json_encode($_json) ?>;</script>
    

    【讨论】:

      【解决方案2】:

      使用

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

      而不是

      $controller = $observer->getAction();
      

      【讨论】:

      • 同样的问题 致命错误:在非对象中调用成员函数 append()
      • 哦。行。试试$layout = $observer-&gt;getEvent()-&gt;getLayout();
      • 同样的问题。我认为 controller_action_layout_load_before 是使用 getLayout() 的错误观察者
      猜你喜欢
      • 2017-10-07
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      相关资源
      最近更新 更多