Best practice per aggiungere una scheda personalizzata nei dettagli del prodotto (backend)


9

Vorrei aggiungere una scheda aggiuntiva ai dettagli del prodotto (backend) e, se possibile, non voglio eseguire alcuna sostituzione.

Qual è il modo migliore per raggiungere questo obiettivo?

Risposte:


16

Personalmente sceglierei un approccio layout / azione usando il metodo addTab()fornito daMage_Adminhtml_Block_Widget_Tabs

Quindi qui sono coinvolte 2 azioni principali:

  1. aggiungere modifiche al layout XML
  2. crea la classe tab
  3. (tutto ciò può essere realizzato creando un nuovo modulo, fuori dallo scopo qui)

- 1. Modifiche al layout -

<?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 Class -

<?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';
    }
} 

Nota:
c'è pochissima documentazione sullo sviluppo del backend, mi sento come Magento Devs. sono un po 'timidi nel condividere le conoscenze su quest'area (ed è per questo motivo della domanda precedente).

Fonte:
questa tecnica può essere trovata qui:
- http://www.webspeaks.in/2012/02/create-custom-tab-in-magento-product-addedit-page.html e anche nei commenti di questo articolo di Inchoo :
- http://inchoo.net/ecommerce/magento/how-to-add-custom-product-relations-in-magento/


4

Ecco come lo faccio.

Crea un osservatore per l'evento core_block_abstract_prepare_layout_after. Non sono sicuro che sia il miglior evento.

<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>

Quindi crea l'osservatore

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;
    }
}

Assicurati di sostituire [namespace]e [module]con i valori che hai per il tuo modulo.


questa non è una buona pratica
Fra

2
@Fra Non ho detto che lo è. La risposta è iniziata con "Ecco come lo faccio.". E funziona Sentiti libero di sfidarlo, cambiarlo o trovare un'alternativa migliore.
Marius

è bene avere questo approccio in modo da poter raccogliere tutte le possibili soluzioni in questa pagina. (controlla la mia risposta per un modo più "magento")
Fra

@Fra. Interessante. Lo proverò.
Marius

@Marius, voglio creare un nuovo menu come catalogo-> gestire i prodotti. Esiste un modo per eseguire. Copia esatta del catalogo-> gestire i prodotti.
Mujahidh,

2

Aggiungi il seguente codice al tuo config.xmlfile

<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>

Dopo questo dovresti creare un nuovo file: 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;
    }
}

Quindi, crea un file: 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 / blocchi / Catalogo / Prodotti / Modifica / Tabs.php

) e aggiungi il seguente frammento alla funzione _prepareLayout()

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

È sempre possibile creare un locale di qualsiasi file principale.


riscrivere non era il benvenuto, comunque è bene avere questo approccio quindi abbiamo tutte le possibili soluzioni qui
Fra

Possiamo sempre evitare di riscrivere creando un locale, comunque quando hai il tuo preferito personale, è meglio procedere con quello. Buona fortuna
TBI Infotech,

quest'ultima risposta non è davvero buona ... local dovrebbe essere usato solo come ultima soluzione, è davvero peggio che usare una riscrittura
Fra

Per favore, suggerisci come sta peggiorando la riscrittura della creazione di un locale?
TBI Infotech,

hai mai aggiornato magento? local non dovrebbe mai essere usato, questa è la migliore pratica ... local è quasi come modificare il file core.
Fra
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.