Почему виджеты полей не являются элементами формы?


11

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

Иногда их функциональность также распространяется по двум API-интерфейсам, например, в следующем вопросе: возможно ли отображение рабочей формы виджета поля самостоятельно?

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

Мне интересно, почему это не так.

Редактировать: Как указано в kiamlaluno ниже, согласно официальным документам, виджеты являются элементами API формы, что означает, что мне нужно немного отредактировать свой вопрос.

Я задумался об этом, потому что хотел использовать виджет тегов Core в качестве элемента формы. Насколько я знаю, однако, нет простого способа сделать это. Несмотря на то, что документы утверждают, что виджеты являются элементами, это не обязательно является правдой.

Если виджет был объявлен как

function hook_widget_info() {
  return array('my_widget' => array(
    'base element' => 'some_form_element_machine_name',
  ))
}

тогда определение элемента будет отделено от виджета, чтобы его можно было использовать обоими способами, но в настоящее время это не так.

Редактировать 2: запрос функции открыт .


В Drupal 8 виджеты теперь реализованы с помощью классов; базовый виджет по сути является классом, из которого происходит класс виджета.
kiamlaluno

Подобные вопросы будут: «Почему такси не машина?» или "Почему улица не кусок асфальта?" или «Почему книга не роман?». Книга может быть романом, но этот же роман может существовать и в цифровом хранилище. Или он мог бы жить в большей книге вместе с другими романами. Книга, даже если она содержит ровно один роман, имеет некоторые физические свойства, которые не зависят от ее содержания.
Donquixote

Ответы:


11

Мне кажется логичным, что виджет поля может быть элементом формы, который также отображается непосредственно в каком-либо хранилище

Виджеты являются элементами формы; у них просто есть дополнительные возможности, которых нет у элемента формы. Документация об API виджетов полей описывает виджеты, используя следующие слова:

Виджеты - это элементы API формы с дополнительными возможностями обработки. Хуки виджетов обычно вызываются API присоединения полей при создании структуры формы поля с помощью field_attach_form () .

Каждый виджет реализован с использованием по крайней мере одного элемента формы, но модуль, реализующий виджеты, должен реализовать некоторые хуки, которые не требуются от элемента формы:

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

Drupal мог бы реализовать виджеты, расширяющие возвращаемые свойства hook_element_info(), но правда в том, что виджет и элемент формы - это две разные вещи, которые используются в разных случаях; Рассмотрим виджет более специализированный тип элемента формы.
Если бы hook_element_info()они также использовались для возврата информации о виджетах, код, ищущий виджеты, должен был бы отфильтровать элементы формы, чтобы сохранить информацию о виджетах; наоборот, код, ищущий элементы формы, должен отфильтровывать информацию виджета. Учитывая, как часто эта информация требуется, это причина, почему необходимы два разных хука.

Drupal мог бы использовать свойство "base element", возвращаемое из hook_field_widget_info(). Если такое свойство не было реализовано, это означает, что никто не предлагал его, или оно было предложено, но оно, тем не менее, было полезно в немногих ограниченных случаях.

Что касается Drupal 8, вещи немного изменились, и элементы формы являются объектами реализации классов FormElementInterface, в то время как виджеты полей являются объектами реализации классов WidgetInterface. Интерфейс, который является общим для этих интерфейсов PluginInspectionInterface, не определяет какой-либо метод для визуализации элемента формы, который вместо этого определяется из RenderElementабстрактного класса.
Поскольку теперь виджеты реализованы с помощью классов, базовый виджет по сути является базовым классом, из которого происходит класс виджетов; нет необходимости в свойстве для определения базового виджета виджета.


Очень интересно, я этого не знал. +1. Однако я обновил свой вопрос, так как вы меня запутали;)
Летарион

Запрос на функцию открыт . :)
Летарион
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.