Рекомендации по добавлению пользовательской вкладки в сведения о продукте (серверная часть)

9

Я хотел бы добавить дополнительную вкладку к деталям продукта (бэкэнд), и я не хочу выполнять какие-либо изменения, если это возможно.

Каков наилучший способ сделать это?

От
источник

Ответы:

16

Лично я бы пошел на макет / действия, используя addTab()предоставленныйMage_Adminhtml_Block_Widget_Tabs

Итак, здесь задействованы 2 основных действия:

  1. добавить изменения макета XML
  2. создать класс вкладки
  3. (всего этого можно добиться, создав новый модуль, выходящий за рамки здесь)

- 1. Изменения макета -

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

Примечание:
документации по бэкэнд-разработке очень мало, я чувствую себя разработчиком Magento. стесняются делиться знаниями об этой области (и именно поэтому вышеупомянутый вопрос.)

Источник:
эту технику можно найти здесь:
- http://www.webspeaks.in/2012/02/create-custom-tab-in-magento-product-addedit-page.html, а также в комментариях к этой статье Inchoo :
- http://inchoo.net/ecommerce/magento/how-to-add-custom-product-relations-in-magento/

От
источник
4

Вот как я это делаю.

Создать наблюдателя на событие core_block_abstract_prepare_layout_after. Не уверен, что это лучшее событие.

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

Затем создайте наблюдателя

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

Просто убедитесь, что вы заменили [namespace]и [module]на значения, которые у вас есть для вашего модуля.

Мариус
источник
это не лучшая практика
Fra
2
@Fra я не сказал, что это так. Ответ начался с «Вот как я это делаю». И это работает. Не стесняйтесь бросить ему вызов, изменить его или предложить лучшую альтернативу.
Мариус
хорошо иметь такой подход, чтобы мы могли собрать все возможные решения на этой странице. (проверьте мой ответ для более "Magento" пути)
Fra
@Fra. Интересно. Я попробую.
Мариус
@Marius, я хочу создать новое меню, например, каталог-> управлять продуктами. Есть ли способ выполнить. Точная копия каталога -> управлять продуктами.
Моджахед
2

Добавьте следующий код в ваш config.xmlфайл

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

После этого вы должны создать новый файл: 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;
    }
}

Далее создайте файл: 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');
    }
}

Приложение / код / ​​местные / Mage / Adminhtml / Block / Каталог / продукта / Редактировать / Tabs.php

) и добавьте следующий фрагмент к функции _prepareLayout()

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

Вы всегда можете создать локальный файл любого ядра.

TBI Infotech
источник
переписывать не хотелось, во всяком случае, хорошо иметь такой подход, поэтому у нас есть все возможные решения
Fra
Мы всегда можем избежать переписывания, создавая локальный, в любом случае, когда у вас есть ваш любимый, лучше продолжать с этим. Удачи
TBI Infotech,
этот последний ответ действительно не очень хорош ... local следует использовать только как последнее решение, это действительно хуже, чем использовать переписывание
Fra
Пожалуйста, предложите, как создание локального хуже переписать?
TBI Infotech
Вы когда-нибудь обновляли magento? Локальный никогда не должен использоваться, это лучшая практика ... Локальный почти как редактировать основной файл.
Фра