Najlepsza praktyka dodawania niestandardowej karty w szczegółach produktu (backend)

9

Chciałbym dodać dodatkową kartę do szczegółów produktu (backend) i nie chcę, jeśli to możliwe, zastępować.

Jaki jest najlepszy sposób na osiągnięcie tego?

Fra
źródło

Odpowiedzi:

16

Osobiście wybrałbym podejście do układu / działania z wykorzystaniem addTab()dostarczonego przezMage_Adminhtml_Block_Widget_Tabs

W grę wchodzą więc 2 główne działania:

  1. dodaj zmiany układu XML
  2. utwórz klasę tabulatorów
  3. (wszystko to można osiągnąć, tworząc nowy moduł poza zakresem tutaj)

- 1. Zmiany układu -

<?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. Klasa tab -

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

Uwaga:
Istnieje bardzo mało dokumentacji na temat tworzenia backendów, czuję się jak Magento Devs. trochę nieśmiało dzielą się wiedzą na ten temat (i właśnie dlatego powyższe pytanie).

Źródło:
Tę technikę można znaleźć tutaj:
- http://www.webspeaks.in/2012/02/create-custom-tab-in-magento-product-addedit-page.html, a także w komentarzach do tego artykułu Inchoo :
- http://inchoo.net/ecommerce/magento/how-to-add-custom-product-relations-in-magento/

Fra
źródło
4

Oto jak to robię.

Utwórz obserwatora wydarzenia core_block_abstract_prepare_layout_after. Nie jestem jednak pewien, czy to najlepsze wydarzenie.

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

Następnie utwórz obserwatora

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

Tylko pamiętaj, aby zastąpić [namespace]i [module]wartościami, które masz na module.

Marius
źródło
nie jest to najlepsza praktyka
Fra
2
@Fra Nie powiedziałem, że jest. Odpowiedź zaczęła się od „Oto jak to zrobić”. I to działa. Możesz rzucić mu wyzwanie, zmienić go lub znaleźć lepszą alternatywę.
Marius
dobrze jest mieć takie podejście, abyśmy mogli zebrać wszystkie możliwe rozwiązania na tej stronie. (sprawdź moją odpowiedź w celu uzyskania bardziej „Magento”)
Fra
@Fra. Ciekawy. Spróbuję.
Marius
@Marius, chcę utworzyć nowe menu, takie jak katalog-> zarządzaj produktami. Czy jest jakiś sposób na wykonanie. Dokładna kopia katalogu-> zarządzanie produktami.
Mujahidh
2

Dodaj następujący kod do swojego config.xmlpliku

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

Następnie należy utworzyć nowy plik: 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;
    }
}

Następnie utwórz plik: 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

) i dodaj następujący fragment kodu do funkcji _prepareLayout()

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

Zawsze możesz utworzyć plik lokalny dowolnego pliku podstawowego.

TBI Infotech
źródło
przepisanie nie było mile widziane, w każdym razie dobrze jest mieć takie podejście, więc mamy tutaj wszystkie możliwe rozwiązania
Fra
Zawsze możemy uniknąć przepisywania, tworząc lokalny, w każdym razie, gdy masz osobistego faworyta, lepiej jest kontynuować. Powodzenia
TBI Infotech
ta ostatnia odpowiedź nie jest naprawdę dobra ... lokalna powinna być używana tylko jako ostatnie rozwiązanie, jest naprawdę najgorsza niż przepisanie
Fra
Proszę zasugerować, w jaki sposób tworzenie lokalnych gorzej przepisuje?
TBI Infotech
czy kiedykolwiek aktualizowałeś Magento? lokalny nigdy nie powinien być używany, jest to najlepsza praktyka ... lokalny jest prawie jak edycja pliku podstawowego.
Fra