1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
26:
27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56:
57: class Mage_Newsletter_Model_Template extends Mage_Core_Model_Template
58: {
59: 60: 61: 62: 63:
64: protected $_preprocessFlag = false;
65:
66: 67: 68: 69: 70:
71: protected $_mail;
72:
73: 74: 75: 76:
77: protected function _construct()
78: {
79: $this->_init('newsletter/template');
80: }
81:
82: 83: 84: 85: 86: 87:
88: public function validate()
89: {
90: $validators = array(
91: 'template_code' => array(Zend_Filter_Input::ALLOW_EMPTY => false),
92: 'template_type' => 'Int',
93: 'template_sender_email' => 'EmailAddress',
94: 'template_sender_name' => array(Zend_Filter_Input::ALLOW_EMPTY => false)
95: );
96: $data = array();
97: foreach (array_keys($validators) as $validateField) {
98: $data[$validateField] = $this->getDataUsingMethod($validateField);
99: }
100:
101: $validateInput = new Zend_Filter_Input(array(), $validators, $data);
102: if (!$validateInput->isValid()) {
103: $errorMessages = array();
104: foreach ($validateInput->getMessages() as $messages) {
105: if (is_array($messages)) {
106: foreach ($messages as $message) {
107: $errorMessages[] = $message;
108: }
109: }
110: else {
111: $errorMessages[] = $messages;
112: }
113: }
114:
115: Mage::throwException(join("\n", $errorMessages));
116: }
117: }
118:
119: 120: 121: 122: 123:
124: protected function _beforeSave()
125: {
126: $this->validate();
127: return parent::_beforeSave();
128: }
129:
130: 131: 132: 133: 134: 135:
136: public function loadByCode($templateCode)
137: {
138: $this->_getResource()->loadByCode($this, $templateCode);
139: return $this;
140: }
141:
142: 143: 144: 145: 146: 147:
148: public function isValidForSend()
149: {
150: return !Mage::getStoreConfigFlag('system/smtp/disable')
151: && $this->getTemplateSenderName()
152: && $this->getTemplateSenderEmail()
153: && $this->getTemplateSubject();
154: }
155:
156: 157: 158: 159: 160:
161: public function getType(){
162: return $this->getTemplateType();
163: }
164:
165: 166: 167: 168: 169:
170: public function isPreprocessed()
171: {
172: return strlen($this->getTemplateTextPreprocessed()) > 0;
173: }
174:
175: 176: 177: 178: 179:
180: public function getTemplateTextPreprocessed()
181: {
182: if ($this->_preprocessFlag) {
183: $this->setTemplateTextPreprocessed($this->getProcessedTemplate());
184: }
185:
186: return $this->getData('template_text_preprocessed');
187: }
188:
189: 190: 191: 192: 193: 194: 195:
196: public function getProcessedTemplate(array $variables = array(), $usePreprocess = false)
197: {
198:
199: $processor = Mage::helper('newsletter')->getTemplateProcessor();
200:
201: if (!$this->_preprocessFlag) {
202: $variables['this'] = $this;
203: }
204:
205: if (Mage::app()->isSingleStoreMode()) {
206: $processor->setStoreId(Mage::app()->getStore());
207: } else {
208: $processor->setStoreId(Mage::app()->getRequest()->getParam('store_id'));
209: }
210:
211: $processor
212: ->setIncludeProcessor(array($this, 'getInclude'))
213: ->setVariables($variables);
214:
215: if ($usePreprocess && $this->isPreprocessed()) {
216: return $processor->filter($this->getPreparedTemplateText(true));
217: }
218:
219: return $processor->filter($this->getPreparedTemplateText());
220: }
221:
222: 223: 224: 225: 226: 227:
228: public function getPreparedTemplateText($usePreprocess = false)
229: {
230: $text = $usePreprocess ? $this->getTemplateTextPreprocessed() : $this->getTemplateText();
231:
232: if ($this->_preprocessFlag || $this->isPlain() || !$this->getTemplateStyles()) {
233: return $text;
234: }
235:
236: $html = "<style type=\"text/css\">\n%s\n</style>\n%s";
237: return sprintf($html, $this->getTemplateStyles(), $text);
238: }
239:
240: 241: 242: 243: 244: 245: 246:
247: public function getInclude($templateCode, array $variables)
248: {
249: return Mage::getModel('newsletter/template')
250: ->loadByCode($templateCode)
251: ->getProcessedTemplate($variables);
252: }
253:
254: 255: 256: 257: 258: 259:
260: public function getMail()
261: {
262: if (is_null($this->_mail)) {
263: $this->_mail = new Zend_Mail('utf-8');
264: }
265: return $this->_mail;
266: }
267:
268:
269: 270: 271: 272: 273: 274: 275: 276: 277: 278:
279: public function send($subscriber, array $variables = array(), $name=null, Mage_Newsletter_Model_Queue $queue=null)
280: {
281: if (!$this->isValidForSend()) {
282: return false;
283: }
284:
285: $email = '';
286: if ($subscriber instanceof Mage_Newsletter_Model_Subscriber) {
287: $email = $subscriber->getSubscriberEmail();
288: if (is_null($name) && ($subscriber->hasCustomerFirstname() || $subscriber->hasCustomerLastname()) ) {
289: $name = $subscriber->getCustomerFirstname() . ' ' . $subscriber->getCustomerLastname();
290: }
291: }
292: else {
293: $email = (string) $subscriber;
294: }
295:
296: if (Mage::getStoreConfigFlag(Mage_Core_Model_Email_Template::XML_PATH_SENDING_SET_RETURN_PATH)) {
297: $this->getMail()->setReturnPath($this->getTemplateSenderEmail());
298: }
299:
300: ini_set('SMTP', Mage::getStoreConfig('system/smtp/host'));
301: ini_set('smtp_port', Mage::getStoreConfig('system/smtp/port'));
302:
303: $mail = $this->getMail();
304: $mail->addTo($email, $name);
305: $text = $this->getProcessedTemplate($variables, true);
306:
307: if ($this->isPlain()) {
308: $mail->setBodyText($text);
309: }
310: else {
311: $mail->setBodyHTML($text);
312: }
313:
314: $mail->setSubject($this->getProcessedTemplateSubject($variables));
315: $mail->setFrom($this->getTemplateSenderEmail(), $this->getTemplateSenderName());
316:
317: try {
318: $mail->send();
319: $this->_mail = null;
320: if (!is_null($queue)) {
321: $subscriber->received($queue);
322: }
323: }
324: catch (Exception $e) {
325: if ($subscriber instanceof Mage_Newsletter_Model_Subscriber) {
326:
327: $problem = Mage::getModel('newsletter/problem');
328: $problem->addSubscriberData($subscriber);
329: if (!is_null($queue)) {
330: $problem->addQueueData($queue);
331: }
332: $problem->addErrorData($e);
333: $problem->save();
334:
335: if (!is_null($queue)) {
336: $subscriber->received($queue);
337: }
338: } else {
339:
340: throw $e;
341: }
342: return false;
343: }
344:
345: return true;
346: }
347:
348: 349: 350: 351: 352: 353:
354: public function preprocess()
355: {
356: $this->_preprocessFlag = true;
357: $this->save();
358: $this->_preprocessFlag = false;
359: return $this;
360: }
361:
362: 363: 364: 365: 366: 367:
368: public function getProcessedTemplateSubject(array $variables)
369: {
370: $processor = new Varien_Filter_Template();
371:
372: if (!$this->_preprocessFlag) {
373: $variables['this'] = $this;
374: }
375:
376: $processor->setVariables($variables);
377: return $processor->filter($this->getTemplateSubject());
378: }
379:
380: 381: 382: 383: 384:
385: public function getTemplateText()
386: {
387: if (!$this->getData('template_text') && !$this->getId()) {
388: $this->setData('template_text',
389: Mage::helper('newsletter')->__('Follow this link to unsubscribe <!-- This tag is for unsubscribe link --><a href="{{var subscriber.getUnsubscriptionLink()}}">{{var subscriber.getUnsubscriptionLink()}}</a>')
390: );
391: }
392:
393: return $this->getData('template_text');
394: }
395: }
396: