1
0
Fork 0
cl-newsletter/classes/class.newsletter.recipients.php
2019-10-26 14:35:06 +02:00

248 Zeilen
8 KiB
PHP

<?php
/**
* Project:
* Contenido Content Management System
*
* Description:
* Newsletter recipient class
*
* Requirements:
* @con_php_req 5.0
*
*
* @package Contenido Backend classes
* @version 1.1
* @author Björn Behrens
* @copyright four for business AG <www.4fb.de>
* @license http://www.contenido.org/license/LIZENZ.txt
* @link http://www.4fb.de
* @link http://www.contenido.org
* @since file available since contenido release <= 4.6
*
* {@internal
* created 2004-08-01
* modified 2008-06-30, Dominik Ziegler, add security fix
* modified 2011-03-14, Murat Purc, adapted to new GenericDB, partly ported to PHP 5, formatting
*
* $Id: class.newsletter.recipients.php 128 2019-07-03 11:58:28Z oldperl $:
* }}
*
*/
if (!defined('CON_FRAMEWORK')) {
die('Illegal call');
}
/**
* Recipient management class
*/
class RecipientCollection extends ItemCollection {
/**
* Constructor Function
* @param none
*/
public function __construct() {
global $cfg;
parent::__construct($cfg["tab"]["news_rcp"], "idnewsrcp");
$this->_setItemClass("Recipient");
}
/**
* Creates a new recipient
* @param string $sEMail Specifies the e-mail adress
* @param string $sName Specifies the recipient name (optional)
* @param int $iConfirmed Specifies, if the recipient is confirmed (optional)
* @param string $sJoinID Specifies additional recipient group ids to join (optional, e.g. 47,12,...)
* @param int $iMessageType Specifies the message type for the recipient (0 = text, 1 = html)
*/
public function create($sEMail, $sName = "", $iConfirmed = 0, $sJoinID = "", $iMessageType = 0) {
global $client, $lang, $auth;
$iConfirmed = (int) $iConfirmed;
$iMessageType = (int) $iMessageType;
/* Check if the e-mail adress already exists */
$email = strtolower($email); // e-mail always lower case
$this->setWhere("idclient", $client);
$this->setWhere("idlang", $lang);
$this->setWhere("email", $sEMail);
$this->query();
if ($this->next()) {
return $this->create($sEMail . "_" . substr(md5(rand()), 0, 10), $sName, 0, $sJoinID, $iMessageType); // 0: Deactivate 'confirmed'
}
$oItem = parent::createNewItem();
$oItem->set("idclient", $client);
$oItem->set("idlang", $lang);
$oItem->set("name", $sName);
$oItem->set("email", $sEMail);
$oItem->set("hash", substr(md5(rand()), 0, 17) . uniqid("")); // Generating UID, 30 characters
$oItem->set("confirmed", $iConfirmed);
$oItem->set("news_type", $iMessageType);
if ($iConfirmed) {
$oItem->set("confirmeddate", date("Y-m-d H:i:s"), false);
}
$oItem->set("deactivated", 0);
$oItem->set("created", date("Y-m-d H:i:s"), false);
$oItem->set("author", $auth->auth["uid"]);
$oItem->store();
$iIDRcp = $oItem->get("idnewsrcp"); // Getting internal id of new recipient
// Add this recipient to the default recipient group (if available)
$oGroups = new RecipientGroupCollection();
$oGroupMembers = new RecipientGroupMemberCollection();
$oGroups->setWhere("idclient", $client);
$oGroups->setWhere("idlang", $lang);
$oGroups->setWhere("defaultgroup", 1);
$oGroups->query();
while ($oGroup = $oGroups->next()) {
$iIDGroup = $oGroup->get("idnewsgroup");
$oGroupMembers->create($iIDGroup, $iIDRcp);
}
// Add to other recipient groups as well? Do so!
if ($sJoinID != "") {
$aJoinID = explode(",", $sJoinID);
if (count($aJoinID) > 0) {
foreach ($aJoinID as $iIDGroup) {
$oGroupMembers->create($iIDGroup, $iIDRcp);
}
}
}
return $oItem;
}
/**
* Overridden delete method to remove recipient from groupmember table
* before deleting recipient
*
* @param $itemID int specifies the recipient
*/
public function delete($itemID) {
$oAssociations = new RecipientGroupMemberCollection();
$oAssociations->setWhere("idnewsrcp", $itemID);
$oAssociations->query();
While ($oItem = $oAssociations->next()) {
$oAssociations->delete($oItem->get("idnewsgroupmember"));
}
parent::delete($itemID);
}
/**
* Purge method to delete recipients which hasn't been confirmed since over a month
* @param $timeframe int Days after creation a not confirmed recipient will be removed
* @return int Count of deleted recipients
*/
public function purge($timeframe) {
global $client, $lang;
$oRecipientCollection = new RecipientCollection();
// DATEDIFF(created, NOW()) > 30 would be better, but it's only available in MySQL V4.1.1 and above
// Note, that, TO_DAYS or NOW may not be available in other database systems than MySQL
$oRecipientCollection->setWhere("idclient", $client);
$oRecipientCollection->setWhere("idlang", $lang);
$oRecipientCollection->setWhere("confirmed", 0);
$oRecipientCollection->setWhere("(TO_DAYS(NOW()) - TO_DAYS(created))", $timeframe, ">");
$oRecipientCollection->query();
while ($oItem = $oRecipientCollection->next()) {
$oRecipientCollection->delete($oItem->get("idnewsrcp"));
}
return $oRecipientCollection->count();
}
/**
* checkEMail returns true, if there is no recipient with the same e-mail address; otherwise false
* @param $email string e-mail
* @return recpient item if item with e-mail exists, false otherwise
*/
public function emailExists($sEmail) {
global $client, $lang;
$oRecipientCollection = new RecipientCollection();
$oRecipientCollection->setWhere("idclient", $client);
$oRecipientCollection->setWhere("idlang", $lang);
$oRecipientCollection->setWhere("email", strtolower($sEmail));
$oRecipientCollection->query();
if ($oItem = $oRecipientCollection->next()) {
return $oItem;
} else {
return false;
}
}
/**
* Sets a key for all recipients without key or an old key (len(key) <> 30)
* @param none
*/
public function updateKeys() {
$this->setWhere("LENGTH(hash)", 30, "<>");
$this->query();
$iUpdated = $this->count();
while ($oItem = $this->next()) {
$oItem->set("hash", substr(md5(rand()), 0, 17) . uniqid("")); /* Generating UID, 30 characters */
$oItem->store();
}
return $iUpdated;
}
}
/**
* Single Recipient Item
*/
class Recipient extends Item {
/**
* Constructor Function
* @param mixed $mId Specifies the ID of item to load
*/
public function __construct($mId = false) {
global $cfg;
parent::__construct($cfg["tab"]["news_rcp"], "idnewsrcp");
if ($mId !== false) {
$this->loadByPrimaryKey($mId);
}
}
public function store() {
global $auth;
$this->set("lastmodified", date("Y-m-d H:i:s"), false);
$this->set("modifiedby", $auth->auth["uid"]);
parent::store();
// Update name, email and newsletter type for recipients in pending newsletter jobs
$sName = $this->get("name");
$sEmail = $this->get("email");
if ($sName == "") {
$sName = $sEmail;
}
$iNewsType = $this->get("news_type");
$oLogs = new cNewsletterLogCollection();
$oLogs->setWhere("idnewsrcp", $this->get($this->primaryKey));
$oLogs->setWhere("status", "pending");
$oLogs->query();
while ($oLog = $oLogs->next()) {
$oLog->set("rcpname", $sName);
$oLog->set("rcpemail", $sEmail);
$oLog->set("rcpnewstype", $iNewsType);
$oLog->store();
}
}
}