Основываясь на ответе Чарли, я обнаружил, что перезагрузка блока занимает примерно столько же времени, если вы добавляете 1 или 100 элементов, так что вот хитрость, чтобы добавить список выбора номеров в форме рядом с «добавить» больше », так что вы можете выбрать, сколько вы добавляете. Это экономит много времени и остается гибким. Можно обернуть в маленький модуль
<?php
/**
* Implements hook_field_attach_form()
*/
function village_field_attach_form($entity_type, $entity, &$form, &$form_state, $langcode){
$options = array('language' => field_valid_language($langcode));
// Merge default options.
$default_options = array(
'default' => FALSE,
'deleted' => FALSE,
'language' => NULL,
);
$options += $default_options;
list(, , $bundle) = entity_extract_ids($entity_type, $entity);
$instances = _field_invoke_get_instances($entity_type, $bundle, $options);
// Iterate through the instances.
$return = array();
foreach ($instances as $instance) {
// field_info_field() is not available for deleted fields, so use
// field_info_field_by_id().
$field = field_info_field_by_id($instance['field_id']);
$field_name = $field['field_name'];
//If we are looking at our field type and specific widget type, and we are multiple entries
if($field['cardinality'] == FIELD_CARDINALITY_UNLIMITED){
//Check just in case the button is here, and add another #submit function
if(isset($form[$field['field_name']]['und']['add_more'])){
// add a simple select list, this defaults to numb 3
$form[$field['field_name']]['add_more_number'] = array(
'#type' => 'select',
'#title' => t('Add more no.'),
'#options' => drupal_map_assoc(range(0, 50)),
'#default_value' => 2,
);
$form[$field['field_name']]['und']['add_more']['#submit'][] = 'village_field_add_more_submit';
$form[$field['field_name']]['und']['add_more']['#value'] = 'Add more rows';
}
}
}
}
function village_field_add_more_submit($form, &$form_state){
$button = $form_state['triggering_element'];
// Go one level up in the form, to the widgets container.
$element = drupal_array_get_nested_value($form, array_slice($button['#array_parents'], 0, -1));
$field_name = $element['#field_name'];
$langcode = $element['#language'];
$parents = $element['#field_parents'];
// Alter the number of widgets to show. items_count = 0 means 1.
$field_state = field_form_get_state($parents, $field_name, $langcode, $form_state);
//get the number from the select
$numbtoadd = $form[$field_name]['add_more_number']['#value'];
if($numbtoadd){
$field_state['items_count'] += $numbtoadd;
field_form_set_state($parents, $field_name, $langcode, $form_state, $field_state);
$form_state['rebuild'] = TRUE;
}
}
?>
Я также разместил предложение на Drupal.org по адресу https://drupal.org/node/1394184#comment-8252701,
где у ОП была похожая проблема.
Это обратная связь с природой API форм и с тем, как все это делается
$form
и$form_state
доступно обратно на сервер. Это крутая вещь по многим причинам, хотя я согласен, что это может быть довольно раздражающим с точки зрения производительности. Немного статистики на сервере Ubuntu 12.04 под управлением Apache2 с PHP-FPM:Я добавил 30 элементов в поле файла, добавляя и выгружая по 1 за раз, и общее время загрузки + ответа сервера + вставки javascript нового элемента составляло 414 миллисекунд, увеличиваясь при каждой последующей загрузке примерно на 0-20 миллисекунды, заканчивающиеся в 800 миллисекундах для поездки номер 30.
Я щелкнул «Добавить еще один элемент» для неограниченного текстового поля 100 раз, и общее время выросло с 337 миллисекунд до 1,3 секунд. Если бы моя форма была более сложной, эти цифры только увеличивались бы.
В
$form_state['fields']['your_field_name']['und']
существует свойство называетсяitems_count
. Это используется для расчета количества виджетов полей, которые должны отображаться для данного поля. Я бы порекомендовал вам использоватьhook_field_attach_form()
для изменяете$form_state
до того виджет месторождения построен и установить поля вitems_count
свойстве быть больше числа, тем самым давая вам количество полей , которые нужно сразу же. Пользователь по-прежнему сможет добавлять больше элементов. Вам следует найти лучший способ скрыть лишние элементы от создания формы длиной в 10 страниц; возможно, div сoverflow: scroll;
может работать. В любом случае, это может быть отправной точкой для вас, чтобы найти что-то, что позволит вашему рабочему процессу идти быстрее:Редактировать: в примере кода отсутствует некоторая логика, чтобы гарантировать, что он работает только для соответствующей формы и не позволит вам «добавить еще один элемент». Я пересмотрю это, когда у меня будет лучший рабочий пример на местном уровне.
источник