Есть:
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 > 1 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). Также не забывайте в этих строчках изменить имена дочерних полей на имена ваших полей.