Cercherò di rispondere alla tua domanda iniziale: come usare la direttiva con condizione. Per il debug uso xDebug. E secondo me è molto difficile eseguire il debug delle e-mail. In tal caso, ti mostro un esempio con la stessa struttura in un'altra parte di Magento.
Sulla vendita / ordine / vista c'è la stessa struttura. La struttura di output dell'indirizzo determinata Mage/Core/etc/config.xml
in default/customer/address_templates/text
.
Il nostro compito sarà aggiungere qualsiasi condizione per mostrare o meno il "nome dell'azienda". Direttive come var , dipendono , se analizzate nel filtro delVarien_Filter_Template
metodo ($ value) . In questo metodo c'è l'iterazione di tutte le $ costruzioni (if / depend / var) e di tutte le $ costruzioni usate in questa chiamata:
$replacedValue = call_user_func($callback, $construction);
Per ogni if / depende / var esiste un metodo proprio. Guardiamopublic 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];
}
}
Ora diamo un'occhiata al metodo protetto _getVariable. Vorrei attirare la tua attenzione su una riga:
} elseif (isset($stackVars[$i-1]['variable']) && $stackVars[$i-1]['variable'] instanceof Varien_Object) {
e guarda il commento qui sotto:
// If object calling methods or getting properties
Quindi, per rendere le condizioni, i nostri $ stackVars dovrebbero essere un oggetto e un'istanza di Varien_Object (la maggior parte dei modelli si estende da Mage_Core_Model_Abstract, che si estende da Varien_Object). Saliamo qualche gradino sopra. Dobbiamo aggiungere a stackVars e oggetto.
Nel mio esempio nella classe Mage_Customer_Block_Address_Renderer_Default magento chiama il metodo method ($ value), che ho menzionato sopra.
Qui fornisco una soluzione. Avvertimento! Questa soluzione non è molto pulita. Ha lo scopo di mostrare il comportamento del magento. Per favore, fai tutto da solo riscrivi.
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);
}
In questo metodo aggiungeremo un oggetto ordine all'array $ data. Secondo il mio compito, aggiungiamo l'oggetto ordine a questo array. Fallo prima di '$ formater-> setVariables ($ data);'
$data['order_object'] = $address->getOrder();
Dopo questo magento analizzerà questo oggetto e chiamerà qualsiasi suo metodo. Ad esempio, aggiungiamo un nuovo metodo getPaymentOutput (). Inserisci funzionalità semplice nella classe Ordine:
public function isPrinted()
{
if ($this->getPayment()->getMethod() == 'checkmo') {
return true;
} else {
return false;
}
}
e solo successivamente apportiamo modifiche alla direttiva xml con questo:
{{if order_object.isPrinted()}}{{var smth}}<br />{{/if}}