Как добавить форму редактирования поля сущности к своей форме

Задача - создать пользовательскую форму редактирования поля field_body у ноды типа Article. После отправки формы, новое значение должно быть обновлено у этого поля:

/**
 * Form constructor for the edit "field_body".
 *
 * @see example_my_custom_form_submit()
 * @ingroup forms
 */
function example_my_custom_form($form, $form_state, $node) {
  $form_state['storage']['node'] = $node;

  $form['#parents'] = array();

  // Получаем язык поля.
  $langcode = field_language('node', $node, 'field_body');

  // Получаем текущее значение поля, будет использовано как значение по умолчанию.
  $items = field_get_items('node', $node, 'field_body');

  // Получаем информацию об поле и его инстансе, необходимо для генерации формы редактирования поля.
  $field = field_info_field('field_body');
  $instance = field_info_instance('node', 'field_body', 'article');

  $form += field_default_form('node', $node, $field, $instance, $langcode, $items, $form, $form_state);

  $form['actions'] = array(
    '#type' => 'actions',
  );
  $form['actions']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save'),
  );
}

/**
 * Form submission handler for example_my_custom_form().
 *
 * @see example_my_custom_form()
 * @ingroup forms
 */
function example_my_custom_form_submit($form, &$form_state) {
  $node = $form_state['storage']['node'];

  // Сохраняем новые значения.
  field_attach_submit('node', $node, $form, $form_state);
  field_attach_update('node', $node);

  drupal_set_message(t('The data have been saved.'));
}

Комментарии (8)

Аватар пользователя Гость
Гость

Подтвердите пожалуйста рабоспособность формы.
И уточните метод вывода.

Спасибо

Аватар пользователя Benya
Benya

Возникли какие то проблемы?

Аватар пользователя Гость
Гость

Вы не сказали как выводите вашу форму.

Аватар пользователя Benya
Benya

как и любую другую, drupal_get_form()

Аватар пользователя Гость
Гость

А как же render ?
Что-то вы не договариваете.
Это ваша статья или вы заказали написание другому человеку ?

Стандартная форма выводится.
drupal_get_form('user_register_form');

А ваша нет.
Warning: Missing argument 3 for example_my_custom_form() in example_my_custom_form()

Что я должен сделать ?

Аватар пользователя Гость
Гость

Вот как удалось добиться работы.

$node = node_load('1');
$output = drupal_get_form('example_my_custom_form', $node);
Аватар пользователя Benya
Benya

Забавно. Вы не знаете даже базовых вещей и в то же время бросаетесь нелепыми высказываниями, что статья не моя. Это очевидные вещи и урок не о том, как правильно вызывать форму.

P.S. Рад, что у вас все получилось

Аватар пользователя Гость
Гость

Вам забавно, а в статье как минимум два неочевидных момента.
Вы как автор, почему не написали этих базовых вещей ?
На кого ориентированы ваши статьи ?
На какой-то средний уровень ?
Новичкам нужно искать или угадывать ?

Оценки по поводу нелепости моих высказываний в данных условиях неуместны.
Извините, если задело, серьезно.

Но я видел с десяток подобных однотипных статей.
В каждой ни слова не было о выводе.
Пришлось несколько часов думать.
Отсюда и выводы об авторстве.

Кроме вывода в статье не уточняется что поле "field_body" нужно создать дополнительно.
А поле по умолчанию при установке называется "body", без префикса "field_".
Очень просто перепутать.

Надеюсь этот комментарий кому-то будет полезен, ну или правки внесите, а дискуссию можно убрать, я не против. А то как-то враждебно получилось, цель ведь помочь.

Спасибо