Bagaimana cara menulis ulang kelas yang sudah ditulis ulang?

15

Pembaruan: Saya menemukan bahwa kelas yang benar-benar perlu saya tulis ulang adalah SMDesign_SMDZoom_Block_Product_View_Mediadan tidak SMDesign_ColorswatchProductView_Block_Product_View_Mediaseperti yang saya pikir semula. Namun, masalah yang sama persis masih berlaku.

Ekstensi SMDesign SMDZoom menulis ulang blok kelas 'katalog / product_view_media'. Xml untuk itu terlihat seperti ini:

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

Saya ingin menulis ulang kelas ini lagi. Saya ingin menulis ulang kelas katalog / product_view_media yang ditulis ulang oleh modul smdzoom ini. Bisakah ini dilakukan? Seperti apa konfigurasi xml di modul saya untuk melakukan ini?

Saat ini adalah file modul xml init saya:

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

dan file config.xml modul:

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

Kelas baru saya terlihat seperti ini untuk pengujian:

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

Saya menguji ini dengan menampilkan petunjuk jalur templat, dan saya melihat blok SMDesign masih digunakan pada halaman tampilan produk. Apa yang saya lakukan salah?

Nick Rolando
sumber

Jawaban:

13

Saya meletakkan <depends>node di lokasi yang salah di file xml init modul saya. Itu harus bersarang di dalam simpul nama modul, seperti:

<config>
    <modules>
        <Goorin_SMDZoom>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Catalog />
                <SMDesign_SMDZoom />
            </depends>
        </Goorin_SMDZoom>
    </modules>
</config>
Nick Rolando
sumber
10

Bagian ini di sini:

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

hanya akan membantu Anda jika instantiasi asli dilakukan melalui createBlock('colorswatchproductview/product_view_media)
ini tidak mungkin karena ekstensi pertama menggunakan penulisan ulang, yaitu mereka ingin ditampilkan di mana saja di mana
createBlock('catalog/product_view_media')digunakan

Salah satu opsi adalah menggunakan penulisan ulang untuk blok yang sama

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

dan kemudian di kelas blok Anda memperpanjang blok ekstensi lainnya

class Goorin_ColorswatchProductView_Block_Product_View_Media extends SMDesign_ColorswatchProductView_Block_Product_View_Media

Agar ini berfungsi, ekstensi Anda harus dimuat setelah yang pertama. Selama pengujian saya di sini http://magebase.com/magento-tutorials/magento-extension-clashes-winners-and-loosers/ Saya mengetahui bahwa urutan pemuatan didasarkan pada urutan alfabet aplikasi Anda / etc / modules / file xml . Atau urutan ini dapat dipengaruhi dengan menggunakan simpul Depends (SMDesign_ColorswatchProductView).

Anda melihat pesan kesalahan karena Anda mencoba membuat blok secara terpisah tetapi membutuhkan produk, yang dimuat dari blok induknya:

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;
    }
Kristof di Fooman
sumber
Saya pergi instruksi Anda dan tidak dapat menulis ulang kelas, bahkan dengan node dependen.
Nick Rolando
Cobalah mengganti nama file modul init xml Anda menjadi z.xml diikuti dengan penyegaran cache.
Kristof di Fooman
Maaf saya belum kembali ke ini sebentar. Saya mengganti nama file xml init menjadi zzz.xml dan penulisan ulangnya berhasil! Jadi saya kira saya perlu mencari tahu mengapa <depends>simpul tidak berfungsi ..
Nick Rolando
Saya memberi +1 terimakasih atas bantuannya dan membimbing saya ke jawabannya :)
Nick Rolando
3

Inilah sebabnya mengapa menulis ulang kelas inti menyebalkan.

Menembak dari sana pinggul di sini tapi saya pikir taruhan terbaik Anda adalah untuk memperpanjang implementasi carikan warna Mage_Catalog_Blog_Product_View_Mediadan kemudian membuat modul Anda tergantung pada modul carikan warna.

Alan Storm menjawab pertanyaan serupa di sini .

Yang lebih baik adalah mencoba dan melakukan apa pun yang Anda coba lakukan melalui pengamat.

wlvrn
sumber