PageRenderTime 69ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/app/code/core/Mage/Newsletter/Model/Queue.php

https://bitbucket.org/acidel/buykoala
PHP | 372 lines | 161 code | 35 blank | 176 comment | 20 complexity | 1f4403dd95804557a4079d83bb20415f MD5 | raw file
  1. <?php
  2. /**
  3. * Magento
  4. *
  5. * NOTICE OF LICENSE
  6. *
  7. * This source file is subject to the Open Software License (OSL 3.0)
  8. * that is bundled with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://opensource.org/licenses/osl-3.0.php
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@magentocommerce.com so we can send you a copy immediately.
  14. *
  15. * DISCLAIMER
  16. *
  17. * Do not edit or add to this file if you wish to upgrade Magento to newer
  18. * versions in the future. If you wish to customize Magento for your
  19. * needs please refer to http://www.magentocommerce.com for more information.
  20. *
  21. * @category Mage
  22. * @package Mage_Newsletter
  23. * @copyright Copyright (c) 2011 Magento Inc. (http://www.magentocommerce.com)
  24. * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
  25. */
  26. /**
  27. * Newsletter queue model.
  28. *
  29. * @method Mage_Newsletter_Model_Resource_Queue _getResource()
  30. * @method Mage_Newsletter_Model_Resource_Queue getResource()
  31. * @method int getTemplateId()
  32. * @method Mage_Newsletter_Model_Queue setTemplateId(int $value)
  33. * @method int getNewsletterType()
  34. * @method Mage_Newsletter_Model_Queue setNewsletterType(int $value)
  35. * @method string getNewsletterText()
  36. * @method Mage_Newsletter_Model_Queue setNewsletterText(string $value)
  37. * @method string getNewsletterStyles()
  38. * @method Mage_Newsletter_Model_Queue setNewsletterStyles(string $value)
  39. * @method string getNewsletterSubject()
  40. * @method Mage_Newsletter_Model_Queue setNewsletterSubject(string $value)
  41. * @method string getNewsletterSenderName()
  42. * @method Mage_Newsletter_Model_Queue setNewsletterSenderName(string $value)
  43. * @method string getNewsletterSenderEmail()
  44. * @method Mage_Newsletter_Model_Queue setNewsletterSenderEmail(string $value)
  45. * @method int getQueueStatus()
  46. * @method Mage_Newsletter_Model_Queue setQueueStatus(int $value)
  47. * @method string getQueueStartAt()
  48. * @method Mage_Newsletter_Model_Queue setQueueStartAt(string $value)
  49. * @method string getQueueFinishAt()
  50. * @method Mage_Newsletter_Model_Queue setQueueFinishAt(string $value)
  51. *
  52. * @category Mage
  53. * @package Mage_Newsletter
  54. * @author Magento Core Team <core@magentocommerce.com>
  55. */
  56. class Mage_Newsletter_Model_Queue extends Mage_Core_Model_Template
  57. {
  58. /**
  59. * Newsletter Template object
  60. *
  61. * @var Mage_Newsletter_Model_Template
  62. */
  63. protected $_template;
  64. /**
  65. * Subscribers collection
  66. * @var Varien_Data_Collection_Db
  67. */
  68. protected $_subscribersCollection = null;
  69. /**
  70. * save template flag
  71. *
  72. * @var boolean
  73. * @deprecated since 1.4.0.1
  74. */
  75. protected $_saveTemplateFlag = false;
  76. /**
  77. * Save stores flag.
  78. *
  79. * @var boolean
  80. */
  81. protected $_saveStoresFlag = false;
  82. /**
  83. * Stores assigned to queue.
  84. *
  85. * @var array
  86. */
  87. protected $_stores = array();
  88. const STATUS_NEVER = 0;
  89. const STATUS_SENDING = 1;
  90. const STATUS_CANCEL = 2;
  91. const STATUS_SENT = 3;
  92. const STATUS_PAUSE = 4;
  93. /**
  94. * Initialize resource model
  95. */
  96. protected function _construct()
  97. {
  98. $this->_init('newsletter/queue');
  99. }
  100. /**
  101. * Return: is this queue newly created or not.
  102. *
  103. * @return boolean
  104. */
  105. public function isNew()
  106. {
  107. return (is_null($this->getQueueStatus()));
  108. }
  109. /**
  110. * Returns subscribers collection for this queue
  111. *
  112. * @return Varien_Data_Collection_Db
  113. */
  114. public function getSubscribersCollection()
  115. {
  116. if (is_null($this->_subscribersCollection)) {
  117. $this->_subscribersCollection = Mage::getResourceModel('newsletter/subscriber_collection')
  118. ->useQueue($this);
  119. }
  120. return $this->_subscribersCollection;
  121. }
  122. /**
  123. * Add template data to queue.
  124. *
  125. * @param Varien_Object $data
  126. * @return Mage_Newsletter_Model_Queue
  127. * @deprecated since 1.4.0.1
  128. */
  129. public function addTemplateData($data)
  130. {
  131. $template = $this->getTemplate();
  132. if ($data->getTemplateId() && $data->getTemplateId() != $template->getId()) {
  133. $template->load($data->getTemplateId());
  134. }
  135. return $this;
  136. }
  137. /**
  138. * Set $_data['queue_start'] based on string from backend, which based on locale.
  139. *
  140. * @param string|null $startAt start date of the mailing queue
  141. * @return Mage_Newsletter_Model_Queue
  142. */
  143. public function setQueueStartAtByString($startAt)
  144. {
  145. if(is_null($startAt) || $startAt == '') {
  146. $this->setQueueStartAt(null);
  147. } else {
  148. $locale = Mage::app()->getLocale();
  149. $format = $locale->getDateTimeFormat(Mage_Core_Model_Locale::FORMAT_TYPE_MEDIUM);
  150. $time = $locale->date($startAt, $format)->getTimestamp();
  151. $this->setQueueStartAt(Mage::getModel('core/date')->gmtDate(null, $time));
  152. }
  153. return $this;
  154. }
  155. /**
  156. * Send messages to subscribers for this queue
  157. *
  158. * @param int $count
  159. * @param array $additionalVariables
  160. * @return Mage_Newsletter_Model_Queue
  161. */
  162. public function sendPerSubscriber($count=20, array $additionalVariables=array())
  163. {
  164. if($this->getQueueStatus()!=self::STATUS_SENDING
  165. && ($this->getQueueStatus()!=self::STATUS_NEVER && $this->getQueueStartAt())
  166. ) {
  167. return $this;
  168. }
  169. if ($this->getSubscribersCollection()->getSize() == 0) {
  170. $this->_finishQueue();
  171. return $this;
  172. }
  173. $collection = $this->getSubscribersCollection()
  174. ->useOnlyUnsent()
  175. ->showCustomerInfo()
  176. ->setPageSize($count)
  177. ->setCurPage(1)
  178. ->load();
  179. /* @var $sender Mage_Core_Model_Email_Template */
  180. $sender = Mage::getModel('core/email_template');
  181. $sender->setSenderName($this->getNewsletterSenderName())
  182. ->setSenderEmail($this->getNewsletterSenderEmail())
  183. ->setTemplateType(self::TYPE_HTML)
  184. ->setTemplateSubject($this->getNewsletterSubject())
  185. ->setTemplateText($this->getNewsletterText())
  186. ->setTemplateStyles($this->getNewsletterStyles())
  187. ->setTemplateFilter(Mage::helper('newsletter')->getTemplateProcessor());
  188. foreach($collection->getItems() as $item) {
  189. $email = $item->getSubscriberEmail();
  190. $name = $item->getSubscriberFullName();
  191. $sender->emulateDesign($item->getStoreId());
  192. $successSend = $sender->send($email, $name, array('subscriber' => $item));
  193. $sender->revertDesign();
  194. if($successSend) {
  195. $item->received($this);
  196. } else {
  197. $problem = Mage::getModel('newsletter/problem');
  198. $notification = Mage::helper('newsletter')->__('Please refer to exeption.log');
  199. $problem->addSubscriberData($item)
  200. ->addQueueData($this)
  201. ->addErrorData(new Exception($notification))
  202. ->save();
  203. $item->received($this);
  204. }
  205. }
  206. if(count($collection->getItems()) < $count-1 || count($collection->getItems()) == 0) {
  207. $this->_finishQueue();
  208. }
  209. return $this;
  210. }
  211. /**
  212. * Finish queue: set status SENT and update finish date
  213. *
  214. * @return Mage_Newsletter_Model_Queue
  215. */
  216. protected function _finishQueue()
  217. {
  218. $this->setQueueFinishAt(Mage::getSingleton('core/date')->gmtDate());
  219. $this->setQueueStatus(self::STATUS_SENT);
  220. $this->save();
  221. return $this;
  222. }
  223. /**
  224. * Getter data for saving
  225. *
  226. * @return array
  227. */
  228. public function getDataForSave()
  229. {
  230. $data = array();
  231. $data['template_id'] = $this->getTemplateId();
  232. $data['queue_status'] = $this->getQueueStatus();
  233. $data['queue_start_at'] = $this->getQueueStartAt();
  234. $data['queue_finish_at'] = $this->getQueueFinishAt();
  235. return $data;
  236. }
  237. /**
  238. * Add subscribers to queue.
  239. *
  240. * @param array $subscriberIds
  241. * @return Mage_Newsletter_Model_Queue
  242. */
  243. public function addSubscribersToQueue(array $subscriberIds)
  244. {
  245. $this->_getResource()->addSubscribersToQueue($this, $subscriberIds);
  246. return $this;
  247. }
  248. /**
  249. * Setter for save template flag.
  250. *
  251. * @param boolean|integer|string $value
  252. * @return Mage_Newsletter_Model_Queue
  253. * @deprecated since 1.4.0.1
  254. */
  255. public function setSaveTemplateFlag($value)
  256. {
  257. $this->_saveTemplateFlag = (boolean)$value;
  258. return $this;
  259. }
  260. /**
  261. * Getter for save template flag.
  262. *
  263. * @param void
  264. * @return boolean
  265. * @deprecated since 1.4.0.1
  266. */
  267. public function getSaveTemplateFlag()
  268. {
  269. return $this->_saveTemplateFlag;
  270. }
  271. /**
  272. * Setter for save stores flag.
  273. *
  274. * @param boolean|integer|string $value
  275. * @return Mage_Newsletter_Model_Queue
  276. */
  277. public function setSaveStoresFlag($value)
  278. {
  279. $this->_saveStoresFlag = (boolean)$value;
  280. return $this;
  281. }
  282. /**
  283. * Getter for save stores flag.
  284. *
  285. * @param void
  286. * @return boolean
  287. */
  288. public function getSaveStoresFlag()
  289. {
  290. return $this->_saveStoresFlag;
  291. }
  292. /**
  293. * Setter for stores of queue.
  294. *
  295. * @param array
  296. * @return Mage_Newsletter_Model_Queue
  297. */
  298. public function setStores(array $storesIds)
  299. {
  300. $this->setSaveStoresFlag(true);
  301. $this->_stores = $storesIds;
  302. return $this;
  303. }
  304. /**
  305. * Getter for stores of queue.
  306. *
  307. * @return array
  308. */
  309. public function getStores()
  310. {
  311. if(!$this->_stores) {
  312. $this->_stores = $this->_getResource()->getStores($this);
  313. }
  314. return $this->_stores;
  315. }
  316. /**
  317. * Retrieve Newsletter Template object
  318. *
  319. * @return Mage_Newsletter_Model_Template
  320. */
  321. public function getTemplate()
  322. {
  323. if (is_null($this->_template)) {
  324. $this->_template = Mage::getModel('newsletter/template')
  325. ->load($this->getTemplateId());
  326. }
  327. return $this->_template;
  328. }
  329. /**
  330. * Getter for template type
  331. *
  332. * @return int|string
  333. */
  334. public function getType(){
  335. return $this->getNewsletterType();
  336. }
  337. }