Merge pull request #13145 from civicrm/5.8
[civicrm-core.git] / CRM / Event / Page / EventInfo.php
CommitLineData
6a488035
TO
1<?php
2/*
3 +--------------------------------------------------------------------+
fee14197 4 | CiviCRM version 5 |
6a488035 5 +--------------------------------------------------------------------+
8c9251b3 6 | Copyright CiviCRM LLC (c) 2004-2018 |
6a488035
TO
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
9 | |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
13 | |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
18 | |
19 | You should have received a copy of the GNU Affero General Public |
20 | License and the CiviCRM Licensing Exception along |
21 | with this program; if not, contact CiviCRM LLC |
22 | at info[AT]civicrm[DOT]org. If you have questions about the |
23 | GNU Affero General Public License or the licensing of CiviCRM, |
24 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
25 +--------------------------------------------------------------------+
d25dd0ee 26 */
6a488035
TO
27
28/**
29 *
30 * @package CRM
8c9251b3 31 * @copyright CiviCRM LLC (c) 2004-2018
6a488035
TO
32 */
33
34/**
35 * Event Info Page - Summmary about the event
36 */
37class CRM_Event_Page_EventInfo extends CRM_Core_Page {
38
39 /**
40 * Run the page.
41 *
42 * This method is called after the page is created. It checks for the
43 * type of action and executes that action.
44 * Finally it calls the parent's run method.
45 *
46 * @return void
6a488035 47 */
00be9182 48 public function run() {
6a488035
TO
49 //get the event id.
50 $this->_id = CRM_Utils_Request::retrieve('id', 'Positive', $this, TRUE);
51 $config = CRM_Core_Config::singleton();
52 // ensure that the user has permission to see this page
53 if (!CRM_Core_Permission::event(CRM_Core_Permission::VIEW,
353ffa53
TO
54 $this->_id, 'view event info'
55 )
56 ) {
6a488035
TO
57 CRM_Utils_System::setUFMessage(ts('You do not have permission to view this event'));
58 return CRM_Utils_System::permissionDenied();
59 }
60
61 $action = CRM_Utils_Request::retrieve('action', 'String', $this, FALSE);
edc80cda 62 $context = CRM_Utils_Request::retrieve('context', 'Alphanumeric', $this, FALSE, 'register');
6a488035
TO
63 $this->assign('context', $context);
64
65 // Sometimes we want to suppress the Event Full msg
66 $noFullMsg = CRM_Utils_Request::retrieve('noFullMsg', 'String', $this, FALSE, 'false');
67
68 // set breadcrumb to append to 2nd layer pages
69 $breadCrumbPath = CRM_Utils_System::url('civicrm/event/info',
70 "id={$this->_id}&reset=1"
71 );
6a488035
TO
72
73 //retrieve event information
74 $params = array('id' => $this->_id);
75 CRM_Event_BAO_Event::retrieve($params, $values['event']);
76
77 if (!$values['event']['is_active']) {
78 // form is inactive, die a fatal death
12cc37ef
SB
79 CRM_Utils_System::setUFMessage(ts('The event you requested is currently unavailable (contact the site administrator for assistance).'));
80 return CRM_Utils_System::permissionDenied();
6a488035
TO
81 }
82
c6d4092b
RO
83 if (!$values['event']['is_public']) {
84 CRM_Utils_System::addHTMLHead('<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">');
85 }
86
6a488035
TO
87 if (!empty($values['event']['is_template'])) {
88 // form is an Event Template
89 CRM_Core_Error::fatal(ts('The page you requested is currently unavailable.'));
90 }
91
4b351970
DG
92 // Add Event Type to $values in case folks want to display it
93 $values['event']['event_type'] = CRM_Utils_Array::value($values['event']['event_type_id'], CRM_Event_PseudoConstant::eventType());
e2d09ab4 94
6a488035
TO
95 $this->assign('isShowLocation', CRM_Utils_Array::value('is_show_location', $values['event']));
96
97 // show event fees.
8cc574cf 98 if ($this->_id && !empty($values['event']['is_monetary'])) {
6a488035
TO
99 //CRM-6907
100 $config = CRM_Core_Config::singleton();
101 $config->defaultCurrency = CRM_Utils_Array::value('currency',
102 $values['event'],
103 $config->defaultCurrency
104 );
105
106 //CRM-10434
d3e86119 107 $discountId = CRM_Core_BAO_Discount::findSet($this->_id, 'civicrm_event');
6a488035
TO
108 if ($discountId) {
109 $priceSetId = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_Discount', $discountId, 'price_set_id');
0db6c3e1
TO
110 }
111 else {
9da8dc8c 112 $priceSetId = CRM_Price_BAO_PriceSet::getFor('civicrm_event', $this->_id);
6a488035
TO
113 }
114
115 // get price set options, - CRM-5209
116 if ($priceSetId) {
9da8dc8c 117 $setDetails = CRM_Price_BAO_PriceSet::getSetDetail($priceSetId, TRUE, TRUE);
6a488035
TO
118
119 $priceSetFields = $setDetails[$priceSetId]['fields'];
120 if (is_array($priceSetFields)) {
121 $fieldCnt = 1;
122 $visibility = CRM_Core_PseudoConstant::visibility('name');
123
c7b3d063 124 // CRM-14492 Admin price fields should show up on event registration if user has 'administer CiviCRM' permissions
ab8a593e 125 $adminFieldVisible = FALSE;
c7b3d063 126 if (CRM_Core_Permission::check('administer CiviCRM')) {
4eeb9a5b 127 $adminFieldVisible = TRUE;
c7b3d063
DG
128 }
129
6a488035
TO
130 foreach ($priceSetFields as $fid => $fieldValues) {
131 if (!is_array($fieldValues['options']) ||
132 empty($fieldValues['options']) ||
ab8a593e 133 (CRM_Utils_Array::value('visibility_id', $fieldValues) != array_search('public', $visibility) && $adminFieldVisible == FALSE)
6a488035
TO
134 ) {
135 continue;
136 }
137
138 if (count($fieldValues['options']) > 1) {
139 $values['feeBlock']['value'][$fieldCnt] = '';
140 $values['feeBlock']['label'][$fieldCnt] = $fieldValues['label'];
141 $values['feeBlock']['lClass'][$fieldCnt] = 'price_set_option_group-label';
142 $values['feeBlock']['isDisplayAmount'][$fieldCnt] = CRM_Utils_Array::value('is_display_amounts', $fieldValues);
143 $fieldCnt++;
144 $labelClass = 'price_set_option-label';
145 }
146 else {
147 $labelClass = 'price_set_field-label';
148 }
3a669c96 149 // show tax rate with amount
aaffa79f 150 $invoiceSettings = Civi::settings()->get('contribution_invoice_settings');
fe7983e7
PD
151 $taxTerm = CRM_Utils_Array::value('tax_term', $invoiceSettings);
152 $displayOpt = CRM_Utils_Array::value('tax_display_settings', $invoiceSettings);
153 $invoicing = CRM_Utils_Array::value('invoicing', $invoiceSettings);
6a488035 154 foreach ($fieldValues['options'] as $optionId => $optionVal) {
c6833879
BS
155 if (CRM_Utils_Array::value('visibility_id', $optionVal) != array_search('public', $visibility) &&
156 $adminFieldVisible == FALSE
157 ) {
158 continue;
159 }
160
6a488035 161 $values['feeBlock']['isDisplayAmount'][$fieldCnt] = CRM_Utils_Array::value('is_display_amounts', $fieldValues);
fe7983e7
PD
162 if ($invoicing && isset($optionVal['tax_amount'])) {
163 $values['feeBlock']['value'][$fieldCnt] = CRM_Price_BAO_PriceField::getTaxLabel($optionVal, 'amount', $displayOpt, $taxTerm);
3a669c96 164 $values['feeBlock']['tax_amount'][$fieldCnt] = $optionVal['tax_amount'];
165 }
166 else {
167 $values['feeBlock']['value'][$fieldCnt] = $optionVal['amount'];
168 }
6a488035
TO
169 $values['feeBlock']['label'][$fieldCnt] = $optionVal['label'];
170 $values['feeBlock']['lClass'][$fieldCnt] = $labelClass;
171 $fieldCnt++;
172 }
173 }
174 }
175 // Tell tpl we have price set fee data and whether it's a quick_config price set
176 $this->assign('isPriceSet', 1);
177 $this->assign('isQuickConfig', $setDetails[$priceSetId]['is_quick_config']);
178 }
353ffa53 179 }
6a488035
TO
180
181 $params = array('entity_id' => $this->_id, 'entity_table' => 'civicrm_event');
182 $values['location'] = CRM_Core_BAO_Location::getValues($params, TRUE);
183
45618a70 184 // fix phone type labels
185 if (!empty($values['location']['phone'])) {
186 $phoneTypes = CRM_Core_PseudoConstant::get('CRM_Core_DAO_Phone', 'phone_type_id');
187 foreach ($values['location']['phone'] as &$val) {
188 if (!empty($val['phone_type_id'])) {
189 $val['phone_type_display'] = $phoneTypes[$val['phone_type_id']];
190 }
191 }
192 }
193
6a488035 194 //retrieve custom field information
0b330e6d 195 $groupTree = CRM_Core_BAO_CustomGroup::getTree('Event', NULL, $this->_id, 0, $values['event']['event_type_id'], NULL, TRUE, NULL, FALSE, TRUE, NULL, TRUE);
e34e6979 196 CRM_Core_BAO_CustomGroup::buildCustomDataView($this, $groupTree, FALSE, NULL, NULL, NULL, $this->_id);
6a488035
TO
197 $this->assign('action', CRM_Core_Action::VIEW);
198 //To show the event location on maps directly on event info page
199 $locations = CRM_Event_BAO_Event::getMapInfo($this->_id);
8cc574cf 200 if (!empty($locations) && !empty($values['event']['is_map'])) {
6a488035
TO
201 $this->assign('locations', $locations);
202 $this->assign('mapProvider', $config->mapProvider);
203 $this->assign('mapKey', $config->mapAPIKey);
204 $sumLat = $sumLng = 0;
205 $maxLat = $maxLng = -400;
8d7a9d07 206 $minLat = $minLng = 400;
6a488035
TO
207 foreach ($locations as $location) {
208 $sumLat += $location['lat'];
209 $sumLng += $location['lng'];
210
211 if ($location['lat'] > $maxLat) {
212 $maxLat = $location['lat'];
213 }
214 if ($location['lat'] < $minLat) {
215 $minLat = $location['lat'];
216 }
217
218 if ($location['lng'] > $maxLng) {
219 $maxLng = $location['lng'];
220 }
221 if ($location['lng'] < $minLng) {
222 $minLng = $location['lng'];
223 }
224 }
225
6ea503d4
TO
226 $center = array(
227 'lat' => (float ) $sumLat / count($locations),
6a488035
TO
228 'lng' => (float ) $sumLng / count($locations),
229 );
6ea503d4 230 $span = array(
353ffa53
TO
231 'lat' => (float ) ($maxLat - $minLat),
232 'lng' => (float ) ($maxLng - $minLng),
6a488035
TO
233 );
234 $this->assign_by_ref('center', $center);
235 $this->assign_by_ref('span', $span);
236 if ($action == CRM_Core_Action::PREVIEW) {
237 $mapURL = CRM_Utils_System::url('civicrm/contact/map/event',
238 "eid={$this->_id}&reset=1&action=preview",
53c223bf 239 FALSE, NULL, TRUE,
6a488035
TO
240 TRUE
241 );
242 }
243 else {
244 $mapURL = CRM_Utils_System::url('civicrm/contact/map/event',
245 "eid={$this->_id}&reset=1",
53c223bf 246 FALSE, NULL, TRUE,
6a488035
TO
247 TRUE
248 );
249 }
250
251 $this->assign('skipLocationType', TRUE);
252 $this->assign('mapURL', $mapURL);
253 }
254
4cdc90e9
DH
255 if (CRM_Core_Permission::check('view event participants')) {
256 $statusTypes = CRM_Event_PseudoConstant::participantStatus(NULL, 'is_counted = 1', 'label');
257 $statusTypesPending = CRM_Event_PseudoConstant::participantStatus(NULL, 'is_counted = 0', 'label');
258 $findParticipants['statusCounted'] = implode(', ', array_values($statusTypes));
259 $findParticipants['statusNotCounted'] = implode(', ', array_values($statusTypesPending));
260 $this->assign('findParticipants', $findParticipants);
261 }
6a488035
TO
262
263 $participantListingID = CRM_Utils_Array::value('participant_listing_id', $values['event']);
264 if ($participantListingID) {
265 $participantListingURL = CRM_Utils_System::url('civicrm/event/participant',
266 "reset=1&id={$this->_id}",
53c223bf 267 FALSE, NULL, TRUE, TRUE
6a488035
TO
268 );
269 $this->assign('participantListingURL', $participantListingURL);
270 }
271
272 $hasWaitingList = CRM_Utils_Array::value('has_waitlist', $values['event']);
273 $eventFullMessage = CRM_Event_BAO_Participant::eventFull($this->_id,
274 FALSE,
275 $hasWaitingList
276 );
277
278 $allowRegistration = FALSE;
5c6fa26c 279 $isEventOpenForRegistration = CRM_Event_BAO_Event::validRegistrationRequest($values['event'], $this->_id);
a7488080 280 if (!empty($values['event']['is_online_registration'])) {
5c6fa26c 281 if ($isEventOpenForRegistration == 1) {
6a488035
TO
282 // we always generate urls for the front end in joomla
283 $action_query = $action === CRM_Core_Action::PREVIEW ? "&action=$action" : '';
284 $url = CRM_Utils_System::url('civicrm/event/register',
285 "id={$this->_id}&reset=1{$action_query}",
53c223bf 286 FALSE, NULL, TRUE,
6a488035
TO
287 TRUE
288 );
289 if (!$eventFullMessage || $hasWaitingList) {
290 $registerText = ts('Register Now');
a7488080 291 if (!empty($values['event']['registration_link_text'])) {
6a488035
TO
292 $registerText = $values['event']['registration_link_text'];
293 }
294
295 // check if we're in shopping cart mode for events
aaffa79f 296 $enable_cart = Civi::settings()->get('enable_cart');
6a488035
TO
297 if ($enable_cart) {
298 $link = CRM_Event_Cart_BAO_EventInCart::get_registration_link($this->_id);
299 $registerText = $link['label'];
300
53c223bf 301 $url = CRM_Utils_System::url($link['path'], $link['query'] . $action_query, FALSE, NULL, TRUE, TRUE);
6a488035
TO
302 }
303
304 //Fixed for CRM-4855
305 $allowRegistration = CRM_Event_BAO_Event::showHideRegistrationLink($values);
306
307 $this->assign('registerText', $registerText);
308 $this->assign('registerURL', $url);
309 $this->assign('eventCartEnabled', $enable_cart);
310 }
311 }
312 elseif (CRM_Core_Permission::check('register for events')) {
313 $this->assign('registerClosed', TRUE);
314 }
315 }
316
317 $this->assign('allowRegistration', $allowRegistration);
318
319 $session = CRM_Core_Session::singleton();
6ea503d4
TO
320 $params = array(
321 'contact_id' => $session->get('userID'),
6a488035
TO
322 'event_id' => CRM_Utils_Array::value('id', $values['event']),
323 'role_id' => CRM_Utils_Array::value('default_role_id', $values['event']),
324 );
325
326 if ($eventFullMessage && ($noFullMsg == 'false') || CRM_Event_BAO_Event::checkRegistration($params)) {
327 $statusMessage = $eventFullMessage;
328 if (CRM_Event_BAO_Event::checkRegistration($params)) {
329 if ($noFullMsg == 'false') {
330 if ($values['event']['allow_same_participant_emails']) {
331 $statusMessage = ts('It looks like you are already registered for this event. You may proceed if you want to create an additional registration.');
332 }
333 else {
334 $registerUrl = CRM_Utils_System::url('civicrm/event/register',
335 "reset=1&id={$values['event']['id']}&cid=0"
336 );
337 $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>.', array(1 => $registerUrl));
338 }
339 }
340 }
341 elseif ($hasWaitingList) {
342 $statusMessage = CRM_Utils_Array::value('waitlist_text', $values['event']);
343 if (!$statusMessage) {
344 $statusMessage = ts('Event is currently full, but you can register and be a part of waiting list.');
345 }
346 }
5c6fa26c
JM
347 if ($isEventOpenForRegistration == 1) {
348 CRM_Core_Session::setStatus($statusMessage);
349 }
6a488035
TO
350 }
351 // we do not want to display recently viewed items, so turn off
352 $this->assign('displayRecent', FALSE);
353
354 // set page title = event title
355 CRM_Utils_System::setTitle($values['event']['title']);
356
357 $this->assign('event', $values['event']);
358 if (isset($values['feeBlock'])) {
359 $this->assign('feeBlock', $values['feeBlock']);
360 }
361 $this->assign('location', $values['location']);
362
fdf80679 363 if (CRM_Core_Permission::check('access CiviEvent')) {
aaffa79f 364 $enableCart = Civi::settings()->get('enable_cart');
fdf80679
CW
365 $this->assign('manageEventLinks', CRM_Event_Page_ManageEvent::tabs($enableCart));
366 }
367
6a488035
TO
368 return parent::run();
369 }
370
0cf587a7
EM
371 /**
372 * @return string
373 */
00be9182 374 public function getTemplateFileName() {
6a488035
TO
375 if ($this->_id) {
376 $templateFile = "CRM/Event/Page/{$this->_id}/EventInfo.tpl";
377 $template = CRM_Core_Page::getTemplate();
378
379 if ($template->template_exists($templateFile)) {
380 return $templateFile;
381 }
382 }
383 return parent::getTemplateFileName();
384 }
96025800 385
6a488035 386}