Сбор полей, добавление к ним новых элементов в форме

#drupal #drupal-7

#drupal #drupal-7

Вопрос:

У меня есть $ form с коллекцией полей «field_definition», в которой есть 2 поля с неограниченной мощностью. Я могу вроде как создавать поля, делая это в hook_form_alter:

 $field_definition_template = $form['field_definition']['und'][0];

for($k=0;$k<count($column_names);$k  )
{
    $form['field_definition']['und'][$k] = $field_definition_template;
    $form['field_definition']['und'][$k]['#delta'] = $k;
}
  

Проблема в том, что имена неправильные, идентификаторы неправильные и почти все остальное. Есть ли способ сделать это правильно?

Комментарии:

1. Эй, Крис, что именно ты имеешь в виду, что имена и идентификаторы неправильные? Если вы не получаете структуру (например, имена и идентификаторы), которую вы ожидаете от $form_state['values'] , убедитесь, что вы установили $form['#tree'] = TRUE . В противном случае древовидная структура становится плоской. Я действительно не могу понять, чего вы пытаетесь достичь здесь, и это не работает…

2. Это довольно сложно объяснить, но я в основном пытаюсь создать поля для неограниченной коллекции полей мощности на стороне сервера. По умолчанию всегда создается одна из коллекций полей, но для добавления другой вам нужно изменить дельту и кучу других данных, таких как идентификаторы.

3. Какого типа это поле: стандартное FAPI или CCK? Если это стандартный FAPI, то ваш код выглядит нормально, вы должны получить то, что хотите: кучу дополнительных полей в зависимости от count($columng_names) . В этом случае проблема в том, что сгенерированные поля не совпадают с полями по умолчанию? Я просто пытаюсь немного лучше понять вашу проблему.

4. Это поля CCK, которые я пытаюсь клонировать в drupal 7. (CCK теперь в ядре)

5. Да, вы правы, CCK теперь в ядре. Я действительно не понимаю, почему ваш код не будет работать. Если только эти поля не относятся к какому-то особому типу и для них не нужны какие-то другие параметры, этот код должен сработать. Кстати, какой тип является «оригинальным» и используете ли вы специальный виджет для его отображения? Например. Файл содержит загрузку файла и изображения.

Ответ №1:

Вам захочется поработать с hook_field_presave(), чтобы добавить значения в само поле. Использование Form API для полей иногда работает, но это будет чище, если вы переключитесь на использование Field API напрямую.