Without rewriting core classes you cannot pass variables to the e-mail templates. This is a real disappointment for me too. I needed this numerous times.
But here is a workaround.
Instead of having custom variables you can have custom {{...}}
directives.
So instead of using {{var something}}
you can use directly {{something}}
.
But for this you need to create your own class that handles these directives (short codes).
Create your own class Namespace_Module_Model_Template_Filter
that extends Mage_Core_Email_Template_Filter
where you add this method:
public function somethingDirective($construction) {
$params = $this->_getIncludeParameters($construction[2]);
//do something with params
return expected result;
}
$params
is an array with what you pass to the directive {{something param1=value1 param2=value2....}}
.
Now all you need is to tell Magento to use your template filter instead of the one it uses by default.
Unfortunately I didn't find a 100% rewrite-less method.
You still have to rewrite the email template filter model. But this should not be an issue if nothing else rewrites it.
You need to add this in your config.xml
<models>
<core>
<rewrite>
<email_template_filter>Namespace_Module_Email_Template_Filter</email_template_filter>
</rewrite>
</core>
</models>
I know this is not exactly what you were hoping for, but it provides a cleaner way of doing it than no rewrite every method that sends an e-mail. Doing this will make your new directives available in all templates.
Even if I say it a lot, and this may look like spam, I have to quote my sources.
This idea is not mine. I got it from Vinai Kopp's book Grokking Magento
Best Answer
You would need to rewrite
Mage_Core_Model_Email_Template_Mailer
and you'll have to create a concrete method for the magic methodsetTemplateParams
:It's pretty simple - we're getting in between the magic method with a concrete method, injecting our template
{{var your_varname}}
handle for the email and then passing that up to the magic method!Best of luck!