Je vais essayer de répondre à votre question initiale - comment utiliser la directive avec condition. Pour le débogage, j'utilise xDebug. Et à mon avis, il est très difficile de déboguer les e-mails. Dans ce cas, je vous montre un exemple avec la même structure dans une autre partie de magento.
Sur la vente / commande / vue, il y a la même structure. La structure de sortie d'adresse déterminée en Mage/Core/etc/config.xml
pouces default/customer/address_templates/text
.
Notre tâche sera d'ajouter toute condition pour afficher ou ne pas afficher le «nom de l'entreprise». Des directives telles que var , depend , si elles sont analysées dans le filtre deVarien_Filter_Template
méthode ($ value) . Dans cette méthode, il y a une itération de toutes les constructions $ (if / depend / var) et de chaque construction $ utilisée dans cet appel:
$replacedValue = call_user_func($callback, $construction);
Pour chaque if / depende / var, il existe sa propre méthode. Regardonspublic 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];
}
}
Voyons maintenant la méthode protégée _getVariable. Je voudrais attirer votre attention sur une ligne:
} elseif (isset($stackVars[$i-1]['variable']) && $stackVars[$i-1]['variable'] instanceof Varien_Object) {
et regardez le commentaire ci-dessous:
// If object calling methods or getting properties
Donc, pour conditionner notre $ stackVars doit être un objet et être une instace de Varien_Object (la plupart des modèles s'étendent de Mage_Core_Model_Abstract, qui s'étend de Varien_Object). Permet de monter quelques marches au-dessus. Nous devons ajouter à stackVars et object.
Dans mon exemple dans la classe Mage_Customer_Block_Address_Renderer_Default, Magento appelle le filtre de méthode ($ value), que j'ai mentionné ci-dessus.
Ici, je fournis une solution. Attention! Cette solution n'est pas très propre. Son but est de montrer le comportement de magento. Veuillez faire toutes les réécritures vous-même.
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);
}
Dans cette méthode, nous ajouterons un objet order au tableau de données $. Selon ma tâche, ajoutons un objet de commande à ce tableau. Faites-le avant '$ formater-> setVariables ($ data);'
$data['order_object'] = $address->getOrder();
Après ce magento analysera cet objet et appellera n'importe quelle méthode. Par exemple, nous ajoutons une nouvelle méthode getPaymentOutput (). Mettez des fonctionnalités simples dans la classe Order:
public function isPrinted()
{
if ($this->getPayment()->getMethod() == 'checkmo') {
return true;
} else {
return false;
}
}
et seulement après cela, nous apportons des modifications dans la directive xml avec ceci:
{{if order_object.isPrinted()}}{{var smth}}<br />{{/if}}