Merge pull request #17390 from mattwire/api3activitydatetimedefault
[civicrm-core.git] / CRM / Mailing / Page / Browse.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | Copyright CiviCRM LLC. All rights reserved. |
5 | |
6 | This work is published under the GNU AGPLv3 license with some |
7 | permitted exceptions and without any warranty. For full license |
8 | and copyright information, see https://civicrm.org/licensing |
9 +--------------------------------------------------------------------+
10 */
11
12 /**
13 *
14 * @package CRM
15 * @copyright CiviCRM LLC https://civicrm.org/licensing
16 */
17
18 /**
19 * This implements the profile page for all contacts. It uses a selector
20 * object to do the actual dispay. The fields displayd are controlled by
21 * the admin
22 */
23 class CRM_Mailing_Page_Browse extends CRM_Core_Page {
24
25 /**
26 * All the fields that are listings related.
27 *
28 * @var array
29 */
30 protected $_fields;
31
32 /**
33 * The mailing id of the mailing we're operating on
34 *
35 * @var int
36 */
37 protected $_mailingId;
38
39 /**
40 * The action that we are performing (in CRM_Core_Action terms)
41 *
42 * @var int
43 */
44 protected $_action;
45
46 public $_sortByCharacter;
47
48 public $_unscheduled;
49 public $_archived;
50
51 /**
52 * Scheduled mailing.
53 *
54 * @var bool
55 */
56 public $_scheduled;
57
58 public $_sms;
59
60 /**
61 * Heart of the viewing process. The runner gets all the meta data for
62 * the contact and calls the appropriate type of page to view.
63 */
64 public function preProcess() {
65 Civi::resources()->addStyleFile('civicrm', 'css/searchForm.css', 1, 'html-header');
66
67 $this->_unscheduled = $this->_archived = $archiveLinks = FALSE;
68 $this->_mailingId = CRM_Utils_Request::retrieve('mid', 'Positive', $this);
69 $this->_sms = CRM_Utils_Request::retrieve('sms', 'Positive', $this);
70
71 if ($this->_sms) {
72 // if this is an SMS page, check that the user has permission to browse SMS
73 if (!CRM_Core_Permission::check('send SMS')) {
74 CRM_Core_Error::statusBounce(ts('You do not have permission to send SMS'));
75 }
76 }
77 else {
78 // If this is not an SMS page, check that the user has an appropriate
79 // permission (specific permissions have been copied from
80 // CRM/Mailing/xml/Menu/Mailing.xml)
81 if (!CRM_Core_Permission::check([['access CiviMail', 'approve mailings', 'create mailings', 'schedule mailings']])) {
82 CRM_Core_Error::statusBounce(ts('You do not have permission to view this page.'));
83 }
84 }
85
86 $this->assign('sms', $this->_sms);
87 // check that the user has permission to access mailing id
88 CRM_Mailing_BAO_Mailing::checkPermission($this->_mailingId);
89
90 $this->_action = CRM_Utils_Request::retrieve('action', 'String', $this);
91 $this->assign('action', $this->_action);
92
93 $showLinks = TRUE;
94 if (CRM_Mailing_Info::workflowEnabled()) {
95 if (CRM_Core_Permission::check('create mailings')) {
96 $archiveLinks = TRUE;
97 }
98 if (!CRM_Core_Permission::check('access CiviMail') &&
99 !CRM_Core_Permission::check('create mailings')
100 ) {
101 $showLinks = FALSE;
102 }
103 }
104 $this->assign('showLinks', $showLinks);
105 if (CRM_Core_Permission::check('access CiviMail')) {
106 $archiveLinks = TRUE;
107 }
108 if ($archiveLinks == TRUE) {
109 $this->assign('archiveLinks', $archiveLinks);
110 }
111 }
112
113 /**
114 * Run this page (figure out the action needed and perform it).
115 */
116 public function run() {
117 $this->preProcess();
118
119 $newArgs = func_get_args();
120 // since we want only first function argument
121 $newArgs = $newArgs[0];
122 if (isset($_GET['runJobs']) || CRM_Utils_Array::value('2', $newArgs) == 'queue') {
123 $mailerJobSize = Civi::settings()->get('mailerJobSize');
124 CRM_Mailing_BAO_MailingJob::runJobs_pre($mailerJobSize);
125 CRM_Mailing_BAO_MailingJob::runJobs();
126 CRM_Mailing_BAO_MailingJob::runJobs_post();
127 }
128
129 $this->_sortByCharacter
130 = CRM_Utils_Request::retrieve('sortByCharacter', 'String', $this);
131
132 // CRM-11920 all should set sortByCharacter to null, not empty string
133 if (strtolower($this->_sortByCharacter) == 'all' || !empty($_POST)) {
134 $this->_sortByCharacter = NULL;
135 $this->set('sortByCharacter', NULL);
136 }
137
138 if (CRM_Utils_Array::value(3, $newArgs) == 'unscheduled') {
139 $this->_unscheduled = TRUE;
140 }
141 $this->set('unscheduled', $this->_unscheduled);
142
143 if (CRM_Utils_Array::value(3, $newArgs) == 'archived') {
144 $this->_archived = TRUE;
145 }
146 $this->set('archived', $this->_archived);
147
148 if (CRM_Utils_Array::value(3, $newArgs) == 'scheduled') {
149 $this->_scheduled = TRUE;
150 }
151 $this->set('scheduled', $this->_scheduled);
152
153 $this->_createdId = CRM_Utils_Request::retrieve('cid', 'Positive', $this, FALSE, 0);
154 if ($this->_createdId) {
155 $this->set('createdId', $this->_createdId);
156 }
157
158 if ($this->_sms) {
159 $this->set('sms', $this->_sms);
160 }
161
162 $session = CRM_Core_Session::singleton();
163 $context = $session->readUserContext();
164
165 if ($this->_action & CRM_Core_Action::DISABLE) {
166 if (CRM_Utils_Request::retrieve('confirmed', 'Boolean', $this)) {
167 CRM_Mailing_BAO_MailingJob::cancel($this->_mailingId);
168 CRM_Core_Session::setStatus(ts('The mailing has been canceled.'), ts('Canceled'), 'success');
169 CRM_Utils_System::redirect($context);
170 }
171 else {
172 $controller = new CRM_Core_Controller_Simple('CRM_Mailing_Form_Browse',
173 ts('Cancel Mailing'),
174 $this->_action
175 );
176 $controller->setEmbedded(TRUE);
177 $controller->run();
178 }
179 }
180 elseif ($this->_action & CRM_Core_Action::CLOSE) {
181 if (!CRM_Core_Permission::checkActionPermission('CiviMail', CRM_Core_Action::CLOSE)) {
182 CRM_Core_Error::statusBounce(ts('You do not have permission to access this page.'));
183 }
184 CRM_Mailing_BAO_MailingJob::pause($this->_mailingId);
185 CRM_Core_Session::setStatus(ts('The mailing has been paused. Active message deliveries may continue for a few minutes, but CiviMail will not begin delivery of any more batches.'), ts('Paused'), 'success');
186 CRM_Utils_System::redirect($context);
187 }
188 elseif ($this->_action & CRM_Core_Action::REOPEN) {
189 if (!CRM_Core_Permission::checkActionPermission('CiviMail', CRM_Core_Action::CLOSE)) {
190 CRM_Core_Error::statusBounce(ts('You do not have permission to access this page.'));
191 }
192 CRM_Mailing_BAO_MailingJob::resume($this->_mailingId);
193 CRM_Core_Session::setStatus(ts('The mailing has been resumed.'), ts('Resumed'), 'success');
194 CRM_Utils_System::redirect($context);
195 }
196 elseif ($this->_action & CRM_Core_Action::DELETE) {
197 if (CRM_Utils_Request::retrieve('confirmed', 'Boolean', $this)) {
198
199 // check for action permissions.
200 if (!CRM_Core_Permission::checkActionPermission('CiviMail', $this->_action)) {
201 CRM_Core_Error::statusBounce(ts('You do not have permission to access this page.'));
202 }
203
204 CRM_Mailing_BAO_Mailing::del($this->_mailingId);
205 CRM_Utils_System::redirect($context);
206 }
207 else {
208 $controller = new CRM_Core_Controller_Simple('CRM_Mailing_Form_Browse',
209 ts('Delete Mailing'),
210 $this->_action
211 );
212 $controller->setEmbedded(TRUE);
213 $controller->run();
214 }
215 }
216 elseif ($this->_action & CRM_Core_Action::RENEW) {
217 // archive this mailing, CRM-3752.
218 if (CRM_Utils_Request::retrieve('confirmed', 'Boolean', $this)) {
219 // set is_archived to 1
220 CRM_Core_DAO::setFieldValue('CRM_Mailing_DAO_Mailing', $this->_mailingId, 'is_archived', TRUE);
221 CRM_Utils_System::redirect($context);
222 }
223 else {
224 $controller = new CRM_Core_Controller_Simple('CRM_Mailing_Form_Browse',
225 ts('Archive Mailing'),
226 $this->_action
227 );
228 $controller->setEmbedded(TRUE);
229 $controller->run();
230 }
231 }
232
233 $selector = new CRM_Mailing_Selector_Browse();
234 $selector->setParent($this);
235
236 $controller = new CRM_Core_Selector_Controller(
237 $selector,
238 $this->get(CRM_Utils_Pager::PAGE_ID),
239 $this->get(CRM_Utils_Sort::SORT_ID) . $this->get(CRM_Utils_Sort::SORT_DIRECTION),
240 CRM_Core_Action::VIEW,
241 $this,
242 CRM_Core_Selector_Controller::TEMPLATE
243 );
244
245 $controller->setEmbedded(TRUE);
246 $controller->run();
247
248 // hack to display results as per search
249 $rows = $controller->getRows($controller);
250
251 $this->assign('rows', $rows);
252
253 $urlParams = 'reset=1';
254 $urlString = 'civicrm/mailing/browse';
255 if ($this->get('sms')) {
256 $urlParams .= '&sms=1';
257 }
258 if (CRM_Utils_Array::value(3, $newArgs) == 'unscheduled') {
259 $urlString .= '/unscheduled';
260 $urlParams .= '&scheduled=false';
261 $this->assign('unscheduled', TRUE);
262 }
263 elseif (CRM_Utils_Array::value(3, $newArgs) == 'archived') {
264 $urlString .= '/archived';
265 $this->assign('archived', TRUE);
266 }
267 elseif (CRM_Utils_Array::value(3, $newArgs) == 'scheduled') {
268 $urlString .= '/scheduled';
269 $urlParams .= '&scheduled=true';
270 }
271 if ($this->get('sms')) {
272 CRM_Utils_System::setTitle(ts('Find Mass SMS'));
273 }
274
275 $crmRowCount = CRM_Utils_Request::retrieve('crmRowCount', 'Integer');
276 $crmPID = CRM_Utils_Request::retrieve('crmPID', 'Integer');
277 if ($crmRowCount || $crmPID) {
278 $urlParams .= '&force=1';
279 $urlParams .= $crmRowCount ? '&crmRowCount=' . $crmRowCount : '';
280 $urlParams .= $crmPID ? '&crmPID=' . $crmPID : '';
281 }
282
283 $crmSID = CRM_Utils_Request::retrieve('crmSID', 'Integer');
284 if ($crmSID) {
285 $urlParams .= '&crmSID=' . $crmSID;
286 }
287
288 $session = CRM_Core_Session::singleton();
289 $url = CRM_Utils_System::url($urlString, $urlParams);
290 $session->pushUserContext($url);
291
292 // CRM-6862 -run form cotroller after
293 // selector, since it erase $_POST
294 $this->search();
295
296 return parent::run();
297 }
298
299 public function search() {
300 if ($this->_action & (CRM_Core_Action::ADD |
301 CRM_Core_Action::UPDATE
302 )
303 ) {
304 return;
305 }
306
307 $form = new CRM_Core_Controller_Simple('CRM_Mailing_Form_Search',
308 ts('Search Mailings'),
309 CRM_Core_Action::ADD
310 );
311 $form->setEmbedded(TRUE);
312 $form->setParent($this);
313 $form->process();
314 $form->run();
315 }
316
317 /**
318 * @param array $params
319 * @param bool $sortBy
320 *
321 * @return string
322 */
323 public function whereClause(&$params, $sortBy = TRUE) {
324 $values = [];
325
326 $clauses = [];
327 $title = $this->get('mailing_name');
328 // echo " name=$title ";
329 if ($title) {
330 $clauses[] = 'name LIKE %1';
331 if (strpos($title, '%') !== FALSE) {
332 $params[1] = [$title, 'String', FALSE];
333 }
334 else {
335 $params[1] = [$title, 'String', TRUE];
336 }
337 }
338
339 if ($sortBy &&
340 $this->_sortByCharacter !== NULL
341 ) {
342 $clauses[] = "name LIKE '" . strtolower(CRM_Core_DAO::escapeWildCardString($this->_sortByCharacter)) . "%'";
343 }
344
345 $campainIds = $this->get('campaign_id');
346 if (!CRM_Utils_System::isNull($campainIds)) {
347 if (!is_array($campainIds)) {
348 $campaignIds = [$campaignIds];
349 }
350 $clauses[] = '( campaign_id IN ( ' . implode(' , ', array_values($campainIds)) . ' ) )';
351 }
352
353 return implode(' AND ', $clauses);
354 }
355
356 }