Meilleure pratique pour ajouter un onglet personnalisé dans les détails du produit (backend)


9

Je voudrais ajouter un onglet supplémentaire aux détails du produit (backend) et je ne veux pas effectuer de remplacement, si possible.

Quelle est la meilleure façon d'y parvenir ?

Réponses:


16

Personnellement, j'opterais pour une approche de mise en page / action en utilisant le addTab()fourni parMage_Adminhtml_Block_Widget_Tabs

Donc 2 actions principales sont impliquées ici:

  1. ajouter des modifications de disposition XML
  2. créer la classe d'onglets
  3. (tout cela peut être accompli en créant un nouveau module, hors de portée ici)

- 1. Modifications de mise en page -

<?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. Classe d'onglets -

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

Remarque:
Il y a très peu de documentation sur le développement backend, je me sens comme Magento Devs. sont un peu timides pour partager des connaissances sur ce domaine (et c'est pourquoi de la question ci-dessus.)

Source:
Cette technique peut être trouvée ici:
- http://www.webspeaks.in/2012/02/create-custom-tab-in-magento-product-addedit-page.html et aussi dans les commentaires de cet article Inchoo :
- http://inchoo.net/ecommerce/magento/how-to-add-custom-product-relations-in-magento/


4

Voici comment je le fais.

Créez un observateur pour l'événement core_block_abstract_prepare_layout_after. Je ne sais pas si c'est le meilleur événement.

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

Créez ensuite l'observateur

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

Assurez-vous simplement de remplacer [namespace]et [module]avec les valeurs que vous avez pour votre module.


ce n'est pas une bonne pratique
Fra

2
@Fra Je ne l'ai pas dit. La réponse a commencé par "Voici comment je le fais.". Et il fonctionne. N'hésitez pas à le modifier, à le changer ou à proposer une meilleure alternative.
Marius

il est bon d'avoir cette approche afin que nous puissions collecter toutes les solutions possibles dans cette page. (vérifier ma réponse pour une manière plus "Magento")
Fra

@Fra. Intéressant. Je vais essayer.
Marius

@Marius, je veux créer un nouveau menu comme catalogue-> gérer les produits. Existe-t-il un moyen d'effectuer une copie exacte du catalogue-> gérer les produits.
Mujahidh

2

Ajoutez le code suivant à votre config.xmlfichier

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

Après cela, vous devez créer un nouveau fichier: 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;
    }
}

Ensuite, créez un fichier: 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 / Catalog / Product / Edit / Tabs.php

) et ajoutez l'extrait de code suivant à la fonction _prepareLayout()

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

Vous pouvez toujours créer une section locale de n'importe quel fichier principal.


la réécriture n'était pas la bienvenue, de toute façon il est bon d'avoir cette approche donc nous avons toutes les solutions possibles ici
Fra

Nous pouvons toujours éviter de réécrire en créant un local, de toute façon lorsque vous avez votre favori personnel, il vaut mieux procéder avec cela. Bonne chance
TBI Infotech

cette dernière réponse n'est vraiment pas bonne ... local ne devrait être utilisé que comme dernière solution, c'est vraiment pire que d'utiliser une réécriture
Fra

Veuillez suggérer comment la création d'un local est-elle pire que la réécriture?
TBI Infotech

avez-vous déjà mis à jour magento? local ne devrait jamais être utilisé, c'est la meilleure pratique ... local est presque comme éditer le fichier core.
Fra
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.