Drupal: Как использовать наборы полей в hook_field_widget_form

Итак, у меня есть столбцы, определяющие hook_field_schema, а hook_field_widget_form настроен и правильно сохраняет все значения столбцов.

Но как только я помещаю два поля в набор полей, эти значения никогда не сохраняются и не обновляются. Я пробовал устанавливать #tree => FALSE повсюду, и это тоже не работает.

Что мне не хватает? Просто не поддерживается? Должен ли я использовать хук form_alter или что-то еще, чтобы переместить их в набор полей?


person Karl    schedule 18.04.2011    source источник


Ответы (3)


У меня была такая же проблема, и я не мог найти решение. Перепробовав многое, оказалось что-то настолько же простое, насколько и нелогичное. Ну, в глазах новичка в Drupal.

Сначала у меня было что-то вроде этого (урезанная версия):

$element['mymodulefieldset'] = array(
  '#title' => 'Fieldset title',
  '#type' => 'fieldset',
);

и добавил поля в набор полей:

$element['mymodulefieldset']['fieldname'] = array(
  '#title' => "Field title",
  '#type' => 'textfield',
  '#default_value' => '',
);

Перепробовав множество различных сценариев, я обнаружил, что следующие строки кода работают (вроде как). Вместо того, чтобы вставлять набор полей, я превратил элемент в набор полей следующим образом:

$element += array(
  '#type' => 'fieldset',
  '#tree' => true
);

Затем я добавил поля к элементу:

$element['fieldname'] = array(
  '#title' => "Field title",
  '#type' => 'textfield',
  '#default_value' => '',
);

NB: некоторые переменные, такие как #title и #weight, контролируются «Главная » Администрирование » Структура » Типы контента » [ВАШ ТИП КОНТЕНТА]», другие (например, #collapsible и #collapsed) могут быть определены здесь.

Надеюсь, что это помогает вам!

person lmeurs    schedule 13.05.2011
comment
Я голосую за этот ответ, потому что он определенно будет полезен другим, ищущим информацию о наборе полей, но это не моя проблема. У меня были некоторые поля формы внутри набора полей и некоторые за его пределами, а те, что внутри, не сохранялись. - person Karl; 13.05.2011

Я знаю, что это старый вопрос, но есть решение этой проблемы, объясненное в этой статье часть #process используется для правильного сохранения полей.

EDIT: Как поясняется в комментарии @alexkb, автор статьи обновил свое настраиваемое поле. sample и удалил взлом #process. Для лучшего решения используйте код GitHub.

person o15a3d4l11s2    schedule 29.08.2012
comment
В статье, на которую вы ссылаетесь, говорится о #process, но вы заметили, что автор обновил свой пример кода на github для использования hook_field_presave() - гораздо лучший подход, чем взлом #process. Тем не менее, я голосую за ваш ответ, так как он привел меня к решению, которое, как я думал, я не смогу решить, спасибо! - person alexkb; 06.02.2015
comment
я сам нашел решение, используя hook_field_presave, но имейте в виду, что с этим решением код ` '#default_value' => isset ($ item ['value'])? $item['value'] : ''` не будет работать в случае полей, прикрепленных к сущностям, таким как абзац - person Nicoschi; 04.11.2019

Посмотрите на физический модуль. В основном делайте:

$element['#type'] = 'fieldset'

Вы можете определить подполя с помощью:

$element['subfield'] = array (...);
person Berend de Boer    schedule 23.03.2017