製品の詳細(バックエンド)にカスタムタブを追加するためのベストプラクティス


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.タブクラス-

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

注:
バックエンド開発に関するドキュメントはほとんどありません。MagentoDevsのように感じます。この領域についての知識を共有するのは恥ずかしがり屋です(そしてそれが上記の質問の理由です)。

出典:
この手法は次の場所にあります。
- 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
@フラ私はそれを言っていませんでした。答えは「これが私のやり方です」から始まりました。そしてそれは機能します。自由に挑戦したり、変更したり、より良い代替案を用意したりしてください。
マリウス

このページにすべての可能な解決策を収集できるように、このアプローチをとることは良いことです。(より「Magento」の方法については私の答えを確認してください)
Fra

@Fra。面白い。やってみます。
マリウス

@Marius、私はカタログのような新しいメニューを作成したい->製品の管理。実行する方法はありますか?カタログの正確なコピー->製品を管理します。
Mujahidh 2017年

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 / Block / Catalog / Product / Edit / Tabs.php

)、次のスニペットを関数に追加します _prepareLayout()

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

コアファイルのローカルをいつでも作成できます。


書き換えは歓迎されませんでした。とにかく、このアプローチをとることは良いことなので、ここにすべての可能な解決策があります
Fra

ローカルを作成することで、常に書き換えを回避できます。個人的なお気に入りがある場合は、とにかく続行することをお勧めします。グッドラック
TBIインフォテック2014

この最後の答えは本当に良くありません...ローカルは最後の解決策としてのみ使用されるべきです、それは書き換えを使用するよりも本当に最悪です
Fra

ローカルの作成がどのように書き換えを悪化させているかを提案してください。
TBI Infotech 2014

magentoをアップグレードしたことがありますか?localは決して使用すべきではありません。これがベストプラクティスです... localは、コアファイルを編集するようなものです。
Fra
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.