为什么'#weight'属性有时在Drupal表单中没有任何影响?

Adr*_*win 12 forms drupal

我正在尝试为自定义类型创建节点表单.我启用了有机组和分类法,但希望它们的元素以非标准顺序出现.所以我已经实现hook_form_alter并将子数组的#weight属性设置og_nodeapi为-1000,但它仍然在分类和菜单之后.我甚至尝试将子阵列更改为字段集(强制实际渲染),但没有骰子.我也尝试过设置

$form['taxonomy']['#weight'] = 1000 
Run Code Online (Sandbox Code Playgroud)

(我有两个词汇,所以它已经被渲染为一个字段集),但这也没有用.

我将模块的权重设置得非常高,并在系统表中确认它确实是网站上最高的模块 - 所以我完全没有想法.有什么建议?

更新:

虽然我不确定如何,但我确实设法让分类法字段集低于其他一切,但现在我有一个相关的问题,希望更容易理解.在分类法字段集中,我有两个项目(标签和多选),我想在hook_form_alter中添加一些指令,如下所示:

$form['taxonomy']['instructions'] = array(
  '#value' => "These are the instructions",
  '#weight' => -1,
);
Run Code Online (Sandbox Code Playgroud)

你猜对了,这出现分类模块插入的术语之后.但是,如果我将其更改为字段集:

$form['taxonomy']['instructions'] = array(
  '#type' => 'fieldset', // <-- here
  '#title' => 'Instructions',  // <-- and here for good measure
  '#value' => "These are the instructions",
  '#weight' => -1,
);
Run Code Online (Sandbox Code Playgroud)

然后它像我想要的那样神奇地漂浮到顶端.我也试过textarea(这也有效)并明确地说标记(这没有).

所以基本上,将类型从"标记"(默认的IIRC)更改为"fieldset"具有不再忽略其权重的效果.

Hen*_*pel 12

这听起来很奇怪,因为表格元素#weight参数的操作对我来说总是可行的,如广告所说.但有一点需要注意的是,权重仅影响相对于元素兄弟的顺序,因此如果要移动的元素位于低于其他元素的水平,则必须更改权重父元素与您要移动的元素位于同一级别.

为了澄清,如果你有这样的层次结构,

$element['foo'];
$element['bar'];
$element['bar']['baz']
Run Code Online (Sandbox Code Playgroud)

你不能通过设置'baz'的重量来移动'baz'相对于'foo'.你必须在'bar'上设置权重(也可以移动它),或者拉出'baz'并将它带到与'foo'相同的水平.

另一个可能的原因可能是CCK:如果您安装了CCK,它允许您设置自己的顺序以及其他字段admin/content/node-type/<yourNodeType>/fields.它通过注册预渲染回调来更改顺序content_alter_extra_weights(),因此这将在您进行更改后运行hook_form_alter.


编辑:更新以回答问题更新

在fieldset中使用时,标记字段类型具有特殊行为,这在表单api文档中暗示:

注意:如果您使用标记,如果您的内容未包含在标记中(通常<p><div>),则您的内容将不在折叠的字段集中.

看起来它不仅落在折叠的场集之外,而且在这些情况下也拒绝尊重重量.在标记中包含标记字段的内容<p>使其尊重我的计算机上的权重:

$form['taxonomy']['instructions'] = array(
  '#value' => "<p>These are the instructions</p>",
  '#weight' => -1,
);
Run Code Online (Sandbox Code Playgroud)