จะเขียนคลาสที่มีการเขียนใหม่ได้อย่างไร?


15

อัปเดต:ฉันพบว่าชั้นที่ฉันต้องการเขียนจริงนั้นSMDesign_SMDZoom_Block_Product_View_Mediaไม่SMDesign_ColorswatchProductView_Block_Product_View_Mediaเหมือนที่ฉันคิดไว้ในตอนแรก อย่างไรก็ตามปัญหาเดียวกันที่แน่นอนยังคงใช้

ส่วนขยายการออกแบบ SMDZoom เขียนคลาสบล็อกใหม่อีกครั้งว่า 'catalog / product_view_media' xml สำหรับที่มีลักษณะเช่นนี้:

       <global>
    ...         
       <blocks>
        <smdzoom>
            <class>SMDesign_SMDZoom_Block</class>
        </smdzoom>
    </blocks>
    <blocks>
        <catalog>
            <rewrite>
                <product_view_media>SMDesign_SMDZoom_Block_Product_View_Media</product_view_media>
            </rewrite>
        </catalog>
    </blocks>
           ....
       </global>

ฉันต้องการเขียนคลาสนี้อีกครั้ง ฉันต้องการเขียนคลาส catalog / product_view_media อีกครั้งว่าโมดูล smdzoom นี้กำลังเขียนใหม่ สามารถทำได้หรือไม่ config xml มีลักษณะอย่างไรในโมดูลของฉันเพื่อทำสิ่งนี้?

ปัจจุบันนี้เป็นไฟล์โมดูล xml ของฉัน:

<config>
    <modules>
        <Goorin_SMDZoom>
            <active>true</active>
            <codePool>local</codePool>
        </Goorin_SMDZoom>
        <depends>
            <Mage_Catalog />
            <SMDesign_SMDZoom />
        </depends>
    </modules>
</config>

และไฟล์โมดูล config.xml:

<global>
        <blocks>
            <gbismdzoom>
                <class>Goorin_SMDZoom_Block</class>
            </gbismdzoom>
            <catalog>
                <rewrite>
                    <product_view_media>Goorin_SMDZoom_Block_Product_View_Media</product_view_media>
                </rewrite>
            </catalog>
        </blocks>
    </global>

คลาสใหม่ของฉันมีลักษณะเช่นนี้เพื่อทำการทดสอบ:

class Goorin_SMDZoom_Block_Product_View_Media extends SMDesign_SMDZoom_Block_Product_View_Media
{
    public function _construct() {
        parent::_construct();
    }
}

ฉันกำลังทดสอบสิ่งนี้โดยการแสดงคำแนะนำเส้นทางเทมเพลตและฉันเห็นบล็อกการออกแบบ SMD ยังคงถูกใช้ในหน้ามุมมองผลิตภัณฑ์ ผมทำอะไรผิดหรือเปล่า?

คำตอบ:


13

ฉันวาง<depends>โหนดผิดตำแหน่งในไฟล์ init ของโมดูล จะต้องซ้อนอยู่ภายในโหนดของชื่อโมดูลเช่น:

<config>
    <modules>
        <Goorin_SMDZoom>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Catalog />
                <SMDesign_SMDZoom />
            </depends>
        </Goorin_SMDZoom>
    </modules>
</config>

10

ส่วนนี้ที่นี่:

        <colorswatchproductview>
            <rewrite>
                <product_view_media>Goorin_ColorswatchProductView_Block_Product_View_Media</product_view_media>
            </rewrite>
        </colorswatchproductview>

จะช่วยคุณได้หากการสร้างอินสแตนซ์ดั้งเดิมผ่านcreateBlock('colorswatchproductview/product_view_media)
สิ่งนี้ไม่น่าจะเกิดขึ้นเนื่องจากส่วนขยายแรกกำลังใช้การเขียนซ้ำนั่นคือพวกเขาต้องการให้ปรากฏทุกที่ที่
createBlock('catalog/product_view_media')มีการใช้งาน

ทางเลือกหนึ่งคือใช้การเขียนซ้ำสำหรับบล็อกเดียวกัน

  <catalog>
    <rewrite>
      <product_view_media>Goorin_ColorswatchProductView_Block_Product_View_Media</product_view_media>
    </rewrite>
  </catalog>

จากนั้นในคลาสบล็อกของคุณให้ขยายบล็อกส่วนขยายอื่น

class Goorin_ColorswatchProductView_Block_Product_View_Media extends SMDesign_ColorswatchProductView_Block_Product_View_Media

สำหรับการทำงานส่วนขยายของคุณจะต้องโหลดหลังจากส่วนแรก ในระหว่างการทดสอบของฉันที่นี่http://magebase.com/magento-tutorials/magento-extension-clashes-winners-and-loosers/ฉันทำงานออกมาว่าลำดับการโหลดจะขึ้นอยู่กับลำดับตัวอักษรของไฟล์แอปของคุณ / etc / modules / xml . หรือมิฉะนั้นคำสั่งนี้อาจได้รับอิทธิพลจากการใช้โหนด Depends (SMDesign_ColorswatchProductView)

คุณเห็นข้อความแสดงข้อผิดพลาดเนื่องจากคุณพยายามแสดงบล็อกแยก แต่ต้องมีผลิตภัณฑ์ซึ่งโหลดจากบล็อกหลัก:

abstract class Mage_Catalog_Block_Product_View_Abstract extends Mage_Catalog_Block_Product_Abstract
{
    /**
     * Retrive product
     *
     * @return Mage_Catalog_Model_Product
     */
    public function getProduct()
    {
        $product = parent::getProduct();
        if (is_null($product->getTypeInstance(true)->getStoreFilter($product))) {
            $product->getTypeInstance(true)->setStoreFilter(Mage::app()->getStore(), $product);
        }

        return $product;
    }

ฉันออกไปตามคำแนะนำของคุณและไม่สามารถเขียนชั้นเรียนซ้ำได้แม้ว่าจะขึ้นกับโหนด
Nick Rolando

ลองเปลี่ยนชื่อไฟล์โมดูล xml ของคุณเป็น z.xml แล้วตามด้วยการรีเฟรชแคช
Kristof ที่ Fooman

ขออภัยฉันไม่ได้รับสิ่งนี้กลับมาสักครู่ ฉันเปลี่ยนชื่อไฟล์ init xml เป็น zzz.xml และการเขียนใหม่ทำงานได้! ดังนั้นผมคิดว่าผมจะต้องคิดออกว่าทำไม<depends>โหนดไม่ทำงาน ..
นิค Rolando

ผม +1 ขอบคุณสำหรับความช่วยเหลือและนำฉันไปที่คำตอบ :)
นิค Rolando

3

นี่คือเหตุผลที่การเขียนคลาสหลักซ้ำซ้อน

ยิงจากที่นี่ที่สะโพก แต่ฉันคิดว่าทางออกที่ดีที่สุดของคุณคือการขยายการใช้แถบสีMage_Catalog_Blog_Product_View_Mediaและจากนั้นทำให้โมดูลของคุณขึ้นอยู่กับโมดูลแถบสี

อลันพายุตอบคำถามที่คล้ายกันที่นี่

ยิ่งไปกว่านั้นก็คือพยายามทำสิ่งที่คุณพยายามทำผ่านผู้สังเกตการณ์

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