แนวทางปฏิบัติที่ดีที่สุดในการเพิ่มแท็บที่กำหนดเองในรายละเอียดผลิตภัณฑ์ (แบ็กเอนด์)


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

หมายเหตุ:
มีเอกสารน้อยมากเกี่ยวกับการพัฒนาแบ็กเอนด์ฉันรู้สึกเหมือน 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 ฉันต้องการสร้างเมนูใหม่เช่น catalog-> จัดการผลิตภัณฑ์ มีวิธีการดำเนินการใด ๆ สำเนาแคตตาล็อก -> จัดการผลิตภัณฑ์ที่แน่นอน
Mujahidh

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 / รหัส / ท้องถิ่น / Mage / Adminhtml / บล็อก / Catalog / สินค้า / แก้ไข / 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

คุณเคยอัพเกรดวีโอไอพีหรือไม่? ไม่ควรใช้ภายในเครื่องนี่เป็นแนวปฏิบัติที่ดีที่สุด ... local เป็นเหมือนไฟล์หลักในการแก้ไข
Fra
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.