/** * Fetch recipient data. * * @todo bugtesting and error handling * @return array */ public function getSlice() { $authors = $this->grab(); $return['total-entries'] = $this->getCount(); $pages = (int) $return['total-entries'] / (int) $this->dsParamLIMIT; $return['total-pages'] = round($pages); $return['remaining-pages'] = max(0, (int) $return['total-pages'] - (int) $this->dsParamSTARTPAGE); $return['remaining-entries'] = max(0, (int) $return['total-entries'] - (int) $this->dsParamSTARTPAGE * (int) $this->dsParamLIMIT); $return['entries-per-page'] = $this->dsParamLIMIT; $return['start'] = ((int) $this->dsParamSTARTPAGE - 1) * (int) $this->dsParamLIMIT + 1; $return['current-page'] = (int) $this->dsParamSTARTPAGE; require TOOLKIT . '/util.validators.php'; foreach ($authors as $author) { $return['records'][] = array('id' => $author->get('id'), 'name' => $author->get('first_name') . ' ' . $author->get('last_name'), 'email' => $author->get('email'), 'valid' => General::validateString($author->get('email'), $validators['email']) ? true : false); } if ($this->newsletter_id !== NULL) { $newsletter = EmailNewsletterManager::create($this->newsletter_id); if (is_a($newsletter, 'EmailNewsletter')) { foreach ($return['records'] as $recipient) { $newsletter->_markRecipient($recipient['email'], 'idle'); } } } return $return; }
/** * Fetch generated recipient data. * * Returns parsed recipient data. This means the xslt provided by the user * will be ran on the raw data, returning a name and email direcly useable * by the email API. * * This is the preferred way of getting recipient data. * * @todo bugtesting and error handling * @return array */ public function getSlice() { $entries = $this->grab(); $return['total-entries'] = (string) $entries['total-entries']; $return['total-pages'] = (string) $entries['total-pages']; $return['remaining-pages'] = (string) $entries['remaining-pages']; $return['remaining-entries'] = (string) $entries['remaining-entries']; $return['entries-per-page'] = (string) $entries['limit']; $return['start'] = (string) $entries['start']; $return['current-page'] = (string) $this->dsParamSTARTPAGE; $field_ids = array(); $xsltproc = new XsltProcess(); foreach ($this->nameFields as $nameField) { $field_ids[] = FieldManager::fetchFieldIDFromElementName($nameField, $this->getSource()); } $email_field_id = FieldManager::fetchFieldIDFromElementName($this->emailField, $this->getSource()); require TOOLKIT . '/util.validators.php'; foreach ((array) $entries['records'] as $entry) { $entry_data = $entry->getData(); $element = new XMLElement('entry'); $name = ''; $email = ''; foreach ($entry_data as $field_id => $data) { if (in_array($field_id, $field_ids)) { $field = FieldManager::fetch($field_id); $field->appendFormattedElement($element, $data); } if ($field_id == $email_field_id) { $email = $data['value']; } } $name = trim($xsltproc->process($element->generate(), $this->nameXslt)); if (!empty($email)) { $return['records'][] = array('id' => $entry->get('id'), 'email' => $email, 'name' => $name, 'valid' => General::validateString($email, $validators['email']) ? true : false); } } if ($this->newsletter_id !== NULL) { $newsletter = EmailNewsletterManager::create($this->newsletter_id); if (is_a($newsletter, 'EmailNewsletter')) { foreach ($return['records'] as $recipient) { $newsletter->_markRecipient($recipient['email'], 'idle'); } } } return $return; }
/** * Fetch recipient data, and include useful data. * * This function is used internally to fetch the recipient data. * It is the preferred way of getting data out of the system, * because it will also return pagination and other useful data. * * @return array */ public function getSlice() { $recipients = $this->grab(); $return['total-entries'] = $this->getCount(); $pages = (int) $return['total-entries'] / (int) $this->dsParamLIMIT; $return['total-pages'] = (int) ceil($pages); $return['remaining-pages'] = max(0, (int) $return['total-pages'] - (int) $this->dsParamSTARTPAGE); $return['remaining-entries'] = max(0, (int) $return['total-entries'] - (int) $this->dsParamSTARTPAGE * (int) $this->dsParamLIMIT); $return['entries-per-page'] = $this->dsParamLIMIT; $return['start'] = ((int) $this->dsParamSTARTPAGE - 1) * (int) $this->dsParamLIMIT + 1; $return['current-page'] = (int) $this->dsParamSTARTPAGE; if ($this->newsletter_id !== NULL) { $newsletter = EmailNewsletterManager::create($this->newsletter_id); if (is_a($newsletter, 'EmailNewsletter')) { foreach ($recipients as $recipient) { $newsletter->_markRecipient($recipient['email'], 'idle'); } } } return array_merge($return, array('records' => $recipients)); }
public function __viewTest() { require_once ENMDIR . '/lib/class.emailnewslettermanager.php'; EmailNewsletterManager::updateRecipientsHandle('test', 'huib'); //$newsletter = EmailNewsletterManager::create(1); //var_dump($newsletter->getStats()); //$newsletter->start(); exit; }
/** * Append element to datasource output */ public function appendFormattedElement(&$wrapper, $data, $encode = false) { $node = new XMLElement($this->get('element_name')); $newsletter = EmailNewsletterManager::create($data['newsletter_id']); $properties = $newsletter->getStats(); $node->setAttribute('newsletter-id', $data['newsletter_id']); $node->setAttribute('started-on', $properties['started_on']); $node->setAttribute('started-by', $properties['started_by']); $node->setAttribute('completed-on', $properties['completed_on']); $node->setAttribute('status', $properties['status']); $node->setAttribute('total', $properties['total']); $node->setAttribute('sent', $properties['sent']); $node->setAttribute('failed', $properties['failed']); $node->appendChild(new XMLElement('subject', $newsletter->getTemplate()->subject)); // load configuration; // use saved (entry) config XML if available (i.e.: if the email newsletter has been sent); // fallback: the field's configuration XML // sender $sender = new XMLElement('sender'); $about = is_object($newsletter->getSender()) ? $newsletter->getSender()->about() : array(); General::array_to_xml($sender, $about); $sender_name = $about['name']; $sender_handle = is_object($newsletter->getSender()) ? $newsletter->getSender()->getHandle() : NULL; $el = new XMLElement('name'); $el->setAttribute('id', $sender_handle); $el->setValue($sender_name); $sender->replaceChildAt(0, $el); $node->appendChild($sender); // recipients $recipients = new XMLElement('recipient-groups'); foreach ($newsletter->getRecipientGroups() as $group) { $rgroup = new XMLElement('group'); $about = (array) $group->about(); General::array_to_xml($rgroup, $about); $rgroup_name = $about['name']; $rgroup_handle = $group->getHandle(); $el = new XMLElement('name'); $el->setAttribute('id', $rgroup_handle); $el->setValue($rgroup_name); $rgroup->replaceChildAt(0, $el); $rgroup_count = RecipientgroupManager::create($rgroup_handle)->getCount(); $rgroup->setAttribute('count', $rgroup_count); $recipients->appendChild($rgroup); } $node->appendChild($recipients); // template $template = new XMLElement('template'); $about = (array) $newsletter->getTemplate()->about; General::array_to_xml($template, $about); $template_name = $about['name']; $template_handle = EmailTemplateManager::getHandleFromName($template_name); $el = new XMLElement('name'); $el->setAttribute('id', $template_handle); $el->setValue($template_name); $template->replaceChildAt(0, $el); $node->appendChild($template); $wrapper->appendChild($node); }
require_once DOCROOT . '/symphony/lib/boot/bundle.php'; //Inside bundle.php, the error_reporting is set again, but we don't want to be stopped by any other than fatal errors. error_reporting(0); require_once DOCROOT . '/symphony/lib/core/class.symphony.php'; require_once DOCROOT . '/symphony/lib/core/class.administration.php'; GenericErrorHandler::$enabled = false; // ENM Specific includes & defines define_safe('ENM_DIR', DOCROOT . '/extensions/email_newsletter_manager'); define_safe('ETM_DIR', DOCROOT . '/extensions/email_template_manager'); require_once ENM_DIR . '/lib/class.sendermanager.php'; require_once ENM_DIR . '/lib/class.recipientgroupmanager.php'; require_once ENM_DIR . '/lib/class.emailnewslettermanager.php'; require_once ENM_DIR . '/lib/class.emailbackgroundprocess.php'; // Needed to __construct() the Symphony class. // This in turn is needed to get the Symphony::Database() functions working. $thing = Administration::instance(); try { $newsletter = EmailNewsletterManager::create($newsletter_id); if (is_a($newsletter, 'EmailNewsletter')) { $newsletter->setPId(getmypid()); $sending_settings = $newsletter->getSender()->about(); if ($newsletter->sendBatch($process_auth) != 'completed') { time_sleep_until($start_time + $sending_settings['throttle-time']); EmailBackgroundProcess::spawnProcess($newsletter_id, $process_auth); } } else { throw new Exception('Newsletter with id: ' . $newsletter_id . ' not found.'); } } catch (Exception $e) { file_put_contents(DOCROOT . '/manifest/newsletter-log.txt', '[' . DateTimeObj::get('Y/m/d H:i:s') . '] newsletter-id: ' . $newsletter_id . ' - ' . $e->getMessage() . "\r\n", FILE_APPEND); }
public function initEmailNewsletter($context) { // The field has a 'save and send' button. We trigger the newsletter // start using the 'action' string, which seems to be the only way. if (isset($_POST['action']) && @array_key_exists('save', $_POST['action']) && substr($_POST['action']['save'], 0, 9) == 'enm-send:') { $vars = explode(":", $_POST['action']['save']); $field_id = $vars[1]; $entry_id = $context['entry']->get('id'); $data = $this->_getEntryData($field_id, $entry_id); if (!empty($data)) { try { $this->newsletter = EmailNewsletterManager::create($data['newsletter_id']); // The reason the newsletter is started here and not in the field save function is because it must only send if all other fields are completed successfully. $this->newsletter->start(); } catch (Exception $e) { Administration::instance()->customError(__('Error sending email newsletter'), __($e->getMessage())); } } } }