Commit | Line | Data |
---|---|---|
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 | 11 | |
9b9335ed | 12 | use Civi\Api4\Event; |
aa06ad4a | 13 | use Civi\Api4\LocBlock; |
14 | use Civi\Api4\Email; | |
15 | use Civi\Api4\Phone; | |
16 | use Civi\Api4\Address; | |
9b9335ed | 17 | |
6a488035 TO |
18 | /** |
19 | * | |
20 | * | |
21 | * @package CRM | |
ca5cec67 | 22 | * @copyright CiviCRM LLC https://civicrm.org/licensing |
6a488035 TO |
23 | */ |
24 | ||
25 | /** | |
26 | * This class generates form components for processing Event Location | |
27 | * civicrm_event_page. | |
28 | */ | |
29 | class CRM_Event_Form_ManageEvent_Location extends CRM_Event_Form_ManageEvent { | |
30 | ||
9b9335ed | 31 | /** |
32 | * @var \Civi\Api4\Generic\Result | |
33 | */ | |
34 | protected $locationBlock; | |
35 | ||
6a488035 | 36 | /** |
100fef9d | 37 | * How many locationBlocks should we display? |
6a488035 TO |
38 | * |
39 | * @var int | |
40 | * @const | |
41 | */ | |
7da04cde | 42 | const LOCATION_BLOCKS = 1; |
6a488035 TO |
43 | |
44 | /** | |
100fef9d | 45 | * The variable, for storing the location array |
6a488035 TO |
46 | * |
47 | * @var array | |
48 | */ | |
be2fb01f | 49 | protected $_locationIds = []; |
6a488035 TO |
50 | |
51 | /** | |
100fef9d | 52 | * The variable, for storing location block id with event |
6a488035 TO |
53 | * |
54 | * @var int | |
55 | */ | |
56 | protected $_oldLocBlockId = 0; | |
57 | ||
58 | /** | |
66f9e52b | 59 | * Get the db values for this form. |
90b461f1 | 60 | * @var array |
6a488035 | 61 | */ |
be2fb01f | 62 | public $_values = []; |
6a488035 TO |
63 | |
64 | /** | |
66f9e52b | 65 | * Set variables up before form is built. |
6a488035 | 66 | */ |
00be9182 | 67 | public function preProcess() { |
6a488035 | 68 | parent::preProcess(); |
e4b857f8 | 69 | $this->setSelectedChild('location'); |
6a488035 TO |
70 | |
71 | $this->_values = $this->get('values'); | |
72 | if ($this->_id && empty($this->_values)) { | |
6a488035 | 73 | //get location values. |
be2fb01f | 74 | $params = [ |
6a488035 TO |
75 | 'entity_id' => $this->_id, |
76 | 'entity_table' => 'civicrm_event', | |
be2fb01f | 77 | ]; |
6a488035 TO |
78 | $this->_values = CRM_Core_BAO_Location::getValues($params); |
79 | ||
80 | //get event values. | |
be2fb01f | 81 | $params = ['id' => $this->_id]; |
6a488035 TO |
82 | CRM_Event_BAO_Event::retrieve($params, $this->_values); |
83 | $this->set('values', $this->_values); | |
84 | } | |
be84b210 | 85 | |
86 | //location blocks. | |
87 | CRM_Contact_Form_Location::preProcess($this); | |
6a488035 TO |
88 | } |
89 | ||
90 | /** | |
3bdf1f3a | 91 | * Set default values for the form. |
6a488035 | 92 | * |
3bdf1f3a | 93 | * Note that in edit/view mode the default values are retrieved from the database. |
6a488035 | 94 | */ |
00be9182 | 95 | public function setDefaultValues() { |
6a488035 TO |
96 | $defaults = $this->_values; |
97 | ||
5d92a7e7 | 98 | if (!empty($defaults['loc_block_id'])) { |
6a488035 TO |
99 | $defaults['loc_event_id'] = $defaults['loc_block_id']; |
100 | $countLocUsed = CRM_Event_BAO_Event::countEventsUsingLocBlockId($defaults['loc_block_id']); | |
62a0f5a1 | 101 | $this->assign('locUsed', $countLocUsed); |
6a488035 TO |
102 | } |
103 | ||
104 | $config = CRM_Core_Config::singleton(); | |
105 | if (!isset($defaults['address'][1]['country_id'])) { | |
106 | $defaults['address'][1]['country_id'] = $config->defaultContactCountry; | |
107 | } | |
03e04002 | 108 | |
6a488035 TO |
109 | if (!isset($defaults['address'][1]['state_province_id'])) { |
110 | $defaults['address'][1]['state_province_id'] = $config->defaultContactStateProvince; | |
111 | } | |
112 | ||
6a488035 TO |
113 | $defaults['location_option'] = $this->_oldLocBlockId ? 2 : 1; |
114 | ||
115 | return $defaults; | |
116 | } | |
117 | ||
118 | /** | |
66f9e52b | 119 | * Add local and global form rules. |
6a488035 | 120 | */ |
00be9182 | 121 | public function addRules() { |
be2fb01f | 122 | $this->addFormRule(['CRM_Event_Form_ManageEvent_Location', 'formRule']); |
6a488035 TO |
123 | } |
124 | ||
125 | /** | |
66f9e52b | 126 | * Global validation rules for the form. |
6a488035 | 127 | * |
d4dd1e85 TO |
128 | * @param array $fields |
129 | * Posted values of the form. | |
6a488035 | 130 | * |
a6c01b45 CW |
131 | * @return array |
132 | * list of errors to be posted back to the form | |
6a488035 | 133 | */ |
00be9182 | 134 | public static function formRule($fields) { |
6a488035 | 135 | // check for state/country mapping |
1273d77c | 136 | $errors = CRM_Contact_Form_Edit_Address::formRule($fields); |
6a488035 TO |
137 | |
138 | return empty($errors) ? TRUE : $errors; | |
139 | } | |
140 | ||
141 | /** | |
3bdf1f3a | 142 | * Function to build location block. |
6a488035 TO |
143 | */ |
144 | public function buildQuickForm() { | |
59f8bad6 CW |
145 | CRM_Contact_Form_Edit_Address::buildQuickForm($this, 1); |
146 | CRM_Contact_Form_Edit_Email::buildQuickForm($this, 1); | |
147 | CRM_Contact_Form_Edit_Email::buildQuickForm($this, 2); | |
148 | CRM_Contact_Form_Edit_Phone::buildQuickForm($this, 1); | |
149 | CRM_Contact_Form_Edit_Phone::buildQuickForm($this, 2); | |
6a488035 TO |
150 | |
151 | $this->applyFilter('__ALL__', 'trim'); | |
152 | ||
6a488035 TO |
153 | //fix for CRM-1971 |
154 | $this->assign('action', $this->_action); | |
155 | ||
156 | if ($this->_id) { | |
9b9335ed | 157 | $this->locationBlock = Event::get() |
158 | ->addWhere('id', '=', $this->_id) | |
84ad7693 | 159 | ->setSelect(['loc_block_id.*', 'loc_block_id']) |
9b9335ed | 160 | ->execute()->first(); |
161 | $this->_oldLocBlockId = $this->locationBlock['loc_block_id']; | |
6a488035 TO |
162 | } |
163 | ||
164 | // get the list of location blocks being used by other events | |
03e04002 | 165 | |
6a488035 TO |
166 | $locationEvents = CRM_Event_BAO_Event::getLocationEvents(); |
167 | // remove duplicates and make sure that the duplicate entry with key as | |
168 | // loc_block_id of this event (this->_id) is preserved | |
a7488080 | 169 | if (!empty($locationEvents[$this->_oldLocBlockId])) { |
6a488035 TO |
170 | $possibleDuplicate = $locationEvents[$this->_oldLocBlockId]; |
171 | $locationEvents = array_flip(array_unique($locationEvents)); | |
a7488080 | 172 | if (!empty($locationEvents[$possibleDuplicate])) { |
6a488035 TO |
173 | $locationEvents[$possibleDuplicate] = $this->_oldLocBlockId; |
174 | } | |
175 | $locationEvents = array_flip($locationEvents); | |
176 | } | |
177 | else { | |
178 | $locationEvents = array_unique($locationEvents); | |
179 | } | |
180 | ||
6a488035 TO |
181 | if (!empty($locationEvents)) { |
182 | $this->assign('locEvents', TRUE); | |
be2fb01f | 183 | $optionTypes = [ |
353ffa53 | 184 | '1' => ts('Create new location'), |
6a488035 | 185 | '2' => ts('Use existing location'), |
be2fb01f | 186 | ]; |
6a488035 | 187 | |
62a0f5a1 | 188 | $this->addRadio('location_option', ts("Choose Location"), $optionTypes); |
6a488035 TO |
189 | |
190 | if (!isset($locationEvents[$this->_oldLocBlockId]) || (!$this->_oldLocBlockId)) { | |
be2fb01f | 191 | $locationEvents = ['' => ts('- select -')] + $locationEvents; |
6a488035 | 192 | } |
be2fb01f | 193 | $this->add('select', 'loc_event_id', ts('Use Location'), $locationEvents, FALSE, ['class' => 'crm-select2']); |
6a488035 TO |
194 | } |
195 | $this->addElement('advcheckbox', 'is_show_location', ts('Show Location?')); | |
196 | parent::buildQuickForm(); | |
197 | } | |
198 | ||
199 | /** | |
66f9e52b | 200 | * Process the form submission. |
6a488035 TO |
201 | */ |
202 | public function postProcess() { | |
203 | $params = $this->exportValues(); | |
204 | $deleteOldBlock = FALSE; | |
205 | ||
206 | // if 'use existing location' option is selected - | |
8cc574cf | 207 | if (CRM_Utils_Array::value('location_option', $params) == 2 && !empty($params['loc_event_id']) && |
6a488035 TO |
208 | ($params['loc_event_id'] != $this->_oldLocBlockId) |
209 | ) { | |
210 | // if new selected loc is different from old loc, update the loc_block_id | |
211 | // so that loc update would affect the selected loc and not the old one. | |
212 | $deleteOldBlock = TRUE; | |
213 | CRM_Core_DAO::setFieldValue('CRM_Event_DAO_Event', $this->_id, | |
214 | 'loc_block_id', $params['loc_event_id'] | |
215 | ); | |
216 | } | |
217 | ||
218 | // if 'create new loc' option is selected, set the loc_block_id for this event to null | |
219 | // so that an update would result in creating a new loc. | |
220 | if ($this->_oldLocBlockId && (CRM_Utils_Array::value('location_option', $params) == 1)) { | |
221 | $deleteOldBlock = TRUE; | |
222 | CRM_Core_DAO::setFieldValue('CRM_Event_DAO_Event', $this->_id, | |
223 | 'loc_block_id', 'null' | |
224 | ); | |
225 | } | |
226 | ||
077f88fe | 227 | // if 'create new loc' option is selected OR selected new loc is different |
6a488035 TO |
228 | // from old one, go ahead and delete the old loc provided thats not being |
229 | // used by any other event | |
230 | if ($this->_oldLocBlockId && $deleteOldBlock) { | |
231 | CRM_Event_BAO_Event::deleteEventLocBlock($this->_oldLocBlockId, $this->_id); | |
232 | } | |
233 | ||
607b8f4a | 234 | $isUpdateToExistingLocationBlock = !$deleteOldBlock && !empty($params['loc_event_id']) && (int) $params['loc_event_id'] === $this->locationBlock['loc_block_id']; |
9b9335ed | 235 | // It should be impossible for there to be no default location type. Consider removing this handling |
236 | $defaultLocationTypeID = CRM_Core_BAO_LocationType::getDefault()->id ?? 1; | |
aa06ad4a | 237 | |
be2fb01f | 238 | foreach ([ |
9b9335ed | 239 | 'address' => $params['address'], |
240 | 'phone' => $params['phone'], | |
241 | 'email' => $params['email'], | |
242 | ] as $block => $locationEntities) { | |
531b6c9e | 243 | |
9b9335ed | 244 | $params[$block][1]['is_primary'] = 1; |
245 | foreach ($locationEntities as $index => $locationEntity) { | |
7af49a64 | 246 | if (!$this->isLocationHasData($block, $locationEntity)) { |
247 | unset($params[$block][$index]); | |
248 | continue; | |
249 | } | |
9b9335ed | 250 | $params[$block][$index]['location_type_id'] = $defaultLocationTypeID; |
251 | $fieldKey = (int) $index === 1 ? '_id' : '_2_id'; | |
84ad7693 CW |
252 | if ($isUpdateToExistingLocationBlock && !empty($this->locationBlock['loc_block_id.' . $block . $fieldKey])) { |
253 | $params[$block][$index]['id'] = $this->locationBlock['loc_block_id.' . $block . $fieldKey]; | |
045bc380 | 254 | } |
6a488035 TO |
255 | } |
256 | } | |
7af49a64 | 257 | $addresses = empty($params['address']) ? [] : Address::save(FALSE)->setRecords($params['address'])->execute(); |
258 | $emails = empty($params['email']) ? [] : Email::save(FALSE)->setRecords($params['email'])->execute(); | |
259 | $phones = empty($params['phone']) ? [] : Phone::save(FALSE)->setRecords($params['phone'])->execute(); | |
aa06ad4a | 260 | |
261 | $params['loc_block_id'] = LocBlock::save(FALSE)->setRecords([ | |
262 | [ | |
263 | 'email_id' => $emails[0]['id'] ?? NULL, | |
264 | 'address_id' => $addresses[0]['id'] ?? NULL, | |
265 | 'phone_id' => $phones[0]['id'] ?? NULL, | |
266 | 'email_2_id' => $emails[1]['id'] ?? NULL, | |
267 | 'address_2_id' => $addresses[1]['id'] ?? NULL, | |
268 | 'phone_2_id' => $phones[1]['id'] ?? NULL, | |
269 | ], | |
270 | ])->execute()->first()['id']; | |
6a488035 TO |
271 | |
272 | // finally update event params | |
273 | $params['id'] = $this->_id; | |
274 | CRM_Event_BAO_Event::add($params); | |
275 | ||
5d92a7e7 CW |
276 | // Update tab "disabled" css class |
277 | $this->ajaxResponse['tabValid'] = TRUE; | |
6a488035 TO |
278 | parent::endPostProcess(); |
279 | } | |
6a488035 TO |
280 | |
281 | /** | |
282 | * Return a descriptive name for the page, used in wizard header | |
283 | * | |
284 | * @return string | |
6a488035 TO |
285 | */ |
286 | public function getTitle() { | |
287 | return ts('Event Location'); | |
288 | } | |
96025800 | 289 | |
7af49a64 | 290 | /** |
291 | * Is there some data to save for the given entity | |
292 | * | |
293 | * @param string $block | |
294 | * @param array $locationEntity | |
295 | * | |
296 | * @return bool | |
297 | */ | |
298 | protected function isLocationHasData(string $block, array $locationEntity): bool { | |
299 | if ($block === 'email') { | |
300 | return !empty($locationEntity['email']); | |
301 | } | |
302 | if ($block === 'phone') { | |
303 | return !empty($locationEntity['phone']); | |
304 | } | |
305 | foreach ($locationEntity as $value) { | |
306 | if (!empty($value)) { | |
307 | return TRUE; | |
308 | } | |
309 | } | |
310 | return FALSE; | |
311 | } | |
312 | ||
6a488035 | 313 | } |