Merge pull request #17118 from lcdservices/dev-core-1722
[civicrm-core.git] / CRM / Activity / Form / Search.php
CommitLineData
6a488035
TO
1<?php
2/*
3 +--------------------------------------------------------------------+
bc77d7c0 4 | Copyright CiviCRM LLC. All rights reserved. |
6a488035 5 | |
bc77d7c0
TO
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 |
6a488035 9 +--------------------------------------------------------------------+
d25dd0ee 10 */
6a488035
TO
11
12/**
13 *
14 * @package CRM
ca5cec67 15 * @copyright CiviCRM LLC https://civicrm.org/licensing
6a488035
TO
16 */
17
18/**
b6c94f42 19 * This file is for activity search.
6a488035 20 */
3efb5b86 21class CRM_Activity_Form_Search extends CRM_Core_Form_Search {
6a488035 22
6a488035 23 /**
fe482240 24 * The params that are sent to the query.
6a488035
TO
25 *
26 * @var array
6a488035
TO
27 */
28 protected $_queryParams;
29
6a488035 30 /**
fe482240 31 * Are we restricting ourselves to a single contact.
6a488035 32 *
d51c6add 33 * @var bool
6a488035
TO
34 */
35 protected $_single = FALSE;
36
37 /**
fe482240 38 * Are we restricting ourselves to a single contact.
6a488035 39 *
d51c6add 40 * @var bool
6a488035 41 */
1c1e779e 42 protected $_limit;
6a488035 43
6a488035 44 /**
fe482240 45 * Prefix for the controller.
62d3ee27 46 * @var string
6a488035 47 */
1c1e779e 48 protected $_prefix = 'activity_';
6a488035 49
6a488035 50 /**
fe482240 51 * The saved search ID retrieved from the GET vars.
6a488035
TO
52 *
53 * @var int
6a488035
TO
54 */
55 protected $_ssID;
56
e6dda67a 57 /**
58 * @return string
59 */
60 public function getDefaultEntity() {
61 return 'Activity';
62 }
63
6a488035 64 /**
fe482240 65 * Processing needed for buildForm and later.
1c1e779e 66 *
67 * @throws \CRM_Core_Exception
68 * @throws \CiviCRM_API3_Exception
6a488035 69 */
00be9182 70 public function preProcess() {
6a488035
TO
71 $this->set('searchFormName', 'Search');
72
c490a46a 73 // set the button names
6a488035
TO
74 $this->_actionButtonName = $this->getButtonName('next', 'action');
75
76 $this->_done = FALSE;
c82067be 77 $this->sortNameOnly = TRUE;
6a488035 78
1c1e779e 79 parent::preProcess();
6a488035
TO
80
81 if (empty($this->_formValues)) {
82 if (isset($this->_ssID)) {
83 $this->_formValues = CRM_Contact_BAO_SavedSearch::getFormValues($this->_ssID);
84 }
85 }
86
6a488035
TO
87 $this->_queryParams = CRM_Contact_BAO_Query::convertFormValues($this->_formValues);
88 $selector = new CRM_Activity_Selector_Search($this->_queryParams,
89 $this->_action,
90 NULL,
91 $this->_single,
92 $this->_limit,
93 $this->_context
94 );
95 $prefix = NULL;
96 if ($this->_context == 'user') {
97 $prefix = $this->_prefix;
98 }
99
100 $this->assign("{$prefix}limit", $this->_limit);
101 $this->assign("{$prefix}single", $this->_single);
102
103 $controller = new CRM_Core_Selector_Controller($selector,
104 $this->get(CRM_Utils_Pager::PAGE_ID),
d9669ca6 105 $this->getSortID(),
6a488035
TO
106 CRM_Core_Action::VIEW,
107 $this,
108 CRM_Core_Selector_Controller::TRANSFER,
109 $prefix
110 );
111 $controller->setEmbedded(TRUE);
112 $controller->moveFromSessionToTemplate();
113
114 $this->assign('summary', $this->get('summary'));
115 }
116
117 /**
fe482240 118 * Build the form object.
1c1e779e 119 *
120 * @throws \CRM_Core_Exception
121 * @throws \CiviCRM_API3_Exception
6a488035 122 */
00be9182 123 public function buildQuickForm() {
3efb5b86 124 parent::buildQuickForm();
e597fc33 125 $this->addSortNameField();
6a488035
TO
126
127 CRM_Activity_BAO_Query::buildSearchForm($this);
128
6a488035
TO
129 $rows = $this->get('rows');
130 if (is_array($rows)) {
131 if (!$this->_single) {
8d36b801 132 $this->addRowSelectors($rows);
6a488035
TO
133 }
134
be509c11 135 $this->addTaskMenu(CRM_Activity_Task::permissionedTaskTitles(CRM_Core_Permission::getPermission()));
6a488035
TO
136 }
137
6a488035
TO
138 }
139
140 /**
141 * The post processing of the form gets done here.
142 *
143 * Key things done during post processing are
144 * - check for reset or next request. if present, skip post procesing.
145 * - now check if user requested running a saved search, if so, then
146 * the form values associated with the saved search are used for searching.
147 * - if user has done a submit with new values the regular post submissing is
148 * done.
2e2605fe 149 *
6a488035
TO
150 * The processing consists of using a Selector / Controller framework for getting the
151 * search results.
a13c931b 152 *
153 * @throws \CRM_Core_Exception
6a488035 154 */
00be9182 155 public function postProcess() {
6a488035
TO
156 if ($this->_done) {
157 return;
158 }
159
160 $this->_done = TRUE;
359fdb6f 161 $this->setFormValues();
6a488035 162 if (!empty($_POST)) {
be2fb01f 163 $specialParams = [
0b38e8f1 164 'activity_type_id',
da236f9a 165 'priority_id',
be2fb01f
CW
166 ];
167 $changeNames = [
da236f9a 168 'priority_id' => 'activity_priority_id',
be2fb01f 169 ];
da236f9a 170
0b38e8f1 171 CRM_Contact_BAO_Query::processSpecialFormValue($this->_formValues, $specialParams, $changeNames);
6a488035 172 }
6a488035
TO
173 $this->fixFormValues();
174
175 if (isset($this->_ssID) && empty($_POST)) {
176 // if we are editing / running a saved search and the form has not been posted
177 $this->_formValues = CRM_Contact_BAO_SavedSearch::getFormValues($this->_ssID);
178 }
6a488035 179
d43b88cc
CW
180 // We don't show test records in summaries or dashboards
181 if (empty($this->_formValues['activity_test']) && $this->_force) {
6a488035
TO
182 $this->_formValues["activity_test"] = 0;
183 }
28c666be 184
c94d39fd 185 CRM_Core_BAO_CustomValue::fixCustomFieldValue($this->_formValues);
6a488035
TO
186
187 $this->_queryParams = CRM_Contact_BAO_Query::convertFormValues($this->_formValues);
188
6a488035
TO
189 $this->set('queryParams', $this->_queryParams);
190
191 $buttonName = $this->controller->getButtonName();
e341bbee 192 if ($buttonName == $this->_actionButtonName) {
6a488035
TO
193 // check actionName and if next, then do not repeat a search, since we are going to the next page
194 // hack, make sure we reset the task values
95ea77ec 195 $stateMachine = $this->controller->getStateMachine();
6a488035
TO
196 $formName = $stateMachine->getTaskFormName();
197 $this->controller->resetPage($formName);
198 return;
199 }
200
6a488035
TO
201 $this->_queryParams = CRM_Contact_BAO_Query::convertFormValues($this->_formValues);
202
203 $selector = new CRM_Activity_Selector_Search($this->_queryParams,
204 $this->_action,
205 NULL,
206 $this->_single,
207 $this->_limit,
208 $this->_context
209 );
210 $selector->setKey($this->controller->_key);
211
212 $prefix = NULL;
1c1e779e 213 if ($this->_context === 'basic' || $this->_context === 'user') {
6a488035
TO
214 $prefix = $this->_prefix;
215 }
216
217 $controller = new CRM_Core_Selector_Controller($selector,
218 $this->get(CRM_Utils_Pager::PAGE_ID),
d9669ca6 219 $this->getSortID(),
6a488035
TO
220 CRM_Core_Action::VIEW,
221 $this,
222 CRM_Core_Selector_Controller::SESSION,
223 $prefix
224 );
225 $controller->setEmbedded(TRUE);
226 $query = &$selector->getQuery();
227
1c1e779e 228 if ($this->_context === 'user') {
6a488035
TO
229 $query->setSkipPermission(TRUE);
230 }
231 $controller->run();
232 }
233
1c1e779e 234 /**
235 * Probably more hackery than anything else.
236 *
237 * @throws \CRM_Core_Exception
238 */
00be9182 239 public function fixFormValues() {
6a488035
TO
240 if (!$this->_force) {
241 return;
242 }
0370ad20 243
6a488035
TO
244 $status = CRM_Utils_Request::retrieve('status', 'String', $this);
245 if ($status) {
97b002d7
CW
246 $this->_formValues['activity_status_id'] = $status;
247 $this->_defaults['activity_status_id'] = $status;
6a488035
TO
248 }
249
a3d827a7 250 $survey = CRM_Utils_Request::retrieve('survey', 'Positive');
300c3253 251
6a488035 252 if ($survey) {
9231464f 253 $this->_formValues['activity_survey_id'] = $this->_defaults['activity_survey_id'] = $survey;
9c1bc317 254 $sid = $this->_formValues['activity_survey_id'] ?? NULL;
9231464f
KJ
255 $activity_type_id = CRM_Core_DAO::getFieldValue('CRM_Campaign_DAO_Survey', $sid, 'activity_type_id');
256
c56c5190 257 // since checkbox are replaced by multiple select option
258 $this->_formValues['activity_type_id'] = $activity_type_id;
259 $this->_defaults['activity_type_id'] = $activity_type_id;
6a488035
TO
260 }
261 $cid = CRM_Utils_Request::retrieve('cid', 'Positive', $this);
262
263 if ($cid) {
264 $cid = CRM_Utils_Type::escape($cid, 'Integer');
265 if ($cid > 0) {
266 $this->_formValues['contact_id'] = $cid;
267
268 $activity_role = CRM_Utils_Request::retrieve('activity_role', 'Positive', $this);
269
270 if ($activity_role) {
271 $this->_formValues['activity_role'] = $activity_role;
272 }
273 else {
6a488035
TO
274 $this->_defaults['sort_name'] = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $cid, 'sort_name');
275 }
276 // also assign individual mode to the template
277 $this->_single = TRUE;
278 }
279 }
8ef12e64 280
2c8d0277 281 // Enable search activity by custom value
e6dda67a 282 // @todo this is not good security practice. Instead define entity fields in metadata &
283 // use getEntity Defaults
2c8d0277
DG
284 $requestParams = CRM_Utils_Request::exportValues();
285 foreach (array_keys($requestParams) as $key) {
286 if (substr($key, 0, 7) != 'custom_') {
287 continue;
288 }
289 elseif (empty($requestParams[$key])) {
290 continue;
291 }
292 $customValue = CRM_Utils_Request::retrieve($key, 'String', $this);
293 if ($customValue) {
294 $this->_formValues[$key] = $customValue;
295 $this->_defaults[$key] = $customValue;
296 }
297 }
9231464f
KJ
298
299 if (!empty($this->_defaults)) {
300 $this->setDefaults($this->_defaults);
301 }
6a488035
TO
302 }
303
6a488035
TO
304 /**
305 * Return a descriptive name for the page, used in wizard header
306 *
307 * @return string
6a488035
TO
308 */
309 public function getTitle() {
310 return ts('Find Activities');
311 }
96025800 312
1c1e779e 313 /**
314 * Get metadata for the entity fields.
315 *
316 * @return array
317 *
318 * @throws \CiviCRM_API3_Exception
319 */
e6dda67a 320 protected function getEntityMetadata() {
321 return CRM_Activity_BAO_Query::getSearchFieldMetadata();
322 }
323
18db97df 324 /**
325 * Set the metadata for the form.
326 */
327 protected function setSearchMetadata() {
328 $this->addSearchFieldMetadata(['Activity' => $this->getEntityMetadata()]);
329 }
330
6a488035 331}