Commit | Line | Data |
---|---|---|
6a488035 | 1 | <?php |
0eea664b | 2 | |
aba1cd8b EM |
3 | /** |
4 | * Class CRM_Core_BAO_CustomFieldTest | |
8392a043 | 5 | * |
acb109b7 | 6 | * @group headless |
aba1cd8b | 7 | */ |
6a488035 | 8 | class CRM_Core_BAO_CustomFieldTest extends CiviUnitTestCase { |
6a488035 | 9 | |
8392a043 | 10 | use CRMTraits_Custom_CustomDataTrait; |
11 | ||
c6b559da | 12 | protected $customFieldID; |
13 | ||
cef2e96c | 14 | /** |
15 | * Clean up after test. | |
16 | * | |
17 | * @throws \Exception | |
18 | */ | |
19 | public function tearDown() { | |
20 | $this->quickCleanup([], TRUE); | |
21 | parent::tearDown(); | |
22 | } | |
23 | ||
c4817841 | 24 | /** |
25 | * Test creating a custom field. | |
26 | */ | |
08e37a2a | 27 | public function testCreateCustomField() { |
c6b559da | 28 | $customGroup = $this->createCustomField(); |
08e37a2a | 29 | $customFieldID = $this->assertDBNotNull('CRM_Core_DAO_CustomField', $customGroup['id'], 'id', 'custom_group_id', |
6a488035 TO |
30 | 'Database check for created CustomField.' |
31 | ); | |
c4817841 | 32 | $fields = [ |
6a488035 TO |
33 | 'id' => $customFieldID, |
34 | 'label' => 'editTestFld', | |
35 | 'is_active' => 1, | |
36 | 'data_type' => 'String', | |
37 | 'html_type' => 'Text', | |
08e37a2a | 38 | 'custom_group_id' => $customGroup['id'], |
c4817841 | 39 | ]; |
6a488035 | 40 | |
08e37a2a | 41 | CRM_Core_BAO_CustomField::create($fields); |
6a488035 TO |
42 | $this->assertDBNotNull('CRM_Core_DAO_CustomField', 1, 'id', 'is_active', 'Database check for edited CustomField.'); |
43 | $this->assertDBNotNull('CRM_Core_DAO_CustomField', $fields['label'], 'id', 'label', 'Database check for edited CustomField.'); | |
44 | ||
8b3b9a2e ARW |
45 | $dbFieldName = $this->assertDBNotNull('CRM_Core_DAO_CustomField', $customFieldID, 'name', 'id', 'Database check for edited CustomField.'); |
46 | $dbColumnName = $this->assertDBNotNull('CRM_Core_DAO_CustomField', $customFieldID, 'column_name', 'id', 'Database check for edited CustomField.'); | |
47 | $this->assertEquals(strtolower("{$dbFieldName}_{$customFieldID}"), $dbColumnName, | |
92915c55 | 48 | "Column name ends in ID"); |
8b3b9a2e | 49 | |
08e37a2a | 50 | $this->customGroupDelete($customGroup['id']); |
8b3b9a2e | 51 | } |
b2042573 | 52 | |
c4817841 | 53 | /** |
54 | * Test custom field create accepts passed column name. | |
55 | */ | |
08e37a2a | 56 | public function testCreateCustomFieldColumnName() { |
c4817841 | 57 | $customGroup = $this->customGroupCreate(['extends' => 'Individual']); |
58 | $fields = [ | |
8b3b9a2e ARW |
59 | 'label' => 'testFld 2', |
60 | 'column_name' => 'special_colname', | |
61 | 'data_type' => 'String', | |
62 | 'html_type' => 'Text', | |
08e37a2a | 63 | 'custom_group_id' => $customGroup['id'], |
c4817841 | 64 | ]; |
08e37a2a | 65 | CRM_Core_BAO_CustomField::create($fields); |
66 | $customFieldID = $this->assertDBNotNull('CRM_Core_DAO_CustomField', $customGroup['id'], 'id', 'custom_group_id', | |
8b3b9a2e ARW |
67 | 'Database check for created CustomField.' |
68 | ); | |
69 | $dbColumnName = $this->assertDBNotNull('CRM_Core_DAO_CustomField', $customFieldID, 'column_name', 'id', 'Database check for edited CustomField.'); | |
70 | $this->assertEquals($fields['column_name'], $dbColumnName, | |
92915c55 | 71 | "Column name set as specified"); |
8b3b9a2e | 72 | |
08e37a2a | 73 | $this->customGroupDelete($customGroup['id']); |
6a488035 TO |
74 | } |
75 | ||
c4817841 | 76 | /** |
77 | * Test that name is used for the column. | |
78 | */ | |
08e37a2a | 79 | public function testCreateCustomFieldName() { |
c4817841 | 80 | $customGroup = $this->customGroupCreate(['extends' => 'Individual']); |
81 | $fields = [ | |
43ff3196 TO |
82 | 'label' => 'testFld 2', |
83 | 'name' => 'special_fldlname', | |
84 | 'data_type' => 'String', | |
85 | 'html_type' => 'Text', | |
08e37a2a | 86 | 'custom_group_id' => $customGroup['id'], |
c4817841 | 87 | ]; |
08e37a2a | 88 | CRM_Core_BAO_CustomField::create($fields); |
89 | $customFieldID = $this->assertDBNotNull('CRM_Core_DAO_CustomField', $customGroup['id'], 'id', 'custom_group_id', | |
43ff3196 TO |
90 | 'Database check for created CustomField.' |
91 | ); | |
92 | $dbFieldName = $this->assertDBNotNull('CRM_Core_DAO_CustomField', $customFieldID, 'name', 'id', 'Database check for edited CustomField.'); | |
93 | $this->assertEquals($fields['name'], $dbFieldName, | |
94 | "Column name set as specified"); | |
95 | ||
08e37a2a | 96 | $this->customGroupDelete($customGroup['id']); |
43ff3196 TO |
97 | } |
98 | ||
c4817841 | 99 | /** |
100 | * Test get fields function. | |
101 | */ | |
00be9182 | 102 | public function testGetFields() { |
c4817841 | 103 | $customGroup = $this->customGroupCreate(['extends' => 'Individual']); |
104 | $fields = [ | |
6a488035 TO |
105 | 'label' => 'testFld1', |
106 | 'data_type' => 'String', | |
107 | 'html_type' => 'Text', | |
108 | 'is_active' => 1, | |
08e37a2a | 109 | 'custom_group_id' => $customGroup['id'], |
c4817841 | 110 | ]; |
08e37a2a | 111 | CRM_Core_BAO_CustomField::create($fields); |
112 | $this->assertDBNotNull('CRM_Core_DAO_CustomField', $customGroup['id'], 'id', 'custom_group_id', | |
6a488035 TO |
113 | 'Database check for created CustomField.' |
114 | ); | |
c4817841 | 115 | $fields = [ |
6a488035 TO |
116 | 'label' => 'testFld2', |
117 | 'data_type' => 'String', | |
118 | 'html_type' => 'Text', | |
119 | 'is_active' => 1, | |
08e37a2a | 120 | 'custom_group_id' => $customGroup['id'], |
c4817841 | 121 | ]; |
08e37a2a | 122 | CRM_Core_BAO_CustomField::create($fields); |
123 | $this->assertDBNotNull('CRM_Core_DAO_CustomField', $customGroup['id'], 'id', 'custom_group_id', | |
6a488035 TO |
124 | 'Database check for created CustomField.' |
125 | ); | |
6a488035 | 126 | |
08e37a2a | 127 | $this->customGroupDelete($customGroup['id']); |
6a488035 TO |
128 | } |
129 | ||
c4817841 | 130 | /** |
131 | * @throws \Exception | |
132 | */ | |
00be9182 | 133 | public function testGetDisplayedValues() { |
c4817841 | 134 | $customGroup = $this->customGroupCreate(['extends' => 'Individual']); |
135 | $fieldsToCreate = [ | |
136 | [ | |
d5c86914 CW |
137 | 'data_type' => 'Country', |
138 | 'html_type' => 'Select Country', | |
c4817841 | 139 | 'tests' => [ |
602b60e0 | 140 | 'United States' => 1228, |
d5c86914 | 141 | '' => NULL, |
c4817841 | 142 | ], |
143 | ], | |
144 | [ | |
d5c86914 CW |
145 | 'data_type' => 'StateProvince', |
146 | 'html_type' => 'Multi-Select State/Province', | |
c4817841 | 147 | 'tests' => [ |
d5c86914 CW |
148 | '' => 0, |
149 | 'Alabama' => 1000, | |
c4817841 | 150 | 'Alabama, Alaska' => [1000, 1001], |
151 | ], | |
152 | ], | |
153 | [ | |
d5c86914 CW |
154 | 'data_type' => 'String', |
155 | 'html_type' => 'Radio', | |
c4817841 | 156 | 'option_values' => [ |
d5c86914 | 157 | 'key' => 'KeyLabel', |
c4817841 | 158 | ], |
159 | 'tests' => [ | |
d5c86914 | 160 | 'KeyLabel' => 'key', |
c4817841 | 161 | ], |
162 | ], | |
163 | [ | |
d5c86914 CW |
164 | 'data_type' => 'String', |
165 | 'html_type' => 'CheckBox', | |
c4817841 | 166 | 'option_values' => [ |
d5c86914 CW |
167 | 'key1' => 'Label1', |
168 | 'key2' => 'Label2', | |
169 | 'key3' => 'Label3', | |
170 | 'key4' => 'Label4', | |
c4817841 | 171 | ], |
172 | 'tests' => [ | |
173 | 'Label1' => ['key1'], | |
d5c86914 | 174 | 'Label2' => 'key2', |
c4817841 | 175 | 'Label2, Label3' => ['key2', 'key3'], |
176 | 'Label3, Label4' => CRM_Utils_Array::implodePadded(['key3', 'key4']), | |
177 | 'Label1, Label4' => ['key1' => 1, 'key4' => 1], | |
178 | ], | |
179 | ], | |
180 | [ | |
d5c86914 CW |
181 | 'data_type' => 'Date', |
182 | 'html_type' => 'Select Date', | |
183 | 'date_format' => 'd M yy', | |
184 | 'time_format' => 1, | |
c4817841 | 185 | 'tests' => [ |
d5c86914 CW |
186 | '1 Jun 1999 1:30PM' => '1999-06-01 13:30', |
187 | '' => '', | |
c4817841 | 188 | ], |
189 | ], | |
190 | ]; | |
d5c86914 | 191 | foreach ($fieldsToCreate as $num => $field) { |
c4817841 | 192 | $params = $field + ['label' => 'test field ' . $num, 'custom_group_id' => $customGroup['id']]; |
d5c86914 CW |
193 | unset($params['tests']); |
194 | $createdField = $this->callAPISuccess('customField', 'create', $params); | |
195 | foreach ($field['tests'] as $expected => $input) { | |
196 | $this->assertEquals($expected, CRM_Core_BAO_CustomField::displayValue($input, $createdField['id'])); | |
197 | } | |
198 | } | |
6a488035 | 199 | |
08e37a2a | 200 | $this->customGroupDelete($customGroup['id']); |
6a488035 TO |
201 | } |
202 | ||
c4817841 | 203 | /** |
204 | * Test CRM_Core_BAO_CustomField::displayValue. | |
205 | * | |
206 | * @throws \CRM_Core_Exception | |
207 | * @throws \Exception | |
208 | */ | |
17369736 AS |
209 | public function testGetDisplayedValuesContactRef() { |
210 | $customGroup = $this->customGroupCreate(['extends' => 'Individual']); | |
211 | $params = [ | |
212 | 'data_type' => 'ContactReference', | |
213 | 'html_type' => 'Autocomplete-Select', | |
214 | 'label' => 'test ref', | |
215 | 'custom_group_id' => $customGroup['id'], | |
216 | ]; | |
217 | $createdField = $this->callAPISuccess('customField', 'create', $params); | |
218 | $contact1 = $this->individualCreate(); | |
219 | $contact2 = $this->individualCreate(['custom_' . $createdField['id'] => $contact1['id']]); | |
220 | ||
221 | $this->assertEquals($contact1['display_name'], CRM_Core_BAO_CustomField::displayValue($contact2['id'], $createdField['id'])); | |
222 | $this->assertEquals("Bob", CRM_Core_BAO_CustomField::displayValue("Bob", $createdField['id'])); | |
223 | ||
224 | $this->contactDelete($contact2['id']); | |
225 | $this->contactDelete($contact1['id']); | |
226 | $this->customGroupDelete($customGroup['id']); | |
227 | } | |
228 | ||
08e37a2a | 229 | public function testDeleteCustomField() { |
c4817841 | 230 | $customGroup = $this->customGroupCreate(['extends' => 'Individual']); |
231 | $fields = [ | |
08e37a2a | 232 | 'custom_group_id' => $customGroup['id'], |
8b3b9a2e | 233 | 'label' => 'Throwaway Field', |
d9136461 | 234 | 'dataType' => 'Memo', |
235 | 'htmlType' => 'TextArea', | |
c4817841 | 236 | ]; |
6a488035 | 237 | |
08e37a2a | 238 | $customField = $this->customFieldCreate($fields); |
239 | $fieldObject = new CRM_Core_BAO_CustomField(); | |
240 | $fieldObject->id = $customField['id']; | |
241 | $fieldObject->find(TRUE); | |
242 | CRM_Core_BAO_CustomField::deleteField($fieldObject); | |
243 | $this->assertDBNull('CRM_Core_DAO_CustomField', $customGroup['id'], 'id', | |
6a488035 TO |
244 | 'custom_group_id', 'Database check for deleted Custom Field.' |
245 | ); | |
08e37a2a | 246 | $this->customGroupDelete($customGroup['id']); |
6a488035 TO |
247 | } |
248 | ||
249 | /** | |
08e37a2a | 250 | * Move a custom field from $groupA to $groupB. |
251 | * | |
252 | * Make sure that data records are correctly matched and created. | |
c4817841 | 253 | * |
254 | * @throws \CRM_Core_Exception | |
6a488035 | 255 | */ |
00be9182 | 256 | public function testMoveField() { |
6a488035 | 257 | $countriesByName = array_flip(CRM_Core_PseudoConstant::country(FALSE, FALSE)); |
602b60e0 | 258 | $this->assertTrue($countriesByName['Andorra'] > 0); |
c4817841 | 259 | $groups = [ |
260 | 'A' => $this->customGroupCreate([ | |
92915c55 TO |
261 | 'title' => 'Test_Group A', |
262 | 'name' => 'test_group_a', | |
c4817841 | 263 | 'extends' => ['Individual'], |
92915c55 TO |
264 | 'style' => 'Inline', |
265 | 'is_multiple' => 0, | |
266 | 'is_active' => 1, | |
267 | 'version' => 3, | |
c4817841 | 268 | ]), |
269 | 'B' => $this->customGroupCreate([ | |
92915c55 TO |
270 | 'title' => 'Test_Group B', |
271 | 'name' => 'test_group_b', | |
c4817841 | 272 | 'extends' => ['Individual'], |
92915c55 TO |
273 | 'style' => 'Inline', |
274 | 'is_multiple' => 0, | |
275 | 'is_active' => 1, | |
276 | 'version' => 3, | |
c4817841 | 277 | ]), |
278 | ]; | |
08e37a2a | 279 | $groupA = $groups['A']['values'][$groups['A']['id']]; |
280 | $groupB = $groups['B']['values'][$groups['B']['id']]; | |
c4817841 | 281 | $countryA = $this->customFieldCreate([ |
08e37a2a | 282 | 'custom_group_id' => $groups['A']['id'], |
283 | 'label' => 'Country A', | |
284 | 'dataType' => 'Country', | |
285 | 'htmlType' => 'Select Country', | |
286 | 'default_value' => NULL, | |
c4817841 | 287 | ]); |
288 | $countryB = $this->customFieldCreate([ | |
08e37a2a | 289 | 'custom_group_id' => $groups['A']['id'], |
290 | 'label' => 'Country B', | |
291 | 'dataType' => 'Country', | |
292 | 'htmlType' => 'Select Country', | |
293 | 'default_value' => NULL, | |
c4817841 | 294 | ]); |
295 | $countryC = $this->customFieldCreate([ | |
08e37a2a | 296 | 'custom_group_id' => $groups['B']['id'], |
297 | 'label' => 'Country C', | |
298 | 'dataType' => 'Country', | |
299 | 'htmlType' => 'Select Country', | |
300 | 'default_value' => NULL, | |
c4817841 | 301 | ]); |
08e37a2a | 302 | |
c4817841 | 303 | $fields = [ |
08e37a2a | 304 | 'countryA' => $countryA['values'][$countryA['id']], |
305 | 'countryB' => $countryB['values'][$countryB['id']], | |
306 | 'countryC' => $countryC['values'][$countryC['id']], | |
c4817841 | 307 | ]; |
308 | $contacts = [ | |
309 | 'alice' => $this->individualCreate([ | |
92915c55 TO |
310 | 'first_name' => 'Alice', |
311 | 'last_name' => 'Albertson', | |
602b60e0 SL |
312 | 'custom_' . $fields['countryA']['id'] => $countriesByName['Andorra'], |
313 | 'custom_' . $fields['countryB']['id'] => $countriesByName['Barbados'], | |
c4817841 | 314 | ]), |
315 | 'bob' => $this->individualCreate([ | |
92915c55 TO |
316 | 'first_name' => 'Bob', |
317 | 'last_name' => 'Roberts', | |
602b60e0 SL |
318 | 'custom_' . $fields['countryA']['id'] => $countriesByName['Austria'], |
319 | 'custom_' . $fields['countryB']['id'] => $countriesByName['Bermuda'], | |
320 | 'custom_' . $fields['countryC']['id'] => $countriesByName['Chad'], | |
c4817841 | 321 | ]), |
322 | 'carol' => $this->individualCreate([ | |
92915c55 TO |
323 | 'first_name' => 'Carol', |
324 | 'last_name' => 'Carolson', | |
602b60e0 | 325 | 'custom_' . $fields['countryC']['id'] => $countriesByName['Cambodia'], |
c4817841 | 326 | ]), |
327 | ]; | |
6a488035 TO |
328 | |
329 | // Move! | |
08e37a2a | 330 | CRM_Core_BAO_CustomField::moveField($fields['countryB']['id'], $groupB['id']); |
6a488035 TO |
331 | |
332 | // Group[A] no longer has fields[countryB] | |
333 | $errorScope = CRM_Core_TemporaryErrorScope::useException(); | |
334 | try { | |
08e37a2a | 335 | $this->assertDBQuery(1, "SELECT {$fields['countryB']['column_name']} FROM " . $groupA['table_name']); |
6a488035 TO |
336 | $this->fail('Expected exception when querying column on wrong table'); |
337 | } | |
92915c55 TO |
338 | catch (PEAR_Exception$e) { |
339 | } | |
6a488035 TO |
340 | $errorScope = NULL; |
341 | ||
342 | // Alice: Group[B] has fields[countryB], but fields[countryC] did not exist before | |
343 | $this->assertDBQuery(1, | |
08e37a2a | 344 | "SELECT count(*) FROM {$groupB['table_name']} |
b2042573 | 345 | WHERE entity_id = %1 |
08e37a2a | 346 | AND {$fields['countryB']['column_name']} = %3 |
347 | AND {$fields['countryC']['column_name']} is null", | |
c4817841 | 348 | [ |
349 | 1 => [$contacts['alice'], 'Integer'], | |
350 | 3 => [$countriesByName['Barbados'], 'Integer'], | |
351 | ] | |
6a488035 TO |
352 | ); |
353 | ||
354 | // Bob: Group[B] has merged fields[countryB] and fields[countryC] on the same record | |
355 | $this->assertDBQuery(1, | |
08e37a2a | 356 | "SELECT count(*) FROM {$groupB['table_name']} |
b2042573 | 357 | WHERE entity_id = %1 |
08e37a2a | 358 | AND {$fields['countryB']['column_name']} = %3 |
359 | AND {$fields['countryC']['column_name']} = %4", | |
c4817841 | 360 | [ |
361 | 1 => [$contacts['bob'], 'Integer'], | |
362 | 3 => [$countriesByName['Bermuda'], 'Integer'], | |
363 | 4 => [$countriesByName['Chad'], 'Integer'], | |
364 | ] | |
6a488035 TO |
365 | ); |
366 | ||
367 | // Carol: Group[B] still has fields[countryC] but did not get fields[countryB] | |
368 | $this->assertDBQuery(1, | |
08e37a2a | 369 | "SELECT count(*) FROM {$groupB['table_name']} |
b2042573 | 370 | WHERE entity_id = %1 |
08e37a2a | 371 | AND {$fields['countryB']['column_name']} is null |
372 | AND {$fields['countryC']['column_name']} = %4", | |
c4817841 | 373 | [ |
374 | 1 => [$contacts['carol'], 'Integer'], | |
375 | 4 => [$countriesByName['Cambodia'], 'Integer'], | |
376 | ] | |
6a488035 TO |
377 | ); |
378 | ||
08e37a2a | 379 | $this->customGroupDelete($groups['A']['id']); |
380 | $this->customGroupDelete($groupB['id']); | |
6a488035 | 381 | } |
96025800 | 382 | |
c6b559da | 383 | /** |
384 | * Test get custom field id function. | |
cef2e96c | 385 | * |
386 | * @throws \CiviCRM_API3_Exception | |
c6b559da | 387 | */ |
388 | public function testGetCustomFieldID() { | |
389 | $this->createCustomField(); | |
390 | $fieldID = CRM_Core_BAO_CustomField::getCustomFieldID('testFld'); | |
391 | $this->assertEquals($this->customFieldID, $fieldID); | |
392 | ||
393 | $fieldID = CRM_Core_BAO_CustomField::getCustomFieldID('testFld', 'new custom group'); | |
394 | $this->assertEquals($this->customFieldID, $fieldID); | |
30b6e002 PF |
395 | |
396 | $fieldID = CRM_Core_BAO_CustomField::getCustomFieldID('testFld', 'new custom group', TRUE); | |
397 | $this->assertEquals('custom_' . $this->customFieldID, $fieldID); | |
398 | ||
399 | // create field with same name in a different group | |
400 | $this->createCustomField('other custom group'); | |
401 | $otherFieldID = CRM_Core_BAO_CustomField::getCustomFieldID('testFld', 'other custom group'); | |
402 | // make sure it does not return the field ID of the first field | |
403 | $this->assertNotEquals($fieldID, $otherFieldID); | |
c6b559da | 404 | } |
405 | ||
406 | /** | |
30b6e002 PF |
407 | * Create a custom field |
408 | * | |
409 | * @param string $groupTitle | |
410 | * | |
c6b559da | 411 | * @return array |
412 | */ | |
30b6e002 PF |
413 | protected function createCustomField($groupTitle = 'new custom group') { |
414 | $customGroup = $this->customGroupCreate([ | |
415 | 'extends' => 'Individual', | |
8392a043 | 416 | 'title' => $groupTitle, |
30b6e002 | 417 | ]); |
8392a043 | 418 | $fields = [ |
c6b559da | 419 | 'label' => 'testFld', |
420 | 'data_type' => 'String', | |
421 | 'html_type' => 'Text', | |
422 | 'custom_group_id' => $customGroup['id'], | |
8392a043 | 423 | ]; |
c6b559da | 424 | $field = CRM_Core_BAO_CustomField::create($fields); |
425 | $this->customFieldID = $field->id; | |
426 | return $customGroup; | |
427 | } | |
428 | ||
8392a043 | 429 | /** |
cef2e96c | 430 | * Test the getFieldsForImport function. |
431 | * | |
432 | * @throws \Exception | |
8392a043 | 433 | */ |
434 | public function testGetFieldsForImport() { | |
435 | $this->entity = 'Contact'; | |
436 | $this->createCustomGroupWithFieldsOfAllTypes(); | |
cef2e96c | 437 | $customGroupID = $this->ids['CustomGroup']['Custom Group']; |
8392a043 | 438 | $expected = [ |
439 | $this->getCustomFieldName('country') => [ | |
cef2e96c | 440 | 'name' => $this->getCustomFieldName('country'), |
8392a043 | 441 | 'type' => 1, |
442 | 'title' => 'Country', | |
443 | 'headerPattern' => '//', | |
444 | 'import' => 1, | |
445 | 'custom_field_id' => $this->getCustomFieldID('country'), | |
446 | 'options_per_line' => NULL, | |
447 | 'text_length' => NULL, | |
d989f2a4 | 448 | 'data_type' => 'Country', |
8392a043 | 449 | 'html_type' => 'Select Country', |
450 | 'is_search_range' => '0', | |
cef2e96c | 451 | 'id' => $this->getCustomFieldID('country'), |
452 | 'label' => 'Country', | |
453 | 'groupTitle' => 'Custom Group', | |
454 | 'default_value' => NULL, | |
455 | 'custom_group_id' => $customGroupID, | |
456 | 'extends' => 'Contact', | |
457 | 'extends_entity_column_value' => NULL, | |
458 | 'extends_entity_column_id' => NULL, | |
459 | 'is_view' => '0', | |
460 | 'is_multiple' => '0', | |
461 | 'option_group_id' => NULL, | |
462 | 'date_format' => NULL, | |
463 | 'time_format' => NULL, | |
464 | 'is_required' => '0', | |
465 | 'table_name' => 'civicrm_value_custom_group_' . $customGroupID, | |
466 | 'column_name' => 'country_' . $this->getCustomFieldID('country'), | |
467 | 'where' => 'civicrm_value_custom_group_' . $customGroupID . '.country_' . $this->getCustomFieldID('country'), | |
468 | 'extends_table' => 'civicrm_contact', | |
469 | 'search_table' => 'contact_a', | |
d989f2a4 | 470 | 'pseudoconstant' => [ |
471 | 'table' => 'civicrm_country', | |
472 | 'keyColumn' => 'id', | |
473 | 'labelColumn' => 'name', | |
474 | 'nameColumn' => 'iso_code', | |
475 | ], | |
8392a043 | 476 | ], |
cef2e96c | 477 | $this->getCustomFieldName('file') => [ |
8392a043 | 478 | 'name' => $this->getCustomFieldName('file'), |
479 | 'type' => 2, | |
480 | 'title' => 'Custom Field', | |
481 | 'headerPattern' => '//', | |
482 | 'import' => 1, | |
483 | 'custom_field_id' => $this->getCustomFieldID('file'), | |
484 | 'options_per_line' => NULL, | |
485 | 'text_length' => NULL, | |
486 | 'data_type' => 'File', | |
487 | 'html_type' => 'File', | |
488 | 'is_search_range' => '0', | |
cef2e96c | 489 | 'id' => $this->getCustomFieldID('file'), |
490 | 'label' => 'Custom Field', | |
491 | 'groupTitle' => 'Custom Group', | |
492 | 'default_value' => NULL, | |
493 | 'custom_group_id' => $customGroupID, | |
494 | 'extends' => 'Contact', | |
495 | 'extends_entity_column_value' => NULL, | |
496 | 'extends_entity_column_id' => NULL, | |
497 | 'is_view' => '0', | |
498 | 'is_multiple' => '0', | |
499 | 'option_group_id' => NULL, | |
500 | 'date_format' => NULL, | |
501 | 'time_format' => NULL, | |
502 | 'is_required' => '0', | |
503 | 'table_name' => 'civicrm_value_custom_group_' . $customGroupID, | |
504 | 'column_name' => 'custom_field_' . $this->getCustomFieldID('file'), | |
505 | 'where' => 'civicrm_value_custom_group_' . $customGroupID . '.custom_field_' . $this->getCustomFieldID('file'), | |
506 | 'extends_table' => 'civicrm_contact', | |
507 | 'search_table' => 'contact_a', | |
8392a043 | 508 | ], |
509 | $this->getCustomFieldName('text') => [ | |
510 | 'name' => $this->getCustomFieldName('text'), | |
511 | 'type' => 2, | |
512 | 'title' => 'Enter text here', | |
513 | 'headerPattern' => '//', | |
514 | 'import' => 1, | |
515 | 'custom_field_id' => $this->getCustomFieldID('text'), | |
516 | 'options_per_line' => NULL, | |
b7d6b1fa | 517 | 'text_length' => 300, |
8392a043 | 518 | 'data_type' => 'String', |
519 | 'html_type' => 'Text', | |
520 | 'is_search_range' => '0', | |
cef2e96c | 521 | 'id' => $this->getCustomFieldID('text'), |
522 | 'label' => 'Enter text here', | |
523 | 'groupTitle' => 'Custom Group', | |
524 | 'default_value' => 'xyz', | |
525 | 'custom_group_id' => '1', | |
526 | 'extends' => 'Contact', | |
527 | 'extends_entity_column_value' => NULL, | |
528 | 'extends_entity_column_id' => NULL, | |
529 | 'is_view' => '0', | |
530 | 'is_multiple' => '0', | |
531 | 'option_group_id' => NULL, | |
532 | 'date_format' => NULL, | |
533 | 'time_format' => NULL, | |
534 | 'is_required' => '1', | |
535 | 'table_name' => 'civicrm_value_custom_group_' . $customGroupID, | |
536 | 'column_name' => 'enter_text_here_' . $this->getCustomFieldID('text'), | |
537 | 'where' => 'civicrm_value_custom_group_' . $customGroupID . '.enter_text_here_' . $this->getCustomFieldID('text'), | |
538 | 'extends_table' => 'civicrm_contact', | |
539 | 'search_table' => 'contact_a', | |
b7d6b1fa | 540 | 'maxlength' => 300, |
8392a043 | 541 | ], |
542 | $this->getCustomFieldName('select_string') => [ | |
cef2e96c | 543 | 'name' => $this->getCustomFieldName('select_string'), |
8392a043 | 544 | 'type' => 2, |
545 | 'title' => 'Pick Color', | |
546 | 'headerPattern' => '//', | |
547 | 'import' => 1, | |
548 | 'custom_field_id' => $this->getCustomFieldID('select_string'), | |
549 | 'options_per_line' => NULL, | |
550 | 'text_length' => NULL, | |
551 | 'data_type' => 'String', | |
552 | 'html_type' => 'Select', | |
553 | 'is_search_range' => '0', | |
cef2e96c | 554 | 'id' => $this->getCustomFieldID('select_string'), |
555 | 'label' => 'Pick Color', | |
556 | 'groupTitle' => 'Custom Group', | |
557 | 'default_value' => NULL, | |
558 | 'custom_group_id' => $customGroupID, | |
559 | 'extends' => 'Contact', | |
560 | 'extends_entity_column_value' => NULL, | |
561 | 'extends_entity_column_id' => NULL, | |
562 | 'is_view' => '0', | |
563 | 'is_multiple' => '0', | |
564 | 'option_group_id' => $this->callAPISuccessGetValue('CustomField', ['id' => $this->getCustomFieldID('select_string'), 'return' => 'option_group_id']), | |
565 | 'date_format' => NULL, | |
566 | 'time_format' => NULL, | |
567 | 'is_required' => '1', | |
568 | 'table_name' => 'civicrm_value_custom_group_' . $customGroupID, | |
569 | 'column_name' => 'pick_color_' . $this->getCustomFieldID('select_string'), | |
570 | 'where' => 'civicrm_value_custom_group_' . $customGroupID . '.pick_color_' . $this->getCustomFieldID('select_string'), | |
571 | 'extends_table' => 'civicrm_contact', | |
572 | 'search_table' => 'contact_a', | |
573 | 'pseudoconstant' => [ | |
574 | 'optionGroupName' => $this->callAPISuccessGetValue('CustomField', ['id' => $this->getCustomFieldID('select_string'), 'return' => 'option_group_id.name']), | |
575 | 'optionEditPath' => 'civicrm/admin/options/' . $this->callAPISuccessGetValue('CustomField', ['id' => $this->getCustomFieldID('select_string'), 'return' => 'option_group_id.name']), | |
576 | ], | |
8392a043 | 577 | ], |
578 | $this->getCustomFieldName('select_date') => [ | |
579 | 'name' => $this->getCustomFieldName('select_date'), | |
580 | 'type' => 4, | |
56d1630d | 581 | 'title' => 'Test Date', |
8392a043 | 582 | 'headerPattern' => '//', |
583 | 'import' => 1, | |
584 | 'custom_field_id' => $this->getCustomFieldID('select_date'), | |
585 | 'options_per_line' => NULL, | |
586 | 'text_length' => NULL, | |
587 | 'data_type' => 'Date', | |
588 | 'html_type' => 'Select Date', | |
0e1544e7 | 589 | 'is_search_range' => '1', |
8392a043 | 590 | 'date_format' => 'mm/dd/yy', |
591 | 'time_format' => '1', | |
cef2e96c | 592 | 'id' => $this->getCustomFieldID('select_date'), |
56d1630d | 593 | 'label' => 'Test Date', |
cef2e96c | 594 | 'groupTitle' => 'Custom Group', |
595 | 'default_value' => '20090711', | |
596 | 'custom_group_id' => $customGroupID, | |
597 | 'extends' => 'Contact', | |
598 | 'extends_entity_column_value' => NULL, | |
599 | 'extends_entity_column_id' => NULL, | |
600 | 'is_view' => '0', | |
601 | 'is_multiple' => '0', | |
602 | 'option_group_id' => NULL, | |
603 | 'is_required' => '0', | |
604 | 'table_name' => 'civicrm_value_custom_group_' . $customGroupID, | |
605 | 'column_name' => 'test_date_' . $this->getCustomFieldID('select_date'), | |
606 | 'where' => 'civicrm_value_custom_group_' . $customGroupID . '.test_date_' . $this->getCustomFieldID('select_date'), | |
607 | 'extends_table' => 'civicrm_contact', | |
608 | 'search_table' => 'contact_a', | |
8392a043 | 609 | ], |
610 | $this->getCustomFieldName('link') => [ | |
611 | 'name' => $this->getCustomFieldName('link'), | |
612 | 'type' => 2, | |
613 | 'title' => 'test_link', | |
614 | 'headerPattern' => '//', | |
615 | 'import' => 1, | |
616 | 'custom_field_id' => $this->getCustomFieldID('link'), | |
617 | 'options_per_line' => NULL, | |
618 | 'text_length' => NULL, | |
619 | 'data_type' => 'Link', | |
620 | 'html_type' => 'Link', | |
621 | 'is_search_range' => '0', | |
cef2e96c | 622 | 'id' => $this->getCustomFieldID('link'), |
623 | 'label' => 'test_link', | |
624 | 'groupTitle' => 'Custom Group', | |
625 | 'default_value' => 'http://civicrm.org', | |
626 | 'custom_group_id' => $customGroupID, | |
627 | 'extends' => 'Contact', | |
628 | 'extends_entity_column_value' => NULL, | |
629 | 'extends_entity_column_id' => NULL, | |
630 | 'is_view' => '0', | |
631 | 'is_multiple' => '0', | |
632 | 'option_group_id' => NULL, | |
633 | 'date_format' => NULL, | |
634 | 'time_format' => NULL, | |
635 | 'is_required' => '1', | |
636 | 'table_name' => 'civicrm_value_custom_group_' . $customGroupID, | |
637 | 'column_name' => 'test_link_' . $this->getCustomFieldID('link'), | |
638 | 'where' => 'civicrm_value_custom_group_' . $customGroupID . '.test_link_' . $this->getCustomFieldID('link'), | |
639 | 'extends_table' => 'civicrm_contact', | |
640 | 'search_table' => 'contact_a', | |
8392a043 | 641 | ], |
0e1544e7 | 642 | $this->getCustomFieldName('int') => [ |
643 | 'name' => $this->getCustomFieldName('int'), | |
644 | 'type' => CRM_Utils_Type::T_INT, | |
645 | 'title' => 'Enter integer here', | |
646 | 'headerPattern' => '//', | |
647 | 'import' => 1, | |
648 | 'custom_field_id' => $this->getCustomFieldID('int'), | |
649 | 'options_per_line' => NULL, | |
650 | 'text_length' => NULL, | |
651 | 'data_type' => 'Int', | |
652 | 'html_type' => 'Text', | |
653 | 'is_search_range' => '1', | |
654 | 'id' => $this->getCustomFieldID('int'), | |
655 | 'label' => 'Enter integer here', | |
656 | 'groupTitle' => 'Custom Group', | |
657 | 'default_value' => '4', | |
658 | 'custom_group_id' => $customGroupID, | |
659 | 'extends' => 'Contact', | |
660 | 'extends_entity_column_value' => NULL, | |
661 | 'extends_entity_column_id' => NULL, | |
662 | 'is_view' => '0', | |
663 | 'is_multiple' => '0', | |
664 | 'option_group_id' => NULL, | |
665 | 'date_format' => NULL, | |
666 | 'time_format' => NULL, | |
667 | 'is_required' => '1', | |
668 | 'table_name' => 'civicrm_value_custom_group_' . $customGroupID, | |
669 | 'column_name' => $this->getCustomFieldColumnName('int'), | |
670 | 'where' => 'civicrm_value_custom_group_' . $customGroupID . '.' . $this->getCustomFieldColumnName('int'), | |
671 | 'extends_table' => 'civicrm_contact', | |
672 | 'search_table' => 'contact_a', | |
673 | ], | |
8392a043 | 674 | ]; |
675 | $this->assertEquals($expected, CRM_Core_BAO_CustomField::getFieldsForImport()); | |
676 | } | |
677 | ||
e5ce15c3 | 678 | /** |
679 | * Test the bulk create function works. | |
680 | */ | |
681 | public function testBulkCreate() { | |
682 | $customGroup = $this->customGroupCreate([ | |
683 | 'extends' => 'Individual', | |
684 | 'title' => 'my bulk group', | |
685 | ]); | |
686 | CRM_Core_BAO_CustomField::bulkSave([ | |
687 | [ | |
688 | 'label' => 'Test', | |
689 | 'data_type' => 'String', | |
690 | 'html_type' => 'Text', | |
691 | 'column_name' => 'my_text', | |
692 | ], | |
693 | [ | |
694 | 'label' => 'test_link', | |
695 | 'data_type' => 'Link', | |
696 | 'html_type' => 'Link', | |
697 | 'is_search_range' => '0', | |
698 | ], | |
699 | ], | |
700 | [ | |
701 | 'custom_group_id' => $customGroup['id'], | |
702 | 'is_active' => 1, | |
703 | 'is_searchable' => 1, | |
704 | ]); | |
705 | $dao = CRM_Core_DAO::executeQuery(('SHOW CREATE TABLE ' . $customGroup['values'][$customGroup['id']]['table_name'])); | |
706 | $dao->fetch(); | |
707 | $this->assertContains('`test_link_2` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL', $dao->Create_Table); | |
708 | $this->assertContains('KEY `INDEX_my_text` (`my_text`)', $dao->Create_Table); | |
709 | } | |
710 | ||
1de1c868 SL |
711 | /** |
712 | * Check that outputting the display value for a file field with No description doesn't generate error | |
713 | */ | |
714 | public function testFileDisplayValueNoDescription() { | |
715 | $customGroup = $this->customGroupCreate([ | |
716 | 'extends' => 'Individual', | |
717 | 'title' => 'Test Contact File Custom Group', | |
718 | ]); | |
719 | $fileField = $this->customFieldCreate([ | |
720 | 'custom_group_id' => $customGroup['id'], | |
721 | 'data_type' => 'File', | |
722 | 'html_type' => 'File', | |
723 | 'default_value' => '', | |
724 | ]); | |
725 | $filePath = Civi::paths()->getPath('[civicrm.files]/custom/test_file.txt'); | |
726 | $file = $this->callAPISuccess('File', 'create', [ | |
727 | 'uri' => $filePath, | |
728 | ]); | |
729 | $individual = $this->individualCreate(['custom_' . $fileField['id'] => $file['id']]); | |
730 | $expectedDisplayValue = CRM_Core_BAO_File::paperIconAttachment('*', $file['id'])[$file['id']]; | |
731 | $this->assertEquals($expectedDisplayValue, CRM_Core_BAO_CustomField::displayValue($file['id'], $fileField['id'])); | |
732 | } | |
733 | ||
3566563f PN |
734 | /** |
735 | * Test for hook_civicrm_alterCustomFieldDisplayValue(). | |
736 | */ | |
737 | public function testAlterCustomFieldDisplayValueHook() { | |
738 | CRM_Utils_Hook_UnitTests::singleton()->setHook('civicrm_alterCustomFieldDisplayValue', [$this, 'alterCustomFieldDisplayValue']); | |
739 | $customGroupId = $this->customGroupCreate([ | |
740 | 'extends' => 'Individual', | |
741 | 'title' => 'Test Contactcustom Group', | |
742 | ])['id']; | |
743 | $fieldId = $this->customFieldCreate([ | |
744 | 'custom_group_id' => $customGroupId, | |
745 | 'name' => 'alter_cf_field', | |
746 | 'label' => 'Alter CF Field', | |
747 | ])['id']; | |
748 | $contactId = $this->individualCreate(['custom_' . $fieldId => 'Test']); | |
749 | ||
750 | $this->assertEquals('Test', $this->callAPISuccessGetValue('Contact', | |
751 | ['id' => $contactId, 'return' => "custom_{$fieldId}"] | |
752 | )); | |
753 | ||
754 | $values = []; | |
755 | $fields = [ | |
756 | 'custom_' . $fieldId => $this->callAPISuccess('Contact', 'getfield', [ | |
757 | 'name' => 'custom_' . $fieldId, | |
758 | 'action' => 'get', | |
759 | ])['values'], | |
760 | ]; | |
761 | ||
762 | // CRM_Core_BAO_UFGroup::getValues() invokes CRM_Core_BAO_CustomField::displayValue() function. | |
763 | CRM_Core_BAO_UFGroup::getValues($contactId, $fields, $values); | |
764 | $this->assertEquals('New value', $values['Alter CF Field']); | |
765 | } | |
766 | ||
767 | /** | |
768 | * @param string $displayValue | |
769 | * @param mixed $value | |
770 | * @param int $entityId | |
771 | * @param array $fieldInfo | |
772 | * | |
773 | */ | |
774 | public function alterCustomFieldDisplayValue(&$displayValue, $value, $entityId, $fieldInfo) { | |
775 | if ($fieldInfo['name'] == 'alter_cf_field') { | |
776 | $displayValue = 'New value'; | |
777 | } | |
778 | } | |
779 | ||
6a488035 | 780 | } |