security/core#14 Validate "context" inputs
[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
TO
154 foreach ($fieldValues['options'] as $optionId => $optionVal) {
155 $values['feeBlock']['isDisplayAmount'][$fieldCnt] = CRM_Utils_Array::value('is_display_amounts', $fieldValues);
fe7983e7
PD
156 if ($invoicing && isset($optionVal['tax_amount'])) {
157 $values['feeBlock']['value'][$fieldCnt] = CRM_Price_BAO_PriceField::getTaxLabel($optionVal, 'amount', $displayOpt, $taxTerm);
3a669c96 158 $values['feeBlock']['tax_amount'][$fieldCnt] = $optionVal['tax_amount'];
159 }
160 else {
161 $values['feeBlock']['value'][$fieldCnt] = $optionVal['amount'];
162 }
6a488035
TO
163 $values['feeBlock']['label'][$fieldCnt] = $optionVal['label'];
164 $values['feeBlock']['lClass'][$fieldCnt] = $labelClass;
165 $fieldCnt++;
166 }
167 }
168 }
169 // Tell tpl we have price set fee data and whether it's a quick_config price set
170 $this->assign('isPriceSet', 1);
171 $this->assign('isQuickConfig', $setDetails[$priceSetId]['is_quick_config']);
172 }
353ffa53 173 }
6a488035
TO
174
175 $params = array('entity_id' => $this->_id, 'entity_table' => 'civicrm_event');
176 $values['location'] = CRM_Core_BAO_Location::getValues($params, TRUE);
177
45618a70 178 // fix phone type labels
179 if (!empty($values['location']['phone'])) {
180 $phoneTypes = CRM_Core_PseudoConstant::get('CRM_Core_DAO_Phone', 'phone_type_id');
181 foreach ($values['location']['phone'] as &$val) {
182 if (!empty($val['phone_type_id'])) {
183 $val['phone_type_display'] = $phoneTypes[$val['phone_type_id']];
184 }
185 }
186 }
187
6a488035 188 //retrieve custom field information
0b330e6d 189 $groupTree = CRM_Core_BAO_CustomGroup::getTree('Event', NULL, $this->_id, 0, $values['event']['event_type_id'], NULL, TRUE, NULL, FALSE, TRUE, NULL, TRUE);
e34e6979 190 CRM_Core_BAO_CustomGroup::buildCustomDataView($this, $groupTree, FALSE, NULL, NULL, NULL, $this->_id);
6a488035
TO
191 $this->assign('action', CRM_Core_Action::VIEW);
192 //To show the event location on maps directly on event info page
193 $locations = CRM_Event_BAO_Event::getMapInfo($this->_id);
8cc574cf 194 if (!empty($locations) && !empty($values['event']['is_map'])) {
6a488035
TO
195 $this->assign('locations', $locations);
196 $this->assign('mapProvider', $config->mapProvider);
197 $this->assign('mapKey', $config->mapAPIKey);
198 $sumLat = $sumLng = 0;
199 $maxLat = $maxLng = -400;
8d7a9d07 200 $minLat = $minLng = 400;
6a488035
TO
201 foreach ($locations as $location) {
202 $sumLat += $location['lat'];
203 $sumLng += $location['lng'];
204
205 if ($location['lat'] > $maxLat) {
206 $maxLat = $location['lat'];
207 }
208 if ($location['lat'] < $minLat) {
209 $minLat = $location['lat'];
210 }
211
212 if ($location['lng'] > $maxLng) {
213 $maxLng = $location['lng'];
214 }
215 if ($location['lng'] < $minLng) {
216 $minLng = $location['lng'];
217 }
218 }
219
6ea503d4
TO
220 $center = array(
221 'lat' => (float ) $sumLat / count($locations),
6a488035
TO
222 'lng' => (float ) $sumLng / count($locations),
223 );
6ea503d4 224 $span = array(
353ffa53
TO
225 'lat' => (float ) ($maxLat - $minLat),
226 'lng' => (float ) ($maxLng - $minLng),
6a488035
TO
227 );
228 $this->assign_by_ref('center', $center);
229 $this->assign_by_ref('span', $span);
230 if ($action == CRM_Core_Action::PREVIEW) {
231 $mapURL = CRM_Utils_System::url('civicrm/contact/map/event',
232 "eid={$this->_id}&reset=1&action=preview",
53c223bf 233 FALSE, NULL, TRUE,
6a488035
TO
234 TRUE
235 );
236 }
237 else {
238 $mapURL = CRM_Utils_System::url('civicrm/contact/map/event',
239 "eid={$this->_id}&reset=1",
53c223bf 240 FALSE, NULL, TRUE,
6a488035
TO
241 TRUE
242 );
243 }
244
245 $this->assign('skipLocationType', TRUE);
246 $this->assign('mapURL', $mapURL);
247 }
248
4cdc90e9
DH
249 if (CRM_Core_Permission::check('view event participants')) {
250 $statusTypes = CRM_Event_PseudoConstant::participantStatus(NULL, 'is_counted = 1', 'label');
251 $statusTypesPending = CRM_Event_PseudoConstant::participantStatus(NULL, 'is_counted = 0', 'label');
252 $findParticipants['statusCounted'] = implode(', ', array_values($statusTypes));
253 $findParticipants['statusNotCounted'] = implode(', ', array_values($statusTypesPending));
254 $this->assign('findParticipants', $findParticipants);
255 }
6a488035
TO
256
257 $participantListingID = CRM_Utils_Array::value('participant_listing_id', $values['event']);
258 if ($participantListingID) {
259 $participantListingURL = CRM_Utils_System::url('civicrm/event/participant',
260 "reset=1&id={$this->_id}",
53c223bf 261 FALSE, NULL, TRUE, TRUE
6a488035
TO
262 );
263 $this->assign('participantListingURL', $participantListingURL);
264 }
265
266 $hasWaitingList = CRM_Utils_Array::value('has_waitlist', $values['event']);
267 $eventFullMessage = CRM_Event_BAO_Participant::eventFull($this->_id,
268 FALSE,
269 $hasWaitingList
270 );
271
272 $allowRegistration = FALSE;
a7488080 273 if (!empty($values['event']['is_online_registration'])) {
6a488035
TO
274 if (CRM_Event_BAO_Event::validRegistrationRequest($values['event'], $this->_id)) {
275 // we always generate urls for the front end in joomla
276 $action_query = $action === CRM_Core_Action::PREVIEW ? "&action=$action" : '';
277 $url = CRM_Utils_System::url('civicrm/event/register',
278 "id={$this->_id}&reset=1{$action_query}",
53c223bf 279 FALSE, NULL, TRUE,
6a488035
TO
280 TRUE
281 );
282 if (!$eventFullMessage || $hasWaitingList) {
283 $registerText = ts('Register Now');
a7488080 284 if (!empty($values['event']['registration_link_text'])) {
6a488035
TO
285 $registerText = $values['event']['registration_link_text'];
286 }
287
288 // check if we're in shopping cart mode for events
aaffa79f 289 $enable_cart = Civi::settings()->get('enable_cart');
6a488035
TO
290 if ($enable_cart) {
291 $link = CRM_Event_Cart_BAO_EventInCart::get_registration_link($this->_id);
292 $registerText = $link['label'];
293
53c223bf 294 $url = CRM_Utils_System::url($link['path'], $link['query'] . $action_query, FALSE, NULL, TRUE, TRUE);
6a488035
TO
295 }
296
297 //Fixed for CRM-4855
298 $allowRegistration = CRM_Event_BAO_Event::showHideRegistrationLink($values);
299
300 $this->assign('registerText', $registerText);
301 $this->assign('registerURL', $url);
302 $this->assign('eventCartEnabled', $enable_cart);
303 }
304 }
305 elseif (CRM_Core_Permission::check('register for events')) {
306 $this->assign('registerClosed', TRUE);
307 }
308 }
309
310 $this->assign('allowRegistration', $allowRegistration);
311
312 $session = CRM_Core_Session::singleton();
6ea503d4
TO
313 $params = array(
314 'contact_id' => $session->get('userID'),
6a488035
TO
315 'event_id' => CRM_Utils_Array::value('id', $values['event']),
316 'role_id' => CRM_Utils_Array::value('default_role_id', $values['event']),
317 );
318
319 if ($eventFullMessage && ($noFullMsg == 'false') || CRM_Event_BAO_Event::checkRegistration($params)) {
320 $statusMessage = $eventFullMessage;
321 if (CRM_Event_BAO_Event::checkRegistration($params)) {
322 if ($noFullMsg == 'false') {
323 if ($values['event']['allow_same_participant_emails']) {
324 $statusMessage = ts('It looks like you are already registered for this event. You may proceed if you want to create an additional registration.');
325 }
326 else {
327 $registerUrl = CRM_Utils_System::url('civicrm/event/register',
328 "reset=1&id={$values['event']['id']}&cid=0"
329 );
330 $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));
331 }
332 }
333 }
334 elseif ($hasWaitingList) {
335 $statusMessage = CRM_Utils_Array::value('waitlist_text', $values['event']);
336 if (!$statusMessage) {
337 $statusMessage = ts('Event is currently full, but you can register and be a part of waiting list.');
338 }
339 }
340
341 CRM_Core_Session::setStatus($statusMessage);
342 }
343 // we do not want to display recently viewed items, so turn off
344 $this->assign('displayRecent', FALSE);
345
346 // set page title = event title
347 CRM_Utils_System::setTitle($values['event']['title']);
348
349 $this->assign('event', $values['event']);
350 if (isset($values['feeBlock'])) {
351 $this->assign('feeBlock', $values['feeBlock']);
352 }
353 $this->assign('location', $values['location']);
354
fdf80679 355 if (CRM_Core_Permission::check('access CiviEvent')) {
aaffa79f 356 $enableCart = Civi::settings()->get('enable_cart');
fdf80679
CW
357 $this->assign('manageEventLinks', CRM_Event_Page_ManageEvent::tabs($enableCart));
358 }
359
6a488035
TO
360 return parent::run();
361 }
362
0cf587a7
EM
363 /**
364 * @return string
365 */
00be9182 366 public function getTemplateFileName() {
6a488035
TO
367 if ($this->_id) {
368 $templateFile = "CRM/Event/Page/{$this->_id}/EventInfo.tpl";
369 $template = CRM_Core_Page::getTemplate();
370
371 if ($template->template_exists($templateFile)) {
372 return $templateFile;
373 }
374 }
375 return parent::getTemplateFileName();
376 }
96025800 377
6a488035 378}