为什么hook_form_alter()如此混乱?


40

这是我遇到的一个例子。我正在尝试在字段标签中添加一些HTML。

$form['field_feedback']['und']['#title'] <- has the title
$form['field_feedback']['und'][0]['#title'] <- has the title
$form['field_feedback']['und'][0]['value']['#title'] <- has the title. (Works)

为什么在三个填充的#title属性中仅使用一个?


1
$ form数组在哪里生成?据我所知,在hook_form_alter中没有具有此结构的$ form
Mohammad Ali

这次真是万分感谢。我正在拔头发。数组结构很荒谬。
JM01

Answers:


72

您所看到的是Drupal如何表示表单中的字段。它像这样分解:

  • 外部数组的子代$form['field_back']['und']'und'for 'undefined')是字段已翻译成的不同语言。在Drupal中,建议您在代码中使用LANGUAGE_NONEfor 'und'
  • 每个语言数组内的子级(例如$form['field_feedback']['und'][0])代表该字段的不同条目。例如,如果一个字段有无限的容量,并有该领域的一些项目,他们将显示为$form['field_feedback']['und'][0]$form['field_feedback']['und'][1]
  • 最后,您具有表单输入元素,用于字段值本身,例如$form['field_feedback']['und'][0]['value']。在这种情况下,列名称为value,对于节点引用字段类型,列名称为,nid依此类推。如果一个字段具有与之关联的多个数据列,那么您还将看到更多的子级。这些由文本字段/选择框/特殊小部件表示,并将最终提供该字段的值。

老实说,在整个层次结构中将标题添加到各个元素的事实是偶然的。这些标题是否显示在表单上取决于每个#title包含其中的渲染数组的特定设置。

要更改实际表单小部件上的标题,您只需要担心数组最底部的表单元素:即实际输入元素($form['field_feedback']['und'][0]['value'],等等)。

可能值得注意的是,用于特定字段的元素/小部件可能非常复杂。如果尚未安装,则应安装Devel模块并使用该dpm()功能检查$form阵列。它将确切显示您要定位的元素在数组中的位置。


3
简而言之,在Drupal认为不是Form API数组的内容上添加#title不会产生任何效果。即使在那种情况下,也不会说#title是考虑因素,因为它不是Drupal实现的所有表单元素的属性。字段API使事情复杂化,因为它向表单数组添加了普通数组,但这不会混淆寻找#type的 Drupal 识别表单元素。
kiamlaluno
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.