Thực hành tốt nhất để thêm tab tùy chỉnh trong chi tiết sản phẩm (phụ trợ)


9

Tôi muốn thêm một tab phụ vào chi tiết sản phẩm (phụ trợ) và tôi không muốn thực hiện bất kỳ ghi đè nào, nếu có thể.

Cách tốt nhất để thực hiện điều này là gì ?

Câu trả lời:


16

Cá nhân tôi sẽ đi theo cách tiếp cận bố cục / hành động bằng cách sử dụng addTab()được cung cấp bởiMage_Adminhtml_Block_Widget_Tabs

Vì vậy, 2 hành động chính có liên quan ở đây:

  1. thêm thay đổi bố cục XML
  2. tạo lớp tab
  3. (tất cả điều này có thể được thực hiện khi tạo một mô-đun mới, ngoài phạm vi ở đây)

- 1. Thay đổi bố cục -

<?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. Lớp 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';
    }
} 

Lưu ý:
Có rất ít tài liệu về phát triển phụ trợ, tôi cảm thấy như Magento Devs. rất ngại chia sẻ kiến ​​thức về lĩnh vực này (và đó là lý do của câu hỏi trên.)

Nguồn:
Kỹ thuật này có thể được tìm thấy ở đây:
- http://www.webspeaks.in/2012/02/create-custom-tab-in-magento-product-addedit-page.html và cả trong các bình luận của bài viết Inchoo này :
- http://inchoo.net/ecommerce/magento/how-to-add-custom-product-relations-in-magento/


4

Đây là cách tôi làm điều đó.

Tạo một người quan sát cho sự kiện core_block_abstract_prepare_layout_after. Không chắc chắn nếu đó là sự kiện tốt nhất mặc dù.

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

Sau đó tạo người quan sát

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

Chỉ cần đảm bảo bạn thay thế [namespace][module]với các giá trị bạn có cho mô-đun của mình.


đây không phải là cách thực hành tốt nhất
Fra

2
@Fra Tôi không nói là có. Câu trả lời bắt đầu với "Đây là cách tôi làm." Và nó hoạt động. Hãy thoải mái để thay đổi nó, thay đổi nó hoặc đi kèm với một sự thay thế tốt hơn.
Marius

thật tốt khi có cách tiếp cận này để chúng tôi có thể thu thập tất cả các giải pháp có thể trong trang này. (kiểm tra câu trả lời của tôi để biết thêm cách "Magento")
Fra

@Fra. Hấp dẫn. Tôi sẽ thử nó.
Marius

@Marius, tôi muốn tạo một menu mới như catalog-> quản lý sản phẩm. Có cách nào để thực hiện. Bản sao chính xác của danh mục-> quản lý sản phẩm.
Mujahidh

2

Thêm mã sau vào config.xmltập tin của bạn

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

Sau đó, bạn nên tạo một tệp mới: 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;
    }
}

Tiếp theo, tạo một tệp: 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');
    }
}

ứng dụng / mã / cục bộ / Pháp sư / adminhtml / Chặn / Danh mục / Sản phẩm / Chỉnh sửa / Tab.php

) và thêm đoạn mã sau vào hàm _prepareLayout()

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

Bạn luôn có thể tạo một địa phương của bất kỳ tập tin cốt lõi.


viết lại không được hoan nghênh, dù sao cũng tốt để có cách tiếp cận này vì vậy chúng tôi có tất cả giải pháp khả thi ở đây
Fra

Chúng tôi luôn có thể tránh viết lại bằng cách tạo một địa phương, dù sao đi nữa khi bạn có sở thích cá nhân, tốt hơn là tiếp tục với điều đó. Chúc may mắn
TBI Infotech

câu trả lời cuối cùng này thực sự không tốt ... địa phương chỉ nên được sử dụng như giải pháp cuối cùng, nó thực sự tồi tệ hơn việc sử dụng viết lại
Fra

Xin đề nghị làm thế nào là tạo ra một địa phương tồi tệ hơn viết lại?
TBI Infotech

bạn đã bao giờ nâng cấp magento chưa? cục bộ không bao giờ nên sử dụng, đây là cách thực hành tốt nhất ... cục bộ gần giống như chỉnh sửa tập tin lõi.
Fra
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.