Magento:将选项卡添加到管理订单详细信息页面
我创建了一个自定义 Magento 模块,它通过一些自定义用户输入扩展了核心销售订单功能。下订单后,我想在管理区域的订单详细信息页面上的自定义选项卡中显示此数据。我已经设法让新选项卡显示在选项卡列表中,但是当我单击该选项卡时,它给出了 404。
这是我的代码:
app/code/local/Zac/Attack/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/本地/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
)
所以,我的第一个问题是:Am我遵循正确的方法向页面添加自定义选项卡吗?
如果我没有遵循正确的方法,您能否告诉我正确的方法是什么,或者提供一个清晰概述整个方法的链接(搜索 Magento 信息时有太多答案片段,没有足够的完整答案)。
如果我遵循正确的方法,为什么我的控制器没有覆盖?
好吧,我希望我已经提供了足够的细节来澄清问题。如果没有,请随时在评论中提出后续问题,我将很乐意详细说明 - 如果我知道如何做。
预先感谢您提供的任何帮助。
干杯, 扎克
P.S.我注意到社区部分中有另一个模块覆盖了同一个控制器 - 但是该覆盖似乎也没有生效。不管怎样,为了调试的目的,我已经完全删除了第3方模块,以确保没有干扰。
I have created a custom Magento module which extends the core sales order functionality with some custom user input. After an order has been placed I would like to display this data in a custom tab on the order detail page of the admin area. I have managed to get the new tab displaying in the tab list however when I click on the tab it gives me a 404.
Here's my code:
app/code/local/Zac/Attack/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>
What appears to be failing is the controller override. Neither the overriden method "viewAction()" nor the custom action "attackAction()" get called. I can tell that the config is being picked up because when I print "Mage::getConfig()->getNode('admin/routers/adminhtml')" I can see the following output:
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
)
So, my first question is: Am I following the correct approach for adding a custom tab to the page?
If I am not following the correct approach can you please advise me what the correct approach is or provide a link which clearly outlines the whole approach (there are too many answer fragments when searching for Magento information, not enough whole answers).
If I am following the correct approach, why is my controller not overriding?
Well, I hope that I've provided enough detail to make the problem clear. If not, feel free to post follow up questions in the comments and I'll be happy to elaborate - if I know how.
Thanks in advance for any help offered.
Cheers,
Zac
P.S. I noticed that there is another module in the community section overriding the same controller - however that override doesn't appear to be taking effect either. Regardless, I have completely removed the 3rd party module for the purposes of debugging to ensure that there is no interference.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
好吧,这并不是第一次解决方案与我的预期不符。正如我在回复上面 OSDave 的评论时提到的,我的模块代码完全按照应有的方式编写 - 问题在于另一个模块覆盖了同一控制器。
为了将来的参考,如果您认为您已经正确完成了控制器覆盖(管理或前端 - 应该是相同的)但它不起作用,我强烈建议使用“
Mage::getConfig()- >getNode('admin/routers/adminhtml')
" 进行调试。只需确保 getNode 方法中的 XPath 适合您要覆盖的模块,然后查找任何不是明显 Magento 的条目。希望这能节省其他人在这个问题上浪费的时间。
干杯,
扎克
Well, this isn't the first time the solution wasn't what I was expecting it to be. As I mentioned in reply to OSDave's comments above, my module code was written exactly as it should be - the problem was with another module overriding the same controller.
For future reference, if you think you've got your controller override done right (admin or frontend - should be the same either way) but it isn't working, I highly recommend using "
Mage::getConfig()->getNode('admin/routers/adminhtml')
" to debug. Just make sure the XPath in the getNode method is appropriate for the module you're overriding and then look for any entries that aren't clearly Magento.Hopefully this will save some others the hours I wasted on the problem.
Cheers,
Zac