Ian province abbreviation patch - issue 724
[civicrm-core.git] / CRM / Event / Form / ManageEvent / Location.php
CommitLineData
6a488035
TO
1<?php
2/*
3 +--------------------------------------------------------------------+
7e9e8871 4 | CiviCRM version 4.7 |
6a488035 5 +--------------------------------------------------------------------+
e7112fa7 6 | Copyright CiviCRM LLC (c) 2004-2015 |
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 *
31 * @package CRM
e7112fa7 32 * @copyright CiviCRM LLC (c) 2004-2015
6a488035
TO
33 * $Id$
34 *
35 */
36
37/**
38 * This class generates form components for processing Event Location
39 * civicrm_event_page.
40 */
41class CRM_Event_Form_ManageEvent_Location extends CRM_Event_Form_ManageEvent {
42
43 /**
100fef9d 44 * How many locationBlocks should we display?
6a488035
TO
45 *
46 * @var int
47 * @const
48 */
7da04cde 49 const LOCATION_BLOCKS = 1;
6a488035
TO
50
51 /**
100fef9d 52 * The variable, for storing the location array
6a488035
TO
53 *
54 * @var array
55 */
56 protected $_locationIds = array();
57
58 /**
100fef9d 59 * The variable, for storing location block id with event
6a488035
TO
60 *
61 * @var int
62 */
63 protected $_oldLocBlockId = 0;
64
65 /**
66f9e52b 66 * Get the db values for this form.
6a488035
TO
67 */
68 public $_values = array();
69
70 /**
66f9e52b 71 * Set variables up before form is built.
6a488035
TO
72 *
73 * @return void
6a488035 74 */
00be9182 75 public function preProcess() {
6a488035
TO
76 parent::preProcess();
77
78 $this->_values = $this->get('values');
79 if ($this->_id && empty($this->_values)) {
6a488035
TO
80 //get location values.
81 $params = array(
82 'entity_id' => $this->_id,
83 'entity_table' => 'civicrm_event',
84 );
85 $this->_values = CRM_Core_BAO_Location::getValues($params);
86
87 //get event values.
88 $params = array('id' => $this->_id);
89 CRM_Event_BAO_Event::retrieve($params, $this->_values);
90 $this->set('values', $this->_values);
91 }
be84b210 92
93 //location blocks.
94 CRM_Contact_Form_Location::preProcess($this);
6a488035
TO
95 }
96
97 /**
c490a46a 98 * Set default values for the form. Note that in edit/view mode
6a488035
TO
99 * the default values are retrieved from the database
100 *
6a488035 101 *
355ba699 102 * @return void
6a488035 103 */
00be9182 104 public function setDefaultValues() {
6a488035
TO
105 $defaults = $this->_values;
106
5d92a7e7 107 if (!empty($defaults['loc_block_id'])) {
6a488035
TO
108 $defaults['loc_event_id'] = $defaults['loc_block_id'];
109 $countLocUsed = CRM_Event_BAO_Event::countEventsUsingLocBlockId($defaults['loc_block_id']);
62a0f5a1 110 $this->assign('locUsed', $countLocUsed);
6a488035
TO
111 }
112
113 $config = CRM_Core_Config::singleton();
114 if (!isset($defaults['address'][1]['country_id'])) {
115 $defaults['address'][1]['country_id'] = $config->defaultContactCountry;
116 }
03e04002 117
6a488035
TO
118 if (!isset($defaults['address'][1]['state_province_id'])) {
119 $defaults['address'][1]['state_province_id'] = $config->defaultContactStateProvince;
120 }
121
6a488035
TO
122 $defaults['location_option'] = $this->_oldLocBlockId ? 2 : 1;
123
124 return $defaults;
125 }
126
127 /**
66f9e52b 128 * Add local and global form rules.
6a488035 129 *
6a488035
TO
130 *
131 * @return void
132 */
00be9182 133 public function addRules() {
6a488035
TO
134 $this->addFormRule(array('CRM_Event_Form_ManageEvent_Location', 'formRule'));
135 }
136
137 /**
66f9e52b 138 * Global validation rules for the form.
6a488035 139 *
d4dd1e85
TO
140 * @param array $fields
141 * Posted values of the form.
6a488035 142 *
a6c01b45
CW
143 * @return array
144 * list of errors to be posted back to the form
6a488035 145 */
00be9182 146 public static function formRule($fields) {
6a488035 147 // check for state/country mapping
ac79e2f5 148 $errors = CRM_Contact_Form_Edit_Address::formRule($fields, CRM_Core_DAO::$_nullArray, CRM_Core_DAO::$_nullObject);
6a488035
TO
149
150 return empty($errors) ? TRUE : $errors;
151 }
152
153 /**
66f9e52b 154 * function to build location block.
6a488035 155 *
355ba699 156 * @return void
6a488035
TO
157 */
158 public function buildQuickForm() {
159 //load form for child blocks
160 if ($this->_addBlockName) {
0e6e8724
DL
161 $className = "CRM_Contact_Form_Edit_{$this->_addBlockName}";
162 return $className::buildQuickForm($this);
6a488035
TO
163 }
164
165 $this->applyFilter('__ALL__', 'trim');
166
167 //build location blocks.
168 CRM_Contact_Form_Location::buildQuickForm($this);
169
170 //fix for CRM-1971
171 $this->assign('action', $this->_action);
172
173 if ($this->_id) {
174 $this->_oldLocBlockId = CRM_Core_DAO::getFieldValue('CRM_Event_DAO_Event',
175 $this->_id, 'loc_block_id'
176 );
177 }
178
179 // get the list of location blocks being used by other events
03e04002 180
6a488035
TO
181 $locationEvents = CRM_Event_BAO_Event::getLocationEvents();
182 // remove duplicates and make sure that the duplicate entry with key as
183 // loc_block_id of this event (this->_id) is preserved
a7488080 184 if (!empty($locationEvents[$this->_oldLocBlockId])) {
6a488035
TO
185 $possibleDuplicate = $locationEvents[$this->_oldLocBlockId];
186 $locationEvents = array_flip(array_unique($locationEvents));
a7488080 187 if (!empty($locationEvents[$possibleDuplicate])) {
6a488035
TO
188 $locationEvents[$possibleDuplicate] = $this->_oldLocBlockId;
189 }
190 $locationEvents = array_flip($locationEvents);
191 }
192 else {
193 $locationEvents = array_unique($locationEvents);
194 }
195
196 $events = array();
197 if (!empty($locationEvents)) {
198 $this->assign('locEvents', TRUE);
0479b4c8 199 $optionTypes = array(
353ffa53 200 '1' => ts('Create new location'),
6a488035
TO
201 '2' => ts('Use existing location'),
202 );
203
62a0f5a1 204 $this->addRadio('location_option', ts("Choose Location"), $optionTypes);
6a488035
TO
205
206 if (!isset($locationEvents[$this->_oldLocBlockId]) || (!$this->_oldLocBlockId)) {
389bcebf 207 $locationEvents = array('' => ts('- select -')) + $locationEvents;
6a488035
TO
208 }
209 $this->add('select', 'loc_event_id', ts('Use Location'), $locationEvents);
210 }
211 $this->addElement('advcheckbox', 'is_show_location', ts('Show Location?'));
212 parent::buildQuickForm();
213 }
214
215 /**
66f9e52b 216 * Process the form submission.
6a488035 217 *
6a488035 218 *
355ba699 219 * @return void
6a488035
TO
220 */
221 public function postProcess() {
222 $params = $this->exportValues();
223 $deleteOldBlock = FALSE;
224
225 // if 'use existing location' option is selected -
8cc574cf 226 if (CRM_Utils_Array::value('location_option', $params) == 2 && !empty($params['loc_event_id']) &&
6a488035
TO
227 ($params['loc_event_id'] != $this->_oldLocBlockId)
228 ) {
229 // if new selected loc is different from old loc, update the loc_block_id
230 // so that loc update would affect the selected loc and not the old one.
231 $deleteOldBlock = TRUE;
232 CRM_Core_DAO::setFieldValue('CRM_Event_DAO_Event', $this->_id,
233 'loc_block_id', $params['loc_event_id']
234 );
235 }
236
237 // if 'create new loc' option is selected, set the loc_block_id for this event to null
238 // so that an update would result in creating a new loc.
239 if ($this->_oldLocBlockId && (CRM_Utils_Array::value('location_option', $params) == 1)) {
240 $deleteOldBlock = TRUE;
241 CRM_Core_DAO::setFieldValue('CRM_Event_DAO_Event', $this->_id,
242 'loc_block_id', 'null'
243 );
244 }
245
246 // if 'create new loc' optioin is selected OR selected new loc is different
247 // from old one, go ahead and delete the old loc provided thats not being
248 // used by any other event
249 if ($this->_oldLocBlockId && $deleteOldBlock) {
250 CRM_Event_BAO_Event::deleteEventLocBlock($this->_oldLocBlockId, $this->_id);
251 }
252
253 // get ready with location block params
254 $params['entity_table'] = 'civicrm_event';
255 $params['entity_id'] = $this->_id;
256
257 $defaultLocationType = CRM_Core_BAO_LocationType::getDefault();
258 foreach (array(
353ffa53
TO
259 'address',
260 'phone',
389bcebf 261 'email',
353ffa53 262 ) as $block) {
a7488080 263 if (empty($params[$block]) || !is_array($params[$block])) {
6a488035
TO
264 continue;
265 }
266 foreach ($params[$block] as $count => & $values) {
267 if ($count == 1) {
268 $values['is_primary'] = 1;
269 }
270 $values['location_type_id'] = ($defaultLocationType->id) ? $defaultLocationType->id : 1;
271 }
272 }
273
274 // create/update event location
275 $location = CRM_Core_BAO_Location::create($params, TRUE, 'event');
276 $params['loc_block_id'] = $location['id'];
277
278 // finally update event params
279 $params['id'] = $this->_id;
280 CRM_Event_BAO_Event::add($params);
281
5d92a7e7
CW
282 // Update tab "disabled" css class
283 $this->ajaxResponse['tabValid'] = TRUE;
6a488035
TO
284 parent::endPostProcess();
285 }
6a488035
TO
286
287 /**
288 * Return a descriptive name for the page, used in wizard header
289 *
290 * @return string
6a488035
TO
291 */
292 public function getTitle() {
293 return ts('Event Location');
294 }
96025800 295
6a488035 296}