3

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

这是我的代码:

应用程序/代码/本地/Zac/攻击/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>

app/code/local/Zac/Attack/Block/Adminhtml/Sales/Order/View/Tab/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' );
    }
}

app/code/local/Zac/Attack/controllers/Adminhtml/Sales/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>');
    }
}

app/design/adminhtml/default/default/layout/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()->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 信息时答案片段太多,没有足够的完整答案)。

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

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

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

干杯,扎克

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

4

1 回答 1

1

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

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

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

干杯,扎克

于 2011-08-30T00:35:57.327 回答