Tôi sẽ cố gắng trả lời câu hỏi ban đầu của bạn - làm thế nào để sử dụng chỉ thị với điều kiện. Để gỡ lỗi tôi sử dụng xDebug. Và theo tôi thì rất khó để gỡ lỗi email. Trong trường hợp đó tôi chỉ cho bạn một ví dụ có cùng cấu trúc trong một phần khác của magento.
Về bán hàng / đặt hàng / xem có cấu trúc tương tự. Cấu trúc đầu ra địa chỉ được xác định Mage/Core/etc/config.xml
trong default/customer/address_templates/text
.
Nhiệm vụ của chúng tôi sẽ là thêm bất kỳ điều kiện nào để hiển thị hoặc không hiển thị 'tên công ty'. Các chỉ thị như var , phụ thuộc , nếu phân tích cú pháp trong bộ lọcVarien_Filter_Template
phương thức ($ value) . Trong phương thức này có phép lặp của tất cả các cấu trúc $ (if / Dep / var) và mỗi $ xây dựng được sử dụng trong lệnh gọi này:
$replacedValue = call_user_func($callback, $construction);
Đối với mỗi if / Depe / var có phương thức riêng. Chúng ta hãy nhìn vàopublic 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];
}
}
Bây giờ hãy xem phương thức được bảo vệ _getVariable. Tôi muốn thu hút sự chú ý của bạn trên một hàng:
} elseif (isset($stackVars[$i-1]['variable']) && $stackVars[$i-1]['variable'] instanceof Varien_Object) {
và nhìn vào bình luận dưới đây:
// If object calling methods or getting properties
Vì vậy, để tạo điều kiện $ stackVars của chúng ta phải là một đối tượng và là một nhánh của Varien_Object (hầu hết các mô hình mở rộng từ Mage_Core_Model_Abauge, kéo dài từ Varien_Object). Hãy leo lên một vài bước ở trên. Chúng ta cần thêm vào stackVars và object.
Trong ví dụ của tôi trong lớp Mage_Customer_Block_Address_Renderer_Default magento gọi bộ lọc phương thức ($ value), mà tôi đã đề cập ở trên.
Ở đây tôi cung cấp một giải pháp. Cảnh báo! Giải pháp này không sạch lắm. Đó là mục đích để thể hiện hành vi magento. Hãy làm tất cả viết lại chính mình.
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);
}
Trong phương thức này, chúng ta sẽ thêm một đối tượng thứ tự vào mảng dữ liệu $. Theo nhiệm vụ của tôi cho phép thêm đối tượng thứ tự vào mảng này. Thực hiện trước '$ formater-> setVariabled ($ data);'
$data['order_object'] = $address->getOrder();
Sau đó, magento sẽ phân tích đối tượng này và gọi bất kỳ phương thức nào. Ví dụ: chúng ta thêm phương thức mới getPaymentOutput (). Đặt chức năng đơn giản vào lớp Đặt hàng:
public function isPrinted()
{
if ($this->getPayment()->getMethod() == 'checkmo') {
return true;
} else {
return false;
}
}
và chỉ sau đó chúng tôi thực hiện thay đổi trong chỉ thị xml với điều này:
{{if order_object.isPrinted()}}{{var smth}}<br />{{/if}}