drupal-civicrm/sites/all/modules/civicrm/CRM/Mailing/Selector/Event.php
2018-01-14 13:10:16 +00:00

476 lines
14 KiB
PHP

<?php
/*
+--------------------------------------------------------------------+
| CiviCRM version 4.7 |
+--------------------------------------------------------------------+
| Copyright CiviCRM LLC (c) 2004-2017 |
+--------------------------------------------------------------------+
| This file is a part of CiviCRM. |
| |
| CiviCRM is free software; you can copy, modify, and distribute it |
| under the terms of the GNU Affero General Public License |
| Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
| |
| CiviCRM is distributed in the hope that it will be useful, but |
| WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| See the GNU Affero General Public License for more details. |
| |
| You should have received a copy of the GNU Affero General Public |
| License and the CiviCRM Licensing Exception along |
| with this program; if not, contact CiviCRM LLC |
| at info[AT]civicrm[DOT]org. If you have questions about the |
| GNU Affero General Public License or the licensing of CiviCRM, |
| see the CiviCRM license FAQ at http://civicrm.org/licensing |
+--------------------------------------------------------------------+
*/
/**
*
* @package CRM
* @copyright CiviCRM LLC (c) 2004-2017
*/
/**
* This class is used to retrieve and display a range of
* contacts that match the given criteria (specifically for
* results of advanced search options.
*/
class CRM_Mailing_Selector_Event extends CRM_Core_Selector_Base implements CRM_Core_Selector_API {
/**
* Array of supported links, currently null
*
* @var array
*/
static $_links = NULL;
/**
* What event type are we browsing?
*/
private $_event;
/**
* Should we only count distinct contacts?
*/
private $_is_distinct;
/**
* Which mailing are we browsing events from?
*/
private $_mailing_id;
/**
* Do we want events tied to a specific job?
*/
private $_job_id;
/**
* For click-through events, do we only want those from a specific url?
*/
private $_url_id;
/**
* We use desc to remind us what that column is, name is used in the tpl
*
* @var array
*/
public $_columnHeaders;
/**
* Class constructor.
*
* @param string $event
* The event type (queue/delivered/open...).
* @param bool $distinct
* Count only distinct contact events?.
* @param int $mailing
* ID of the mailing to query.
* @param int $job
* ID of the job to query. If null, all jobs from $mailing are queried.
* @param int $url
* If the event type is a click-through, do we want only those from a specific url?.
*
* @return \CRM_Mailing_Selector_Event
*/
public function __construct($event, $distinct, $mailing, $job = NULL, $url = NULL) {
$this->_event_type = $event;
$this->_is_distinct = $distinct;
$this->_mailing_id = $mailing;
$this->_job_id = $job;
$this->_url_id = $url;
}
/**
* This method returns the links that are given for each search row.
*
* @return array
*/
public static function &links() {
return self::$_links;
}
/**
* Getter for array of the parameters required for creating pager.
*
* @param $action
* @param array $params
*/
public function getPagerParams($action, &$params) {
$params['csvString'] = NULL;
$params['rowCount'] = CRM_Utils_Pager::ROWCOUNT;
$params['status'] = ts('%1 %%StatusMessage%%', array(1 => $this->eventToTitle()));
$params['buttonTop'] = 'PagerTopButton';
$params['buttonBottom'] = 'PagerBottomButton';
}
/**
* Returns the column headers as an array of tuples:
* (name, sortName (key to the sort array))
*
* @param string $action
* The action being performed.
* @param string $output
* What should the result set include (web/email/csv).
*
* @return array
* the column headers that need to be displayed
*/
public function &getColumnHeaders($action = NULL, $output = NULL) {
$mailing = CRM_Mailing_BAO_Mailing::getTableName();
$contact = CRM_Contact_BAO_Contact::getTableName();
$email = CRM_Core_BAO_Email::getTableName();
$job = CRM_Mailing_BAO_MailingJob::getTableName();
if (!isset($this->_columnHeaders)) {
$this->_columnHeaders = array(
'sort_name' => array(
'name' => ts('Contact'),
'sort' => $contact . '.sort_name',
'direction' => CRM_Utils_Sort::ASCENDING,
),
'email' => array(
'name' => ts('Email Address'),
'sort' => $email . '.email',
'direction' => CRM_Utils_Sort::DONTCARE,
),
);
switch ($this->_event_type) {
case 'queue':
$dateSort = $job . '.start_date';
break;
case 'delivered':
$this->_columnHeaders = array(
'contact_id' => array(
'name' => ts('Internal Contact ID'),
'sort' => $contact . '.id',
'direction' => CRM_Utils_Sort::ASCENDING,
),
) + $this->_columnHeaders;
$dateSort = CRM_Mailing_Event_BAO_Delivered::getTableName() . '.time_stamp';
break;
case 'opened':
$dateSort = CRM_Mailing_Event_BAO_Opened::getTableName() . '.time_stamp';
break;
case 'bounce':
$dateSort = CRM_Mailing_Event_BAO_Bounce::getTableName() . '.time_stamp';
$this->_columnHeaders = array_merge($this->_columnHeaders,
array(
array(
'name' => ts('Bounce Type'),
),
array(
'name' => ts('Bounce Reason'),
),
)
);
break;
case 'forward':
$dateSort = CRM_Mailing_Event_BAO_Forward::getTableName() . '.time_stamp';
$this->_columnHeaders = array_merge($this->_columnHeaders,
array(
array(
'name' => ts('Forwarded Email'),
),
)
);
break;
case 'reply':
$dateSort = CRM_Mailing_Event_BAO_Reply::getTableName() . '.time_stamp';
break;
case 'unsubscribe':
$dateSort = CRM_Mailing_Event_BAO_Unsubscribe::getTableName() . '.time_stamp';
$this->_columnHeaders = array_merge($this->_columnHeaders, array(
array(
'name' => ts('Unsubscribe'),
),
));
break;
case 'optout':
$dateSort = CRM_Mailing_Event_BAO_Unsubscribe::getTableName() . '.time_stamp';
$this->_columnHeaders = array_merge($this->_columnHeaders, array(
array(
'name' => ts('Opt-Out'),
),
));
break;
case 'click':
$dateSort = CRM_Mailing_Event_BAO_TrackableURLOpen::getTableName() . '.time_stamp';
$this->_columnHeaders = array_merge($this->_columnHeaders, array(
array(
'name' => ts('URL'),
),
));
break;
default:
return 0;
}
$this->_columnHeaders = array_merge($this->_columnHeaders, array(
'date' => array(
'name' => ts('Date'),
'sort' => $dateSort,
'direction' => CRM_Utils_Sort::DESCENDING,
),
));
}
return $this->_columnHeaders;
}
/**
* Returns total number of rows for the query.
*
* @param string $action
*
* @return int
* Total number of rows
*/
public function getTotalCount($action) {
switch ($this->_event_type) {
case 'queue':
$event = new CRM_Mailing_Event_BAO_Queue();
$result = $event->getTotalCount($this->_mailing_id,
$this->_job_id
);
return $result;
case 'delivered':
$event = new CRM_Mailing_Event_BAO_Delivered();
$result = $event->getTotalCount($this->_mailing_id,
$this->_job_id,
$this->_is_distinct
);
return $result;
case 'opened':
$event = new CRM_Mailing_Event_BAO_Opened();
$result = $event->getTotalCount($this->_mailing_id,
$this->_job_id,
$this->_is_distinct
);
return $result;
case 'bounce':
$event = new CRM_Mailing_Event_BAO_Bounce();
$result = $event->getTotalCount($this->_mailing_id,
$this->_job_id,
$this->_is_distinct
);
return $result;
case 'forward':
$event = new CRM_Mailing_Event_BAO_Forward();
$result = $event->getTotalCount($this->_mailing_id,
$this->_job_id,
$this->_is_distinct
);
return $result;
case 'reply':
$event = new CRM_Mailing_Event_BAO_Reply();
$result = $event->getTotalCount($this->_mailing_id,
$this->_job_id,
$this->_is_distinct
);
return $result;
case 'unsubscribe':
$event = new CRM_Mailing_Event_BAO_Unsubscribe();
$result = $event->getTotalCount($this->_mailing_id,
$this->_job_id,
$this->_is_distinct
);
return $result;
case 'optout':
$event = new CRM_Mailing_Event_BAO_Unsubscribe();
$result = $event->getTotalCount($this->_mailing_id,
$this->_job_id,
$this->_is_distinct,
FALSE
);
return $result;
case 'click':
$event = new CRM_Mailing_Event_BAO_TrackableURLOpen();
$result = $event->getTotalCount($this->_mailing_id,
$this->_job_id,
$this->_is_distinct,
$this->_url_id
);
return $result;
default:
return 0;
}
}
/**
* Returns all the rows in the given offset and rowCount.
*
* @param string $action
* The action being performed.
* @param int $offset
* The row number to start from.
* @param int $rowCount
* The number of rows to return.
* @param string $sort
* The sql string that describes the sort order.
* @param string $output
* What should the result set include (web/email/csv).
*
* @return int
* the total number of rows for this action
*/
public function &getRows($action, $offset, $rowCount, $sort, $output = NULL) {
switch ($this->_event_type) {
case 'queue':
$rows = CRM_Mailing_Event_BAO_Queue::getRows($this->_mailing_id,
$this->_job_id, $offset, $rowCount, $sort
);
return $rows;
case 'delivered':
$rows = CRM_Mailing_Event_BAO_Delivered::getRows($this->_mailing_id,
$this->_job_id, $this->_is_distinct,
$offset, $rowCount, $sort
);
return $rows;
case 'opened':
$rows = CRM_Mailing_Event_BAO_Opened::getRows($this->_mailing_id,
$this->_job_id, $this->_is_distinct,
$offset, $rowCount, $sort
);
return $rows;
case 'bounce':
$rows = CRM_Mailing_Event_BAO_Bounce::getRows($this->_mailing_id,
$this->_job_id, $this->_is_distinct,
$offset, $rowCount, $sort
);
return $rows;
case 'forward':
$rows = CRM_Mailing_Event_BAO_Forward::getRows($this->_mailing_id,
$this->_job_id, $this->_is_distinct,
$offset, $rowCount, $sort
);
return $rows;
case 'reply':
$rows = CRM_Mailing_Event_BAO_Reply::getRows($this->_mailing_id,
$this->_job_id, $this->_is_distinct,
$offset, $rowCount, $sort
);
return $rows;
case 'unsubscribe':
$rows = CRM_Mailing_Event_BAO_Unsubscribe::getRows($this->_mailing_id,
$this->_job_id, $this->_is_distinct,
$offset, $rowCount, $sort, TRUE
);
return $rows;
case 'optout':
$rows = CRM_Mailing_Event_BAO_Unsubscribe::getRows($this->_mailing_id,
$this->_job_id, $this->_is_distinct,
$offset, $rowCount, $sort, FALSE
);
return $rows;
case 'click':
$rows = CRM_Mailing_Event_BAO_TrackableURLOpen::getRows(
$this->_mailing_id, $this->_job_id,
$this->_is_distinct, $this->_url_id,
$offset, $rowCount, $sort
);
return $rows;
default:
return NULL;
}
}
/**
* Name of export file.
*
* @param string $output
* Type of output.
*
* @return string|NULL
* name of the file
*/
public function getExportFileName($output = 'csv') {
return NULL;
}
/**
* Get the title for the mailing event type.
*
* @return string
*/
public function eventToTitle() {
static $events = NULL;
if (empty($events)) {
$events = array(
'queue' => ts('Intended Recipients'),
'delivered' => ts('Successful Deliveries'),
'bounce' => ts('Bounces'),
'forward' => ts('Forwards'),
'reply' => $this->_is_distinct ? ts('Unique Replies') : ts('Replies'),
'unsubscribe' => ts('Unsubscribe Requests'),
'optout' => ts('Opt-out Requests'),
'click' => $this->_is_distinct ? ts('Unique Click-throughs') : ts('Click-throughs'),
'opened' => $this->_is_distinct ? ts('Unique Tracked Opens') : ts('Total Tracked Opens'),
);
}
return $events[$this->_event_type];
}
/**
* Get the title of the event.
*
* @return string
*/
public function getTitle() {
return $this->eventToTitle();
}
}