Bagaimana cara mengganti / menulis ulang kelas blok di Magento 1?

12

Catatan: Ini dimaksudkan sebagai pertanyaan kanonik yang sepenuhnya menjelaskan cara kerja penulisan ulang blok dan dapat digunakan sebagai target duplikat untuk pertanyaan "Bagaimana cara mengganti blok X" yang lebih spesifik atau "Mengapa penulisan ulang tidak berfungsi".

Lihat juga: Mencari pertanyaan kanonik tentang override Magento 1

Katakanlah, saya harus membuat perubahan ke kelas blok inti dalam modul khusus (ubah metode atau tambahkan metode). Bagaimana saya melakukan ini, langkah demi langkah?

Fabian Schmengler
sumber

Jawaban:

23

Setiap blok, atau kelompok blok dinyatakan dalam config.xmlfile modul seperti ini (di dalam <global>tag).
Ini adalah contoh dari modul katalog

    <blocks><!-- marks definition of a block group -->
        <catalog><!-- unique alias for blocks in the module -->
            <class>Mage_Catalog_Block</class><!-- class prefix for all blocks -->
        </catalog>
    </blocks>

Ini berarti bahwa blok dapat dipakai menggunakan alias di catalog/class_name_heremana class_name_heresisa jalur kelas dimulai dari awalan.
Ini berarti catalog/class_name_hereakan dipetakan secara default ke Mage_Catalog_Block_Class_Name_Here.

Untuk menulis ulang blok, Anda perlu membuat modul yang tergantung pada modul yang Anda coba ubah ( Magento_Catalog) dalam contoh saya.
Dan Anda perlu menambahkan ini di config.xmlbawah <global>tag.

<blocks>
    <catalog><!-- alias of the block group you are rewriting -->
        <rewrite><!-- reserved tag: specify that you are rewriting something -->
             <class_name_here>YourNamespace_YourModule_Block_Your_New_Class_Here</class_name_here> <!-- tag: the rest of the alias of the class you are rewriting. value: the name of your class that rewrites the core class -->
        </rewrite>
    </catalog>
</blocks>

Kemudian buat kelas YourNamespace_YourModule_Block_Your_New_Class_Here(mengikuti struktur folder ZF) dan membuat kelas ini memperluas kelas asli.

class YourNamespace_YourModule_Block_Your_New_Class_Here extends Mage_Catalog_Block_Class_Name_Here
{
    //your awesome code here
}

Setelah selesai, nonaktifkan kompilasi dan aktifkan lagi (jika perlu) dan kosongkan cache.

Ini tidak akan berfungsi untuk blok abstrak.
Ini hanya berfungsi untuk kelas yang akan dipakai.

Contoh

Mari kita asumsikan bahwa Anda ingin menulis ulang aplikasi file \ code \ core \ Mage \ Catalog \ Block \ Product \ View \ Options \ Type \ Select.php yang memiliki kelas Mage_Catalog_Block_Product_View_Options_Type_Selectdalam modul Anda sendiri Marius_Test .

Maka Anda akan membutuhkan entri ini di config.xml:

<blocks>
    <catalog>
        <rewrite>
            <product_view_options_type_select>Marius_Test_Block_Catalog_Block_Product_View_Options_Type_Select</product_view_options_type_select>
        </rewrite>
    </catalog>
</blocks>

app \ code \ local \ Marius \ Test \ Block \ Catalog \ Product \ View \ Options \ Type \ Select.php :

class Marius_Test_Block_Catalog_Product_View_Options_Type_Select extends Mage_Catalog_Block_Product_View_Options_Type_Select
{
    //your awesome code here
}
Marius
sumber
Tidak bekerja. Saya mencoba untuk menimpa kelas Mage_Catalog_Block_Product_View_Options_Type_Selectdi app \ code \ local \ WR \ EPO \ Block \ Catalog \ Block \ Product \ View \ Options \ Type \ Select.php . Saya mencobanya seperti ini: codepen.io/anon/pen/WYOqBr
Black
Dan jika itu tidak berhasil, Anda berpikir bahwa jawaban saya salah sehingga Anda menurunkannya alih-alih berpikir bahwa mungkin Anda melakukan sesuatu yang salah. Pokoknya ... ganti ini <Mage_Catalog_Block_Product_View_Options_Type_Select> WR_EPO_Block_Catalog_Block_Product_View_Options_Type_Select </Mage_Catalog_Block_Product_View_Options_Type_Select>dengan <product_view_options_type_select>WR_EPO_Block_Catalog_Block_Product_View_Options_Type_Select</product_view_options_type_select>dan pastikan tidak ada ruang di dalamnyaproduct_view_options_type_select
Marius
Saya menurunkan suara karena jawaban Anda tidak tepat dan meskipun saya mengikutinya langkah demi langkah tidak membuahkan hasil yang tepat. Anda menulis bahwa kami harus menggunakan nama kelas, jadi saya menggunakannya dan tidak berhasil. Kita harus menggunakan product_view_options_type_selectalih-alih nama kelas yang sebenarnya Mage_Catalog_Block_Product_View_Options_Type_Select. Jika Anda mengubah jawaban Anda maka saya akan menjawab.
Hitam
Jika Anda membacanya langkah demi langkah Anda melewatkan langkah. Di mana saya menjelaskan apa alias kelas. Jika Anda hanya menyalin ganti tempel, Anda akan membuatnya berfungsi. 17 orang mengerti. Saya pikir saya menjelaskannya dengan benar
Marius
Ya, tetapi contoh yang baik tidak ada sehingga kami dapat memastikan bahwa kami memahami teori Anda dengan benar
Black
4

Untuk My Point of view menimpa dan menulis ulang kedua hal ini berbeda,

Mengesampingkan:

Ketika kita menggunakan mekanisme fallback desain maka kita sedang melakukan override

Menulis kembali:

Ketika kita menulis ulang kelas inti Magento di kelas kita maka kita sedang menulis ulang.

1) Contoh Timpa:

Jika saya perlu mengganti app/code/core/Mage/Catalog/Block/Product/List.phpfile maka saya salin dalam modul lokal saya dengan jalur yang sama seperti yang ditunjukkan di bawah iniapp/code/local/Mage/Catalog/Block/Product/List.php

Ini tidak disarankan oleh Magento. Tapi Anda bisa melakukan itu.

2) Contoh Penulisan Ulang:

Jika saya ingin menulis ulang kelas blok ini Mage_Adminhtml_Block_Sales_Order_Createmaka saya kode di modul config.xml saya seperti di bawah ini

    <global>
        <blocks>
            <adminhtml>
                <rewrite>

                    <sales_order_create>Trimantra_Smallchanges_Block_Adminhtml_Sales_Order_Create</sales_order_create>
                </rewrite>
            </adminhtml>
        </blocks>
    </global>

Dan di kelas saya Trimantra_Smallchanges_Block_Adminhtml_Sales_Order_Create

Saya kode Seperti Di Bawah Ini

class Trimantra_Smallchanges_Block_Adminhtml_Sales_Order_Create extends Mage_Adminhtml_Block_Sales_Order_Create {
      My Function Or funcions That I want to Rewrite..
}
Murtuza Zabuawala
sumber
2

Penting untuk ditambahkan di sini adalah bahwa blok penulisan ulang (serta semua penulisan ulang modul Magento lainnya) menyiratkan upaya pemeliharaan yang lebih tinggi dan karenanya harus dianggap sebagai peluang terakhir untuk memperluas fungsionalitas setelah manipulasi konfigurasi, acara, dan penyesuaian tema.

Masalah potensial 1: Template yang ditulis ulang tidak akan diperbarui ketika Anda atau pengelola lain akan memperbarui file sumber Magento. Berarti perbaikan atau peningkatan keamanan tidak akan diterapkan pada kode Anda. Hal yang sama berlaku untuk kelas penulisan ulang lainnya termasuk Blok, tetapi tergantung pada seberapa banyak penulisan ulang dilakukan (lihat di bawah).

Masalah potensial 2: Blok yang Ditulis Ulang (atau kelas lain) mungkin tampaknya ditulis ulang oleh ekstensi lain yang akan Anda coba instal. Maka Anda harus menyelesaikan konflik ini.

Alternatif 1: Gunakan acara, yaitu gali kode yang akan Anda tulis ulang dan periksa apakah ada acara yang dapat digunakan untuk mencapai fungsionalitas yang diinginkan.

Alternatif 2: Menulis ulang pintar, yaitu melihat-lihat: mungkin memeriksa tempat di mana kelas yang akan Anda tulis ulang adalah instantiated dan memeriksa apakah Anda dapat memengaruhi kelas mana yang dipilih melalui konfigurasi atau acara; mungkin ada kelas di sekitar yang memungkinkan Anda untuk mengganti metode 3-baris untuk mengganti nama kelas alih-alih menyalin metode 30 baris dari kelas asli ke yang ditulis ulang.

Anton Boritskiy
sumber