==Additional Columns from group_rules==
rule_id (int) Database ID/Key
group_id (int) Correlating Group ID
field_id (int) Correlating Field ID
logic (enum) 'is','not','greater','less','true','false','is_in','not_in'
value (str) Match Value
* You should have received a copy of the GNU General Public License * along with program; see the file docs/LICENSE. If not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ /********************************** INITIALIZATION METHODS *********************************/ require '../bootstrap.php'; require_once Pommo::$_baseDir . 'classes/Pommo_Groups.php'; Pommo::init(); $logger = Pommo::$_logger; $dbo = Pommo::$_dbo; // Remember the Page State $state = Pommo_Api::stateInit('subscribers_manage'); // Fetch group + member IDs $group = new Pommo_Groups($state['group'], $state['status'], $state['search']); /********************************** JSON OUTPUT INITIALIZATION *********************************/ require_once Pommo::$_baseDir . 'classes/Pommo_Json.php'; $json = new Pommo_Json(); /********************************** PAGINATION AND ORDERING *********************************/ // Get and Remember the requested number of rows if (!empty($_REQUEST['page']) && (is_numeric($_REQUEST['rows']) && ($_REQUEST['rows'] > 0 && $_REQUEST['rows'] <= 1000))) { $state['limit'] = $_REQUEST['rows']; } // Get and Remember the requested page if (!empty($_REQUEST['page']) && (is_numeric($_REQUEST['page']) && $_REQUEST['page'] <= $state['pages'])) { $state['page'] = $_REQUEST['page'];
SmartyValidate::register_validator('mailgroup', 'mailgroup:/(all|\\d+)/i', 'isRegExp', false, false, 'trim'); SmartyValidate::register_validator('list_charset', 'list_charset', 'isCharSet', false, false, 'trim'); $vMsg = array(); $vMsg['fromname'] = $vMsg['subject'] = Pommo::_T('Cannot be empty.'); $vMsg['charset'] = Pommo::_T('Invalid Character Set'); $vMsg['fromemail'] = $vMsg['frombounce'] = Pommo::_T('Invalid email address'); $vMsg['ishtml'] = $vMsg['mailgroup'] = Pommo::_T('Invalid Input'); $smarty->assign('vMsg', $vMsg); } else { // ___ USER HAS SENT FORM ___ /********************************** JSON OUTPUT INITIALIZATION *********************************/ require_once Pommo::$_baseDir . 'classes/Pommo_Json.php'; $json = new Pommo_Json(); SmartyValidate::connect($smarty); if (SmartyValidate::is_valid($_POST)) { // __ FORM IS VALID SmartyValidate::disconnect(); $json->success(); } else { // __ FORM NOT VALID $json->add('fieldErrors', $smarty->getInvalidFields()); $json->fail(Pommo::_T('Please review and correct errors with your submission.')); } } $mailgroups = explode(',', $state['mailgroup']); $smarty->assign('mailgroups', $mailgroups); $smarty->assign('groups', Pommo_Groups::get()); $smarty->assign($state); $smarty->display('admin/mailings/mailing/setup.tpl');
$json = new Pommo_Json(false); // do not toggle escaping // EXAMINE CALL switch ($_REQUEST['call']) { case 'notice': foreach ($mailingIDS as $id) { $logger->AddMsg('<br /><br />###' . sprintf(Pommo::_T('Displaying notices for mailing %s'), Pommo_Mailing::getSubject($id)) . ' ###<br /><br />'); $notices = Pommo_Mailing::getNotices($id); $logger->AddMsg($notices); } break; case 'reload': require_once Pommo::$_baseDir . 'classes/Pommo_Groups.php'; $mailing = current(Pommo_Mailing::get(array('id' => $_REQUEST['mailings']))); // change group name to ID $groups = Pommo_Groups::getNames(); $gid = 'all'; foreach ($groups as $group) { if ($group['name'] == $mailing['group']) { $gid = $group['id']; } } Pommo_Api::stateReset(array('mailing')); // if this is a plain text mailing, switch body + altbody. if ($mailing['ishtml'] == 'off') { $mailing['altbody'] = $mailing['body']; $mailing['body'] = null; } // Initialize page state with default values overriden by those held in $_REQUEST $state =& Pommo_Api::stateInit('mailing', array('fromname' => $mailing['fromname'], 'fromemail' => $mailing['fromemail'], 'frombounce' => $mailing['frombounce'], 'list_charset' => $mailing['charset'], 'mailgroup' => $gid, 'subject' => $mailing['subject'], 'body' => $mailing['body'], 'altbody' => $mailing['altbody'])); Pommo::redirect(Pommo::$_baseUrl . 'mailings_start.php');
public static function groupSQL($group, $tally = false, $status = 1, $filter = false) { // used to prevent against group include/exclude recursion static $groups; if (!isset($groups[$group['id']])) { $groups[$group['id']] = TRUE; } global $pommo; $dbo =& Pommo::$_dbo; $rules = Pommo_Sql::sortRules($group['rules']); $ands = Pommo_Sql::getSubQueries(Pommo_Sql::sortLogic($rules['and'])); $ors = empty($rules['or']) ? array() : Pommo_Sql::getSubQueries(Pommo_Sql::sortLogic($rules['or'])); $sql = $tally ? 'SELECT count(subscriber_id) ' : 'SELECT subscriber_id '; $sql .= "\n FROM {$dbo->table['subscribers']}\n WHERE status=" . intval($status); $q = FALSE; if (!empty($ands)) { $sql .= " AND (\n"; foreach ($ands as $k => $s) { if ($k != 0) { $sql .= "\n AND "; } $sql .= $s; } foreach ($ors as $s) { $sql .= "\n OR {$s}"; } $sql .= "\n)"; $q = TRUE; } foreach ($rules['exclude'] as $gid) { if (!isset($groups[$gid])) { $sql .= "\nAND subscriber_id NOT IN (\n"; $sql .= Pommo_Sql::groupSQL(current(Pommo_Groups::get(array('id' => $gid)))); $sql .= "\n)"; } $q = TRUE; } foreach ($rules['include'] as $gid) { if (!isset($groups[$gid])) { $sql .= "\n" . ($q ? 'OR' : 'AND') . " subscriber_id IN (\n"; $sql .= Pommo_Sql::groupSQL(current(Pommo_Groups::get(array('id' => $gid)))); $sql .= "\n)"; } $q = TRUE; } // If a filter/search is requested, perform a match if (is_array($filter) && !empty($filter['field']) && !empty($filter['string'])) { // make MySQL LIKE() compliant $filter['string'] = mysql_real_escape_string(addcslashes($filter['string'], '%_')); $sql .= is_numeric($filter['field']) ? "\n AND subscriber_id in (select subscriber_id from {$dbo->table['subscriber_data']} WHERE field_id = " . (int) $filter['field'] . " AND value LIKE '%{$filter['string']}%')" : "\n AND " . mysql_real_escape_string($filter['field']) . " LIKE '%{$filter['string']}%'"; } return $sql; }
} if ($state['order'] != 'asc' && $state['order'] != 'desc') { $state['order'] = 'asc'; } if (!is_numeric($state['sort']) && $state['sort'] != 'email' && $state['sort'] != 'ip' && $state['sort'] != 'time_registered' && $state['sort'] != 'time_touched') { $state['sort'] = 'email'; } if (!is_numeric($state['status'])) { $state['status'] = 1; } if (!is_numeric($state['group']) && $state['group'] != 'all') { $state['group'] = 'all'; } if (isset($_REQUEST['searchClear'])) { $state['search'] = false; } elseif (isset($_REQUEST['searchField']) && (is_numeric($_REQUEST['searchField']) || $_REQUEST['searchField'] == 'email' || $_REQUEST['searchField'] == 'ip' || $_REQUEST['searchField'] == 'time_registered' || $_REQUEST['searchField'] == 'time_touched')) { $_REQUEST['searchString'] = trim($_REQUEST['searchString']); $state['search'] = empty($_REQUEST['searchString']) ? false : array('field' => $_REQUEST['searchField'], 'string' => trim($_REQUEST['searchString'])); } /********************************** DISPLAY METHODS *********************************/ // Get the *empty* group [no member IDs. 3rd arg is set TRUE] $group = new Pommo_Groups($state['group'], $state['status'], $state['search']); // Calculate and Remember number of pages for this group/status combo $state['pages'] = is_numeric($group->_tally) && $group->_tally > 0 ? ceil($group->_tally / $state['limit']) : 0; $view->assign('state', $state); $view->assign('tally', $group->_tally); $view->assign('groups', Pommo_Groups::get()); $view->assign('fields', Pommo_Fields::get()); $view->display('admin/subscribers/subscribers_manage');
public static function add($in) { $dbo =& Pommo::$_dbo; if (!Pommo_Groups::validate($in)) { return false; } $query = "\n INSERT INTO " . $dbo->table['groups'] . "\n SET\n group_name='%s'"; $query = $dbo->prepare($query, @array($in['name'])); return $dbo->lastId($query); }
$view = new Pommo_Template(); $view->assign('returnStr', _('Groups Page')); // Initialize page state with default values overriden by those held in $_REQUEST $state =& Pommo_Api::stateInit('groups_edit', array('group' => 0), $_REQUEST); $groups = Pommo_Groups::get(); $fields = Pommo_Fields::get(); $group =& $groups[$state['group']]; if (empty($group)) { Pommo::redirect('subscribers_groups.php'); } $rules = Pommo_Sql::sortRules($group['rules']); $rules['and'] = Pommo_Sql::sortLogic($rules['and']); $rules['or'] = Pommo_Sql::sortLogic($rules['or']); foreach ($rules as $key => $a) { if ($key == 'include' || $key == 'exclude') { foreach ($a as $k => $gid) { $rules[$key][$k] = $groups[$gid]['name']; } } } $view->assign('fields', $fields); $view->assign('legalFieldIDs', Pommo_Rules::getLegal($group, $fields)); $view->assign('legalGroups', Pommo_Rules::getLegalGroups($group, $groups)); $view->assign('group', $group); $view->assign('logicNames', Pommo_Rules::getEnglish()); $view->assign('rules', $rules); $view->assign('tally', Pommo_Groups::tally($group)); $view->assign('ruleCount', count($rules['and']) + count($rules['or']) + count($rules['include']) + count($rules['exclude'])); $view->assign('getURL', $_SERVER['PHP_SELF'] . '?group_id=' . $group['id']); $view->assign('t_include', Pommo::_T('INCLUDE')); $view->display('admin/subscribers/groups_edit');
require_once Pommo::$_baseDir . 'classes/Pommo_Fields.php'; require_once Pommo::$_baseDir . 'classes/Pommo_Groups.php'; Pommo::init(); $logger =& Pommo::$_logger; $dbo =& Pommo::$_dbo; Pommo::toggleEscaping(TRUE); $state = Pommo_API::stateInit('subscribers_manage'); $fields = Pommo_Fields::get(); $ids = FALSE; if (!empty($_POST['ids'])) { $ids = explode(',', $_POST['ids']); } // ====== CSV EXPORT ====== if ($_POST['type'] == 'csv') { if (!$ids) { $group = new Pommo_Groups($state['group'], $state['status']); $subscribers = $group->members(); } else { $subscribers = Pommo_Subscribers::get(array('id' => $ids)); } // supply headers $o = '"' . Pommo::_T('Email') . '"'; if (!empty($_POST['registered'])) { $o .= ',"' . Pommo::_T('Date Registered') . '"'; } if (!empty($_POST['ip'])) { $o .= ',"' . Pommo::_T('IP Address') . '"'; } foreach ($fields as $f) { $o .= ",\"{$f['name']}\""; }
$group =& current(Pommo_Groups::get(array('id' => $state['group']))); $rules = Pommo_Sql::sortRules($group['rules']); switch ($_REQUEST['request']) { case 'update': if ($_REQUEST['type'] == 'or' && count($rules['and']) < 2) { $json->add('callbackFunction', 'resume'); $json->success(Pommo::_T('At least 1 "and" rule must exist before an "or" rule takes effect.')); } Pommo_Rules::changeType($group['id'], $_REQUEST['fieldID'], $_REQUEST['logic'], $_REQUEST['type']); break; case 'delete': Pommo_Rules::deleteRule($group['id'], $_REQUEST['fieldID'], $_REQUEST['logic']); break; } $json->add('callbackFunction', 'redirect'); $json->add('callbackParams', Pommo::$_baseUrl . 'groups_edit.php'); $json->serve(); break; case 'renameGroup': if (!empty($_REQUEST['group_name'])) { if (Pommo_Groups::nameChange($state['group'], $_REQUEST['group_name'])) { $json->success(Pommo::_T('Group Renamed')); } } $json->fail('invalid group name'); break; default: die('invalid request passed to ' . __FILE__); break; } die;
$smarty->assign('returnStr', Pommo::_T('Groups Page')); // Initialize page state with default values overriden by those held in $_REQUEST $state =& Pommo_Api::stateInit('groups_edit', array('group' => 0), $_REQUEST); $groups =& Pommo_Groups::get(); $fields =& Pommo_Fields::get(); $group =& $groups[$state['group']]; if (empty($group)) { Pommo::redirect('subscribers_groups.php'); } $rules = Pommo_Sql::sortRules($group['rules']); $rules['and'] = Pommo_Sql::sortLogic($rules['and']); $rules['or'] = Pommo_Sql::sortLogic($rules['or']); foreach ($rules as $key => $a) { if ($key == 'include' || $key == 'exclude') { foreach ($a as $k => $gid) { $rules[$key][$k] = $groups[$gid]['name']; } } } $smarty->assign('fields', $fields); $smarty->assign('legalFieldIDs', Pommo_Rules::getLegal($group, $fields)); $smarty->assign('legalGroups', Pommo_Rules::getLegalGroups($group, $groups)); $smarty->assign('group', $group); $smarty->assign('logicNames', Pommo_Rules::getEnglish()); $smarty->assign('rules', $rules); $smarty->assign('tally', Pommo_Groups::tally($group)); $smarty->assign('ruleCount', count($rules['and']) + count($rules['or']) + count($rules['include']) + count($rules['exclude'])); $smarty->assign('getURL', $_SERVER['PHP_SELF'] . '?group_id=' . $group['id']); $smarty->assign('t_include', Pommo::_T('INCLUDE')); $smarty->display('admin/subscribers/groups_edit.tpl'); Pommo::kill();