Элементы формы часто отделены от виджетов полей, но в них реализована очень похожая функциональность.
Иногда их функциональность также распространяется по двум API-интерфейсам, например, в следующем вопросе: возможно ли отображение рабочей формы виджета поля самостоятельно?
Мне кажется логичным, что виджет поля может быть элементом формы, который также отображается непосредственно в некотором базовом хранилище, тем более что форма api уже была на месте, когда появилось поле api.
Мне интересно, почему это не так.
Редактировать: Как указано в kiamlaluno ниже, согласно официальным документам, виджеты являются элементами API формы, что означает, что мне нужно немного отредактировать свой вопрос.
Я задумался об этом, потому что хотел использовать виджет тегов Core в качестве элемента формы. Насколько я знаю, однако, нет простого способа сделать это. Несмотря на то, что документы утверждают, что виджеты являются элементами, это не обязательно является правдой.
Если виджет был объявлен как
function hook_widget_info() {
return array('my_widget' => array(
'base element' => 'some_form_element_machine_name',
))
}
тогда определение элемента будет отделено от виджета, чтобы его можно было использовать обоими способами, но в настоящее время это не так.
Редактировать 2: запрос функции открыт .
Ответы:
Виджеты являются элементами формы; у них просто есть дополнительные возможности, которых нет у элемента формы. Документация об API виджетов полей описывает виджеты, используя следующие слова:
Каждый виджет реализован с использованием по крайней мере одного элемента формы, но модуль, реализующий виджеты, должен реализовать некоторые хуки, которые не требуются от элемента формы:
В то время как первый может считаться эквивалентом 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
абстрактного класса.Поскольку теперь виджеты реализованы с помощью классов, базовый виджет по сути является базовым классом, из которого происходит класс виджетов; нет необходимости в свойстве для определения базового виджета виджета.
источник