/**
  * 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()));
             }
         }
     }
 }