Merge pull request #22808 from colemanw/searchKitMailingTask
[civicrm-core.git] / CRM / Event / Page / EventInfo.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 * Event Info Page - Summary about the event
20 */
21 class CRM_Event_Page_EventInfo extends CRM_Core_Page {
22
23 /**
24 * Run the page.
25 *
26 * This method is called after the page is created. It checks for the
27 * type of action and executes that action.
28 * Finally it calls the parent's run method.
29 *
30 * @return void
31 */
32 public function run() {
33 //get the event id.
34 $this->_id = CRM_Utils_Request::retrieve('id', 'Positive', $this, TRUE);
35 $config = CRM_Core_Config::singleton();
36 // ensure that the user has permission to see this page
37 if (!CRM_Core_Permission::event(CRM_Core_Permission::VIEW,
38 $this->_id, 'view event info'
39 )
40 ) {
41 CRM_Utils_System::setUFMessage(ts('You do not have permission to view this event'));
42 return CRM_Utils_System::permissionDenied();
43 }
44
45 $action = CRM_Utils_Request::retrieve('action', 'String', $this, FALSE);
46 $context = CRM_Utils_Request::retrieve('context', 'Alphanumeric', $this, FALSE, 'register');
47 $this->assign('context', $context);
48
49 $this->assign('iCal', CRM_Event_BAO_Event::getICalLinks($this->_id));
50
51 // Sometimes we want to suppress the Event Full msg
52 $noFullMsg = CRM_Utils_Request::retrieve('noFullMsg', 'String', $this, FALSE, 'false');
53
54 // set breadcrumb to append to 2nd layer pages
55 $breadCrumbPath = CRM_Utils_System::url('civicrm/event/info',
56 "id={$this->_id}&reset=1"
57 );
58
59 //retrieve event information
60 $params = ['id' => $this->_id];
61 $values = ['event' => NULL];
62 CRM_Event_BAO_Event::retrieve($params, $values['event']);
63
64 if (!$values['event']['is_active']) {
65 CRM_Utils_System::setUFMessage(ts('The event you requested is currently unavailable (contact the site administrator for assistance).'));
66 return CRM_Utils_System::permissionDenied();
67 }
68
69 if (!$values['event']['is_public']) {
70 CRM_Utils_System::addHTMLHead('<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">');
71 }
72
73 if (!empty($values['event']['is_template'])) {
74 // form is an Event Template
75 CRM_Core_Error::statusBounce(ts('The page you requested is currently unavailable.'));
76 }
77
78 // Add Event Type to $values in case folks want to display it
79 $values['event']['event_type'] = CRM_Utils_Array::value($values['event']['event_type_id'], CRM_Event_PseudoConstant::eventType());
80
81 $this->assign('isShowLocation', CRM_Utils_Array::value('is_show_location', $values['event']));
82
83 // Reset event time zone info
84 CRM_Event_BAO_Event::setOutputTimeZone($values['event'], $values['event']['event_tz']);
85
86 $values['event']['event_tz'] = CRM_Core_SelectValues::timezone()[$values['event']['event_tz']];
87
88 $eventCurrency = CRM_Utils_Array::value('currency', $values['event'], $config->defaultCurrency);
89 $this->assign('eventCurrency', $eventCurrency);
90
91 // show event fees.
92 if ($this->_id && !empty($values['event']['is_monetary'])) {
93
94 //CRM-10434
95 $discountId = CRM_Core_BAO_Discount::findSet($this->_id, 'civicrm_event');
96 if ($discountId) {
97 $priceSetId = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_Discount', $discountId, 'price_set_id');
98 }
99 else {
100 $priceSetId = CRM_Price_BAO_PriceSet::getFor('civicrm_event', $this->_id);
101 }
102
103 // get price set options, - CRM-5209
104 if ($priceSetId) {
105 $setDetails = CRM_Price_BAO_PriceSet::getSetDetail($priceSetId, TRUE, TRUE);
106
107 $priceSetFields = $setDetails[$priceSetId]['fields'];
108 if (is_array($priceSetFields)) {
109 $fieldCnt = 1;
110 $visibility = CRM_Core_PseudoConstant::visibility('name');
111
112 // CRM-14492 Admin price fields should show up on event registration if user has 'administer CiviCRM' permissions
113 $adminFieldVisible = FALSE;
114 if (CRM_Core_Permission::check('administer CiviCRM')) {
115 $adminFieldVisible = TRUE;
116 }
117
118 foreach ($priceSetFields as $fid => $fieldValues) {
119 if (!is_array($fieldValues['options']) ||
120 empty($fieldValues['options']) ||
121 (CRM_Utils_Array::value('visibility_id', $fieldValues) != array_search('public', $visibility) && $adminFieldVisible == FALSE)
122 ) {
123 continue;
124 }
125
126 if (count($fieldValues['options']) > 1) {
127 $values['feeBlock']['value'][$fieldCnt] = '';
128 $values['feeBlock']['label'][$fieldCnt] = $fieldValues['label'];
129 $values['feeBlock']['lClass'][$fieldCnt] = 'price_set_option_group-label';
130 $values['feeBlock']['isDisplayAmount'][$fieldCnt] = $fieldValues['is_display_amounts'] ?? NULL;
131 $fieldCnt++;
132 $labelClass = 'price_set_option-label';
133 }
134 else {
135 $labelClass = 'price_set_field-label';
136 }
137 // show tax rate with amount
138 $invoiceSettings = Civi::settings()->get('contribution_invoice_settings');
139 $taxTerm = Civi::settings()->get('tax_term');
140 $displayOpt = $invoiceSettings['tax_display_settings'] ?? NULL;
141
142 foreach ($fieldValues['options'] as $optionId => $optionVal) {
143 if (CRM_Utils_Array::value('visibility_id', $optionVal) != array_search('public', $visibility) &&
144 $adminFieldVisible == FALSE
145 ) {
146 continue;
147 }
148
149 $values['feeBlock']['isDisplayAmount'][$fieldCnt] = $fieldValues['is_display_amounts'] ?? NULL;
150 if (Civi::settings()->get('invoicing') && isset($optionVal['tax_amount'])) {
151 $values['feeBlock']['value'][$fieldCnt] = CRM_Price_BAO_PriceField::getTaxLabel($optionVal, 'amount', $displayOpt, $taxTerm, $eventCurrency);
152 $values['feeBlock']['tax_amount'][$fieldCnt] = $optionVal['tax_amount'];
153 }
154 else {
155 $values['feeBlock']['value'][$fieldCnt] = $optionVal['amount'];
156 $values['feeBlock']['tax_amount'][$fieldCnt] = 0;
157 }
158 $values['feeBlock']['label'][$fieldCnt] = $optionVal['label'];
159 $values['feeBlock']['lClass'][$fieldCnt] = $labelClass;
160 $fieldCnt++;
161 }
162 }
163 }
164 // Tell tpl we have price set fee data and whether it's a quick_config price set
165 $this->assign('isPriceSet', 1);
166 $this->assign('isQuickConfig', $setDetails[$priceSetId]['is_quick_config']);
167 }
168 }
169
170 $params = ['entity_id' => $this->_id, 'entity_table' => 'civicrm_event'];
171 $values['location'] = CRM_Core_BAO_Location::getValues($params, TRUE);
172
173 // fix phone type labels
174 if (!empty($values['location']['phone'])) {
175 $phoneTypes = CRM_Core_PseudoConstant::get('CRM_Core_DAO_Phone', 'phone_type_id');
176 foreach ($values['location']['phone'] as &$val) {
177 if (!empty($val['phone_type_id'])) {
178 $val['phone_type_display'] = $phoneTypes[$val['phone_type_id']];
179 }
180 }
181 }
182
183 //retrieve custom field information
184 $groupTree = CRM_Core_BAO_CustomGroup::getTree('Event', NULL, $this->_id, 0, $values['event']['event_type_id'], NULL,
185 TRUE, NULL, FALSE, CRM_Core_Permission::VIEW, NULL, TRUE);
186 CRM_Core_BAO_CustomGroup::buildCustomDataView($this, $groupTree, FALSE, NULL, NULL, NULL, $this->_id);
187 $this->assign('action', CRM_Core_Action::VIEW);
188 //To show the event location on maps directly on event info page
189 $locations = CRM_Event_BAO_Event::getMapInfo($this->_id);
190 if (!empty($locations) && !empty($values['event']['is_map'])) {
191 $this->assign('locations', $locations);
192 $this->assign('mapProvider', $config->mapProvider);
193 $this->assign('mapKey', $config->mapAPIKey);
194 $sumLat = $sumLng = 0;
195 $maxLat = $maxLng = -400;
196 $minLat = $minLng = 400;
197 foreach ($locations as $location) {
198 $sumLat += $location['lat'];
199 $sumLng += $location['lng'];
200
201 if ($location['lat'] > $maxLat) {
202 $maxLat = $location['lat'];
203 }
204 if ($location['lat'] < $minLat) {
205 $minLat = $location['lat'];
206 }
207
208 if ($location['lng'] > $maxLng) {
209 $maxLng = $location['lng'];
210 }
211 if ($location['lng'] < $minLng) {
212 $minLng = $location['lng'];
213 }
214 }
215
216 $center = [
217 'lat' => (float ) $sumLat / count($locations),
218 'lng' => (float ) $sumLng / count($locations),
219 ];
220 $span = [
221 'lat' => (float ) ($maxLat - $minLat),
222 'lng' => (float ) ($maxLng - $minLng),
223 ];
224 $this->assign_by_ref('center', $center);
225 $this->assign_by_ref('span', $span);
226 if ($action == CRM_Core_Action::PREVIEW) {
227 $mapURL = CRM_Utils_System::url('civicrm/contact/map/event',
228 "eid={$this->_id}&reset=1&action=preview",
229 FALSE, NULL, TRUE,
230 TRUE
231 );
232 }
233 else {
234 $mapURL = CRM_Utils_System::url('civicrm/contact/map/event',
235 "eid={$this->_id}&reset=1",
236 FALSE, NULL, TRUE,
237 TRUE
238 );
239 }
240
241 $this->assign('skipLocationType', TRUE);
242 $this->assign('mapURL', $mapURL);
243 }
244
245 if (CRM_Core_Permission::check('view event participants')) {
246 $statusTypes = CRM_Event_PseudoConstant::participantStatus(NULL, 'is_counted = 1', 'label');
247 $statusTypesPending = CRM_Event_PseudoConstant::participantStatus(NULL, 'is_counted = 0', 'label');
248 $findParticipants['statusCounted'] = implode(', ', array_values($statusTypes));
249 $findParticipants['statusNotCounted'] = implode(', ', array_values($statusTypesPending));
250 $this->assign('findParticipants', $findParticipants);
251 }
252
253 $participantListingID = $values['event']['participant_listing_id'] ?? NULL;
254 if ($participantListingID) {
255 $participantListingURL = CRM_Utils_System::url('civicrm/event/participant',
256 "reset=1&id={$this->_id}",
257 FALSE, NULL, TRUE, TRUE
258 );
259 $this->assign('participantListingURL', $participantListingURL);
260 }
261
262 $hasWaitingList = $values['event']['has_waitlist'] ?? NULL;
263 $eventFullMessage = CRM_Event_BAO_Participant::eventFull($this->_id,
264 FALSE,
265 $hasWaitingList
266 );
267
268 $allowRegistration = FALSE;
269 $isEventOpenForRegistration = CRM_Event_BAO_Event::validRegistrationRequest($values['event'], $this->_id);
270 if (!empty($values['event']['is_online_registration'])) {
271 if ($isEventOpenForRegistration == 1) {
272 // we always generate urls for the front end in joomla
273 $action_query = $action === CRM_Core_Action::PREVIEW ? "&action=$action" : '';
274 $url = CRM_Utils_System::url('civicrm/event/register',
275 "id={$this->_id}&reset=1{$action_query}",
276 FALSE, NULL, TRUE,
277 TRUE
278 );
279 if (!$eventFullMessage || $hasWaitingList) {
280 $registerText = ts('Register Now');
281 if (!empty($values['event']['registration_link_text'])) {
282 $registerText = $values['event']['registration_link_text'];
283 }
284
285 //Fixed for CRM-4855
286 $allowRegistration = CRM_Event_BAO_Event::showHideRegistrationLink($values);
287
288 $this->assign('registerText', $registerText);
289 $this->assign('registerURL', $url);
290 }
291 }
292 elseif (CRM_Core_Permission::check('register for events')) {
293 $this->assign('registerClosed', TRUE);
294 }
295 }
296
297 $this->assign('allowRegistration', $allowRegistration);
298
299 $session = CRM_Core_Session::singleton();
300 $params = [
301 'contact_id' => $session->get('userID'),
302 'event_id' => $values['event']['id'] ?? NULL,
303 'role_id' => $values['event']['default_role_id'] ?? NULL,
304 ];
305
306 if ($eventFullMessage && ($noFullMsg == 'false') || CRM_Event_BAO_Event::checkRegistration($params)) {
307 $statusMessage = $eventFullMessage;
308 if (CRM_Event_BAO_Event::checkRegistration($params)) {
309 if ($noFullMsg == 'false') {
310 if ($values['event']['allow_same_participant_emails']) {
311 $statusMessage = ts('It looks like you are already registered for this event. You may proceed if you want to create an additional registration.');
312 }
313 else {
314 $registerUrl = CRM_Utils_System::url('civicrm/event/register',
315 "reset=1&id={$values['event']['id']}&cid=0"
316 );
317 $statusMessage = ts("It looks like you are already registered for this event. If you want to change your registration, or you feel that you've gotten this message in error, please contact the site administrator.") . ' ' . ts('You can also <a href="%1">register another participant</a>.', [1 => $registerUrl]);
318 }
319 }
320 }
321 elseif ($hasWaitingList) {
322 $statusMessage = $values['event']['waitlist_text'] ?? NULL;
323 if (!$statusMessage) {
324 $statusMessage = ts('Event is currently full, but you can register and be a part of waiting list.');
325 }
326 }
327 if ($isEventOpenForRegistration == 1) {
328 CRM_Core_Session::setStatus($statusMessage);
329 }
330 }
331 // we do not want to display recently viewed items, so turn off
332 $this->assign('displayRecent', FALSE);
333
334 // set page title = event title
335 CRM_Utils_System::setTitle($values['event']['title']);
336
337 $this->assign('event', $values['event']);
338 if (isset($values['feeBlock'])) {
339 $this->assign('feeBlock', $values['feeBlock']);
340 }
341 $this->assign('location', $values['location']);
342
343 if (CRM_Core_Permission::check(['access CiviEvent', 'edit all events'])) {
344 $this->assign('manageEventLinks', CRM_Event_Page_ManageEvent::tabs());
345 }
346
347 return parent::run();
348 }
349
350 /**
351 * @return string
352 */
353 public function getTemplateFileName() {
354 if ($this->_id) {
355 $templateFile = "CRM/Event/Page/{$this->_id}/EventInfo.tpl";
356 $template = CRM_Core_Page::getTemplate();
357
358 if ($template->template_exists($templateFile)) {
359 return $templateFile;
360 }
361 }
362 return parent::getTemplateFileName();
363 }
364
365 }