Saya akan mencoba menjawab pertanyaan awal Anda - bagaimana menggunakan arahan dengan syarat. Untuk debug saya menggunakan xDebug. Dan menurut saya sangat sulit untuk men-debug email. Dalam hal ini saya tunjukkan contoh dengan struktur yang sama di bagian lain dari magento.
Pada bagian penjualan / pesanan / tampilan ada struktur yang sama. Struktur keluaran alamat ditentukan di Mage/Core/etc/config.xml
dalam default/customer/address_templates/text
.
Tugas kita akan menambahkan kondisi apa pun untuk menunjukkan atau tidak menunjukkan 'nama perusahaan'. Arahan seperti var , depend , jika diuraikan Varien_Filter_Template
dalam metode filter ($ value) . Dalam metode ini ada iterasi dari semua $ konstruksi (jika / depend / var) dan setiap $ konstruksi yang digunakan dalam panggilan ini:
$replacedValue = call_user_func($callback, $construction);
Untuk setiap if / depende / var ada metode sendiri. Mari lihatpublic function ifDirective($construction)
public function ifDirective($construction)
{
if (count($this->_templateVars) == 0) {
return $construction[0];
}
if($this->_getVariable($construction[1], '') == '') {
if (isset($construction[3]) && isset($construction[4])) {
return $construction[4];
}
return '';
} else {
return $construction[2];
}
}
Sekarang mari kita lihat metode yang dilindungi _getVariable. Saya ingin menarik perhatian Anda pada satu baris:
} elseif (isset($stackVars[$i-1]['variable']) && $stackVars[$i-1]['variable'] instanceof Varien_Object) {
dan lihat komentar di bawah ini:
// If object calling methods or getting properties
Jadi untuk membuat kondisi $ stackVars kita harus menjadi objek dan menjadi instace Varien_Object (sebagian besar model memanjang dari Mage_Core_Model_Abstract, yang memanjang dari Varien_Object). Mari kita naik beberapa langkah di atas. Kita perlu menambahkan ke stackVars dan objek.
Dalam contoh saya di kelas Mage_Customer_Block_Address_Renderer_Default metode filter panggilan magento ($ value), yang saya sebutkan di atas.
Di sini saya memberikan solusinya. Peringatan! Solusi ini tidak terlalu bersih. Ini bertujuan untuk menunjukkan perilaku magento. Tolong lakukan semua penulisan ulang sendiri.
public function render(Mage_Customer_Model_Address_Abstract $address, $format=null)
{
//parsing $data array
$formater->setVariables($data);
$format = !is_null($format) ? $format : $this->getFormat($address);
return $formater->filter($format);
}
Dalam metode ini kita akan menambahkan objek pesanan ke $ data array. Menurut tugas saya, mari kita tambahkan objek pesanan ke array ini. Lakukan sebelum '$ formater-> setVariables ($ data);'
$data['order_object'] = $address->getOrder();
Setelah magento ini akan menguraikan objek ini dan memanggil metode apa pun itu. Sebagai contoh, kami menambahkan metode getPaymentOutput () baru. Masukkan fungsionalitas sederhana ke dalam kelas Order:
public function isPrinted()
{
if ($this->getPayment()->getMethod() == 'checkmo') {
return true;
} else {
return false;
}
}
dan hanya setelah itu kami membuat perubahan dalam direktif xml dengan ini:
{{if order_object.isPrinted()}}{{var smth}}<br />{{/if}}