Magento: Добавить вкладку на страницу с информацией о заказе администратора - PullRequest
3 голосов
/ 28 августа 2011

Я создал пользовательский модуль 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 / 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 Я заметил, что в разделе сообщества есть еще один модуль, переопределяющий тот же контроллер, но, похоже, переопределение также не действует.Несмотря на это, я полностью удалил сторонний модуль для целей отладки, чтобы гарантировать отсутствие помех.

1 Ответ

1 голос
/ 30 августа 2011

Ну, это не первый раз, когда решение оказалось не таким, как я ожидал. Как я упоминал в ответ на комментарии OSDave выше, мой код модуля был написан именно так, как и должно быть - проблема была в том, что другой модуль переопределял тот же контроллер.

Для дальнейшего использования, если вы считаете, что переопределение контроллера выполнено правильно (admin или frontend - должны быть одинаковыми в любом случае), но оно не работает, я настоятельно рекомендую использовать «Mage::getConfig()->getNode('admin/routers/adminhtml')» для отладки. Просто убедитесь, что XPath в методе getNode соответствует модулю, который вы переопределяете, и затем найдите все записи, которые явно не являются Magento.

Надеюсь, это сэкономит некоторым другим те часы, которые я потратил на решение этой проблемы.

Ура, Zac

...