Overview

Packages

  • CONTENIDO
  • Core
    • Authentication
    • Backend
    • Cache
    • CEC
    • Chain
    • ContentType
    • Database
    • Debug
    • Exception
    • Frontend
      • Search
      • URI
      • Util
    • GenericDB
      • Model
    • GUI
      • HTML
    • I18N
    • LayoutHandler
    • Log
    • Security
    • Session
    • Util
    • Validation
    • Versioning
    • XML
  • Module
    • ContentSitemapHtml
    • ContentSitemapXml
    • ContentUserForum
    • NavigationTop
    • ScriptCookieDirective
  • mpAutoloaderClassMap
  • None
  • PHP
  • Plugin
    • ContentAllocation
    • CronjobOverview
    • FormAssistant
    • FrontendLogic
    • FrontendUsers
    • Linkchecker
    • ModRewrite
    • Newsletter
    • Repository
      • FrontendNavigation
      • KeywordDensity
    • SIWECOS
    • SmartyWrapper
    • UrlShortener
    • UserForum
    • Workflow
  • PluginManager
  • Setup
    • Form
    • GUI
    • Helper
      • Environment
      • Filesystem
      • MySQL
      • PHP
    • UpgradeJob

Classes

  • Newsletter
  • NewsletterCollection
  • NewsletterJob
  • NewsletterJobCollection
  • NewsletterLog
  • NewsletterLogCollection
  • NewsletterRecipient
  • NewsletterRecipientCollection
  • NewsletterRecipientGroup
  • NewsletterRecipientGroupCollection
  • NewsletterRecipientGroupMember
  • NewsletterRecipientGroupMemberCollection
  • Overview
  • Package
  • Class
  • Tree
  • Deprecated
  • Todo
  1: <?php
  2: /**
  3:  * This file contains the Collection management class.
  4:  *
  5:  * @package Plugin
  6:  * @subpackage Newsletter
  7:  * @author Bjoern Behrens
  8:  * @copyright four for business AG <www.4fb.de>
  9:  * @license http://www.contenido.org/license/LIZENZ.txt
 10:  * @link http://www.4fb.de
 11:  * @link http://www.contenido.org
 12:  */
 13: 
 14: defined('CON_FRAMEWORK') || die('Illegal call: Missing framework initialization - request aborted.');
 15: 
 16: /**
 17:  * Collection management class.
 18:  *
 19:  * @package Plugin
 20:  * @subpackage Newsletter
 21:  * @method NewsletterJob createNewItem
 22:  * @method NewsletterJob next
 23:  */
 24: class NewsletterJobCollection extends ItemCollection {
 25:     /**
 26:      * Constructor Function
 27:      *
 28:      * @throws cInvalidArgumentException
 29:      */
 30:     public function __construct() {
 31:         global $cfg;
 32:         parent::__construct($cfg["tab"]["news_jobs"], "idnewsjob");
 33:         $this->_setItemClass("NewsletterJob");
 34:     }
 35: 
 36:     /**
 37:      * Creates a newsletter job
 38:      *
 39:      * @param        $iIDNews
 40:      * @param        $iIDCatArt
 41:      * @param string $sName
 42:      *
 43:      * @return bool|Item
 44:      * @throws cDbException
 45:      * @throws cException
 46:      * @throws cInvalidArgumentException
 47:      */
 48:     public function create($iIDNews, $iIDCatArt, $sName = "") {
 49: 
 50:         global $client, $lang, $cfg, $cfgClient, $auth;
 51:         $oNewsletter = new Newsletter();
 52:         if ($oNewsletter->loadByPrimaryKey($iIDNews)) {
 53:             $iIDNews = cSecurity::toInteger($iIDNews);
 54:             $iIDCatArt = cSecurity::toInteger($iIDCatArt);
 55:             $lang = cSecurity::toInteger($lang);
 56:             $client = cSecurity::toInteger($client);
 57:             $sName = $this->escape($sName);
 58: 
 59:             $oItem = $this->createNewItem();
 60: 
 61:             $oItem->set("idnews", $iIDNews);
 62:             $oItem->set("idclient", $client);
 63:             $oItem->set("idlang", $lang);
 64: 
 65:             if ($sName == "") {
 66:                 $oItem->set("name", $oNewsletter->get("name"));
 67:             } else {
 68:                 $oItem->set("name", $sName);
 69:             }
 70:             $oItem->set("type", $oNewsletter->get("type"));
 71:             $oItem->set("use_cronjob", $oNewsletter->get("use_cronjob"));
 72: 
 73:             $oLang = new cApiLanguage($lang);
 74:             $oItem->set("encoding", $oLang->get("encoding"));
 75:             unset($oLang);
 76:             $oItem->set("idart", $oNewsletter->get("idart"));
 77:             $oItem->set("subject", $oNewsletter->get("subject"));
 78: 
 79:             // Precompile messages
 80:             $sPath = cRegistry::getFrontendUrl() . "front_content.php?changelang=" . $lang . "&idcatart=" . $iIDCatArt . "&";
 81: 
 82:             $sMessageText = $oNewsletter->get("message");
 83: 
 84:             // Preventing double lines in mail, you may wish to disable this
 85:             // function on windows servers
 86:             if (!getSystemProperty("newsletter", "disable-rn-replacement")) {
 87:                 $sMessageText = str_replace("\r\n", "\n", $sMessageText);
 88:             }
 89: 
 90:             $oNewsletter->_replaceTag($sMessageText, false, "unsubscribe", $sPath . "unsubscribe={KEY}");
 91:             $oNewsletter->_replaceTag($sMessageText, false, "change", $sPath . "change={KEY}");
 92:             $oNewsletter->_replaceTag($sMessageText, false, "stop", $sPath . "stop={KEY}");
 93:             $oNewsletter->_replaceTag($sMessageText, false, "goon", $sPath . "goon={KEY}");
 94: 
 95:             $oItem->set("message_text", $sMessageText);
 96: 
 97:             if ($oNewsletter->get("type") == "text") {
 98:                 // Text newsletter, no html message
 99:                 $sMessageHTML = "";
100:             } else {
101:                 // HTML newsletter, get article content
102:                 $sMessageHTML = $oNewsletter->getHTMLMessage();
103: 
104:                 if ($sMessageHTML) {
105:                     $oNewsletter->_replaceTag($sMessageHTML, true, "name", "MAIL_NAME");
106:                     $oNewsletter->_replaceTag($sMessageHTML, true, "number", "MAIL_NUMBER");
107:                     $oNewsletter->_replaceTag($sMessageHTML, true, "date", "MAIL_DATE");
108:                     $oNewsletter->_replaceTag($sMessageHTML, true, "time", "MAIL_TIME");
109: 
110:                     $oNewsletter->_replaceTag($sMessageHTML, true, "unsubscribe", $sPath . "unsubscribe={KEY}");
111:                     $oNewsletter->_replaceTag($sMessageHTML, true, "change", $sPath . "change={KEY}");
112:                     $oNewsletter->_replaceTag($sMessageHTML, true, "stop", $sPath . "stop={KEY}");
113:                     $oNewsletter->_replaceTag($sMessageHTML, true, "goon", $sPath . "goon={KEY}");
114: 
115:                     // Replace plugin tags by simple MAIL_ tags
116:                     if (getSystemProperty("newsletter", "newsletter-recipients-plugin") == "true") {
117:                         if (is_array($cfg['plugins']['recipients'])) {
118:                             foreach ($cfg['plugins']['recipients'] as $sPlugin) {
119:                                 plugin_include("recipients", $sPlugin . "/" . $sPlugin . ".php");
120:                                 if (function_exists("recipients_" . $sPlugin . "_wantedVariables")) {
121:                                     $aPluginVars = array();
122:                                     $aPluginVars = call_user_func("recipients_" . $sPlugin . "_wantedVariables");
123: 
124:                                     foreach ($aPluginVars as $sPluginVar) {
125:                                         $oNewsletter->_replaceTag($sMessageHTML, true, $sPluginVar, "MAIL_" . cString::toUpperCase($sPluginVar));
126:                                     }
127:                                 }
128:                             }
129:                         }
130:                     }
131:                 } else {
132:                     // There was a problem getting html message (maybe article
133:                     // deleted)
134:                     // Cancel job generation
135:                     $this->delete($oItem->get($oItem->getPrimaryKeyName()));
136:                     return false;
137:                 }
138:             }
139: 
140:             $oItem->set("message_html", $sMessageHTML);
141: 
142:             $oItem->set("newsfrom", $oNewsletter->get("newsfrom"));
143:             if ($oNewsletter->get("newsfromname") == "") {
144:                 $oItem->set("newsfromname", $oNewsletter->get("newsfrom"));
145:             } else {
146:                 $oItem->set("newsfromname", $oNewsletter->get("newsfromname"));
147:             }
148:             $oItem->set("newsdate", date("Y-m-d H:i:s"), false); // $oNewsletter->get("newsdate"));
149:             $oItem->set("dispatch", $oNewsletter->get("dispatch"));
150:             $oItem->set("dispatch_count", $oNewsletter->get("dispatch_count"));
151:             $oItem->set("dispatch_delay", $oNewsletter->get("dispatch_delay"));
152: 
153:             // Store "send to" info in serialized array (just info)
154:             $aSendInfo = array();
155:             $aSendInfo[] = $oNewsletter->get("send_to");
156: 
157:             switch ($oNewsletter->get("send_to")) {
158:                 case "selection":
159:                     $oGroups = new NewsletterRecipientGroupCollection();
160:                     $oGroups->setWhere("idnewsgroup", unserialize($oNewsletter->get("send_ids")), "IN");
161:                     $oGroups->setOrder("groupname");
162:                     $oGroups->query();
163:                     // oGroups->select("idnewsgroup IN ('" . implode("','",
164:                     // unserialize($oNewsletter->get("send_ids"))) . "')", "",
165:                     // "groupname");
166: 
167:                     while (($oGroup = $oGroups->next()) !== false) {
168:                         $aSendInfo[] = $oGroup->get("groupname");
169:                     }
170: 
171:                     unset($oGroup);
172:                     unset($oGroups);
173:                     break;
174:                 case "single":
175:                     if (is_numeric($oNewsletter->get("send_ids"))) {
176:                         $oRcp = new NewsletterRecipient($oNewsletter->get("send_ids"));
177: 
178:                         if ($oRcp->get("name") == "") {
179:                             $aSendInfo[] = $oRcp->get("email");
180:                         } else {
181:                             $aSendInfo[] = $oRcp->get("name");
182:                         }
183:                         $aSendInfo[] = $oRcp->get("email");
184: 
185:                         unset($oRcp);
186:                     }
187:                     break;
188:                 default:
189:             }
190:             $oItem->set("send_to", serialize($aSendInfo), false);
191: 
192:             $oItem->set("created", date('Y-m-d H:i:s'), false);
193:             $oItem->set("author", $auth->auth["uid"]);
194:             $oItem->set("authorname", $auth->auth["uname"]);
195:             unset($oNewsletter); // Not needed anymore
196: 
197:             // Adds log items for all recipients and returns recipient count
198:             $oLogs = new NewsletterLogCollection();
199:             $iRecipientCount = $oLogs->initializeJob($oItem->get($oItem->getPrimaryKeyName()), $iIDNews);
200:             unset($oLogs);
201: 
202:             // fallback. there's no need to create a newsletter job if no user is selected
203:             if ($iRecipientCount == 0 || !is_int($iRecipientCount)) {
204:                 return false;
205:             }
206: 
207:             $oItem->set("rcpcount", $iRecipientCount);
208:             $oItem->set("sendcount", 0);
209:             $oItem->set("status", 1); // Waiting for sending; note, that status
210:                                       // will be set to 9, if $iRecipientCount =
211:                                       // 0 in store() method
212: 
213:             $oItem->store();
214: 
215:             return $oItem;
216:         } else {
217:             return false;
218:         }
219:     }
220: 
221:     /**
222:      * Overridden delete method to remove job details (logs) from newsletter
223:      * logs table
224:      * before deleting newsletter job
225:      *
226:      * @param $iItemID int specifies the frontend user group
227:      */
228:     public function delete($iItemID) {
229:         $oLogs = new NewsletterLogCollection();
230:         $oLogs->delete($iItemID);
231: 
232:         parent::delete($iItemID);
233:     }
234: 
235: }
236: 
237: /**
238:  * Single NewsletterJob Item
239:  */
240: class NewsletterJob extends Item {
241:     /**
242:      * Constructor Function
243:      *
244:      * @param mixed $mId Specifies the ID of item to load
245:      *
246:      * @throws cDbException
247:      * @throws cException
248:      */
249:     public function __construct($mId = false) {
250:         global $cfg;
251:         parent::__construct($cfg["tab"]["news_jobs"], "idnewsjob");
252:         if ($mId !== false) {
253:             $this->loadByPrimaryKey($mId);
254:         }
255:     }
256: 
257:     /**
258:      * @return int
259:      * @throws cDbException
260:      * @throws cException
261:      */
262:     public function runJob() {
263:         global $cfg, $recipient;
264: 
265:         $iCount = 0;
266:         if ($this->get("status") == 2) {
267:             // Job is currently running, check start time and restart if
268:             // started 5 minutes ago
269:             $dStart = strtotime($this->get("started"));
270:             $dNow = time();
271: 
272:             if (($dNow - $dStart) > (5 * 60)) {
273:                 $this->set("status", 1);
274:                 $this->set("started", "0000-00-00 00:00:00", false);
275: 
276:                 $oLogs = new NewsletterLogCollection();
277:                 $oLogs->setWhere("idnewsjob", $this->get($this->getPrimaryKeyName()));
278:                 $oLogs->setWhere("status", "sending");
279:                 $oLogs->query();
280: 
281:                 while (($oLog = $oLogs->next()) !== false) {
282:                     $oLog->set("status", "error (sending)");
283:                     $oLog->store();
284:                 }
285:             }
286:         }
287: 
288:         if ($this->get("status") == 1) {
289:             // Job waiting for sending
290:             $this->set("status", 2);
291:             $this->set("started", date("Y-m-d H:i:s"), false);
292:             $this->store();
293: 
294:             // Initialization
295:             $aMessages = array();
296: 
297:             $oLanguage = new cApiLanguage($this->get("idlang"));
298:             $sFormatDate = $oLanguage->getProperty("dateformat", "date");
299:             $sFormatTime = $oLanguage->getProperty("dateformat", "time");
300:             unset($oLanguage);
301: 
302:             if ($sFormatDate == "") {
303:                 $sFormatDate = "%d.%m.%Y";
304:             }
305:             if ($sFormatTime == "") {
306:                 $sFormatTime = "%H:%M";
307:             }
308: 
309:             // Get newsletter data
310:             $sFrom = $this->get("newsfrom");
311:             $sFromName = $this->get("newsfromname");
312:             $sSubject = $this->get("subject");
313:             $sMessageText = $this->get("message_text");
314:             $sMessageHTML = $this->get("message_html");
315:             $dNewsDate = strtotime($this->get("newsdate"));
316:             $sEncoding = $this->get("encoding");
317:             $bIsHTML = false;
318:             if ($this->get("type") == "html" && $sMessageHTML != "") {
319:                 $bIsHTML = true;
320:             }
321: 
322:             $bDispatch = false;
323:             if ($this->get("dispatch") == 1) {
324:                 $bDispatch = true;
325:             }
326: 
327:             // Single replacements
328:             // Replace message tags (text message)
329:             $sMessageText = str_replace("MAIL_DATE", strftime($sFormatDate, $dNewsDate), $sMessageText);
330:             $sMessageText = str_replace("MAIL_TIME", strftime($sFormatTime, $dNewsDate), $sMessageText);
331:             $sMessageText = str_replace("MAIL_NUMBER", $this->get("rcpcount"), $sMessageText);
332: 
333:             // Replace message tags (html message)
334:             if ($bIsHTML) {
335:                 $sMessageHTML = str_replace("MAIL_DATE", strftime($sFormatDate, $dNewsDate), $sMessageHTML);
336:                 $sMessageHTML = str_replace("MAIL_TIME", strftime($sFormatTime, $dNewsDate), $sMessageHTML);
337:                 $sMessageHTML = str_replace("MAIL_NUMBER", $this->get("rcpcount"), $sMessageHTML);
338:             }
339: 
340:             // Enabling plugin interface
341:             $bPluginEnabled = false;
342:             if (getSystemProperty("newsletter", "newsletter-recipients-plugin") == "true") {
343:                 $bPluginEnabled = true;
344:                 $aPlugins = array();
345: 
346:                 if (is_array($cfg['plugins']['recipients'])) {
347:                     foreach ($cfg['plugins']['recipients'] as $sPlugin) {
348:                         plugin_include("recipients", $sPlugin . "/" . $sPlugin . ".php");
349:                         if (function_exists("recipients_" . $sPlugin . "_wantedVariables")) {
350:                             $aPlugins[$sPlugin] = call_user_func("recipients_" . $sPlugin . "_wantedVariables");
351:                         }
352:                     }
353:                 }
354:             }
355: 
356:             // Get recipients (from log table)
357:             if (!is_object($oLogs)) {
358:                 $oLogs = new NewsletterLogCollection();
359:             } else {
360:                 $oLogs->resetQuery();
361:             }
362:             $oLogs->setWhere("idnewsjob", $this->get($this->getPrimaryKeyName()));
363:             $oLogs->setWhere("status", "pending");
364: 
365:             if ($bDispatch) {
366:                 $oLogs->setLimit(0, $this->get("dispatch_count"));
367:             }
368: 
369:             $oLogs->query();
370:             while (($oLog = $oLogs->next()) !== false) {
371:                 $iCount++;
372:                 $oLog->set("status", "sending");
373:                 $oLog->store();
374: 
375:                 $sRcpMsgText = $sMessageText;
376:                 $sRcpMsgHTML = $sMessageHTML;
377: 
378:                 $sKey = $oLog->get("rcphash");
379:                 $sEMail = $oLog->get("rcpemail");
380: 
381:                 // do not try to send a message to an invalid email address
382:                 if (false === isValidMail($sEMail)) {
383:                     $oLog->set("status", "error (invalid email)");
384:                     $oLog->store();
385:                     continue;
386:                 }
387: 
388:                 $bSendHTML = false;
389:                 if ($oLog->get("rcpnewstype") == 1) {
390:                     $bSendHTML = true; // Recipient accepts html newsletter
391:                 }
392: 
393:                 if (cString::getStringLength($sKey) == 30) { // Prevents sending without having a
394:                                            // key
395:                     $sRcpMsgText = str_replace("{KEY}", $sKey, $sRcpMsgText);
396:                     $sRcpMsgText = str_replace("MAIL_MAIL", $sEMail, $sRcpMsgText);
397:                     $sRcpMsgText = str_replace("MAIL_NAME", $oLog->get("rcpname"), $sRcpMsgText);
398: 
399:                     // Replace message tags (html message)
400:                     if ($bIsHTML && $bSendHTML) {
401:                         $sRcpMsgHTML = str_replace("{KEY}", $sKey, $sRcpMsgHTML);
402:                         $sRcpMsgHTML = str_replace("MAIL_MAIL", $sEMail, $sRcpMsgHTML);
403:                         $sRcpMsgHTML = str_replace("MAIL_NAME", $oLog->get("rcpname"), $sRcpMsgHTML);
404:                     }
405: 
406:                     if ($bPluginEnabled) {
407:                         // Don't change name of $recipient variable as it is
408:                         // used in plugins!
409:                         $recipient = new NewsletterRecipient();
410:                         $recipient->loadByPrimaryKey($oLog->get("idnewsrcp"));
411: 
412:                         foreach ($aPlugins as $sPlugin => $aPluginVar) {
413:                             foreach ($aPluginVar as $sPluginVar) {
414:                                 // Replace tags in text message
415:                                 $sRcpMsgText = str_replace("MAIL_" . cString::toUpperCase($sPluginVar), call_user_func("recipients_" . $sPlugin . "_getvalue", $sPluginVar), $sRcpMsgText);
416: 
417:                                 // Replace tags in html message
418:                                 if ($bIsHTML && $bSendHTML) {
419:                                     $sRcpMsgHTML = str_replace("MAIL_" . cString::toUpperCase($sPluginVar), call_user_func("recipients_" . $sPlugin . "_getvalue", $sPluginVar), $sRcpMsgHTML);
420:                                 }
421:                             }
422:                         }
423:                         unset($recipient);
424:                     }
425: 
426:                     $mailer = new cMailer();
427:                     $mailer->setCharset($sEncoding);
428: 
429:                     $to = $sEMail;
430:                     if ($bIsHTML && $bSendHTML) {
431:                         $body = $sRcpMsgHTML;
432:                     } else {
433:                         $body = $sRcpMsgText . "\n\n";
434:                     }
435:                     $contentType = 'text/plain';
436:                     if ($bIsHTML && $bSendHTML) {
437:                         $contentType = 'text/html';
438:                     }
439: 
440:                     try {
441:                         // this code can throw exceptions like Swift_RfcComplianceException
442:                         $message = Swift_Message::newInstance($sSubject, $body, $contentType, $sEncoding);
443:                         $message->setFrom($sFrom, $sFromName);
444:                         $message->setTo($to);
445: 
446:                         // send the email
447:                         $result = $mailer->send($message);
448:                     } catch (Exception $e) {
449:                         $result = false;
450:                     }
451: 
452:                     if ($result) {
453:                         $oLog->set("status", "successful");
454:                         $oLog->set("sent", date("Y-m-d H:i:s"), false);
455:                     } else {
456:                         $oLog->set("status", "error (sending)");
457:                     }
458:                 } else {
459:                     $oLog->set("status", "error (key)");
460:                 }
461:                 $oLog->store();
462:             }
463: 
464:             $this->set("sendcount", $this->get("sendcount") + $iCount);
465: 
466:             if ($iCount == 0 || !$bDispatch) {
467:                 // No recipients remaining, job finished
468:                 $this->set("status", 9);
469:                 $this->set("finished", date("Y-m-d H:i:s"), false);
470:             } elseif ($bDispatch) {
471:                 // Check, if there are recipients remaining - stops job faster
472:                 $oLogs->resetQuery();
473:                 $oLogs->setWhere("idnewsjob", $this->get($this->getPrimaryKeyName()));
474:                 $oLogs->setWhere("status", "pending");
475:                 $oLogs->setLimit(0, $this->get("dispatch_count"));
476:                 $oLogs->query();
477: 
478:                 If ($oLogs->next()) {
479:                     // Remaining recipients found, set job back to pending
480:                     $this->set("status", 1);
481:                     $this->set("started", "0000-00-00 00:00:00", false);
482:                 } else {
483:                     // No remaining recipients, job finished
484:                     $this->set("status", 9);
485:                     $this->set("finished", date("Y-m-d H:i:s"), false);
486:                 }
487:             } else {
488:                 // Set job back to pending
489:                 $this->set("status", 1);
490:                 $this->set("started", "0000-00-00 00:00:00", false);
491:             }
492:             $this->store();
493:         }
494: 
495:         return $iCount;
496:     }
497: 
498:     /**
499:      * Overriden store() method to set status to finished if rcpcount is 0
500:      */
501:     public function store() {
502:         if ($this->get("rcpcount") == 0) {
503:             // No recipients, job finished
504:             $this->set("status", 9);
505:             if ($this->get("started") == "0000-00-00 00:00:00") {
506:                 $this->set("started", date("Y-m-d H:i:s"), false);
507:             }
508:             $this->set("finished", date("Y-m-d H:i:s"), false);
509:         }
510: 
511:         return parent::store();
512:     }
513: 
514: }
515: 
CMS CONTENIDO 4.10.1 API documentation generated by ApiGen 2.8.0