2

我正在尝试在 magento 管理员的主订单详细信息页面上添加打印订单按钮。客户的旧 magento 有一个订单本身的打印按钮(已付款或未付款,不是发票)。看看它以前的样子:

订单栏

我在后端启用了模板提示,并且模板文件不包含该按钮。我已经浏览了几个核心文件...... html 如下所示。我如何将它变成适用于当前查看订单的 php 按钮?

<button  id="id_d808fbd2d533d4e7b8e4a3fcd6274251" title="Back" type="button" class="scalable back" onclick="setLocation('http://test.animalnecessity.com/index.php/admin/sales_order/index/order_id/15852/key/28a65aa166da1664c65971decf3e472c/')" style="">

我可以实现这个吗? Magento - 将按钮添加到销售订单视图页面(观察者/事件),如果是这样,我会将这段代码放在哪里?

我已经按照此处描述的典型模块结构对其进行了设置:http: //alanstorm.com/magento_config。我在 etc 文件夹中的 config.xml 有以下内容

<config>    
    <modules>
        <CaitlinHavener_printOrder>
            <version>0.1.0</version>
        </CaitlinHavener_printOrder>
    </modules>
    <global>
        <events>
            <core_block_abstract_to_html_before>
                <observers>
                <CaitlinHavener_printOrder>
                    <class>CaitlinHavener_printOrder_Model_Observer</class>
                    <method>orderPageButton</method>
                    <type>model</type>
                </CaitlinHavener_printOrder>
                </observers>
            </core_block_abstract_to_html_before>
        </events>
    </global>
</config>

我的 CaitlinHavener_printOrder.xml 以下

<config>    
    <modules>
        <CaitlinHavener_printOrder>
            <active>true</active>
            <codePool>local</codePool>
        </CaitlinHavener_printOrder>
    </modules>
</config>

和 Observer.php

<?php
// Order View Page button    
class CaitlinHavener_printOrder_Model_Observer
{
    public function orderPageButton( Varien_Event_Observer $observer )
    {
        if(get_class($block) =='Mage_Adminhtml_Block_Sales_Order_View'
            && $block->getRequest()->getControllerName() == 'sales_order')
        {
            $block->addButton('test_print', array(
                'label'     => 'Test',
                'onclick'   => 'setLocation(\'' . $block->getUrl('html/sales_order/print') . '\')',
                'class'     => 'go'
            ));
        }
    }
}
?>

这仍然行不通。有任何想法吗?

4

2 回答 2

2

这些按钮是在 Mage_Adminhtml_Block_Sales_Order_View::__construct 中使用 $this->addButton 函数调用创建的。

至于事件,您可以使用其中之一,但我不记得哪一个(如果有的话)适合调用。

要列出所有触发的事件,您可以使用 Mage::log( $name ); 将日志记录添加到 Mage::dispatchEvent 函数中。

使用该名称,您可以在 config.xml 中声明一个侦听器(在 config/global/events 标记路径下):

  <name_that_was_printed_by_the_above_function>
    <observers>
      <YourModuleNamespace_YourModuleName>
        <class>moduleName/observer</class>
        <method>functionName</method>
        <type>model</type>
      </YourModuleNamespace_YourModuleName>
    </observers>
  </name_that_was_printed_by_the_above_function>

然后创建一个模块类 Observer.php

class Namespace_ModuleName_Model_Observer
{
    public function functionName( Varien_Event_Observer $observer )
    {
        $block = $observer->getEvent()->getData( 'data_object' ); // this line may vary

        $block->addButton( ...stuff here... // take for reference the answer from the question you linked to
        return $this;
    }
}

但是就像我说的那样,可能没有一个观察者会满足您的需求,您将不得不找到另一个更具侵入性的解决方案......

编辑

您可能必须使用 core_block_abstract_to_html_before 并有一个 if 语句来检查它是否是正确的块......缺点是它为每个块提供了调用开销和 if 语句开销,所以我不确定它是否是最好的解决方案,但它肯定是侵入性最小的,因此我可能会使用它(如果发生此事件,应将“data_object”更改为“block”-事件在 Mage_Core_Block_Abstract::toHtml dispatchEvent 行中触发)。

编辑

在您的问题更新后,我测试了您的模块,就像我在评论中警告的那样,问题是您的模块名称 - 小写。

应用程序/etc/modules/CaitlinHavener_PrintOrder.xml

<?xml version="1.0" encoding="UTF-8"?>
<config>    
    <modules>
        <CaitlinHavener_PrintOrder>
            <active>true</active>
            <codePool>local</codePool>
        </CaitlinHavener_PrintOrder>
    </modules>
</config>

应用程序/代码/本地/CaitlinHavener/PrintOrder/etc/config.xml

<?xml version="1.0" encoding="UTF-8"?>
<config>    
    <modules>
        <CaitlinHavener_PrintOrder>
            <version>0.1.0</version>
        </CaitlinHavener_PrintOrder>
    </modules>
    <global>
        <events>
            <core_block_abstract_to_html_before>
                <observers>
                <CaitlinHavener_PrintOrder>
                    <class>CaitlinHavener_PrintOrder_Model_Observer</class>
                    <method>orderPageButton</method>
                    <type>model</type>
                </CaitlinHavener_PrintOrder>
                </observers>
            </core_block_abstract_to_html_before>
        </events>
    </global>
</config>

本地/CaitlinHavener/PrintOrder/Model/Observer.php

<?php
// Order View Page button    
class CaitlinHavener_PrintOrder_Model_Observer
{
    public function orderPageButton( Varien_Event_Observer $observer )
    {
      $block = $observer->getEvent()->getData( 'block' );

        if(get_class($block) =='Mage_Adminhtml_Block_Sales_Order_View'
            && $block->getRequest()->getControllerName() == 'sales_order')
        {
            $block->addButton('test_print', array(
                'label'     => 'Test',
                'onclick'   => 'setLocation(\'' . $block->getUrl('html/sales_order/print') . '\')',
                'class'     => 'go'
            ));
        }
    }
}
?>

请注意正确命名文件(注意大写字符)并复制代码,它应该可以工作。

于 2013-01-25T00:25:52.060 回答
0

@Domen Vrankar 略有改进

adminhtml_block_html_before只会在管理区域core_block_abstract_to_html_before发送,同时在管理和前端发送

    <events>
        <adminhtml_block_html_before>
            <observers>
            <CaitlinHavener_PrintOrder>
                <class>CaitlinHavener_PrintOrder_Model_Observer</class>
                <method>orderPageButton</method>
                <type>model</type>
            </CaitlinHavener_PrintOrder>
            </observers>
        </adminhtml_block_html_before>
    </events>

如果另一个模块重写Mage_Adminhtml_Block_Sales_Order_View,则将get_class($block)返回新的块类,例如 MagePal_Guest2Customer_Block_Adminhtml_Sales_Order_View 因此您的按钮将不再显示

<?php
// Order View Page button    
class CaitlinHavener_PrintOrder_Model_Observer
{
    public function orderPageButton( Varien_Event_Observer $observer )
    {
      $block = $observer->getEvent()->getData( 'block' );

        if($block->getId() == 'sales_order_view' && $block->getRequest()->getControllerName() == 'sales_order')
        { 
          ....
于 2013-05-20T15:00:14.770 回答