From f8a9e5cc18395eb5a798c89a213b045a846433a5 Mon Sep 17 00:00:00 2001 From: eileen Date: Fri, 15 May 2020 12:17:42 +1200 Subject: [PATCH] Make is_archived work as a url-search parameter Eg civicrm/mailing/browse/scheduled?reset=1&is_archived=1&force=1 --- CRM/Mailing/BAO/Query.php | 2 +- CRM/Mailing/Form/Search.php | 38 ++++++++++++++++++++++++++++++++++--- CRM/Mailing/Page/Browse.php | 24 +++++++++++++++++------ 3 files changed, 54 insertions(+), 10 deletions(-) diff --git a/CRM/Mailing/BAO/Query.php b/CRM/Mailing/BAO/Query.php index f734f1cd12..b9d58a99fc 100644 --- a/CRM/Mailing/BAO/Query.php +++ b/CRM/Mailing/BAO/Query.php @@ -122,7 +122,7 @@ class CRM_Mailing_BAO_Query { * rather than a static function. */ public static function getSearchFieldMetadata() { - $fields = ['mailing_job_start_date']; + $fields = ['mailing_job_start_date', 'is_archived']; $metadata = civicrm_api3('Mailing', 'getfields', [])['values']; $metadata = array_merge($metadata, civicrm_api3('MailingJob', 'getfields', [])['values']); return array_intersect_key($metadata, array_flip($fields)); diff --git a/CRM/Mailing/Form/Search.php b/CRM/Mailing/Form/Search.php index f2a9671723..04f321d995 100644 --- a/CRM/Mailing/Form/Search.php +++ b/CRM/Mailing/Form/Search.php @@ -29,6 +29,9 @@ class CRM_Mailing_Form_Search extends CRM_Core_Form_Search { parent::preProcess(); } + /** + * @throws \CiviCRM_API3_Exception + */ public function buildQuickForm() { $parent = $this->controller->getParent(); $nameTextLabel = ($parent->_sms) ? ts('SMS Name') : ts('Mailing Name'); @@ -44,6 +47,8 @@ class CRM_Mailing_Form_Search extends CRM_Core_Form_Search { CRM_Core_DAO::getAttribute('CRM_Contact_DAO_Contact', 'sort_name') ); + CRM_Mailing_BAO_Query::buildSearchForm($this); + CRM_Campaign_BAO_Campaign::addCampaignInComponentSearch($this); // CRM-15434 - Fix mailing search by status in non-English languages @@ -52,7 +57,6 @@ class CRM_Mailing_Form_Search extends CRM_Core_Form_Search { $this->addElement('checkbox', "mailing_status[$statusId]", NULL, $statusName); } $this->addElement('checkbox', 'status_unscheduled', NULL, ts('Draft / Unscheduled')); - $this->addYesNo('is_archived', ts('Mailing is Archived'), TRUE); // Search by language, if multi-lingual $enabledLanguages = CRM_Core_I18n::languages(TRUE); @@ -77,9 +81,11 @@ class CRM_Mailing_Form_Search extends CRM_Core_Form_Search { /** * @return array + * @throws \CRM_Core_Exception */ public function setDefaultValues() { $defaults = $statusVals = []; + $entityDefaults = parent::setDefaultValues(); $parent = $this->controller->getParent(); if ($parent->get('unscheduled')) { @@ -99,11 +105,15 @@ class CRM_Mailing_Form_Search extends CRM_Core_Form_Search { if ($parent->_sms) { $defaults['sms'] = 1; } - return $defaults; + return array_merge($defaults, $entityDefaults); } + /** + * @throws \CRM_Core_Exception + */ public function postProcess() { - $params = $this->controller->exportValues($this->_name); + $this->setFormValues(); + $params = $this->_formValues; if (!empty($params['mailing_relative'])) { list($params['mailing_low'], $params['mailing_high']) = CRM_Utils_Date::getFromTo($params['mailing_relative'], $params['mailing_low'], $params['mailing_high']); @@ -141,4 +151,26 @@ class CRM_Mailing_Form_Search extends CRM_Core_Form_Search { } } + /** + * Handle force=1 in the url. + * + * Search field metadata is normally added in buildForm but we are bypassing that in this flow + * (I've always found the flow kinda confusing & perhaps that is the problem but this mitigates) + * + * @throws \CiviCRM_API3_Exception + */ + protected function handleForcedSearch() { + $this->setSearchMetadata(); + $this->addContactSearchFields(); + } + + /** + * Set the metadata for the form. + * + * @throws \CiviCRM_API3_Exception + */ + protected function setSearchMetadata() { + $this->addSearchFieldMetadata(['Mailing' => CRM_Mailing_BAO_Query::getSearchFieldMetadata()]); + } + } diff --git a/CRM/Mailing/Page/Browse.php b/CRM/Mailing/Page/Browse.php index 769919e7b3..9982bd1a79 100644 --- a/CRM/Mailing/Page/Browse.php +++ b/CRM/Mailing/Page/Browse.php @@ -64,7 +64,7 @@ class CRM_Mailing_Page_Browse extends CRM_Core_Page { public function preProcess() { Civi::resources()->addStyleFile('civicrm', 'css/searchForm.css', 1, 'html-header'); - $this->_unscheduled = $this->_archived = $archiveLinks = FALSE; + $this->_unscheduled = $archiveLinks = FALSE; $this->_mailingId = CRM_Utils_Request::retrieve('mid', 'Positive', $this); $this->_sms = CRM_Utils_Request::retrieve('sms', 'Positive', $this); @@ -119,6 +119,7 @@ class CRM_Mailing_Page_Browse extends CRM_Core_Page { $newArgs = func_get_args(); // since we want only first function argument $newArgs = $newArgs[0]; + $this->_isArchived = $this->isArchived($newArgs); if (isset($_GET['runJobs']) || CRM_Utils_Array::value('2', $newArgs) == 'queue') { $mailerJobSize = Civi::settings()->get('mailerJobSize'); CRM_Mailing_BAO_MailingJob::runJobs_pre($mailerJobSize); @@ -140,10 +141,7 @@ class CRM_Mailing_Page_Browse extends CRM_Core_Page { } $this->set('unscheduled', $this->_unscheduled); - if (CRM_Utils_Array::value(3, $newArgs) == 'archived') { - $this->_archived = TRUE; - } - $this->set('archived', $this->_archived); + $this->set('archived', $this->isArchived($newArgs)); if (CRM_Utils_Array::value(3, $newArgs) == 'scheduled') { $this->_scheduled = TRUE; @@ -260,7 +258,8 @@ class CRM_Mailing_Page_Browse extends CRM_Core_Page { $urlParams .= '&scheduled=false'; $this->assign('unscheduled', TRUE); } - elseif (CRM_Utils_Array::value(3, $newArgs) == 'archived') { + + if ($this->isArchived($newArgs)) { $urlString .= '/archived'; $this->assign('archived', TRUE); } @@ -353,4 +352,17 @@ class CRM_Mailing_Page_Browse extends CRM_Core_Page { return implode(' AND ', $clauses); } + /** + * Is the search limited to archived mailings. + * + * @param array $urlArguments + * + * @return bool + * + * @throws \CRM_Core_Exception + */ + protected function isArchived($urlArguments): bool { + return in_array('archived', $urlArguments, TRUE) || CRM_Utils_Request::retrieveValue('is_archived', 'Boolean'); + } + } -- 2.25.1