*/
class Mage_Newsletter_Model_Template extends Mage_Core_Model_Template
{
/**
* Template Text Preprocessed flag
*
* @var bool
*/
protected $_preprocessFlag = false;
/**
* Mail object
*
* @var Zend_Mail
*/
protected $_mail;
/**
* Initialize resource model
*
*/
protected function _construct()
{
$this->_init('newsletter/template');
}
/**
* Validate Newsletter template
*
* @throws Mage_Core_Exception
* @return bool
*/
public function validate()
{
$validators = array(
'template_code' => array(Zend_Filter_Input::ALLOW_EMPTY => false),
'template_type' => 'Int',
'template_sender_email' => 'EmailAddress',
'template_sender_name' => array(Zend_Filter_Input::ALLOW_EMPTY => false)
);
$data = array();
foreach (array_keys($validators) as $validateField) {
$data[$validateField] = $this->getDataUsingMethod($validateField);
}
$validateInput = new Zend_Filter_Input(array(), $validators, $data);
if (!$validateInput->isValid()) {
$errorMessages = array();
foreach ($validateInput->getMessages() as $messages) {
if (is_array($messages)) {
foreach ($messages as $message) {
$errorMessages[] = $message;
}
}
else {
$errorMessages[] = $messages;
}
}
Mage::throwException(join("\n", $errorMessages));
}
}
/**
* Processing object before save data
*
* @return Mage_Newsletter_Model_Template
*/
protected function _beforeSave()
{
$this->validate();
return parent::_beforeSave();
}
/**
* Load template by code
*
* @param string $templateCode
* @return Mage_Newsletter_Model_Template
*/
public function loadByCode($templateCode)
{
$this->_getResource()->loadByCode($this, $templateCode);
return $this;
}
/**
* Return true if this template can be used for sending queue as main template
*
* @return boolean
* @deprecated since 1.4.0.1
*/
public function isValidForSend()
{
return !Mage::getStoreConfigFlag('system/smtp/disable')
&& $this->getTemplateSenderName()
&& $this->getTemplateSenderEmail()
&& $this->getTemplateSubject();
}
/**
* Getter for template type
*
* @return int|string
*/
public function getType(){
return $this->getTemplateType();
}
/**
* Check is Preprocessed
*
* @return bool
*/
public function isPreprocessed()
{
return strlen($this->getTemplateTextPreprocessed()) > 0;
}
/**
* Check Template Text Preprocessed
*
* @return bool
*/
public function getTemplateTextPreprocessed()
{
if ($this->_preprocessFlag) {
$this->setTemplateTextPreprocessed($this->getProcessedTemplate());
}
return $this->getData('template_text_preprocessed');
}
/**
* Retrieve processed template
*
* @param array $variables
* @param bool $usePreprocess
* @return string
*/
public function getProcessedTemplate(array $variables = array(), $usePreprocess = false)
{
/* @var $processor Mage_Newsletter_Model_Template_Filter */
$processor = Mage::helper('newsletter')->getTemplateProcessor();
if (!$this->_preprocessFlag) {
$variables['this'] = $this;
}
if (Mage::app()->isSingleStoreMode()) {
$processor->setStoreId(Mage::app()->getStore());
} else {
$processor->setStoreId(Mage::app()->getRequest()->getParam('store_id'));
}
$processor
->setIncludeProcessor(array($this, 'getInclude'))
->setVariables($variables);
if ($usePreprocess && $this->isPreprocessed()) {
return $processor->filter($this->getPreparedTemplateText(true));
}
return $processor->filter($this->getPreparedTemplateText());
}
/**
* Makes additional text preparations for HTML templates
*
* @param bool $usePreprocess Use Preprocessed text or original text
* @return string
*/
public function getPreparedTemplateText($usePreprocess = false)
{
$text = $usePreprocess ? $this->getTemplateTextPreprocessed() : $this->getTemplateText();
if ($this->_preprocessFlag || $this->isPlain() || !$this->getTemplateStyles()) {
return $text;
}
// wrap styles into style tag
$html = "\n%s";
return sprintf($html, $this->getTemplateStyles(), $text);
}
/**
* Retrieve included template
*
* @param string $templateCode
* @param array $variables
* @return string
*/
public function getInclude($templateCode, array $variables)
{
return Mage::getModel('newsletter/template')
->loadByCode($templateCode)
->getProcessedTemplate($variables);
}
/**
* Retrieve mail object instance
*
* @return Zend_Mail
* @deprecated since 1.4.0.1
*/
public function getMail()
{
if (is_null($this->_mail)) {
$this->_mail = new Zend_Mail('utf-8');
}
return $this->_mail;
}
/**
* Send mail to subscriber
*
* @param Mage_Newsletter_Model_Subscriber|string $subscriber subscriber Model or E-mail
* @param array $variables template variables
* @param string|null $name receiver name (if subscriber model not specified)
* @param Mage_Newsletter_Model_Queue|null $queue queue model, used for problems reporting.
* @return boolean
* @deprecated since 1.4.0.1
**/
public function send($subscriber, array $variables = array(), $name=null, Mage_Newsletter_Model_Queue $queue=null)
{
if (!$this->isValidForSend()) {
return false;
}
$email = '';
if ($subscriber instanceof Mage_Newsletter_Model_Subscriber) {
$email = $subscriber->getSubscriberEmail();
if (is_null($name) && ($subscriber->hasCustomerFirstname() || $subscriber->hasCustomerLastname()) ) {
$name = $subscriber->getCustomerFirstname() . ' ' . $subscriber->getCustomerLastname();
}
}
else {
$email = (string) $subscriber;
}
if (Mage::getStoreConfigFlag(Mage_Core_Model_Email_Template::XML_PATH_SENDING_SET_RETURN_PATH)) {
$this->getMail()->setReturnPath($this->getTemplateSenderEmail());
}
ini_set('SMTP', Mage::getStoreConfig('system/smtp/host'));
ini_set('smtp_port', Mage::getStoreConfig('system/smtp/port'));
$mail = $this->getMail();
$mail->addTo($email, $name);
$text = $this->getProcessedTemplate($variables, true);
if ($this->isPlain()) {
$mail->setBodyText($text);
}
else {
$mail->setBodyHTML($text);
}
$mail->setSubject($this->getProcessedTemplateSubject($variables));
$mail->setFrom($this->getTemplateSenderEmail(), $this->getTemplateSenderName());
try {
$mail->send();
$this->_mail = null;
if (!is_null($queue)) {
$subscriber->received($queue);
}
}
catch (Exception $e) {
if ($subscriber instanceof Mage_Newsletter_Model_Subscriber) {
// If letter sent for subscriber, we create a problem report entry
$problem = Mage::getModel('newsletter/problem');
$problem->addSubscriberData($subscriber);
if (!is_null($queue)) {
$problem->addQueueData($queue);
}
$problem->addErrorData($e);
$problem->save();
if (!is_null($queue)) {
$subscriber->received($queue);
}
} else {
// Otherwise throw error to upper level
throw $e;
}
return false;
}
return true;
}
/**
* Prepare Process (with save)
*
* @return Mage_Newsletter_Model_Template
* @deprecated since 1.4.0.1
*/
public function preprocess()
{
$this->_preprocessFlag = true;
$this->save();
$this->_preprocessFlag = false;
return $this;
}
/**
* Retrieve processed template subject
*
* @param array $variables
* @return string
*/
public function getProcessedTemplateSubject(array $variables)
{
$processor = new Varien_Filter_Template();
if (!$this->_preprocessFlag) {
$variables['this'] = $this;
}
$processor->setVariables($variables);
return $processor->filter($this->getTemplateSubject());
}
/**
* Retrieve template text wrapper
*
* @return string
*/
public function getTemplateText()
{
if (!$this->getData('template_text') && !$this->getId()) {
$this->setData('template_text',
Mage::helper('newsletter')->__('Follow this link to unsubscribe {{var subscriber.getUnsubscriptionLink()}}')
);
}
return $this->getData('template_text');
}
}