Я постараюсь ответить на ваш первоначальный вопрос - как использовать директиву с условием. Для отладки я использую xDebug. И по моему мнению, это очень трудно для отладки электронных писем. В этом случае я покажу вам пример с той же структурой в другой части magento.
На продажах / заказах / просмотрах есть такая же структура. Структура вывода адреса определяется Mage/Core/etc/config.xml
в default/customer/address_templates/text
.
Наша задача будет добавить любое условие, чтобы показать или не показывать «название компании». Директивы , такие как вар , зависят , если синтаксический анализ в Varien_Filter_Template
в методе фильтре ($ значения) . В этом методе есть итерация всех $ конструкций (если / зависит / var) и каждой конструкции, используемой в этом вызове:
$replacedValue = call_user_func($callback, $construction);
Для каждого if / depende / var существует свой метод. Давайте посмотрим наpublic 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];
}
}
Теперь давайте посмотрим на защищенный метод _getVariable. Я хотел бы обратить ваше внимание на один ряд:
} elseif (isset($stackVars[$i-1]['variable']) && $stackVars[$i-1]['variable'] instanceof Varien_Object) {
и посмотрите на комментарий ниже:
// If object calling methods or getting properties
Таким образом, чтобы сделать условие, наши $ stackVars должны быть объектом и источником Varien_Object (большинство моделей расширяется от Mage_Core_Model_Abstract, который расширяется от Varien_Object). Давайте поднимемся на несколько ступеней выше. Нам нужно добавить в stackVars и объект.
В моем примере в классе Mage_Customer_Block_Address_Renderer_Default magento вызывает метод filter ($ value), о котором я упоминал выше.
Здесь я предоставляю решение. Предупреждение! Это решение не очень чистое. Это цель показать поведение magento. Пожалуйста, все переписываете сами.
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);
}
В этом методе мы добавим объект заказа в массив данных. В соответствии с моей задачей давайте добавим объект заказа в этот массив. Сделайте это до '$ formater-> setVariables ($ data);'
$data['order_object'] = $address->getOrder();
После этого magento проанализирует этот объект и вызовет любой его метод. Например, мы добавляем новый метод getPaymentOutput (). Поместите простую функциональность в класс Order:
public function isPrinted()
{
if ($this->getPayment()->getMethod() == 'checkmo') {
return true;
} else {
return false;
}
}
и только после этого мы вносим изменения в директиву xml следующим образом:
{{if order_object.isPrinted()}}{{var smth}}<br />{{/if}}