PageRenderTime 25ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/lib/models/Message.php

https://github.com/balupton/balphp
PHP | 402 lines | 217 code | 61 blank | 124 comment | 19 complexity | e838a0725c4fce8f81e9c1329cc1bf76 MD5 | raw file
  1. <?php
  2. /**
  3. * Message
  4. *
  5. * This class has been auto-generated by the Doctrine ORM Framework
  6. *
  7. * @package ##PACKAGE##
  8. * @subpackage ##SUBPACKAGE##
  9. * @author ##NAME## <##EMAIL##>
  10. * @version SVN: $Id: Builder.php 6820 2009-11-30 17:27:49Z jwage $
  11. */
  12. class Bal_Message extends Base_Bal_Message
  13. {
  14. /**
  15. * Generate the Email's Content
  16. * @return
  17. */
  18. protected function _generateEmailContent ( ) {
  19. # Prepare
  20. $Locale = Bal_App::getLocale();
  21. $View = Bal_App::getView(true);
  22. $Message = $this;
  23. # Prepare Message
  24. $params = array();
  25. $params['Message'] = is_array($Message) ? $Message : $Message->toArray(true);
  26. # Update Params
  27. $this->_updateParams($params);
  28. # Render
  29. $xhtml =
  30. $View->doctype().
  31. '<html>'.
  32. '<head>'.
  33. $View->headTitle().
  34. $View->headLink().
  35. $View->headStyle().
  36. '</head>'.
  37. '<body class="email">'.
  38. '<div class="email-wrapper">'.
  39. '<div class="email-header">'.
  40. $Locale->translate('message-header',$params).
  41. '</div>'.
  42. '<div class="email-body">'.
  43. '<div class="email-from">'.
  44. $Locale->translate('message-from',$params).
  45. '</div>'.
  46. '<div class="email-title">'.
  47. $Locale->translate('message-title',$params).
  48. '</div>'.
  49. '<div class="email-description">'.
  50. $Locale->translate('message-description',$params).
  51. '</div>'.
  52. '</div>'.
  53. '<div class="email-footer">'.
  54. $Locale->translate('message-footer',$params).
  55. '</div>'.
  56. '</div>'.
  57. '</body>'.
  58. '</html>';
  59. # Return xhtml
  60. return $xhtml;
  61. }
  62. /**
  63. * Update the translation params
  64. * @return
  65. */
  66. protected function _updateParams ( array &$params ) {
  67. # Prepare
  68. $Locale = Bal_App::getLocale();
  69. $View = Bal_App::getView(false);
  70. $View->url()->renege('route','app');
  71. $Message = $this;
  72. # Prepare Relations
  73. $UserFrom = delve($Message,'UserFrom');
  74. $UserFor = delve($Message,'UserFor');
  75. # Apply Relations
  76. $params['from'] = delve($UserFrom,'fullname','System');
  77. $params['for'] = delve($UserFor, 'fullname','System');
  78. # Prepare Urls
  79. $root_url = $View->app()->getRootUrl();
  80. $base_url = $View->app()->getBaseUrl(true);
  81. $Message_url = $root_url.$View->url()->message($Message)->toString();
  82. $UserFrom_url = delve($UserFrom,'id') ? $root_url.$View->url()->user($UserFrom)->toString() : $root_url;
  83. $UserFor_url = delve($UserFor,'id') ? $root_url.$View->url()->user($UserFor)->toString() : $root_url;
  84. # Apply URLs
  85. $params['root_url'] = $root_url;
  86. $params['base_url'] = $base_url;
  87. $params['Message_url'] = $Message_url;
  88. $params['UserFrom_url'] = $UserFrom_url;
  89. $params['UserFor_url'] = $UserFor_url;
  90. # Chain
  91. return $this;
  92. }
  93. /**
  94. * Shortcut Message Creation via Codes
  95. * @return
  96. */
  97. public function useTemplate ( $template, array $data = array() ) {
  98. # Prepare
  99. $Locale = Bal_App::getLocale();
  100. $Message = $this;
  101. # --------------------------
  102. # Prepare Message
  103. $params = is_array($data) ? $data : array();
  104. $params['Message'] = $Message->toArray();
  105. # Handle Message
  106. $function = '_template'.magic_function($template);
  107. if ( method_exists($this, $function) ) {
  108. $this->$function($params,$data);
  109. }
  110. # Update Params
  111. $this->_updateParams($params);
  112. # --------------------------
  113. # Render
  114. $title = empty($this->title) ? $Locale->translate('message-'.$template.'-title', $params) : $Locale->translate_default('message-'.$template.'-title', $params, $this->title);
  115. $description = empty($this->description) ? $Locale->translate('message-'.$template.'-description', $params) : $Locale->translate_default('message-'.$template.'-description', $params, $this->description);
  116. # --------------------------
  117. # Apply
  118. $this->title = $title;
  119. $this->description = $description;
  120. $this->_set('template', $template, false);
  121. # Chain
  122. return $this;
  123. }
  124. /**
  125. * Set Message Code: user-insert
  126. * @return
  127. */
  128. protected function _templateUserInsert ( &$params, &$data ) {
  129. # Prepare
  130. $Locale = Bal_App::getLocale();
  131. $View = Bal_App::getView(false);
  132. $View->url()->renege('route','app');
  133. $Message = $this;
  134. $UserFor = delve($Message,'UserFor');
  135. # Prepare Urls
  136. $rootUrl = $View->app()->getRootUrl();
  137. $baseUrl = $View->app()->getBaseUrl(true);
  138. # --------------------------
  139. # Prepare URL
  140. $activateUrl = $rootUrl.$View->url()->userActivate($UserFor)->toString();
  141. $params['User_url_activate'] = $activateUrl;
  142. # --------------------------
  143. return true;
  144. }
  145. /**
  146. * Send the Message
  147. * @return
  148. */
  149. public function send ( ) {
  150. # Prepare
  151. $Message = $this;
  152. $UserFor = delve($Message,'UserFor');
  153. $mail = Bal_App::getConfig('mail');
  154. # Prepare Mail
  155. $mail['subject'] = $Message->title;
  156. $mail['html'] = $this->_generateEmailContent();
  157. $mail['text'] = strip_tags($mail['html']);
  158. # Create Mail
  159. $Mail = new Zend_Mail();
  160. $Mail->setFrom($mail['from']['address'], $mail['from']['name']);
  161. $Mail->setSubject($mail['subject']);
  162. $Mail->setBodyText($mail['text']);
  163. $Mail->setBodyHtml($mail['html']);
  164. # Add Receipient
  165. if ( delve($UserFor,'id') ) {
  166. $email = $UserFor->email;
  167. $fullname = $UserFor->fullname;
  168. } else {
  169. $email = $mail['from']['address'];
  170. $fullname = $mail['from']['name'];
  171. }
  172. $Mail->addTo($email, $fullname);
  173. # Send Mail
  174. $Mail->send();
  175. # Done
  176. $Message->sent_on = doctrine_timestamp();
  177. $Message->status = 'published';
  178. # Chain
  179. return $this;
  180. }
  181. /**
  182. * Ensure Message
  183. * @param Doctrine_Event $Event
  184. * @return boolean wheter or not to save
  185. */
  186. public function ensureMessage ( $Event, $Event_type ) {
  187. # Check
  188. if ( !in_array($Event_type,array('postSave','preInsert')) ) {
  189. # Not designed for these events
  190. return null;
  191. }
  192. # Prepare
  193. $save = false;
  194. # Fetch
  195. $Message = $Event->getInvoker();
  196. # preInsert
  197. if ( $Event_type === 'preInsert' ) {
  198. # Prepare
  199. $UserFor = delve($Message,'UserFor');
  200. $UserFor_id = delve($UserFor,'id');
  201. # Hash
  202. $hash = md5($Message->send_on.$Message->title.$Message->description.$UserFor_id);
  203. if ( $Message->hash != $hash ) {
  204. $Message->set('hash', $hash, false);
  205. $save = true;
  206. }
  207. # Ensure Only One
  208. Doctrine_Query::create()
  209. ->delete('Message m')
  210. ->where('m.hash = ?', $Message->hash)
  211. ->execute();
  212. ;
  213. # Send On
  214. if ( !$Message->send_on ) {
  215. $Message->set('send_on', doctrine_timestamp(), false);
  216. $save = true;
  217. }
  218. }
  219. elseif ( $Event_type === 'postSave' ) {
  220. # Send
  221. if ( $Message->id && empty($Message->sent_on) && strtotime($Message->send_on) <= time() ) {
  222. # We want to send now or earlier
  223. $Message->send();
  224. $save = true;
  225. } else {
  226. # We want to send later
  227. // do nothing
  228. }
  229. }
  230. # Done
  231. return $save;
  232. }
  233. /**
  234. * Ensure Consistency
  235. * @param Doctrine_Event $Event
  236. * @return boolean wheter or not to save
  237. */
  238. public function ensure ( $Event, $Event_type ){
  239. return Bal_Doctrine_Core::ensure($Event,$Event_type,array(
  240. 'ensureMessage'
  241. ));
  242. }
  243. /**
  244. * preSave Event
  245. * @param Doctrine_Event $Event
  246. * @return
  247. */
  248. public function preSave ( $Event ) {
  249. # Prepare
  250. $result = true;
  251. # Ensure
  252. if ( self::ensure($Event, __FUNCTION__) ) {
  253. // no need
  254. }
  255. # Done
  256. return method_exists(get_parent_class($this),$parent_method = __FUNCTION__) ? parent::$parent_method($Event) : $result;
  257. }
  258. /**
  259. * postSave Event
  260. * @param Doctrine_Event $Event
  261. * @return
  262. */
  263. public function postSave ( $Event ) {
  264. # Prepare
  265. $Invoker = $Event->getInvoker();
  266. $result = true;
  267. # Ensure
  268. if ( self::ensure($Event, __FUNCTION__) ) {
  269. $Invoker->save();
  270. }
  271. # Done
  272. return method_exists(get_parent_class($this),$parent_method = __FUNCTION__) ? parent::$parent_method($Event) : $result;
  273. }
  274. /**
  275. * Pre Insert Event
  276. * @param Doctrine_Event $Event
  277. */
  278. public function preInsert ( $Event ) {
  279. # Prepare
  280. $Message = $Event->getInvoker();
  281. $result = true;
  282. # Ensure
  283. if ( self::ensure($Event, __FUNCTION__) ) {
  284. // no need
  285. }
  286. # Done
  287. return method_exists(get_parent_class($this),$parent_method = __FUNCTION__) ? parent::$parent_method($Event) : $result;
  288. }
  289. # ========================
  290. # CRUD HELPERS
  291. /**
  292. * Fetch all the records for public access
  293. * @version 1.0, April 12, 2010
  294. * @return mixed
  295. */
  296. public static function fetch ( array $params = array() ) {
  297. # Prepare
  298. Bal_Doctrine_Core::prepareFetchParams($params,array('Message','User','UserFrom','UserFor'));
  299. extract($params);
  300. # Query
  301. $Query = Doctrine_Query::create()
  302. ->select('Message.*, UserFrom.id, UserFrom.displayname, UserFrom.fullname, UserFor.id, UserFor.displayname, UserFor.fullname')
  303. ->from('Message, Message.UserFrom UserFrom, Message.UserFor UserFor')
  304. ->orderBy('Message.send_on DESC')
  305. ->andWhere('Message.sent_on <= ?', doctrine_timestamp());
  306. # Criteria
  307. if ( $User ) {
  308. $identifier = Bal_Doctrine_Core::resolveIdentifier('User',$User);
  309. $Query->andWhere(
  310. 'Message.UserFor.'.$identifier['column'].' = ? OR '.
  311. 'Message.UserFrom.'.$identifier['column'].' = ?',
  312. array($identifier['value'],$identifier['value'])
  313. );
  314. }
  315. if ( $UserFor ) {
  316. $identifier = Bal_Doctrine_Core::resolveIdentifier('User',$UserFor);
  317. $Query->andWhere(
  318. 'Message.UserFor.'.$identifier['column'].' = ?',
  319. $identifier['value']
  320. );
  321. }
  322. if ( $UserFrom ) {
  323. $identifier = Bal_Doctrine_Core::resolveIdentifier('User',$UserFrom);
  324. $Query->andWhere(
  325. 'Message.UserFrom.'.$identifier['column'].' = ?',
  326. $identifier['value']
  327. );
  328. }
  329. if ( $Message ) {
  330. $identifier = Bal_Doctrine_Core::resolveIdentifier('Message',$Message);
  331. $Query->andWhere(
  332. 'Message.'.$identifier['column'].' = ?',
  333. $identifier['value']
  334. );
  335. }
  336. # Fetch
  337. $result = Bal_Doctrine_Core::prepareFetchResult($params,$Query,'Message');
  338. # Done
  339. return $result;
  340. }
  341. }