Fix Failing Activity Test
[civicrm-core.git] / CRM / Mailing / Selector / Search.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 5 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2019 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
9 | |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
13 | |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
18 | |
19 | You should have received a copy of the GNU Affero General Public |
20 | License and the CiviCRM Licensing Exception along |
21 | with this program; if not, contact CiviCRM LLC |
22 | at info[AT]civicrm[DOT]org. If you have questions about the |
23 | GNU Affero General Public License or the licensing of CiviCRM, |
24 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
25 +--------------------------------------------------------------------+
26 */
27
28 /**
29 *
30 * @package CRM
31 * @copyright CiviCRM LLC (c) 2004-2019
32 */
33
34 /**
35 * This class is used to retrieve and display a range of
36 * contacts that match the given criteria (specifically for
37 * results of advanced search options.
38 */
39 class CRM_Mailing_Selector_Search extends CRM_Core_Selector_Base implements CRM_Core_Selector_API {
40
41 /**
42 * This defines two actions- View and Edit.
43 *
44 * @var array
45 */
46 public static $_links = NULL;
47
48 /**
49 * We use desc to remind us what that column is, name is used in the tpl
50 *
51 * @var array
52 */
53 public static $_columnHeaders;
54
55 /**
56 * Properties of contact we're interested in displaying
57 * @var array
58 */
59 public static $_properties = [
60 'contact_id',
61 'mailing_id',
62 'mailing_name',
63 'language',
64 'sort_name',
65 'email',
66 'mailing_subject',
67 'email_on_hold',
68 'contact_opt_out',
69 'mailing_job_status',
70 'mailing_job_end_date',
71 ];
72
73 /**
74 * Are we restricting ourselves to a single contact
75 *
76 * @var boolean
77 */
78 protected $_single = FALSE;
79
80 /**
81 * Are we restricting ourselves to a single contact
82 *
83 * @var boolean
84 */
85 protected $_limit = NULL;
86
87 /**
88 * What context are we being invoked from
89 *
90 * @var string
91 */
92 protected $_context = NULL;
93
94 /**
95 * What component context are we being invoked from
96 *
97 * @var string
98 */
99 protected $_compContext = NULL;
100
101 /**
102 * QueryParams is the array returned by exportValues called on
103 * the HTML_QuickForm_Controller for that page.
104 *
105 * @var array
106 */
107 public $_queryParams;
108
109 /**
110 * Represent the type of selector.
111 *
112 * @var int
113 */
114 protected $_action;
115
116 /**
117 * The additional clause that we restrict the search with.
118 *
119 * @var string
120 */
121 protected $_mailingClause = NULL;
122
123 /**
124 * The query object.
125 *
126 * @var string
127 */
128 protected $_query;
129
130 /**
131 * Class constructor.
132 *
133 * @param array $queryParams
134 * Array of parameters for query.
135 * @param \const|int $action - action of search basic or advanced.
136 * @param string $mailingClause
137 * If the caller wants to further restrict the search.
138 * @param bool $single
139 * Are we dealing only with one contact?.
140 * @param int $limit
141 * How many mailing do we want returned.
142 *
143 * @param string $context
144 * @param null $compContext
145 *
146 * @return \CRM_Mailing_Selector_Search
147 */
148 public function __construct(
149 &$queryParams,
150 $action = CRM_Core_Action::NONE,
151 $mailingClause = NULL,
152 $single = FALSE,
153 $limit = NULL,
154 $context = 'search',
155 $compContext = NULL
156 ) {
157 // submitted form values
158 $this->_queryParams = &$queryParams;
159
160 $this->_single = $single;
161 $this->_limit = $limit;
162 $this->_context = $context;
163 $this->_compContext = $compContext;
164
165 $this->_mailingClause = $mailingClause;
166
167 // type of selector
168 $this->_action = $action;
169 $this->_query = new CRM_Contact_BAO_Query($this->_queryParams,
170 CRM_Mailing_BAO_Query::defaultReturnProperties(CRM_Contact_BAO_Query::MODE_MAILING,
171 FALSE
172 ),
173 NULL, FALSE, FALSE,
174 CRM_Contact_BAO_Query::MODE_MAILING
175 );
176
177 $this->_query->_distinctComponentClause = " civicrm_mailing_recipients.id ";
178 }
179
180 /**
181 * This method returns the links that are given for each search row.
182 * currently the links added for each row are
183 *
184 * - View
185 * - Edit
186 *
187 * @return array
188 */
189 public static function &links() {
190 if (!(self::$_links)) {
191 list($context, $key) = func_get_args();
192 $extraParams = ($key) ? "&key={$key}" : NULL;
193 $searchContext = ($context) ? "&context=$context" : NULL;
194
195 self::$_links = [
196 CRM_Core_Action::VIEW => [
197 'name' => ts('View'),
198 'url' => 'civicrm/contact/view',
199 'qs' => "reset=1&cid=%%cid%%{$searchContext}{$extraParams}",
200 'title' => ts('View Contact Details'),
201 ],
202 CRM_Core_Action::UPDATE => [
203 'name' => ts('Edit'),
204 'url' => 'civicrm/contact/add',
205 'qs' => "reset=1&action=update&cid=%%cid%%{$searchContext}{$extraParams}",
206 'title' => ts('Edit Contact Details'),
207 ],
208 CRM_Core_Action::DELETE => [
209 'name' => ts('Delete'),
210 'url' => 'civicrm/contact/view/delete',
211 'qs' => "reset=1&delete=1&cid=%%cid%%{$searchContext}{$extraParams}",
212 'title' => ts('Delete Contact'),
213 ],
214 ];
215 }
216 return self::$_links;
217 }
218
219 /**
220 * Getter for array of the parameters required for creating pager.
221 *
222 * @param $action
223 * @param array $params
224 */
225 public function getPagerParams($action, &$params) {
226 $params['status'] = ts('Mailing Recipient') . ' %%StatusMessage%%';
227 $params['csvString'] = NULL;
228 if ($this->_limit) {
229 $params['rowCount'] = $this->_limit;
230 }
231 else {
232 $params['rowCount'] = CRM_Utils_Pager::ROWCOUNT;
233 }
234
235 $params['buttonTop'] = 'PagerTopButton';
236 $params['buttonBottom'] = 'PagerBottomButton';
237 }
238
239 /**
240 * Returns total number of rows for the query.
241 *
242 * @param string $action
243 *
244 * @return int
245 * Total number of rows
246 */
247 public function getTotalCount($action) {
248 return $this->_query->searchQuery(0, 0, NULL,
249 TRUE, FALSE,
250 FALSE, FALSE,
251 FALSE,
252 $this->_mailingClause
253 );
254 }
255
256 /**
257 * Returns all the rows in the given offset and rowCount.
258 *
259 * @param string $action
260 * The action being performed.
261 * @param int $offset
262 * The row number to start from.
263 * @param int $rowCount
264 * The number of rows to return.
265 * @param string $sort
266 * The sql string that describes the sort order.
267 * @param string $output
268 * What should the result set include (web/email/csv).
269 *
270 * @return int
271 * the total number of rows for this action
272 */
273 public function &getRows($action, $offset, $rowCount, $sort, $output = NULL) {
274 $result = $this->_query->searchQuery($offset, $rowCount, $sort,
275 FALSE, FALSE,
276 FALSE, FALSE,
277 FALSE,
278 $this->_mailingClause
279 );
280
281 // process the result of the query
282 $rows = [];
283 $permissions = [CRM_Core_Permission::getPermission()];
284 if (CRM_Core_Permission::check('delete contacts')) {
285 $permissions[] = CRM_Core_Permission::DELETE;
286 }
287 $mask = CRM_Core_Action::mask($permissions);
288 $qfKey = $this->_key;
289
290 while ($result->fetch()) {
291 $row = [];
292 // the columns we are interested in
293 foreach (self::$_properties as $property) {
294 if (property_exists($result, $property)) {
295 $row[$property] = $result->$property;
296 }
297 }
298
299 $row['checkbox'] = CRM_Core_Form::CB_PREFIX . $result->mailing_recipients_id;
300
301 $actions = [
302 'cid' => $result->contact_id,
303 'cxt' => $this->_context,
304 ];
305
306 $row['action'] = CRM_Core_Action::formLink(
307 self::links($qfKey, $this->_context),
308 $mask,
309 $actions,
310 ts('more'),
311 FALSE,
312 'contact.mailing.row',
313 'Contact',
314 $result->contact_id
315 );
316 $row['contact_type'] = CRM_Contact_BAO_Contact_Utils::getImage($result->contact_sub_type ? $result->contact_sub_type : $result->contact_type, FALSE, $result->contact_id
317 );
318
319 $rows[] = $row;
320 }
321 return $rows;
322 }
323
324 /**
325 * @inheritDoc
326 */
327 public function getQILL() {
328 return $this->_query->qill();
329 }
330
331 /**
332 * Returns the column headers as an array of tuples:
333 * (name, sortName (key to the sort array))
334 *
335 * @param string $action
336 * The action being performed.
337 * @param string $output
338 * What should the result set include (web/email/csv).
339 *
340 * @return array
341 * the column headers that need to be displayed
342 */
343 public function &getColumnHeaders($action = NULL, $output = NULL) {
344
345 if (!isset(self::$_columnHeaders)) {
346 $isMultiLingual = CRM_Core_I18n::isMultiLingual();
347 $headers = [
348 ['desc' => ts('Contact Type')],
349 [
350 'name' => ts('Name'),
351 'sort' => 'sort_name',
352 'direction' => CRM_Utils_Sort::DONTCARE,
353 ],
354 [
355 'name' => ts('Email'),
356 'sort' => 'email',
357 'direction' => CRM_Utils_Sort::DONTCARE,
358 ],
359 [
360 'name' => ts('Mailing Name'),
361 'sort' => 'mailing_name',
362 'direction' => CRM_Utils_Sort::DONTCARE,
363 ],
364 ];
365
366 // Check to see if languages column should be displayed.
367 if ($isMultiLingual) {
368 $headers[] = [
369 'name' => ts('Language'),
370 'sort' => 'language',
371 'direction' => CRM_Utils_Sort::DONTCARE,
372 ];
373 }
374 self::$_columnHeaders = array_merge($headers, [
375 [
376 'name' => ts('Mailing Subject'),
377 'sort' => 'mailing_subject',
378 'direction' => CRM_Utils_Sort::DONTCARE,
379 ],
380 [
381 'name' => ts('Mailing Status'),
382 'sort' => 'mailing_job_status',
383 'direction' => CRM_Utils_Sort::DONTCARE,
384 ],
385 [
386 'name' => ts('Completed Date'),
387 'sort' => 'mailing_job_end_date',
388 'direction' => CRM_Utils_Sort::DONTCARE,
389 ],
390 ['desc' => ts('Actions')],
391 ]);
392 }
393 return self::$_columnHeaders;
394 }
395
396 /**
397 * @return mixed
398 */
399 public function alphabetQuery() {
400 return $this->_query->alphabetQuery();
401 }
402
403 /**
404 * @return string
405 */
406 public function &getQuery() {
407 return $this->_query;
408 }
409
410 /**
411 * Name of export file.
412 *
413 * @param string $output
414 * Type of output.
415 *
416 * @return string
417 * name of the file
418 */
419 public function getExportFileName($output = 'csv') {
420 return ts('CiviCRM Mailing Search');
421 }
422
423 }