Merge pull request #4892 from colemanw/INFRA-132
[civicrm-core.git] / CRM / Contact / Form / CustomData.php
CommitLineData
6a488035
TO
1<?php
2/*
3 +--------------------------------------------------------------------+
39de6fd5 4 | CiviCRM version 4.6 |
6a488035 5 +--------------------------------------------------------------------+
06b69b18 6 | Copyright CiviCRM LLC (c) 2004-2014 |
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 +--------------------------------------------------------------------+
26*/
27
28/**
29 *
30 * @package CRM
06b69b18 31 * @copyright CiviCRM LLC (c) 2004-2014
6a488035
TO
32 * $Id$
33 *
34 */
35
36/**
37 * This class generates form components for custom data
38 *
39 * It delegates the work to lower level subclasses and integrates the changes
40 * back in. It also uses a lot of functionality with the CRM API's, so any change
41 * made here could potentially affect the API etc. Be careful, be aware, use unit tests.
42 *
43 */
44class CRM_Contact_Form_CustomData extends CRM_Core_Form {
45
46 /**
47 * The table id, used when editing/creating custom data
48 *
49 * @var int
50 */
51 protected $_tableId;
52
53 /**
100fef9d 54 * Entity type of the table id
6a488035
TO
55 *
56 * @var string
57 */
58 protected $_entityType;
59
60 /**
100fef9d 61 * Entity sub type of the table id
6a488035
TO
62 *
63 * @var string
6a488035
TO
64 */
65 protected $_entitySubType;
66
67 /**
100fef9d 68 * The group tree data
6a488035
TO
69 *
70 * @var array
71 */
72 //protected $_groupTree;
73
74 /**
75 * Which blocks should we show and hide.
76 *
77 * @var CRM_Core_ShowHideBlocks
78 */
79 protected $_showHide;
80
81 /**
82 * Array group titles.
83 *
84 * @var array
85 */
86 protected $_groupTitle;
87
88 /**
89 * Array group display status.
90 *
91 * @var array
92 */
93 protected $_groupCollapseDisplay;
94
95 /**
100fef9d 96 * Custom group id
6a488035
TO
97 *
98 * @int
6a488035
TO
99 */
100 public $_groupID;
101
e41f4660 102 public $_multiRecordDisplay;
1dde099b
PJ
103
104 public $_copyValueId;
6a488035 105 /**
100fef9d 106 * Pre processing work done here.
6a488035
TO
107 *
108 * gets session variables for table name, id of entity in table, type of entity and stores them.
109 *
110 * @param
111 *
112 * @return void
113 *
6a488035 114 *
8ef12e64 115 */
00be9182 116 public function preProcess() {
6a488035 117 $this->_cdType = CRM_Utils_Array::value('type', $_GET);
6a488035 118 $this->assign('cdType', FALSE);
e41f4660
PJ
119 $this->_multiRecordDisplay = CRM_Utils_Request::retrieve('multiRecordDisplay', 'String', $this);
120 if ($this->_cdType || $this->_multiRecordDisplay == 'single') {
121 if ($this->_cdType) {
122 $this->assign('cdType', TRUE);
123 }
124 // NOTE : group id is not stored in session from within CRM_Custom_Form_CustomData::preProcess func
125 // this is due to some condition inside it which restricts it from saving in session
126 // so doing this for multi record edit action
9710b8d1 127 $entityId = CRM_Utils_Request::retrieve('entityID', 'Positive', $this);
22e263ad 128 if (!empty($entityId)) {
9710b8d1
RK
129 $subType = CRM_Contact_BAO_Contact::getContactSubType($entityId, ',');
130 }
131 CRM_Custom_Form_CustomData::preProcess($this, NULL, $subType, NULL, NULL, $entityId);
e41f4660
PJ
132 if ($this->_multiRecordDisplay) {
133 $this->_groupID = CRM_Utils_Request::retrieve('groupID', 'Positive', $this);
134 $this->_tableID = $this->_entityId;
bf076628
PJ
135 $this->_contactType = CRM_Contact_BAO_Contact::getContactType($this->_tableID);
136 $mode = CRM_Utils_Request::retrieve('mode', 'String', $this);
137 $hasReachedMax = CRM_Core_BAO_CustomGroup::hasReachedMaxLimit($this->_groupID, $this->_tableID);
138 if ($hasReachedMax && $mode == 'add') {
139 CRM_Core_Error::statusBounce(ts('The maximum record limit is reached'));
140 }
1dde099b 141 $this->_copyValueId = CRM_Utils_Request::retrieve('copyValueId', 'Positive', $this);
9cb02ab3 142
525faea3
PJ
143 $groupTitle = CRM_Core_BAO_CustomGroup::getTitle($this->_groupID);
144 $mode = CRM_Utils_Request::retrieve('mode', 'String', CRM_Core_DAO::$_nullObject, FALSE, NULL, 'GET');
145 $mode = ucfirst($mode);
146 CRM_Utils_System::setTitle(ts('%1 %2 Record', array(1 => $mode, 2 => $groupTitle)));
147
5f5a6693
PJ
148 if (!empty($_POST['hidden_custom'])) {
149 $this->assign('postedInfo', TRUE);
150 }
e41f4660
PJ
151 }
152 return;
6a488035 153 }
6a488035
TO
154 $this->_groupID = CRM_Utils_Request::retrieve('groupID', 'Positive', $this, TRUE);
155 $this->_tableID = CRM_Utils_Request::retrieve('tableId', 'Positive', $this, TRUE);
156
157 $this->_contactType = CRM_Contact_BAO_Contact::getContactType($this->_tableID);
158 $this->_contactSubType = CRM_Contact_BAO_Contact::getContactSubType($this->_tableID, ',');
159 $this->assign('contact_type', $this->_contactType);
160 $this->assign('contact_subtype', $this->_contactSubType);
161 list($displayName, $contactImage) = CRM_Contact_BAO_Contact::getDisplayAndImage($this->_tableID);
162 CRM_Utils_System::setTitle($displayName, $contactImage . ' ' . $displayName);
163
164 // when custom data is included in this page
a7488080 165 if (!empty($_POST['hidden_custom'])) {
6a488035
TO
166 for ($i = 0; $i <= $_POST['hidden_custom_group_count'][$this->_groupID]; $i++) {
167 CRM_Custom_Form_CustomData::preProcess($this, NULL, NULL, $i);
168 CRM_Custom_Form_CustomData::buildQuickForm($this);
169 CRM_Custom_Form_CustomData::setDefaultValues($this);
170 }
171 }
172 }
173
174 /**
c490a46a 175 * Build the form object
6a488035
TO
176 *
177 * @return void
6a488035
TO
178 */
179 public function buildQuickForm() {
e41f4660
PJ
180 if ($this->_cdType || $this->_multiRecordDisplay == 'single') {
181 // buttons display for multi-valued fields to perform independednt actions
182 if ($this->_multiRecordDisplay) {
183 $isMultiple = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomGroup',
184 $this->_groupID,
185 'is_multiple'
186 );
187 if ($isMultiple) {
188 $this->assign('multiRecordDisplay', $this->_multiRecordDisplay);
d3e86119 189 $saveButtonName = $this->_copyValueId ? 'Save a Copy' : 'Save';
e41f4660
PJ
190 $this->addButtons(array(
191 array(
192 'type' => 'upload',
1dde099b 193 'name' => ts('%1', array(1 => $saveButtonName)),
e41f4660
PJ
194 'isDefault' => TRUE,
195 ),
bf076628
PJ
196 array(
197 'type' => 'upload',
198 'name' => ts('Save and New'),
199 'subName' => 'new',
200 ),
e41f4660
PJ
201 array(
202 'type' => 'cancel',
203 'name' => ts('Cancel'),
204 ),
205 )
206 );
207 }
208 }
6a488035
TO
209 return CRM_Custom_Form_CustomData::buildQuickForm($this);
210 }
211
212 //need to assign custom data type and subtype to the template
213 $this->assign('entityID', $this->_tableID);
214 $this->assign('groupID', $this->_groupID);
215
216 // make this form an upload since we dont know if the custom data injected dynamically
217 // is of type file etc
218 $this->addButtons(array(
219 array(
220 'type' => 'upload',
221 'name' => ts('Save'),
222 'isDefault' => TRUE,
223 ),
224 array(
225 'type' => 'cancel',
226 'name' => ts('Cancel'),
227 ),
228 )
229 );
230 }
231
232 /**
233 * Set the default form values
234 *
6a488035
TO
235 *
236 * @return array the default array reference
237 */
00be9182 238 public function setDefaultValues() {
e41f4660 239 if ($this->_cdType || $this->_multiRecordDisplay == 'single') {
1dde099b
PJ
240 if ($this->_copyValueId) {
241 // cached tree is fetched
242 $groupTree = &CRM_Core_BAO_CustomGroup::getTree($this->_type,
243 $this,
244 $this->_entityId,
245 $this->_groupID
246 );
247 $valueIdDefaults = array();
248 $groupTreeValueId = CRM_Core_BAO_CustomGroup::formatGroupTree($groupTree, $this->_copyValueId, $this);
249 CRM_Core_BAO_CustomGroup::setDefaults($groupTreeValueId, $valueIdDefaults, FALSE, FALSE, $this->get('action'));
250 $tableId = $groupTreeValueId[$this->_groupID]['table_id'];
251 foreach ($valueIdDefaults as $valueIdElementName => $value) {
252 // build defaults for COPY action for new record saving
253 $valueIdElementNamePieces = explode('_', $valueIdElementName);
254 $valueIdElementNamePieces[2] = "-{$this->_groupCount}";
255 $elementName = implode('_', $valueIdElementNamePieces);
256 $customDefaultValue[$elementName] = $value;
257 }
258 }
259 else {
260 $customDefaultValue = CRM_Custom_Form_CustomData::setDefaultValues($this);
261 }
6a488035
TO
262 return $customDefaultValue;
263 }
264
265 $groupTree = &CRM_Core_BAO_CustomGroup::getTree($this->_contactType,
266 $this,
267 $this->_tableID,
268 $this->_groupID,
269 $this->_contactSubType
270 );
271
a7488080 272 if (empty($_POST['hidden_custom_group_count'])) {
6a488035
TO
273 // custom data building in edit mode (required to handle multi-value)
274 $groupTree = &CRM_Core_BAO_CustomGroup::getTree($this->_contactType, $this, $this->_tableID,
275 $this->_groupID, $this->_contactSubType
276 );
277 $customValueCount = CRM_Core_BAO_CustomGroup::buildCustomDataView($this, $groupTree, TRUE, $this->_groupID);
278 }
279 else {
280 $customValueCount = $_POST['hidden_custom_group_count'][$this->_groupID];
281 }
282
283 $this->assign('customValueCount', $customValueCount);
284
285 $defaults = array();
286 return $defaults;
287 }
288
289 /**
290 * Process the user submitted custom data values.
291 *
6a488035
TO
292 *
293 * @return void
294 */
295 public function postProcess() {
296 // Get the form values and groupTree
297 $params = $this->controller->exportValues($this->_name);
bf076628 298
6a488035
TO
299 CRM_Core_BAO_CustomValueTable::postProcess($params,
300 $this->_groupTree[$this->_groupID]['fields'],
301 'civicrm_contact',
302 $this->_tableID,
303 $this->_entityType
304 );
bf076628
PJ
305 $table = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomGroup', $this->_groupID, 'table_name');
306 $cgcount = CRM_Core_BAO_CustomGroup::customGroupDataExistsForEntity($this->_tableID, $table, TRUE);
307 $cgcount += 1;
308 $buttonName = $this->controller->getButtonName();
309 if ($buttonName == $this->getButtonName('upload', 'new')) {
310 CRM_Core_Session::singleton()->pushUserContext(CRM_Utils_System::url('civicrm/contact/view/cd/edit', "reset=1&type={$this->_contactType}&groupID={$this->_groupID}&entityID={$this->_tableID}&cgcount={$cgcount}&multiRecordDisplay=single&mode=add"));
311 }
6a488035
TO
312 // reset the group contact cache for this group
313 CRM_Contact_BAO_GroupContactCache::remove();
314 }
ef10e0b5 315}