Kami menggunakan ekstensi yang secara global akan menimpa blok Mage_Catalog_Block_Product_List_Toolbar.
<global>
<blocks>
<catalog>
<rewrite>
<product_list_toolbar>Amasty_Shopby_Block_Catalog_Product_List_Toolbar</product_list_toolbar>
</rewrite>
</catalog>
</blocks>
</global>
Sementara ekstensi berfungsi dalam konteks kategori navigasi berlapis, kelas yang ditulis ulang tidak berfungsi dengan baik ketika kami menyisipkan daftar produk yang sewenang-wenang ke tampilan lain (khusus) dalam modul internal kami sendiri. Jika kami menghapus ekstensi yang ditimpa hanya untuk tujuan pengujian, semuanya berfungsi dengan baik.
Bagaimana kita bisa membatalkan penulisan ulang ekstensi hanya untuk controller kita sendiri, tanpa mengedit kode komunitas pengembang ekstensi?
magento-1
extensions
overrides
Aaron Pollock
sumber
sumber
<rewrite>
per kelas, jadi meskipun saya bisa membuat kelas saya sendiri memperluas kelas inti, saya tidak yakin bagaimana saya bisa membuatnya bekerja melaluigetBlock('catalog/product_list_toolbar')
metode pabrik.Jawaban:
Peringatan: Tidak ada cara yang dirancang untuk melakukan apa yang Anda minta dalam sistem. Berikut ini harusnya berhasil, tetapi saya belum pernah mencobanya secara luas pada sistem produksi, dan mungkin ada situasi di mana itu akan menyebabkan lebih banyak masalah yang layak. Hanya lanjutkan jika Anda merasa nyaman dengan masalah debug yang terkait dengan mengubah penulisan ulang sistem kerja.
Langkah 1 sedang membatalkan penulisan ulang. Pohon konfigurasi Magento dapat diubah saat runtime. Jadi, jika Anda menjalankan kode berikut
Kemudian Magento akan instantiate
Mage_Catalog_Block_Product_List_Toolbar
blok asli untuk sisa permintaan.Langkah 2 menentukan di mana harus memanggil ini dalam modul Anda. Karena ini hanya untuk controller Anda dan itu menulis ulang sebuah blok yang tidak akan dipakai sampai akhir controller Anda, saya akan menambahkan metode ke kelas controller Anda seperti ini
lalu panggil metode ini di awal setiap tindakan Anda
Ini mungkin tampak sedikit kikuk, tapi saya pikir itu ide yang bagus untuk menjadi kikuk (yaitu jelas) ketika Anda menjadi pintar dengan objek sistem Magento. Tempat lain untuk ini bisa menjadi
controller_action_predispatch
ataucontroller_action_predispatch_front_controller_action
peristiwa dan / atau diterapkan kondisional.Ingat saja penulisan ulang tidak akan dibatalkan sampai metode ini dipanggil. Itu berarti jika Anda mencoba untuk instantiate blok sebelum memanggil
_undoRewrites
, kelas yang ditulis ulang akan digunakan untuk instantiate objek.sumber
Solusi 1:
Anda dapat mencoba untuk instantiate kelas secara langsung (cara php) di controller Anda
dari pada
sesuatu seperti:
Solusi 2:
Pendekatan lain akan membuat kelas baru, dalam modul Anda, yang memperluas kelas asli dan menggunakannya.
Solusi 3:
Kalau tidak, jika ekstensi tidak crypted (kita semua suka open source :) Anda dapat mencoba mencari tahu mengapa itu merusak barang-barang Anda
sumber
rewrite
pada kelas dasar yang sama. Oleh karena itu metode pabrik tidak akan berfungsi (Anda sudah menyadari ini saya pikir sudah). Mungkin tidak ada cara Magento untuk melakukan ini, tapi mari kita bertahan sedikit untuk melihat apakah ada cara yang lebih baik.$this->getLayout()->createBlock("Mage_Catalog_Block_Product_List_Toolbar")
ketika Anda berada dalam konteks kelas blok). Jika tidak ada/
dalam parameter Magento hanya akan menggunakan string apa adanya untuk mencari kelas.Jika ada beberapa penulisan ulang untuk alias kelas yang sama, maka yang terakhir loader konfigurasi Magento diurai dari config.xml "menang". Saya akan menyerang masalah ini dengan:
catalog/product_list_toolbar
ekstensi AndaMage_Catalog_Block_Product_List_Toolbar
bukan kelas Amasty.sumber
Mirip dengan apa yang disarankan Francesco di atas, tetapi saya yakin Anda benar-benar dapat memasukkan nama kelas penuh ke getModel. Dengan cara ini, Anda agak masih melakukan hal yang sama, tetapi menggunakan metode inti untuk melakukannya. Saya tidak sepenuhnya yakin pro / kontra untuk metode ini, tetapi berpikir saya akan membuang ini di luar sana sebagai ide.
Di samping catatan, saya percaya ini akan menjadi cara standar untuk memuat kelas di Magento2.
sumber
Anda perlu melakukan sedikit perubahan pada kode ekstensi saya takut. Jangan menulis ulang kelas di Anda sendiri
config.xml
lagi, cukup ubahAmasty_Shopby_Block_Catalog_Product_List_Toolbar
untuk memperluas kelas Anda yang pada gilirannya meluasMage_Catalog_Block_Product_List_Toolbar
.sumber