Prepopulate значений множественных коллекций полей в entity form

Главные вкладки

Аватар пользователя OldWarrior OldWarrior 22 апреля 2017 в 0:46
3

Есть:

1. Форма entity form
2. В этой форме множественное поле типа "Коллекция полей" с двумя дочерними полями: тест (число) и список выбора (select).

Требуется:

Сделать в hook_form_alter добавление и предзаполнение коллекций полей множественными значениями по умолчанию при создании новой сущности. То есть автоматически добавить несколько рядов произвольных данных, не прибегая к ручному добавлению с помощью кнопки "Add more". И даже вообще скрыть кнопки "Add more" и "Remove", поскольку в рамках именно этой задачи они не нужны.

Решение:

После довольно длительного шуршания по форумам и гугления такого, казалось бы, банального вопроса, наконец было найдено относительно простое и корректное решение. В примере ниже дочерние поля заполняются однотипными данными-константами, но, разумеется, ничто не мешает читать данные из какого-то своего произвольного массива инициализации.

<?php
function mymodule_form_alter(&$form, &$form_state$form_id) {

        

// Проверяем, что это "наша" форма и что она используется в данный момент для создания новой сущности
        // (а не для редактирования)
    
if ($form_id == 'my_form_name' && isset($form_state['build_info']['args'][0]->is_new)) {

        

// Общее количество значений для инициализации        
        
$items_count 6;
        
// Название поля-коллекции
        
$field_name 'field_field_collection';
        
$form_theme $form[$field_name][LANGUAGE_NONE]['#theme'];
        
        
// Скрываем кнопки "Add more" и "Remove"
        
$form[$field_name][LANGUAGE_NONE][0]['remove_button']['#access'] = FALSE;
        
$form[$field_name][LANGUAGE_NONE]['add_more']['#access'] = FALSE;

        

$items = &$form_state['field'][$field_name][LANGUAGE_NONE];
        
        
// Генерируем необходимое количество значений для коллекции
        
if ($items_count and $items['items_count'] != $items_count) {
          
$items['items_count'] = $items_count;
          
$items['field']['cardinality'] = $items_count;
          
$form[$field_name][LANGUAGE_NONE] = field_multiple_value_form($items['field'], $items['instance'], LANGUAGE_NONE, array(), $form$form_state);
            
// Восстанавливаем имя функции темы формы поскольку field_multiple_value_form() изменяет его
            
$form[$field_name][LANGUAGE_NONE]['#theme'] = $form_theme;
        }

        

// Заполняем новые ряды значениями
        
for ($delta 0$delta $items_count$delta++) {
          
// Текст/число по умолчанию
          
$form['field_field_collection'][LANGUAGE_NONE][$delta]['field_user_number'][LANGUAGE_NONE][0]['value']['#default_value'] = '4';
          
// Select (позиция) по умолчанию
          
$form['field_field_collection'][LANGUAGE_NONE][$delta]['field_user_select'][LANGUAGE_NONE]['#default_value'] = '1';
            }
    }
}
?>

PS. Для новичков, и во избежание "у меня не работает!". Обратите внимание, что в массивах отличающихся типов полей может быть разный "маршрут" до значений по умолчанию '#default_value' (строчки внутри цикла for). Также не забывайте в этих строчках изменить имена дочерних полей на имена ваших полей.