Magento:将标签添加到管理订单详细信息页面

时间:2011-08-27 20:18:24

标签: magento override adminhtml

我创建了一个自定义Magento模块,该模块通过一些自定义用户输入扩展了核心销售订单功能。下订单后,我想在管理区域的订单详细信息页面的自定义选项卡中显示此数据。我已设法在选项卡列表中显示新选项卡,但是当我单击选项卡时,它会给我一个404.

这是我的代码:

应用程序/代码/本地/扎克/攻击的/ etc / config.xml中:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Zac_Attack>
            <version>0.1.0</version>
        </Zac_Attack>
    </modules>
    <admin>
        <routers>
            <adminhtml>
                <args>
                    <modules>
                        <!-- Override Adminhtml module here. -->
                        <Zac_Attack_Adminhtml before="Mage_Adminhtml">Zac_Attack_Adminhtml</Zac_Attack_Adminhtml>
                    </modules>
                </args>
            </adminhtml>
        </routers>
    </admin>
    <adminhtml>
        <layout>
            <updates>
                <attack>
                    <file>attack.xml</file>
                </attack>
            </updates>
        </layout>
    </adminhtml>
    <global>
        <blocks>
            <attack>
                <class>Zac_Attack_Block</class>
            </attack>
        </blocks>
    <!-- models, resources, etc -->
    </global>
</config>

应用程序/代码/本地/扎克/攻击/座/ Adminhtml /销售/ /查看/标签/ Attack.php:

<?php

class Zac_Attack_Block_Adminhtml_Sales_Order_View_Tab_Design extends Mage_Adminhtml_Block_Template
    implements Mage_Adminhtml_Block_Widget_Tab_Interface
{
    protected function _construct()
    {
        parent::_construct();
        $this->setTemplate( 'attack/sales/order/view/tab/attack.phtml' );
    }

    public function getTabLabel()
    {
        return $this->__( 'Attack' );
    }

    public function getTabTitle()
    {
        return $this->__( 'Attack' );
    }

    public function getTabClass()
    {
        return '';
    }

    public function getClass()
    {
        return $this->getTabClass();
    }

    public function getTabUrl()
    {
        // Here the url gets rewritten to my custom name, throws 404 when called...
        // The url takes the form:
        // http://mydomain.com/admin/sales_order/attack/order_id/1/key/65cbb0c2956dd9413570a2ec8761bef5/
        return $this->getUrl('*/*/attack', array('_current' => true));
    }

    public function canShowTab()
    {
        return true;
    }

    public function isHidden()
    {
        return false;
    }

    public function getOrder()
    {
        return Mage::registry( 'current_order' );
    }
}

应用程序/代码/本地/扎克/攻击/控制器/ Adminhtml /销售/ OrderController.php:

<?php

require_once "Mage/Adminhtml/controllers/Sales/OrderController.php";

class Zac_Attack_Adminhtml_Sales_OrderController extends Mage_Adminhtml_Sales_OrderController
{
    public function viewAction()
    {
        // This doesn't get called when viewing the default order detail page.
        // I should see the <h1> output as the only content on the page but I don't.
        die( '<h1>viewAction()</h1>' );
    }

    public function attackAction()
    {
        // This should be called when the url has the pattern '*/*/attack' (as it does
        // when displaying my custom tab) however clicking this tab gives a 404.
        die('<h1>attackAction()</h1>');
    }
}

应用程序/设计/ adminhtml /默认/默认/布局/ attack.xml

<?xml version="1.0" encoding="UTF-8"?>
<layout>
    <adminhtml_sales_order_view>
        <reference name="sales_order_tabs">
            <action method="addTab">
                <name>order_design_details</name>
                <block>attack/adminhtml_sales_order_view_tab_design</block>
            </action>
        </reference>
    </adminhtml_sales_order_view>
</layout>

似乎失败的是控制器覆盖。无法调用覆盖方法“viewAction()”和自定义操作“attackAction()”。我可以告诉配置正在被选中,因为当我打印“Mage :: getConfig() - &gt; getNode('admin / routers / adminhtml')”时,我可以看到以下输出:

Mage_Core_Model_Config_Element Object
(
    [args] => Mage_Core_Model_Config_Element Object
        (
            [module] => Mage_Adminhtml
            [modules] => Mage_Core_Model_Config_Element Object
                (
                    [Mage_Index] => Mage_Index_Adminhtml
                    [Mage_Paygate] => Mage_Paygate_Adminhtml
                    [Mage_Paypal] => Mage_Paypal_Adminhtml
                    [widget] => Mage_Widget_Adminhtml
                    [Mage_GoogleOptimizer] => Mage_GoogleOptimizer_Adminhtml
                    [Mage_GoogleBase] => Mage_GoogleBase_Adminhtml
                    [Mage_Authorizenet] => Mage_Authorizenet_Adminhtml
                    [Mage_Bundle] => Mage_Bundle_Adminhtml
                    [Mage_Centinel] => Mage_Centinel_Adminhtml
                    [Mage_Compiler] => Mage_Compiler_Adminhtml
                    [connect] => Mage_Connect_Adminhtml
                    [Mage_Downloadable] => Mage_Downloadable_Adminhtml
                    [importexport] => Mage_ImportExport_Adminhtml
                    [Mage_PageCache] => Mage_PageCache_Adminhtml
                    [xmlconnect] => Mage_XmlConnect_Adminhtml
                    [EM_DeleteOrder_Adminhtml] => EM_DeleteOrder_Adminhtml
                    [find_feed] => Find_Feed_Adminhtml
                    [moneybookers] => Phoenix_Moneybookers
                    [Zac_Attack_Adminhtml] => Zac_Attack_Adminhtml
                )

            [frontName] => admin
        )

    [use] => admin
)

所以,我的第一个问题是:我是否遵循了向页面添加自定义标签的正确方法?

如果我没有遵循正确的方法,请告诉我正确的方法是什么,或者提供一个明确概述整个方法的链接(搜索Magento信息时答案片段太多,而不是全部答案)。

如果我遵循正确的方法,为什么我的控制器不会覆盖?

嗯,我希望我已经提供了足够的细节来解决问题。如果没有,请随时在评论中发布后续问题,我很乐意详细说明 - 如果我知道如何。

提前感谢您提供的任何帮助。

干杯, 扎克

P.S。我注意到社区部分中有另一个模块覆盖同一个控制器 - 但是该覆盖似乎也没有生效。无论如何,我已经完全删除了第三方模块以进行调试,以确保没有干扰。

1 个答案:

答案 0 :(得分:1)

嗯,这不是第一次解决方案不是我期望的那样。正如我在回复上面的OSDave评论中提到的那样,我的模块代码完全按照应有的方式编写 - 问题在于另一个模块覆盖了同一个控制器。

为了将来参考,如果你认为你的控制器覆盖正确(管理员或前端 - 应该是相同的两种方式)但它不起作用,我强烈建议使用“Mage::getConfig()->getNode('admin/routers/adminhtml')”来调试。只需确保getNode方法中的XPath适用于您要覆盖的模块,然后查找任何不明显Magento的条目。

希望这可以节省一些其他人浪费在这个问题上的时间。

干杯, 扎克