3 +--------------------------------------------------------------------+
4 | Copyright CiviCRM LLC. All rights reserved. |
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 +--------------------------------------------------------------------+
15 * @copyright CiviCRM LLC https://civicrm.org/licensing
19 * Event Info Page - Summmary about the event
21 class CRM_Event_Page_EventInfo
extends CRM_Core_Page
{
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.
32 public function run() {
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'
41 CRM_Utils_System
::setUFMessage(ts('You do not have permission to view this event'));
42 return CRM_Utils_System
::permissionDenied();
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);
49 // Sometimes we want to suppress the Event Full msg
50 $noFullMsg = CRM_Utils_Request
::retrieve('noFullMsg', 'String', $this, FALSE, 'false');
52 // set breadcrumb to append to 2nd layer pages
53 $breadCrumbPath = CRM_Utils_System
::url('civicrm/event/info',
54 "id={$this->_id}&reset=1"
57 //retrieve event information
58 $params = ['id' => $this->_id
];
59 CRM_Event_BAO_Event
::retrieve($params, $values['event']);
61 if (!$values['event']['is_active']) {
62 CRM_Utils_System
::setUFMessage(ts('The event you requested is currently unavailable (contact the site administrator for assistance).'));
63 return CRM_Utils_System
::permissionDenied();
66 if (!$values['event']['is_public']) {
67 CRM_Utils_System
::addHTMLHead('<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">');
70 if (!empty($values['event']['is_template'])) {
71 // form is an Event Template
72 CRM_Core_Error
::statusBounce(ts('The page you requested is currently unavailable.'));
75 // Add Event Type to $values in case folks want to display it
76 $values['event']['event_type'] = CRM_Utils_Array
::value($values['event']['event_type_id'], CRM_Event_PseudoConstant
::eventType());
78 $this->assign('isShowLocation', CRM_Utils_Array
::value('is_show_location', $values['event']));
81 if ($this->_id
&& !empty($values['event']['is_monetary'])) {
82 CRM_Contribute_BAO_Contribution_Utils
::overrideDefaultCurrency($values['event']);
85 $discountId = CRM_Core_BAO_Discount
::findSet($this->_id
, 'civicrm_event');
87 $priceSetId = CRM_Core_DAO
::getFieldValue('CRM_Core_DAO_Discount', $discountId, 'price_set_id');
90 $priceSetId = CRM_Price_BAO_PriceSet
::getFor('civicrm_event', $this->_id
);
93 // get price set options, - CRM-5209
95 $setDetails = CRM_Price_BAO_PriceSet
::getSetDetail($priceSetId, TRUE, TRUE);
97 $priceSetFields = $setDetails[$priceSetId]['fields'];
98 if (is_array($priceSetFields)) {
100 $visibility = CRM_Core_PseudoConstant
::visibility('name');
102 // CRM-14492 Admin price fields should show up on event registration if user has 'administer CiviCRM' permissions
103 $adminFieldVisible = FALSE;
104 if (CRM_Core_Permission
::check('administer CiviCRM')) {
105 $adminFieldVisible = TRUE;
108 foreach ($priceSetFields as $fid => $fieldValues) {
109 if (!is_array($fieldValues['options']) ||
110 empty($fieldValues['options']) ||
111 (CRM_Utils_Array
::value('visibility_id', $fieldValues) != array_search('public', $visibility) && $adminFieldVisible == FALSE)
116 if (count($fieldValues['options']) > 1) {
117 $values['feeBlock']['value'][$fieldCnt] = '';
118 $values['feeBlock']['label'][$fieldCnt] = $fieldValues['label'];
119 $values['feeBlock']['lClass'][$fieldCnt] = 'price_set_option_group-label';
120 $values['feeBlock']['isDisplayAmount'][$fieldCnt] = CRM_Utils_Array
::value('is_display_amounts', $fieldValues);
122 $labelClass = 'price_set_option-label';
125 $labelClass = 'price_set_field-label';
127 // show tax rate with amount
128 $invoiceSettings = Civi
::settings()->get('contribution_invoice_settings');
129 $taxTerm = CRM_Utils_Array
::value('tax_term', $invoiceSettings);
130 $displayOpt = CRM_Utils_Array
::value('tax_display_settings', $invoiceSettings);
131 $invoicing = CRM_Utils_Array
::value('invoicing', $invoiceSettings);
132 foreach ($fieldValues['options'] as $optionId => $optionVal) {
133 if (CRM_Utils_Array
::value('visibility_id', $optionVal) != array_search('public', $visibility) &&
134 $adminFieldVisible == FALSE
139 $values['feeBlock']['isDisplayAmount'][$fieldCnt] = CRM_Utils_Array
::value('is_display_amounts', $fieldValues);
140 if ($invoicing && isset($optionVal['tax_amount'])) {
141 $values['feeBlock']['value'][$fieldCnt] = CRM_Price_BAO_PriceField
::getTaxLabel($optionVal, 'amount', $displayOpt, $taxTerm);
142 $values['feeBlock']['tax_amount'][$fieldCnt] = $optionVal['tax_amount'];
145 $values['feeBlock']['value'][$fieldCnt] = $optionVal['amount'];
147 $values['feeBlock']['label'][$fieldCnt] = $optionVal['label'];
148 $values['feeBlock']['lClass'][$fieldCnt] = $labelClass;
153 // Tell tpl we have price set fee data and whether it's a quick_config price set
154 $this->assign('isPriceSet', 1);
155 $this->assign('isQuickConfig', $setDetails[$priceSetId]['is_quick_config']);
159 $params = ['entity_id' => $this->_id
, 'entity_table' => 'civicrm_event'];
160 $values['location'] = CRM_Core_BAO_Location
::getValues($params, TRUE);
162 // fix phone type labels
163 if (!empty($values['location']['phone'])) {
164 $phoneTypes = CRM_Core_PseudoConstant
::get('CRM_Core_DAO_Phone', 'phone_type_id');
165 foreach ($values['location']['phone'] as &$val) {
166 if (!empty($val['phone_type_id'])) {
167 $val['phone_type_display'] = $phoneTypes[$val['phone_type_id']];
172 //retrieve custom field information
173 $groupTree = CRM_Core_BAO_CustomGroup
::getTree('Event', NULL, $this->_id
, 0, $values['event']['event_type_id'], NULL, TRUE, NULL, FALSE, TRUE, NULL, TRUE);
174 CRM_Core_BAO_CustomGroup
::buildCustomDataView($this, $groupTree, FALSE, NULL, NULL, NULL, $this->_id
);
175 $this->assign('action', CRM_Core_Action
::VIEW
);
176 //To show the event location on maps directly on event info page
177 $locations = CRM_Event_BAO_Event
::getMapInfo($this->_id
);
178 if (!empty($locations) && !empty($values['event']['is_map'])) {
179 $this->assign('locations', $locations);
180 $this->assign('mapProvider', $config->mapProvider
);
181 $this->assign('mapKey', $config->mapAPIKey
);
182 $sumLat = $sumLng = 0;
183 $maxLat = $maxLng = -400;
184 $minLat = $minLng = 400;
185 foreach ($locations as $location) {
186 $sumLat +
= $location['lat'];
187 $sumLng +
= $location['lng'];
189 if ($location['lat'] > $maxLat) {
190 $maxLat = $location['lat'];
192 if ($location['lat'] < $minLat) {
193 $minLat = $location['lat'];
196 if ($location['lng'] > $maxLng) {
197 $maxLng = $location['lng'];
199 if ($location['lng'] < $minLng) {
200 $minLng = $location['lng'];
205 'lat' => (float ) $sumLat / count($locations),
206 'lng' => (float ) $sumLng / count($locations),
209 'lat' => (float ) ($maxLat - $minLat),
210 'lng' => (float ) ($maxLng - $minLng),
212 $this->assign_by_ref('center', $center);
213 $this->assign_by_ref('span', $span);
214 if ($action == CRM_Core_Action
::PREVIEW
) {
215 $mapURL = CRM_Utils_System
::url('civicrm/contact/map/event',
216 "eid={$this->_id}&reset=1&action=preview",
222 $mapURL = CRM_Utils_System
::url('civicrm/contact/map/event',
223 "eid={$this->_id}&reset=1",
229 $this->assign('skipLocationType', TRUE);
230 $this->assign('mapURL', $mapURL);
233 if (CRM_Core_Permission
::check('view event participants')) {
234 $statusTypes = CRM_Event_PseudoConstant
::participantStatus(NULL, 'is_counted = 1', 'label');
235 $statusTypesPending = CRM_Event_PseudoConstant
::participantStatus(NULL, 'is_counted = 0', 'label');
236 $findParticipants['statusCounted'] = implode(', ', array_values($statusTypes));
237 $findParticipants['statusNotCounted'] = implode(', ', array_values($statusTypesPending));
238 $this->assign('findParticipants', $findParticipants);
241 $participantListingID = CRM_Utils_Array
::value('participant_listing_id', $values['event']);
242 if ($participantListingID) {
243 $participantListingURL = CRM_Utils_System
::url('civicrm/event/participant',
244 "reset=1&id={$this->_id}",
245 FALSE, NULL, TRUE, TRUE
247 $this->assign('participantListingURL', $participantListingURL);
250 $hasWaitingList = CRM_Utils_Array
::value('has_waitlist', $values['event']);
251 $eventFullMessage = CRM_Event_BAO_Participant
::eventFull($this->_id
,
256 $allowRegistration = FALSE;
257 $isEventOpenForRegistration = CRM_Event_BAO_Event
::validRegistrationRequest($values['event'], $this->_id
);
258 if (!empty($values['event']['is_online_registration'])) {
259 if ($isEventOpenForRegistration == 1) {
260 // we always generate urls for the front end in joomla
261 $action_query = $action === CRM_Core_Action
::PREVIEW ?
"&action=$action" : '';
262 $url = CRM_Utils_System
::url('civicrm/event/register',
263 "id={$this->_id}&reset=1{$action_query}",
267 if (!$eventFullMessage ||
$hasWaitingList) {
268 $registerText = ts('Register Now');
269 if (!empty($values['event']['registration_link_text'])) {
270 $registerText = $values['event']['registration_link_text'];
273 // check if we're in shopping cart mode for events
274 $enable_cart = Civi
::settings()->get('enable_cart');
276 $link = CRM_Event_Cart_BAO_EventInCart
::get_registration_link($this->_id
);
277 $registerText = $link['label'];
279 $url = CRM_Utils_System
::url($link['path'], $link['query'] . $action_query, FALSE, NULL, TRUE, TRUE);
283 $allowRegistration = CRM_Event_BAO_Event
::showHideRegistrationLink($values);
285 $this->assign('registerText', $registerText);
286 $this->assign('registerURL', $url);
287 $this->assign('eventCartEnabled', $enable_cart);
290 elseif (CRM_Core_Permission
::check('register for events')) {
291 $this->assign('registerClosed', TRUE);
295 $this->assign('allowRegistration', $allowRegistration);
297 $session = CRM_Core_Session
::singleton();
299 'contact_id' => $session->get('userID'),
300 'event_id' => CRM_Utils_Array
::value('id', $values['event']),
301 'role_id' => CRM_Utils_Array
::value('default_role_id', $values['event']),
304 if ($eventFullMessage && ($noFullMsg == 'false') || CRM_Event_BAO_Event
::checkRegistration($params)) {
305 $statusMessage = $eventFullMessage;
306 if (CRM_Event_BAO_Event
::checkRegistration($params)) {
307 if ($noFullMsg == 'false') {
308 if ($values['event']['allow_same_participant_emails']) {
309 $statusMessage = ts('It looks like you are already registered for this event. You may proceed if you want to create an additional registration.');
312 $registerUrl = CRM_Utils_System
::url('civicrm/event/register',
313 "reset=1&id={$values['event']['id']}&cid=0"
315 $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]);
319 elseif ($hasWaitingList) {
320 $statusMessage = CRM_Utils_Array
::value('waitlist_text', $values['event']);
321 if (!$statusMessage) {
322 $statusMessage = ts('Event is currently full, but you can register and be a part of waiting list.');
325 if ($isEventOpenForRegistration == 1) {
326 CRM_Core_Session
::setStatus($statusMessage);
329 // we do not want to display recently viewed items, so turn off
330 $this->assign('displayRecent', FALSE);
332 // set page title = event title
333 CRM_Utils_System
::setTitle($values['event']['title']);
335 $this->assign('event', $values['event']);
336 if (isset($values['feeBlock'])) {
337 $this->assign('feeBlock', $values['feeBlock']);
339 $this->assign('location', $values['location']);
341 if (CRM_Core_Permission
::check(['access CiviEvent', 'edit all events'])) {
342 $enableCart = Civi
::settings()->get('enable_cart');
343 $this->assign('manageEventLinks', CRM_Event_Page_ManageEvent
::tabs($enableCart));
346 return parent
::run();
352 public function getTemplateFileName() {
354 $templateFile = "CRM/Event/Page/{$this->_id}/EventInfo.tpl";
355 $template = CRM_Core_Page
::getTemplate();
357 if ($template->template_exists($templateFile)) {
358 return $templateFile;
361 return parent
::getTemplateFileName();