Best Practice zum Hinzufügen einer benutzerdefinierten Registerkarte in den Produktdetails (Backend)


9

Ich möchte den Produktdetails (Backend) eine zusätzliche Registerkarte hinzufügen und möchte nach Möglichkeit keine Überschreibung durchführen.

Was ist der beste Weg, um dies zu erreichen?

Antworten:


16

Persönlich würde ich mich für einen Layout- / Aktionsansatz entscheiden, der addTab()den von bereitgestellten verwendetMage_Adminhtml_Block_Widget_Tabs

Hier sind also 2 Hauptaktionen beteiligt:

  1. Änderungen am XML-Layout hinzufügen
  2. Erstellen Sie die Registerkartenklasse
  3. (All dies kann erreicht werden, um ein neues Modul zu erstellen, das hier nicht in den Geltungsbereich fällt.)

- 1. Layoutänderungen -

<?xml version="1.0"?>
<layout>
     <adminhtml_catalog_product_edit>
        <reference name="product_tabs">
            <block type="MODULENAME/adminhtml_catalog_product_edit_tab" name="custom_tab"/>
            <action method="addTab">
                <name>Custom Tab</name>
                <block>custom_tab</block>
            </action>
        </reference>
    </adminhtml_catalog_product_edit>
</layout>

- 2. Tab-Klasse -

<?php
class NAMESPACE_MODULENAME_Block_Adminhtml_Catalog_Product_Edit_Tab extends Mage_Adminhtml_Block_Widget
    implements Mage_Adminhtml_Block_Widget_Tab_Interface
{
    public function canShowTab()
    {
        return true;
    }
    public function getTabLabel()
    {
        return $this->__('Custom Tab');
    }
    public function getTabTitle()
    {
        return $this->__('Custom Tab');
    }
    public function isHidden()
    {
        return false;
    }
    public function getTabUrl()
    {
        return $this->getUrl('*/*/customtab', array('_current' => true));
    }
    public function getTabClass()
    {
        return 'ajax';
    }
} 

Hinweis:
Es gibt nur sehr wenige Dokumentationen zur Backend-Entwicklung. Ich fühle mich wie Magento Devs. sind etwas schüchtern, um Wissen über diesen Bereich zu teilen (und deshalb der obigen Frage.)

Quelle:
Diese Technik finden Sie hier:
- http://www.webspeaks.in/2012/02/create-custom-tab-in-magento-product-addedit-page.html und auch in den Kommentaren dieses Inchoo-Artikels :
- http://inchoo.net/ecommerce/magento/how-to-add-custom-product-relations-in-magento/


4

Hier ist, wie ich es mache.

Erstellen Sie einen Beobachter für das Ereignis core_block_abstract_prepare_layout_after. Ich bin mir nicht sicher, ob es das beste Event ist.

<adminhtml>
    ...
    <events>
       <core_block_abstract_prepare_layout_after>
            <observers>
                <[namespace]_[module]_product>
                    <type>singleton</type>
                    <class>[module]/adminhtml_observer</class>
                    <method>addProductTabBlock</method>
                </[namespace]_[module]_product>
            </observers>
       </core_block_abstract_prepare_layout_after>
    </events>
    ....
</adminhtml>

Dann erstellen Sie den Beobachter

class [Namespace]_[Module]_Model_Adminhtml_Observer {
    //this checks if the tab can be added. You don't want to add the tab when selecting the product type and attribute set or when selecting the configurable attributes.
    protected function _canAddTab($product){
        if ($product->getId()){
            return true;
        }
        if (!$product->getAttributeSetId()){
            return false;
        }
        $request = Mage::app()->getRequest();
        if ($request->getParam('type') == 'configurable'){
            if ($request->getParam('attributes')){
                return true;
            }
        }
        return false;
    }
    //the method that actually adds the tab
    public function addProductTabBlock($observer){
        $block = $observer->getEvent()->getBlock();
        $product = Mage::registry('product');
        //if on product tabs block and the tab can be added...
        if ($block instanceof Mage_Adminhtml_Block_Catalog_Product_Edit_Tabs && $this->_canAddTab($product)){
            //in case there is an ajax tab
            $block->addTab('some_identifier_here', array(
                'label' => Mage::helper('catalog')->__('Some Label here'),

                'url'   => Mage::helper('adminhtml')->getUrl('adminhtml/some_url/here', array('_current' => true)),
                'class' => 'ajax', 
            ));
            //in case it's a simple content tab
            $block->addTab('other_identifier_here', array(
                 'label'     => Mage::helper('catalog')->__('Label here'),
                'content'   => $this->getLayout()->createBlock('[module]/block_alias')->toHtml(),
            )); 
        }
        return $this;
    }
}

So stellen Sie sicher , dass Sie ersetzen [namespace]und [module]mit den Werten , die Sie für Ihr Modul.


Dies ist keine bewährte Methode
Fra

2
@Fra Ich habe es nicht gesagt. Die Antwort begann mit "So mache ich das." Und es funktioniert. Fühlen Sie sich frei, es herauszufordern, zu ändern oder mit einer besseren Alternative zu kommen.
Marius

Es ist gut, diesen Ansatz zu haben, damit wir alle möglichen Lösungen auf dieser Seite sammeln können. (Überprüfen Sie meine Antwort für eine "Magento" Weise)
Fra

@Fra. Interessant. Ich werde es versuchen.
Marius

@Marius, ich möchte ein neues Menü wie Katalog-> Produkte verwalten erstellen. Gibt es eine Möglichkeit zur Durchführung. Genaue Kopie des Katalogs -> Produkte verwalten.
Mujahidh

2

Fügen Sie Ihrer config.xmlDatei den folgenden Code hinzu

<blocks>
...
    <modulename>
        <class>Company_ModuleName_Block</class>
    </modulename>
    <adminhtml>
        <rewrite>
             <catalog_product_edit_tabs>Company_ModuleName_Block_Adminhtml_Tabs</catalog_product_edit_tabs>
         </rewrite>
     </adminhtml>
...
</blocks>

Danach sollten Sie eine neue Datei erstellen: Company/ModuleName/Block/Adminhtml/Tabs.php

<?php

class Company_ModuleName_Block_Adminhtml_Tabs extends Mage_Adminhtml_Block_Catalog_Product_Edit_Tabs
{
    private $parent;

    protected function _prepareLayout()
    {
        //get all existing tabs
        $this->parent = parent::_prepareLayout();
        //add new tab
        $this->addTab('tabid', array(
                     'label'     => Mage::helper('catalog')->__('New Tab'),
                     'content'   => $this->getLayout()
             ->createBlock('modulename/adminhtml_tabs_tabid')->toHtml(),
        ));
        return $this->parent;
    }
}

Erstellen Sie als Nächstes eine Datei: Company/ModuleName/Block/Adminhtml/Tabs/Tabid.php

<?php

class Company_ModuleName_Block_Adminhtml_Tabs_Tabid extends Mage_Adminhtml_Block_Widget
{
    public function __construct()
    {
        parent::__construct();
        $this->setTemplate('modulename/newtab.phtml');
    }
}

app / code / local / Mage / Adminhtml / Block / Katalog / Produkt / Bearbeiten / Tabs.php

) und fügen Sie der Funktion das folgende Snippet hinzu _prepareLayout()

$this->addTab('tabid', array(
              'label'     => Mage::helper('catalog')->__('New Tab'),
              'content'   => $this->_translateHtml($this->getLayout()
     ->createBlock('modulname/adminhtml_tabs_tabid')->toHtml()),
));

Sie können jederzeit eine lokale Kerndatei erstellen.


Umschreiben war nicht erwünscht, trotzdem ist es gut, diesen Ansatz zu haben, damit wir hier alle möglichen Lösungen haben
Fra

Wir können das Umschreiben immer vermeiden, indem wir ein lokales erstellen. Wenn Sie Ihren persönlichen Favoriten haben, ist es besser, damit fortzufahren. Viel Glück
TBI Infotech

Diese letzte Antwort ist wirklich nicht gut ... lokal sollte nur als letzte Lösung verwendet werden, es ist wirklich schlimmer als eine Umschreibung zu verwenden
Fra

Bitte schlagen Sie vor, wie das Erstellen eines lokalen das Umschreiben schlechter macht.
TBI Infotech

Hast du jemals Magento aktualisiert? local sollte niemals verwendet werden, dies ist eine bewährte Methode ... local ist fast so, als würde man eine Kerndatei bearbeiten.
Fra
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.