';
}
}
diff --git a/e107_plugins/faqs/admin_config.php b/e107_plugins/faqs/admin_config.php
index 148fa0eec..c8cb9ddfe 100644
--- a/e107_plugins/faqs/admin_config.php
+++ b/e107_plugins/faqs/admin_config.php
@@ -317,7 +317,7 @@ class faq_main_ui extends e_admin_ui
}
- public function beforeCreate($new_data)
+ public function beforeCreate($new_data, $old_data)
{
// trim spaces
if(!empty($new_data['faq_tags']))
diff --git a/e107_plugins/user/e_mailout.php b/e107_plugins/user/e_mailout.php
index 5d4439e08..9553e321b 100644
--- a/e107_plugins/user/e_mailout.php
+++ b/e107_plugins/user/e_mailout.php
@@ -12,57 +12,49 @@
*/
-/**
- * e107 Newsletter plugin
- *
- * @package e107_plugins
- * @subpackage newsletter
- * @version $Id$;
- */
if (!defined('e107_INIT')) { exit; }
-
/*
-Class for newsletter mailout function
+Class for user mailout function
Allows admins to send mail to those subscribed to one or more newsletters
*/
// These variables determine the circumstances under which this class is loaded (only used during loading, and may be overwritten later)
- $mailerIncludeWithDefault = TRUE; // Mandatory - if false, show only when mailout for this specific plugin is enabled
- $mailerExcludeDefault = FALSE; // Mandatory - if TRUE, when this plugin's mailout is active, the default (core) isn't loaded
+ $mailerIncludeWithDefault = true; // Mandatory - if false, show only when mailout for this specific plugin is enabled
+ $mailerExcludeDefault = false; // Mandatory - if TRUE, when this plugin's mailout is active, the default (core) isn't loaded
class user_mailout
{
-// protected $mailCount = 0;
-// protected $mailRead = 0;
- //public $mailerSource = 'newsletter'; // Plugin name (core mailer is special case) Must be directory for this file
- public $mailerName = LAN_PLUGIN_NEWSLETTER_NAME; // Text to identify the source of selector (displayed on left of admin page)
- public $mailerEnabled = TRUE; // Mandatory - set to FALSE to disable this plugin (e.g. due to permissions restrictions)
-// private $selectorActive = FALSE; // Set TRUE if we've got a valid selector to start returning entries
-// private $targets = array(); // Used to store potential recipients
-// private $ourDB;
+ public $mailerSource = 'user'; // Plugin name (core mailer is special case) Must be directory for this file
+ public $mailerName = LAN_MAILOUT_68; // Text to identify the source of selector (displayed on left of admin page)
+ public $mailerEnabled = true; // Mandatory - set to FALSE to disable this plugin (e.g. due to permissions restrictions)
+
+ protected $mailCount = 0;
+ protected $mailRead = 0;
+
+ // List of fields used by selectors
+ private $selectFields = array('email_to',
+ 'extended_1_name','extended_1_value',
+ 'extended_2_name', 'extended_2_value',
+ 'user_search_name', 'user_search_value',
+ 'last_visit_match', 'last_visit_date'
+ );
- // Constructor
- public function __construct()
- {
- // BAD FOR PERFORMANCE
- //$this->e107 = e107::getInstance();
- //$this->adminHandler = e107::getRegistry('_mailout_admin'); // Get the mailer admin object - we want to use some of its functions
- }
-
/**
* Manage Bounces.
*/
public function bounce($data)
{
- e107::getLog()->add('Newsletter Bounce', $data, E_LOG_INFORMATIVE, 'BOUNCE');
+ e107::getLog()->add('User Bounce', $data, E_LOG_INFORMATIVE, 'BOUNCE');
}
+
+
/**
* @param $mode - check || process
* @param array $data - usually email, date, id - but dependent on unsubscribe link above.
@@ -90,6 +82,298 @@ class user_mailout
}
+
+
+ /**
+ * Return data representing the user's selection criteria as entered in the $_POST array.
+ *
+ * The value returned can be as simple as an array of chosen fields from the $_POST array, or it may be processed to make it more
+ * convenient to use later. (In general, at least basic sanitising should be performed)
+ * Conflicting selection criteria can also be resolved here.
+ * The returned data is stored in the DB with a saved email. (Just return an empty string or array if this is undesirable)
+ * The returned value is passed back to selectInit() and showSelect when needed.
+ *
+ * @return mixed Selection data - may be string, array or whatever suits
+ */
+ public function returnSelectors()
+ {
+ $tp = e107::getParser();
+
+ $res = array();
+ foreach ($this->selectFields as $k)
+ {
+ if (vartrue($_POST[$k]))
+ {
+ $res[$k] = $tp->toDB($_POST[$k]);
+ }
+ }
+ return $res;
+ }
+
+
+ /**
+ * Called to initialise data selection routine.
+ * Needs to save any queries or other information into internal variables, do initial DB queries as appropriate.
+ * Could in principle read all addresses and buffer them for later routines, if this is more convenient
+ *
+ * @param mixed $selectVals - selection criteria as returned by returnSelectors() (so format is whatever is chosen by the coder)
+ *
+ * @return int|boolean number of records available (or 1 if unknown) on success, FALSE on failure
+ */
+ public function selectInit($selectVals = FALSE)
+ {
+ $sql = e107::getDb();
+
+ $where = array();
+ $incExtended = array();
+
+ $emailTo = vartrue($selectVals['email_to'], false);
+
+ switch ($emailTo)
+ {
+ // Build the query for the user database
+ case 'all' :
+ $where[] = 'u.`user_ban`=0';
+ break;
+ case 'admin' :
+ $where[] = 'u.`user_admin`=1';
+ break;
+ case 'unverified' :
+ $where[] = 'u.`user_ban`=2';
+ break;
+ case 'self' :
+ $where[] = 'u.`user_id`='.USERID;
+ break;
+ default :
+ if (is_numeric($selectVals['email_to']))
+ {
+ $where[] = "u.`user_class` REGEXP concat('(^|,)',{$selectVals['email_to']},'(,|$)')";
+ }
+
+ }
+
+ if (vartrue($selectVals['extended_1_name']) && vartrue($selectVals['extended_1_value']))
+ {
+ $where[] = '`'.$selectVals['extended_1_name']."` = '".$selectVals['extended_1_value']."' ";
+ $incExtended[] = $selectVals['extended_1_name'];
+ }
+
+ if (vartrue($selectVals['extended_2_name']) && vartrue($selectVals['extended_2_value']))
+ {
+ $where[] = "ue.`".$selectVals['extended_2_name']."` = '".$selectVals['extended_2_value']."' ";
+ $incExtended[] = $selectVals['extended_2_name'];
+ }
+
+ if (vartrue($selectVals['user_search_name']) && vartrue($selectVals['user_search_value']))
+ {
+ $where[]= "u.`".$selectVals['user_search_name']."` LIKE '%".$selectVals['user_search_value']."%' ";
+ }
+
+ if (vartrue($selectVals['last_visit_match']) && vartrue($selectVals['last_visit_date']))
+ {
+ foreach(array(':', '-', ',') as $sep)
+ {
+ if (strpos($selectVals['last_visit_date'], ':'))
+ {
+ $tmp = explode($sep, $selectVals['last_visit_date']);
+ break;
+ }
+ }
+ $lvDate = gmmktime(0, 0, 0, $tmp[1], $tmp[0], $tmp[2]); // Require dd-mm-yy for now
+ if (($lvDate > 0) && ($lvDate <= time()))
+ {
+ switch ($selectVals['last_visit_match'])
+ {
+ case '<' :
+ case '>' :
+ $where[]= "u.`user_lastvisit`".$selectVals['last_visit_match'].$lvDate;
+ break;
+ case '=' :
+ $where[]= "u.`user_lastvisit`>=".$lvDate;
+ $where[]= "u.`user_lastvisit`<=".intval($lvDate + 86400);
+ break;
+ }
+ }
+ }
+
+ if(empty($where) && empty($incExtended))
+ {
+ $this->mail_read = 0;
+ $this->mail_count = 0;
+ return $this->mail_count;
+ }
+
+
+ $where[] = "u.`user_email` != ''"; // Ignore all records with empty email address
+
+
+
+ // Now assemble the query from the pieces
+ // Determine which fields we actually need (u.user_sess is the signup link)
+ $qry = 'SELECT u.user_id, u.user_name, u.user_email, u.user_loginname, u.user_sess, u.user_lastvisit';
+ if (count($incExtended))
+ {
+ foreach ($incExtended as $if)
+ {
+ $qry .= ', ue.`'.$if.'`';
+ }
+ }
+ $qry .= " FROM `#user` AS u ";
+ if (count($incExtended))
+ {
+ $qry .= "LEFT JOIN `#user_extended` AS ue ON ue.`user_extended_id` = u.`user_id`";
+ }
+
+ $qry .= ' WHERE '.implode(' AND ',$where).' ORDER BY u.user_name';
+// echo "Selector query: ".$qry.' ';
+
+ e107::getMessage()->addDebug("Selector query: ".$qry);
+
+ if (!( $this->mail_count = $sql->gen($qry))) return FALSE;
+ $this->mail_read = 0;
+ return $this->mail_count;
+ }
+
+
+
+ /**
+ * Return one email address to add to the recipients list. Return FALSE if no more addresses to add
+ *
+ * @return boolean|array FALSE if no more addresses available; else an array:
+ * 'mail_recipient_id' - non-zero if a registered user, zero if a non-registered user. (Always non-zero from this class)
+ * 'mail_recipient_name' - user name
+ * 'mail_recipient_email' - email address to use
+ * 'mail_target_info' - array of info which might be substituted into email, usually using the codes defined by the editor.
+ * Array key is the code within '|...|', value is the string for substitution
+ */
+ public function selectAdd()
+ {
+ $sql = e107::getDb();
+
+ if (!($row = $sql->fetch())) return FALSE;
+ $ret = array('mail_recipient_id' => $row['user_id'],
+ 'mail_recipient_name' => $row['user_name'], // Should this use realname?
+ 'mail_recipient_email' => $row['user_email'],
+ 'mail_target_info' => array(
+ 'USERID' => $row['user_id'],
+ 'DISPLAYNAME' => $row['user_name'],
+ 'SIGNUP_LINK' => $row['user_sess'],
+ 'USERNAME' => $row['user_loginname'],
+ 'USERLASTVISIT' => $row['user_lastvisit']
+ )
+ );
+ $this->mail_read++;
+ return $ret;
+ }
+
+
+ /**
+ * Called once all email addresses read, to do any housekeeping needed
+ *
+ * @return none
+ */
+ public function select_close()
+ {
+ // Nothing to do here
+ }
+
+
+ /**
+ * Called to show current selection criteria, and optionally allow edit
+ *
+ * @param $allow_edit is TRUE to allow user to change the selection; FALSE to just display current settings
+ * @param $selectVals is the current selection information - in the same format as returned by returnSelectors()
+ *
+ * @return Returns HTML which is displayed in a table cell. Typically we return a complete table
+ */
+ public function showSelect($allow_edit = FALSE, $selectVals = FALSE)
+ {
+ $frm = e107::getForm();
+ $sql = e107::getDb();
+ $admin = e107::getRegistry('_mailout_admin');
+
+ $var = array();
+
+ $var[0]['caption'] = LAN_USERCLASS; // User class select
+
+ if ($allow_edit)
+ {
+ $u_array = array('user_name'=>LAN_MAILOUT_43,'user_login'=>LAN_MAILOUT_44,'user_email'=>LAN_MAILOUT_45);
+
+ $var[0]['html'] = $admin->userClassesTotals('email_to', varset($selectVals['email_to'], ''));
+ $var[1]['html'] = $frm->select('user_search_name', $u_array, varset($selectVals['user_search_name'], ''),'',TRUE)." ".LAN_MAILOUT_47." ".$frm->text('user_search_value', varset($selectVals['user_search_value'], ''));
+ //$var[2]['html'] = $admin->comparisonSelect('last_visit_match', varset($selectVals['last_visit_match'], ''))." ".$frm->text('last_visit_date', varset($selectVals['last_visit_date'], 0));
+ $var[2]['html'] = $admin->comparisonSelect('last_visit_match', varset($selectVals['last_visit_match'], ''))." ".$admin->makeCalendar('last_visit_date', varset($selectVals['last_visit_date'], 0));
+ $var[1]['caption'] = LAN_MAILOUT_46; // User Search Field.
+ $var[2]['caption'] = LAN_MAILOUT_56; // User last visit
+
+ $extFields = $admin->ret_extended_field_list('extended_1_name', varset($selectVals['extended_1_name'], ''), TRUE);
+ if ($extFields !== FALSE) // Only display next bit if UEFs defined
+ {
+ $var[3]['html'] = $extFields.LAN_MAILOUT_48." ".$frm->text('extended_1_value',varset($selectVals['extended_1_value'], ''));
+ $var[4]['html'] = $admin->ret_extended_field_list('extended_2_name', varset($selectVals['extended_2_name'], ''), TRUE).LAN_MAILOUT_48." ".$frm->text('extended_2_value',varset($selectVals['extended_2_value'],''));
+
+ $var[3]['caption'] = LAN_MAILOUT_46; // Extended user field
+ $var[4]['caption'] = LAN_MAILOUT_46; // Extended user field
+ }
+ }
+ else // Display existing values
+ {
+ if (!vartrue($selectVals['email_to']))
+ {
+ return null;
+ }
+
+ if (is_numeric($selectVals['email_to']))
+ {
+ $_to = LAN_MAILOUT_23.e107::getUserClass()->uc_get_classname(intval($selectVals['email_to']));
+ }
+ else
+ {
+ $_to = $selectVals['email_to'];
+ }
+
+ $var_0 = $_to.' ';
+ if ($selectVals['email_to'] == 'self')
+ {
+ $var_0 .= '<'.USEREMAIL.'>';
+ }
+
+ $var[0]['html'] = $var_0;
+ if (vartrue($selectVals['user_search_name']) && vartrue($selectVals['user_search_value']))
+ {
+ $var[1]['html'] = $selectVals['user_search_name'].' '.$selectVals['user_search_value'];
+ $var[1]['caption'] = LAN_MAILOUT_46; // User Search Field.
+ }
+ if (vartrue($selectVals['last_visit_match']) && vartrue($selectVals['last_visit_date']))
+ {
+ $var[2]['html'] = $selectVals['last_visit_match'].' '.gmstrftime("%D-%M-%Y",$selectVals['last_visit_date']); //FIXME use e107 date function.
+ $var[2]['caption'] = LAN_MAILOUT_56; // User last visit
+ }
+ $extFields = $admin->ret_extended_field_list('extended_1_name', varset($selectVals['extended_1_name'], ''), TRUE);
+ if ($extFields !== FALSE)
+ {
+ if (vartrue($selectVals['extended_1_name']) && vartrue($selectVals['extended_1_value']))
+ {
+ $var[3]['html'] = $selectVals['extended_1_name'].' '.$selectVals['extended_1_value'];
+ $var[3]['caption'] = LAN_MAILOUT_46; // Extended user field
+ }
+ if (vartrue($selectVals['extended_2_name']) && vartrue($selectVals['extended_2_value']))
+ {
+ $var[4]['html'] = $selectVals['extended_2_name'].' '.$selectVals['extended_2_value'];
+ $var[4]['caption'] = LAN_MAILOUT_46; // Extended user field
+ }
+ }
+
+ }
+
+ return $var;
+ }
+
+
+
+
+
}