Найкраща практика додавання спеціальної вкладки в деталях продукту (бекенд)


9

Я хотів би додати додаткову вкладку до деталей про продукт (бекенд), і я не хочу робити жодних змін, якщо це можливо.

Який найкращий спосіб досягти цього?

Відповіді:


16

Особисто я б пішов на макет / підхід до дії, використовуючи addTab()надану компанієюMage_Adminhtml_Block_Widget_Tabs

Отже, тут беруть участь дві основні дії:

  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. Клас вкладок -

<?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 Devs. не соромлячись ділитися знаннями про цю сферу (і саме тому вищезазначене питання.)

Джерело:
Цю техніку можна знайти тут:
- 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]значення, які ви маєте для свого модуля.


це не найкраща практика
Фра

2
@Fra Я не сказав, що це так. Відповідь почалася з "Ось як я це роблю". І це працює. Не соромтеся оскаржувати це, змінити його або запропонувати кращу альтернативу.
Маріус

добре мати такий підхід, щоб ми могли зібрати всі можливі рішення на цій сторінці. (Перевірити моя відповідь на більш , як «Magento»)
Від

@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');
    }
}

app / code / local / Mage / Adminhtml / Блок / Каталог / Продукт / Редагувати / 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

ця остання відповідь насправді не є доброю ... місцеві слід використовувати лише як останнє рішення, це дійсно гірше, ніж використовувати переписування
Фраг

Підкажіть, будь ласка, як створюється локальне гірше переписувати?
TBI Infotech

Ви коли-небудь модернізували magento? локальна ніколи не повинна використовуватися, це найкраща практика ... локальний - це майже як редагувати основний файл.
Фракт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.