Overview

Packages

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