Magento: Registerkarte Hinzufügen zu Admin, Um die Seite Details

Habe ich eine custom Magento-Modul erweitert die core-Kundenauftrag-Funktionalität mit einige benutzerdefinierte Eingabe. Nachdem eine Bestellung eingegangen ist, möchte ich die Anzeige dieser Daten in einer benutzerdefinierten Registerkarte auf der Bestellung-detail-Seite der admin-Bereich. Ich habe es geschafft die neue Registerkarte Darstellung in der Registerkarte Liste aber wenn ich auf der Registerkarte klicken, es gibt mir ein 404.

Hier ist mein 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>

Was scheint zu scheitern, ist den controller zu überschreiben. Weder der überschreiben-Methode "viewAction()" noch die benutzerdefinierte Aktion "attackAction()" aufgerufen. Ich kann sagen, dass die config wird Sie abgeholt, weil, wenn ich drucken "Mage::getConfig()->getNode('admin/Router/adminhtml')" kann ich die folgende Ausgabe angezeigt werden:

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, meine erste Frage ist: Bin ich nach der richtigen Methode zum hinzufügen einer benutzerdefinierten Registerkarte auf der Seite?

Wenn ich mich nicht nach dem richtigen Ansatz, können Sie bitte mir raten, was der richtige Ansatz ist, oder einen link, der deutlich die Umrisse der gesamte Ansatz (es gibt zu viele Antwort-Fragmente bei der Suche nach Magento Informationen, nicht genug ganzen Antworten).

Wenn ich mich nach der richtige Ansatz, warum mein controller nicht überschreiben?

Gut, ich hoffe, ich habe genug detail, um das problem klar. Wenn nicht, fühlen Sie sich frei, um post-follow-up Fragen in den Kommentaren und ich werde glücklich sein, zu erarbeiten, wenn ich weiß, wie.

Vielen Dank im Voraus für jede Hilfe, die angeboten wird.

Cheers,
Zac

P. S. ich bemerkte, dass es ein anderes Modul in den community-Bereich überschreiben der gleichen controller - jedoch das überschreiben scheint nicht zu greifen entweder. Unabhängig davon, habe ich komplett entfernt, die 3rd-party-Modul für die Zwecke von debugging, um sicherzustellen, dass es keine Störungen.

  • was ist die url, die den 404?
  • Ich habe keinen Zugriff auf die app, wo ich jetzt bin, aber aus der Spitze von meinem Kopf, es ist (dies kann nicht exakt richtig sein, aber es zeigt das Problem): mydomain.com/admin/sales_order/attack/order_id/1/key/[key_value]. Die integrierte, um die detail-url mydomain.com/admin/sales_order/view/order_id/1/key/[key_value]. Hinweis der Unterschied ist nach '/sales_order/'.
  • es sieht ok für mich, ich verstehe nicht, warum die 404. Der cache deaktiviert ist richtig? Wenn Sie möchten, laden das Modul irgendwo und ich gebe einen Blick in eine lokale installation.
  • Wow, ich habe gerade herausgefunden, was das problem ist. Es dreht es wurde ein weiteres Modul überschreiben OrderController. Wenn man in der config-element Ausgabe-Sie werden sehen, "EM_DeleteOrder_Adminhtml" das ist ein community-Modul in das Projekt. Jetzt muss ich herausfinden, wie man den vererbungsbaum Recht -, ob die beiden anderen Modulen unabdingbar sind oder nicht, und was außer Kraft zu setzen oder Sie auszuschließen. Das muss ein Schmerz für 3rd-party-Modul-Entwickler - es muss sein, gemeinsam für zwei community-Module zu überschreiben, die der gleichen Klasse. Ich Frage mich, ob es eine gute design-pattern zu arbeiten, um die fehlende Mehrfachvererbung.
  • Trotzdem, vielen Dank für Ihre Zeit, Dave. Ich hoffe, jemand kann meine Frage als ein Beispiel, wie es funktionieren sollte (nicht, dass es nicht andere gute Quellen zum Thema) und sich bewusst sein, das verborgene Potenzial-Problem, das erlitt ich von hier.
  • Ich natürlich, aber entließ er, wie Sie sagte, entfernt man den third-party-extensions. Trotzdem, bin froh, dass Sie es herausfinden. happy coding
  • Ja, ich fühle mich ein bisschen wie ein idiot übersehen zu haben, dass man. Es scheint so offensichtlich jetzt, aber es hatte mir stecken weit mehr, als ich gerne zugeben! Sie nur aus Fehlern lernen, obwohl-und bei diesem Tempo, ich werde ein Magento master sehr bald auf die Anzahl der Fehler, die ich gemacht habe an diesem Projekt.

InformationsquelleAutor Zac Seth | 2011-08-27
Schreibe einen Kommentar