Saya ingin dapat meneruskan data ke panggilan getChildHtml (). Alasannya, output dari blok tergantung pada jenis produk. Jadi saya ingin meneruskan produk ke getChildHtml sehingga dapat memutuskan output.
Saya melakukan ini di dalam template/checkout/cart/item/default.phtml
.
Idealnya, panggilan akan terlihat seperti:
echo $this->getChildHtml('child_block_name', $_item);
Kemudian blok saya bisa mendapatkan jenis produk dari item dan menampilkan output yang benar.
Karena jelas tidak mungkin meneruskan data ini ke getChildHtml
- bagaimana lagi jenis perilaku ini dapat dicapai tanpa harus menulis ulang blok inti
Dua solusi yang saya miliki saat ini adalah sebagai berikut (tidak terlalu menarik):
1 - Buat helper dan akses output html melalui helper alih-alih membiarkan blok dan template menjadikannya ala $this->helper('my_module')->getItemHtml($_item);
2 - Akses blok anak dan setData di dalamnya di dalam templat:
$this->getChild('child_name')->setData('item', $_item);
echo $this->getChildHtml('child_name')
Saya pikir dalam hal arsitektur Magento, nomor 2 adalah yang lebih rendah dari dua kejahatan, tetapi sangat jelek melihat ke dalam template.
Jawaban:
Anda dapat menambahkan metode pada blok induk untuk menjemput anak tergantung pada jenis produk (saya telah melihat jenis logika ini beberapa kali dalam inti atau sesuatu yang serupa):
Namun, melihat bagaimana Anda memodifikasi tata letak xml untuk menambahkan blok anak-anak, Anda mungkin tertarik pada bagaimana Magento memutuskan untuk bekerja dengan rendering markup tergantung pada jenis produk di
Mage_Sales_Block_Items_Abstract::getItemHtml()
danMage_Checkout_Block_Cart_Abstract::getItemHtml()
.sumber
Solusi di atas tidak akan berfungsi jika Anda menampilkan blok anak dalam
foreach
loop.Untuk itu Anda perlu menggunakan kode berikut:
Di child.block Anda dapat menggunakan
$this->getMyData()
untuk mendapatkan data. Dengan menggunakan strategi ini, blok anak akan selalu mendapatkan data terbaru dari orang tua.Parameter kedua
getChildHtml()
adalah$useCache
. Menetapkannya ke false mencegah output pertama di-cache dan memaksa rendering anak lagi.sumber
Blok yang dapat menerima data disebut widget ; meskipun ini dapat dilakukan melalui beberapa definisi blok (berdasarkan pada properti dari
$_item
).Magento melakukan sesuatu yang sangat mirip dalam inti dengan memuat blok metode pembayaran berdasarkan kode pendek metode:
Anda dapat melakukan hal yang sama dengan kode semu ini:
Semua yang akan membutuhkan akan memiliki jenis blok yang berbeda untuk setiap jenis produk -
bundle
,simple
,configurable
,virtual
,grouped
. Tidak terlalu buruk, sungguh.Jika Anda benar-benar ingin menggunakan widget - itu akan menjadi efek dari ide kedua Anda dalam pertanyaan yang diedit:
Membuat widget mungkin di luar cakupan jawaban ini - tetapi itu tidak terlalu sulit, dan memiliki keuntungan karena dapat digunakan kembali untuk blok CMS, meskipun untuk kasus penggunaan Anda, saya tidak berpikir itu berlaku.
Untuk informasi lebih lanjut tentang cara membuat widget:
http://www.magentocommerce.com/knowledge-base/entry/tutorial-creating-a-magento-widget-part-1
sumber
Sebab
Magento 2
, bisa Anda gunakanUntuk mendapatkan data,
$block->getMyData();
sumber