Prática recomendada para adicionar uma guia personalizada aos detalhes do produto (back-end)

9

Gostaria de adicionar uma guia extra aos detalhes do produto (back-end) e não quero fazer nenhuma substituição, se possível.

Qual é o melhor jeito de concluir isso ?

Fra
fonte

Respostas:

16

Pessoalmente, eu adotaria uma abordagem de layout / ação usando o addTab()fornecido peloMage_Adminhtml_Block_Widget_Tabs

Então, duas ações principais estão envolvidas aqui:

  1. adicionar alterações de layout XML
  2. crie a classe tab
  3. (tudo isso pode ser feito criando um novo módulo, fora do escopo aqui)

- 1. Alterações no 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. Classe da guia -

<?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:
Há muito pouca documentação sobre desenvolvimento de back-end, eu me sinto como o Magento Devs. são um pouco tímidos em compartilhar conhecimento sobre essa área (e é por isso da pergunta acima).

Fonte:
Essa técnica pode ser encontrada aqui:
- http://www.webspeaks.in/2012/02/create-custom-tab-in-magento-product-addedit-page.html e também nos comentários deste artigo do Inchoo :
- http://inchoo.net/ecommerce/magento/how-to-add-custom-product-relations-in-magento/

Fra
fonte
4

Aqui está como eu faço isso.

Crie um observador para o evento core_block_abstract_prepare_layout_after. Não tenho certeza se é o melhor 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>

Então crie o 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;
    }
}

Apenas certifique-se de substituir [namespace]e [module]pelos valores que você possui para o seu módulo.

Marius
fonte
esta não é uma prática recomendada
Fra
2
@Fra eu não disse que é. A resposta começou com "Aqui está como eu faço isso". E isso funciona. Sinta-se à vontade para desafiá-lo, alterá-lo ou oferecer uma alternativa melhor.
Marius
é bom ter essa abordagem para que possamos coletar todas as soluções possíveis nesta página. (Veja a minha resposta para uma forma mais "Magento")
Fra
@Fra. Interessante. Eu vou tentar isso.
Marius
@ Marius, eu quero criar um novo menu como catálogo-> gerenciar produtos. Existe alguma maneira de executar. Cópia exata do catálogo -> gerenciar produtos.
precisa saber é o seguinte
2

Adicione o seguinte código ao seu config.xmlarquivo

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

Depois disso, você deve criar um novo arquivo: 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;
    }
}

Em seguida, crie um arquivo: 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

) e adicione o seguinte trecho à função _prepareLayout()

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

Você sempre pode criar um local de qualquer arquivo principal.

TBI Infotech
fonte
reescrever não foi bem-vindo, de qualquer maneira, é bom ter essa abordagem, para que tenhamos toda a solução possível aqui #
Fra Fra
Sempre podemos evitar a reescrita criando um local, de qualquer maneira, quando você tiver seu favorito, é melhor continuar com isso. Boa sorte
TBI Infotech
esta última resposta não é realmente bom ... local apenas deve ser utilizado como última solução, é muito pior do que o uso de uma reescrita
Fra
Por favor, sugira como a criação de um local piora a reescrita?
TBI Infotech
você já atualizou o magento? local nunca deve ser usado, essa é uma prática recomendada ... local é quase como editar o arquivo principal.
Fra