我创建了一个自定义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。我注意到社区部分中有另一个模块覆盖同一个控制器 - 但是该覆盖似乎也没有生效。无论如何,我已经完全删除了第三方模块以进行调试,以确保没有干扰。
答案 0 :(得分:1)
嗯,这不是第一次解决方案不是我期望的那样。正如我在回复上面的OSDave评论中提到的那样,我的模块代码完全按照应有的方式编写 - 问题在于另一个模块覆盖了同一个控制器。
为了将来参考,如果你认为你的控制器覆盖正确(管理员或前端 - 应该是相同的两种方式)但它不起作用,我强烈建议使用“Mage::getConfig()->getNode('admin/routers/adminhtml')
”来调试。只需确保getNode方法中的XPath适用于您要覆盖的模块,然后查找任何不明显Magento的条目。
希望这可以节省一些其他人浪费在这个问题上的时间。
干杯, 扎克