| 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 | * @package CRM |
| 14 | * @copyright CiviCRM LLC https://civicrm.org/licensing |
| 15 | */ |
| 16 | |
| 17 | /** |
| 18 | * This class generates form components for processing Event. |
| 19 | */ |
| 20 | class CRM_Event_Form_ManageEvent_EventInfo extends CRM_Event_Form_ManageEvent { |
| 21 | |
| 22 | /** |
| 23 | * Event type. |
| 24 | * @var int |
| 25 | */ |
| 26 | protected $_eventType = NULL; |
| 27 | |
| 28 | /** |
| 29 | * Set variables up before form is built. |
| 30 | */ |
| 31 | public function preProcess() { |
| 32 | parent::preProcess(); |
| 33 | $this->setSelectedChild('settings'); |
| 34 | |
| 35 | $entityID = $this->_id ?: $this->_templateId; |
| 36 | if ($entityID) { |
| 37 | $this->assign('entityID', $entityID); |
| 38 | $eventType = CRM_Core_DAO::getFieldValue('CRM_Event_DAO_Event', |
| 39 | $entityID, |
| 40 | 'event_type_id' |
| 41 | ); |
| 42 | } |
| 43 | else { |
| 44 | $eventType = 'null'; |
| 45 | } |
| 46 | |
| 47 | $showLocation = FALSE; |
| 48 | // when custom data is included in this page |
| 49 | if (!empty($_POST['hidden_custom'])) { |
| 50 | $this->set('type', 'Event'); |
| 51 | $this->set('subType', CRM_Utils_Array::value('event_type_id', $_POST)); |
| 52 | $this->assign('customDataSubType', CRM_Utils_Array::value('event_type_id', $_POST)); |
| 53 | $this->set('entityId', $entityID); |
| 54 | |
| 55 | CRM_Custom_Form_CustomData::preProcess($this, NULL, $this->_eventType, 1, 'Event', $entityID); |
| 56 | CRM_Custom_Form_CustomData::buildQuickForm($this); |
| 57 | CRM_Custom_Form_CustomData::setDefaultValues($this); |
| 58 | } |
| 59 | } |
| 60 | |
| 61 | /** |
| 62 | * Set default values for the form. |
| 63 | * |
| 64 | * For edit/view mode he default values are retrieved from the database. |
| 65 | */ |
| 66 | public function setDefaultValues() { |
| 67 | $defaults = parent::setDefaultValues(); |
| 68 | |
| 69 | // in update mode, we need to set custom data subtype to tpl |
| 70 | if (!empty($defaults['event_type_id'])) { |
| 71 | $this->assign('customDataSubType', $defaults['event_type_id']); |
| 72 | } |
| 73 | |
| 74 | $this->_showHide = new CRM_Core_ShowHideBlocks(); |
| 75 | // Show waitlist features or event_full_text if max participants set |
| 76 | if (!empty($defaults['max_participants'])) { |
| 77 | $this->_showHide->addShow('id-waitlist'); |
| 78 | if (!empty($defaults['has_waitlist'])) { |
| 79 | $this->_showHide->addShow('id-waitlist-text'); |
| 80 | $this->_showHide->addHide('id-event_full'); |
| 81 | } |
| 82 | else { |
| 83 | $this->_showHide->addHide('id-waitlist-text'); |
| 84 | $this->_showHide->addShow('id-event_full'); |
| 85 | } |
| 86 | } |
| 87 | else { |
| 88 | $this->_showHide->addHide('id-event_full'); |
| 89 | $this->_showHide->addHide('id-waitlist'); |
| 90 | $this->_showHide->addHide('id-waitlist-text'); |
| 91 | } |
| 92 | |
| 93 | $this->_showHide->addToTemplate(); |
| 94 | $this->assign('elemType', 'table-row'); |
| 95 | |
| 96 | $this->assign('description', CRM_Utils_Array::value('description', $defaults)); |
| 97 | |
| 98 | // Provide suggested text for event full and waitlist messages if they're empty |
| 99 | $defaults['event_full_text'] = CRM_Utils_Array::value('event_full_text', $defaults, ts('This event is currently full.')); |
| 100 | |
| 101 | $defaults['waitlist_text'] = CRM_Utils_Array::value('waitlist_text', $defaults, ts('This event is currently full. However you can register now and get added to a waiting list. You will be notified if spaces become available.')); |
| 102 | $defaults['template_id'] = $this->_templateId; |
| 103 | return $defaults; |
| 104 | } |
| 105 | |
| 106 | /** |
| 107 | * Build the form object. |
| 108 | */ |
| 109 | public function buildQuickForm() { |
| 110 | //need to assign custom data type and subtype to the template |
| 111 | $this->assign('customDataType', 'Event'); |
| 112 | if ($this->_eventType) { |
| 113 | $this->assign('customDataSubType', $this->_eventType); |
| 114 | } |
| 115 | |
| 116 | $this->_first = TRUE; |
| 117 | $this->applyFilter('__ALL__', 'trim'); |
| 118 | $attributes = CRM_Core_DAO::getAttribute('CRM_Event_DAO_Event'); |
| 119 | |
| 120 | if ($this->_isTemplate) { |
| 121 | $this->add('text', 'template_title', ts('Template Title'), $attributes['template_title'], TRUE); |
| 122 | } |
| 123 | |
| 124 | if ($this->_action & CRM_Core_Action::ADD) { |
| 125 | $eventTemplates = CRM_Event_PseudoConstant::eventTemplates(); |
| 126 | if (CRM_Utils_System::isNull($eventTemplates) && !$this->_isTemplate) { |
| 127 | $url = CRM_Utils_System::url('civicrm/admin/eventTemplate', ['reset' => 1]); |
| 128 | CRM_Core_Session::setStatus(ts('If you find that you are creating multiple events with similar settings, you may want to use the <a href="%1">Event Templates</a> feature to streamline your workflow.', [1 => $url]), ts('Tip'), 'info'); |
| 129 | } |
| 130 | if (!CRM_Utils_System::isNull($eventTemplates)) { |
| 131 | $this->add('select', 'template_id', ts('From Template'), ['' => ts('- select -')] + $eventTemplates, FALSE, ['class' => 'crm-select2 huge']); |
| 132 | } |
| 133 | // Make sure this form redirects properly |
| 134 | $this->preventAjaxSubmit(); |
| 135 | } |
| 136 | |
| 137 | // add event title, make required if this is not a template |
| 138 | $this->add('text', 'title', ts('Event Title'), $attributes['event_title'], !$this->_isTemplate); |
| 139 | |
| 140 | $this->addSelect('event_type_id', |
| 141 | ['onChange' => "CRM.buildCustomData( 'Event', this.value );"], |
| 142 | TRUE |
| 143 | ); |
| 144 | |
| 145 | //CRM-7362 --add campaigns. |
| 146 | $campaignId = NULL; |
| 147 | if ($this->_id) { |
| 148 | $campaignId = CRM_Core_DAO::getFieldValue('CRM_Event_DAO_Event', $this->_id, 'campaign_id'); |
| 149 | } |
| 150 | CRM_Campaign_BAO_Campaign::addCampaign($this, $campaignId); |
| 151 | |
| 152 | $this->addSelect('default_role_id', [], TRUE); |
| 153 | |
| 154 | $this->addSelect('participant_listing_id', ['placeholder' => ts('Disabled'), 'option_url' => NULL]); |
| 155 | |
| 156 | $this->add('textarea', 'summary', ts('Event Summary'), $attributes['summary']); |
| 157 | $this->add('wysiwyg', 'description', ts('Complete Description'), $attributes['event_description'] + ['preset' => 'civievent']); |
| 158 | $this->addElement('checkbox', 'is_public', ts('Public Event')); |
| 159 | $this->addElement('checkbox', 'is_share', ts('Add footer region with Twitter, Facebook and LinkedIn share buttons and scripts?')); |
| 160 | $this->addElement('checkbox', 'is_map', ts('Include Map to Event Location')); |
| 161 | |
| 162 | $this->add('datepicker', 'start_date', ts('Start'), [], !$this->_isTemplate, ['time' => TRUE]); |
| 163 | $this->add('datepicker', 'end_date', ts('End'), [], FALSE, ['time' => TRUE]); |
| 164 | |
| 165 | $this->add('number', 'max_participants', ts('Max Number of Participants'), |
| 166 | ['onchange' => "if (this.value != '') {cj('#id-waitlist').show(); showHideByValue('has_waitlist','0','id-waitlist-text','table-row','radio',false); showHideByValue('has_waitlist','0','id-event_full','table-row','radio',true); return;} else {cj('#id-event_full, #id-waitlist, #id-waitlist-text').hide(); return;}"] |
| 167 | ); |
| 168 | $this->addRule('max_participants', ts('Max participants should be a positive number'), 'positiveInteger'); |
| 169 | |
| 170 | $participantStatuses = CRM_Event_PseudoConstant::participantStatus(); |
| 171 | $waitlist = 0; |
| 172 | if (in_array('On waitlist', $participantStatuses) and in_array('Pending from waitlist', $participantStatuses)) { |
| 173 | $this->addElement('checkbox', 'has_waitlist', ts('Offer a Waitlist?'), NULL, ['onclick' => "showHideByValue('has_waitlist','0','id-event_full','table-row','radio',true); showHideByValue('has_waitlist','0','id-waitlist-text','table-row','radio',false);"]); |
| 174 | $this->add('textarea', 'waitlist_text', ts('Waitlist Message'), $attributes['waitlist_text']); |
| 175 | $waitlist = 1; |
| 176 | } |
| 177 | $this->assign('waitlist', $waitlist); |
| 178 | |
| 179 | $this->add('textarea', 'event_full_text', ts('Message if Event Is Full'), $attributes['event_full_text']); |
| 180 | |
| 181 | $this->addElement('checkbox', 'is_active', ts('Is this Event Active?')); |
| 182 | |
| 183 | $this->addFormRule(['CRM_Event_Form_ManageEvent_EventInfo', 'formRule']); |
| 184 | |
| 185 | parent::buildQuickForm(); |
| 186 | } |
| 187 | |
| 188 | /** |
| 189 | * Global validation rules for the form. |
| 190 | * |
| 191 | * @param array $values |
| 192 | * |
| 193 | * @return array |
| 194 | * list of errors to be posted back to the form |
| 195 | */ |
| 196 | public static function formRule($values) { |
| 197 | $errors = []; |
| 198 | |
| 199 | if (!empty($values['end_date']) && ($values['end_date'] < $values['start_date'])) { |
| 200 | $errors['end_date'] = ts('End date should be after Start date.'); |
| 201 | } |
| 202 | |
| 203 | //CRM-4286 |
| 204 | if (strstr($values['title'], '/')) { |
| 205 | $errors['title'] = ts("Please do not use '/' in Event Title."); |
| 206 | } |
| 207 | |
| 208 | return $errors; |
| 209 | } |
| 210 | |
| 211 | /** |
| 212 | * Process the form submission. |
| 213 | */ |
| 214 | public function postProcess() { |
| 215 | $params = array_merge($this->controller->exportValues($this->_name), $this->_submitValues); |
| 216 | |
| 217 | //format params |
| 218 | $params['start_date'] = $params['start_date'] ?? NULL; |
| 219 | $params['end_date'] = $params['end_date'] ?? NULL; |
| 220 | $params['has_waitlist'] = CRM_Utils_Array::value('has_waitlist', $params, FALSE); |
| 221 | $params['is_map'] = CRM_Utils_Array::value('is_map', $params, FALSE); |
| 222 | $params['is_active'] = CRM_Utils_Array::value('is_active', $params, FALSE); |
| 223 | $params['is_public'] = CRM_Utils_Array::value('is_public', $params, FALSE); |
| 224 | $params['is_share'] = CRM_Utils_Array::value('is_share', $params, FALSE); |
| 225 | $params['default_role_id'] = CRM_Utils_Array::value('default_role_id', $params, FALSE); |
| 226 | $params['id'] = $this->_id; |
| 227 | |
| 228 | //merge params with defaults from templates |
| 229 | if (!empty($params['template_id'])) { |
| 230 | $params = array_merge(CRM_Event_BAO_Event::getTemplateDefaultValues($params['template_id']), $params); |
| 231 | foreach ($params as $key => $value) { |
| 232 | $customFieldInfo = CRM_Core_BAO_CustomField::getKeyID($key, TRUE); |
| 233 | if (!empty($customFieldInfo[1])) { |
| 234 | $params[str_replace($customFieldInfo[1], '-' . $customFieldInfo[1], $key)] = $value; |
| 235 | unset($params[$key]); |
| 236 | } |
| 237 | } |
| 238 | } |
| 239 | |
| 240 | $params['custom'] = CRM_Core_BAO_CustomField::postProcess($params, |
| 241 | $this->_id, |
| 242 | 'Event' |
| 243 | ); |
| 244 | |
| 245 | // now that we have the event’s id, do some more template-based stuff |
| 246 | if (!empty($params['template_id'])) { |
| 247 | $event = CRM_Event_BAO_Event::copy($params['template_id'], $params); |
| 248 | } |
| 249 | else { |
| 250 | $event = CRM_Event_BAO_Event::create($params); |
| 251 | } |
| 252 | |
| 253 | $this->set('id', $event->id); |
| 254 | |
| 255 | $this->postProcessHook(); |
| 256 | |
| 257 | if ($this->_action & CRM_Core_Action::ADD) { |
| 258 | $url = 'civicrm/event/manage/location'; |
| 259 | $urlParams = "action=update&reset=1&id={$event->id}"; |
| 260 | // special case for 'Save and Done' consistency. |
| 261 | if ($this->controller->getButtonName('submit') == '_qf_EventInfo_upload_done') { |
| 262 | $url = 'civicrm/event/manage'; |
| 263 | $urlParams = 'reset=1'; |
| 264 | CRM_Core_Session::setStatus(ts("'%1' information has been saved.", |
| 265 | [1 => $this->getTitle()] |
| 266 | ), ts('Saved'), 'success'); |
| 267 | } |
| 268 | |
| 269 | CRM_Utils_System::redirect(CRM_Utils_System::url($url, $urlParams)); |
| 270 | } |
| 271 | |
| 272 | parent::endPostProcess(); |
| 273 | } |
| 274 | |
| 275 | /** |
| 276 | * Return a descriptive name for the page, used in wizard header. |
| 277 | * |
| 278 | * @return string |
| 279 | */ |
| 280 | public function getTitle() { |
| 281 | return ts('Event Information and Settings'); |
| 282 | } |
| 283 | |
| 284 | } |