为什么字段窗口小部件不是表单元素?


11

表单元素通常与字段小部件分开,但是它们实现了非常相似的功能。

有时,它们的功能也会在这两个api之间蔓延,例如在以下问题中:是否可以单独显示工作的Field Widget Form?

在我看来,字段小部件可以一个表单元素,这合乎逻辑,它可以直接映射到某些基础存储,特别是因为在字段api出现时表单api已经就位。

我想知道为什么不是这种情况。

编辑: 正如下面的kiamlaluno所指出的那样,根据官方文档,小部件 Form API元素,这意味着我需要稍微编辑一下问题。

我开始对此感到疑惑,因为我想将Core tagging小部件用作表单元素。据我所知,没有简单的方法可以做到这一点。尽管文档声称小部件是元素,但这似乎不一定是正确的。

如果小部件被声明为

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

那么元素定义将与小部件分开,以便可以在两种方式上使用它,但是当前情况并非如此。

编辑2: 功能请求已打开


在Drupal 8中,小部件现在通过类来实现。基本窗口小部件本质上是从其派生窗口小部件类的类。
kiamlaluno

类似的问题是“为什么出租车不是汽车?” 或“为什么街道不是一块沥青?” 或“为什么书不是小说?”。一本书可以是一本小说,但同一本小说也可以存在于数字存储中。或者它可以和其他小说一起写在更大的书中。即使一本书只包含一部小说,它的某些物理性质也与其内容无关。
donquixote

Answers:


11

在我看来,字段小部件可以是表单元素,这也恰好直接映射到某些底层存储,这似乎合乎逻辑

小部件是表单元素。它们只是表单元素没有的其他功能。有关字段窗口小部件API的文档使用以下词语来描述窗口小部件:

小部件是具有其他处理功能的Form API元素。小部件挂钩通常由Field Attach API在使用field_attach_form()创建字段表单结构期间调用。

每个小部件都至少使用一个form元素实现,但是实现小部件的模块需要实现一些form元素不需要的钩子:

尽管可以将第一个视为hook_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。但是,我已经更新了我的问题,因为您让我更加困惑了;)
Letharion 2012年

功能请求已打开。:)
Letharion
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.