Commit | Line | Data |
---|---|---|
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 | +--------------------------------------------------------------------+ | |
d25dd0ee | 26 | */ |
6a488035 TO |
27 | |
28 | /** | |
29 | * | |
30 | * @package CRM | |
06b69b18 | 31 | * @copyright CiviCRM LLC (c) 2004-2014 |
6a488035 TO |
32 | * $Id$ |
33 | * | |
34 | */ | |
150f50c1 | 35 | class CRM_Contact_Form_Edit_TagsAndGroups { |
6a488035 TO |
36 | |
37 | /** | |
fe482240 | 38 | * Constant to determine which forms we are generating. |
6a488035 TO |
39 | * |
40 | * Used by both profile and edit contact | |
41 | */ | |
7da04cde | 42 | const GROUP = 1, TAG = 2, ALL = 3; |
6a488035 TO |
43 | |
44 | /** | |
fe482240 | 45 | * build form elements. |
6a488035 TO |
46 | * params object $form object of the form |
47 | * | |
77c5b619 TO |
48 | * @param CRM_Core_Form $form |
49 | * The form object that we are operating on. | |
50 | * @param int $contactId | |
51 | * Contact id. | |
52 | * @param int $type | |
53 | * What components are we interested in. | |
54 | * @param bool $visibility | |
55 | * Visibility of the field. | |
77b97be7 | 56 | * @param null $isRequired |
77c5b619 TO |
57 | * @param string $groupName |
58 | * If used for building group block. | |
59 | * @param string $tagName | |
60 | * If used for building tag block. | |
61 | * @param string $fieldName | |
62 | * This is used in batch profile(i.e to build multiple blocks). | |
77b97be7 EM |
63 | * |
64 | * @param string $groupElementType | |
6a488035 | 65 | * |
6a488035 | 66 | */ |
ae5ffbb7 | 67 | public static function buildQuickForm( |
51ccfbbe | 68 | &$form, |
150f50c1 CW |
69 | $contactId = 0, |
70 | $type = self::ALL, | |
6a488035 TO |
71 | $visibility = FALSE, |
72 | $isRequired = NULL, | |
150f50c1 CW |
73 | $groupName = 'Group(s)', |
74 | $tagName = 'Tag(s)', | |
c18f95b7 PJ |
75 | $fieldName = NULL, |
76 | $groupElementType = 'checkbox' | |
6a488035 TO |
77 | ) { |
78 | if (!isset($form->_tagGroup)) { | |
79 | $form->_tagGroup = array(); | |
80 | } | |
81 | ||
82 | // NYSS 5670 | |
83 | if (!$contactId && !empty($form->_contactId)) { | |
84 | $contactId = $form->_contactId; | |
85 | } | |
86 | ||
150f50c1 CW |
87 | $type = (int) $type; |
88 | if ($type & self::GROUP) { | |
6a488035 TO |
89 | |
90 | $fName = 'group'; | |
91 | if ($fieldName) { | |
92 | $fName = $fieldName; | |
93 | } | |
94 | ||
6a488035 TO |
95 | $groupID = isset($form->_grid) ? $form->_grid : NULL; |
96 | if ($groupID && $visibility) { | |
f828fa2c | 97 | $ids = array($groupID => $groupID); |
6a488035 TO |
98 | } |
99 | else { | |
100 | if ($visibility) { | |
101 | $group = CRM_Core_PseudoConstant::allGroup(); | |
102 | } | |
103 | else { | |
104 | $group = CRM_Core_PseudoConstant::group(); | |
105 | } | |
f828fa2c | 106 | $ids = $group; |
6a488035 TO |
107 | } |
108 | ||
109 | if ($groupID || !empty($group)) { | |
110 | $groups = CRM_Contact_BAO_Group::getGroupsHierarchy($ids); | |
111 | ||
112 | $attributes['skiplabel'] = TRUE; | |
c18f95b7 PJ |
113 | $elements = array(); |
114 | $groupsOptions = array(); | |
6a488035 TO |
115 | foreach ($groups as $id => $group) { |
116 | // make sure that this group has public visibility | |
117 | if ($visibility && | |
118 | $group['visibility'] == 'User and User Admin Only' | |
119 | ) { | |
120 | continue; | |
121 | } | |
77b97be7 | 122 | |
ab345ca5 | 123 | if ($groupElementType == 'select') { |
c18f95b7 PJ |
124 | $groupsOptions[$id] = $group['title']; |
125 | } | |
126 | else { | |
127 | $form->_tagGroup[$fName][$id]['description'] = $group['description']; | |
128 | $elements[] = &$form->addElement('advcheckbox', $id, NULL, $group['title'], $attributes); | |
129 | } | |
130 | } | |
131 | ||
ab345ca5 | 132 | if ($groupElementType == 'select' && !empty($groupsOptions)) { |
c18f95b7 | 133 | $form->add('select', $fName, ts('%1', array(1 => $groupName)), $groupsOptions, FALSE, |
ab345ca5 | 134 | array('id' => $fName, 'multiple' => 'multiple', 'class' => 'crm-select2') |
c18f95b7 PJ |
135 | ); |
136 | $form->assign('groupCount', count($groupsOptions)); | |
6a488035 TO |
137 | } |
138 | ||
c18f95b7 | 139 | if ($groupElementType == 'checkbox' && !empty($elements)) { |
6a488035 TO |
140 | $form->addGroup($elements, $fName, $groupName, ' <br />'); |
141 | $form->assign('groupCount', count($elements)); | |
142 | if ($isRequired) { | |
143 | $form->addRule($fName, ts('%1 is a required field.', array(1 => $groupName)), 'required'); | |
144 | } | |
145 | } | |
c18f95b7 | 146 | $form->assign('groupElementType', $groupElementType); |
6a488035 TO |
147 | } |
148 | } | |
149 | ||
150f50c1 | 150 | if ($type & self::TAG) { |
6dac2504 T |
151 | // CODE FROM CRM/Tag/Form/Tag.php // |
152 | CRM_Core_Resources::singleton() | |
153 | ->addScriptFile('civicrm', 'packages/jquery/plugins/jstree/jquery.jstree.js', 0, 'html-header', FALSE) | |
154 | ->addStyleFile('civicrm', 'packages/jquery/plugins/jstree/themes/default/style.css', 0, 'html-header'); | |
155 | ||
6a488035 TO |
156 | $fName = 'tag'; |
157 | if ($fieldName) { | |
158 | $fName = $fieldName; | |
159 | } | |
160 | $form->_tagGroup[$fName] = 1; | |
6dac2504 T |
161 | |
162 | // get the list of all the categories | |
163 | $tags = new CRM_Core_BAO_Tag(); | |
164 | $tree = $tags->getTree('civicrm_contact', TRUE); | |
165 | ||
6a488035 | 166 | $elements = array(); |
6dac2504 | 167 | self::climbtree($form, $tree, $elements); |
6a488035 | 168 | |
6dac2504 T |
169 | $form->addGroup($elements, $fName, $tagName, '<br />'); |
170 | $form->assign('tagCount', count($elements)); | |
171 | $form->assign('tree', $tree); | |
172 | $form->assign('tag', $tree); | |
173 | $form->assign('entityID', $contactId); | |
174 | $form->assign('entityTable', 'civicrm_contact'); | |
6a488035 TO |
175 | |
176 | if ($isRequired) { | |
177 | $form->addRule($fName, ts('%1 is a required field.', array(1 => $tagName)), 'required'); | |
178 | } | |
179 | ||
180 | // build tag widget | |
181 | $parentNames = CRM_Core_BAO_Tag::getTagSet('civicrm_contact'); | |
47bc9cec | 182 | CRM_Core_Form_Tag::buildQuickForm($form, $parentNames, 'civicrm_contact', $contactId, FALSE, TRUE); |
6a488035 TO |
183 | } |
184 | $form->assign('tagGroup', $form->_tagGroup); | |
185 | } | |
4a679824 | 186 | |
2e2605fe EM |
187 | /** |
188 | * Climb tree. | |
189 | * | |
190 | * @param $form | |
191 | * @param $tree | |
192 | * @param $elements | |
193 | * | |
194 | * @return mixed | |
195 | */ | |
00be9182 | 196 | public static function climbtree($form, $tree, &$elements) { |
6dac2504 T |
197 | foreach ($tree as $tagID => $varValue) { |
198 | $tagAttribute = array( | |
353ffa53 TO |
199 | 'onclick' => "return changeRowColor(\"rowidtag_$tagID\")", |
200 | 'id' => "tag_{$tagID}", | |
6dac2504 T |
201 | ); |
202 | ||
203 | $elements[$tagID] = $form->createElement('checkbox', $tagID, '', '', $tagAttribute); | |
204 | ||
205 | if (array_key_exists('children', $varValue)) { | |
206 | self::climbtree($form, $varValue['children'], $elements); | |
207 | } | |
208 | } | |
51ccfbbe | 209 | return $elements; |
6dac2504 | 210 | } |
6a488035 TO |
211 | |
212 | /** | |
fe482240 | 213 | * Set defaults for relevant form elements. |
6a488035 | 214 | * |
77c5b619 TO |
215 | * @param int $id |
216 | * The contact id. | |
217 | * @param array $defaults | |
218 | * The defaults array to store the values in. | |
219 | * @param int $type | |
220 | * What components are we interested in. | |
221 | * @param string $fieldName | |
222 | * This is used in batch profile(i.e to build multiple blocks). | |
6a488035 | 223 | * |
77b97be7 EM |
224 | * @param string $groupElementType |
225 | * | |
6a488035 | 226 | * @return void |
6a488035 | 227 | */ |
00be9182 | 228 | public static function setDefaults($id, &$defaults, $type = self::ALL, $fieldName = NULL, $groupElementType = 'checkbox') { |
6a488035 TO |
229 | $type = (int ) $type; |
230 | if ($type & self::GROUP) { | |
231 | $fName = 'group'; | |
232 | if ($fieldName) { | |
233 | $fName = $fieldName; | |
234 | } | |
235 | ||
236 | $contactGroup = CRM_Contact_BAO_GroupContact::getContactGroup($id, 'Added', NULL, FALSE, TRUE); | |
237 | if ($contactGroup) { | |
238 | foreach ($contactGroup as $group) { | |
ab345ca5 | 239 | if ($groupElementType == 'select') { |
c18f95b7 PJ |
240 | $defaults[$fName][] = $group['group_id']; |
241 | } | |
242 | else { | |
243 | $defaults[$fName . '[' . $group['group_id'] . ']'] = 1; | |
244 | } | |
6a488035 TO |
245 | } |
246 | } | |
247 | } | |
248 | ||
249 | if ($type & self::TAG) { | |
250 | $fName = 'tag'; | |
251 | if ($fieldName) { | |
252 | $fName = $fieldName; | |
253 | } | |
254 | ||
255 | $contactTag = CRM_Core_BAO_EntityTag::getTag($id); | |
256 | if ($contactTag) { | |
257 | foreach ($contactTag as $tag) { | |
258 | $defaults[$fName . '[' . $tag . ']'] = 1; | |
259 | } | |
260 | } | |
261 | } | |
262 | } | |
263 | ||
264 | /** | |
c490a46a | 265 | * Set default values for the form. Note that in edit/view mode |
6a488035 TO |
266 | * the default values are retrieved from the database |
267 | * | |
6a488035 | 268 | * |
c490a46a | 269 | * @param CRM_Core_Form $form |
77b97be7 EM |
270 | * @param $defaults |
271 | * | |
355ba699 | 272 | * @return void |
6a488035 TO |
273 | */ |
274 | public static function setDefaultValues(&$form, &$defaults) { | |
275 | $contactEditOptions = $form->get('contactEditOptions'); | |
c18f95b7 | 276 | |
6a488035 TO |
277 | if ($form->_action & CRM_Core_Action::ADD) { |
278 | if (array_key_exists('TagsAndGroups', $contactEditOptions)) { | |
279 | // set group and tag defaults if any | |
280 | if ($form->_gid) { | |
281 | $defaults['group'][$form->_gid] = 1; | |
282 | } | |
283 | if ($form->_tid) { | |
284 | $defaults['tag'][$form->_tid] = 1; | |
285 | } | |
286 | } | |
287 | } | |
288 | else { | |
289 | if (array_key_exists('TagsAndGroups', $contactEditOptions)) { | |
290 | // set the group and tag ids | |
c18f95b7 PJ |
291 | $groupElementType = 'checkbox'; |
292 | if (CRM_Utils_System::getClassName($form) == 'CRM_Contact_Form_Contact') { | |
ab345ca5 | 293 | $groupElementType = 'select'; |
c18f95b7 PJ |
294 | } |
295 | self::setDefaults($form->_contactId, $defaults, self::ALL, NULL, $groupElementType); | |
6a488035 TO |
296 | } |
297 | } | |
298 | } | |
96025800 | 299 | |
232624b1 | 300 | } |