Práctica recomendada para agregar una pestaña personalizada en los detalles del producto (backend)

Respuestas:

16

Personalmente, optaría por un enfoque de diseño / acción utilizando el addTab()proporcionado porMage_Adminhtml_Block_Widget_Tabs

Entonces 2 acciones principales están involucradas aquí:

  1. agregar cambios de diseño XML
  2. crear la clase de tabulación
  3. (todo esto se puede lograr creando un nuevo módulo, fuera del alcance aquí)

- 1. Cambios de diseño -

<?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. Clase de tabulación -

<?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:
Hay muy poca documentación sobre el desarrollo de backend, me siento como desarrolladores de Magento. son un poco tímidos para compartir conocimientos sobre esta área (y esa es la razón de la pregunta anterior).

Fuente:
esta técnica se puede encontrar aquí:
- http://www.webspeaks.in/2012/02/create-custom-tab-in-magento-product-addedit-page.html y también en los comentarios de este artículo de Inchoo :
- http://inchoo.net/ecommerce/magento/how-to-add-custom-product-relations-in-magento/

Fra
fuente
4

Así es como lo hago.

Crea un observador para el evento core_block_abstract_prepare_layout_after. Sin embargo, no estoy seguro de si es el mejor 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>

Luego crea el observador

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

Solo asegúrese de reemplazar [namespace]y [module]con los valores que tiene para su módulo.

Marius
fuente
esta no es una práctica recomendada
Fra
2
@ Fra, no dije que lo fuera. La respuesta comenzó con "Así es como lo hago". Y funciona. Siéntase libre de desafiarlo, cambiarlo o venir con una mejor alternativa.
Marius
Es bueno tener este enfoque para que podamos recopilar todas las soluciones posibles en esta página. (verifique mi respuesta para una forma más "Magento")
Fra
@Fra. Interesante. Voy a probarlo.
Marius
@ Mario, quiero crear un nuevo menú como catálogo-> administrar productos. ¿Hay alguna forma de realizarlo? Copia exacta de catálogo-> administrar productos.
Mujahidh
2

Agregue el siguiente código a su config.xmlarchivo

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

Después de esto, debe crear un nuevo archivo: 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;
    }
}

A continuación, cree un archivo: 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

) y agregue el siguiente fragmento a la función _prepareLayout()

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

Siempre puede crear un local de cualquier archivo principal.

TBI Infotech
fuente
reescribir no fue bienvenido, de todos modos es bueno tener este enfoque, así que tenemos todas las soluciones posibles aquí
Fra
Siempre podemos evitar la reescritura creando un local, de todos modos, cuando tenga su favorito personal, es mejor proceder con eso. Buena suerte
TBI Infotech
esta última respuesta realmente no es buena ... local solo debe usarse como última solución, es realmente peor que usar una reescritura
Fra
Por favor, sugiera cómo crear un local empeora la reescritura
TBI Infotech
¿Alguna vez has actualizado Magento? local nunca debe usarse, esta es la mejor práctica ... local es casi como editar el archivo central.
Fra