제품 세부 정보에 사용자 지정 탭을 추가하는 모범 사례 (백엔드)


9

제품 세부 정보 (backend)에 추가 탭을 추가하고 싶습니다. 가능하면 재정의를 수행하고 싶지 않습니다.

이것을 달성하는 가장 좋은 방법은 무엇입니까?

답변:


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]당신은 당신의 모듈에 대해 가지고있는 값.


이것은 모범 사례가 아닙니다
Fra

2
@Fra 나는 그렇게 말하지 않았다. 대답은 "여기서 어떻게하는지"로 시작되었습니다. 그리고 작동합니다. 자유롭게 도전하거나 변경하거나 더 나은 대안을 찾으십시오.
Marius

이 페이지에서 가능한 모든 솔루션을 수집 할 수 있도록이 방법을 사용하는 것이 좋습니다. (보다 "마 젠토"방법에 대한 내 대답을 확인하십시오)
Fra

@ 프라. 흥미 롭군 나는 그것을 시도 할 것이다.
Marius

@Marius, 카탈로그-> 제품 관리와 같은 새 메뉴를 만들고 싶습니다. 카탈로그-> 제품 관리의 정확한 사본.
Mujahidh 2012 년

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 Infotech

이 마지막 답변은 실제로 좋지 않습니다 ... 로컬은 마지막 솔루션으로 만 사용해야합니다. 재 작성을 사용하는 것보다 실제로 최악입니다.
Fra

로컬 작성이 재 작성을 어떻게 악화시키는 지 제안하십시오.
TBI Infotech

magento를 업그레이드 한 적이 있습니까? local은 절대 사용해서는 안됩니다. 이것은 모범 사례입니다 ... local은 편집 코어 파일과 거의 같습니다.
Fra
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.