Чому польові віджети не є елементами?


11

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

Іноді їх функціональність також переповзає обидві апіси, як, наприклад, у цьому питанні: чи можливо відображення робочої форми віджетів поля самостійно?

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

Мені цікаво, чому це не так.

Редагувати: Як зазначає kiamlaluno нижче, згідно з офіційними документами, віджети є елементами API 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 з додатковими можливостями обробки. Гачки віджетів зазвичай викликаються API Field Attach під час створення структури форми поля за допомогою field_attach_form () .

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

Хоча перше можна вважати еквівалентом mock_element_info () , інші два - додаткові гачки, необхідні для роботи віджетів. Саме завдяки переданій інформації, hook_field_widget_form()що надається віджет.

Drupal міг реалізувати віджети, розширюючи властивості, повернуті з hook_element_info(), але правда полягає в тому, що віджет і елемент форми - це дві різні речі, які використовуються в різних випадках; вважаємо віджет більш спеціалізованим типом елемента форми.
Якщо hook_element_info()вони також використовувались для повернення інформації про віджети, код, який шукає віджети, повинен був би відфільтрувати елементи форми, щоб зберегти інформацію про віджети; навпаки, код, який шукає елементи форми, повинен відфільтрувати інформацію віджетів. З огляду на те, наскільки часто потрібна ця інформація, саме тому необхідні два різні гачки.

Drupal міг використовувати властивість "базового елемента", повернуту з hook_field_widget_info(). Якщо така властивість не була реалізована, це означає, що її ніхто не запропонував, або вона не була запропонована, але вона була корисною у кількох обмежених випадках.

Що стосується Drupal 8, то речі трохи змінилися, а елементи форми - це об'єкти реалізації класів FormElementInterface, тоді як польові віджети - це об’єкти класів, що реалізуються WidgetInterface. Загальний інтерфейс між цими інтерфейсами - це той PluginInspectionInterface, який не визначає жодного методу візуалізації елемента форми, замість якого визначений RenderElementабстрактний клас.
Оскільки тепер віджети реалізовані з класами, базовий віджет по суті є базовим класом, з якого походить клас віджетів; не потрібно властивості визначати базовий віджет віджета.


Дуже цікаво, я цього не знав. +1. Однак я оновив своє запитання, оскільки ви збентежили;)
Летаріон

Запит на функцію відкрито . :)
Летаріон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.