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

时间:2009-08-18 02:47:43

标签: forms drupal

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

$form['taxonomy']['#weight'] = 1000 

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

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

更新

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

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

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

$form['taxonomy']['instructions'] = array(
  '#type' => 'fieldset', // <-- here
  '#title' => 'Instructions',  // <-- and here for good measure
  '#value' => "These are the instructions",
  '#weight' => -1,
);
然后它按照我的意图神奇地漂浮到顶部。我也尝试过textarea(这也很有用)并且明确地说了标记(这没有)。

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

6 个答案:

答案 0 :(得分:12)

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

澄清一下,如果你有这样的层次结构,

$element['foo'];
$element['bar'];
$element['bar']['baz']

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

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


修改:更新以回答问题更新

标记字段类型在字段集中使用时具有特殊行为,在forms api documentation中暗示:

  

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

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

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

答案 1 :(得分:3)

有时(或者总是,当加权CCK元素时)在hook_form_alter或$ form ['#after_build']回调中起作用的行是这样的:

$form['#content_extra_fields']['taxonomy']['weight'] = 5;

答案 2 :(得分:2)

想要插入一个我可以在JS中使用的<div>。这对我不起作用:

  $form['you_as_reviewer']['ui_container'] = array(
    '#type' => 'markup',
    '#value' => '<div id="le_reviewer_tags_ui"/>',
    '#weight' => 5,
  );

重量被忽略了。

这有效:

  $form['you_as_reviewer']['ui_container'] = array(
    '#type' => 'markup',
    '#prefix' => '<div>',
    '#value' => '<div id="le_reviewer_tags_ui"/>',
    '#suffix' => '</div>',
    '#weight' => 5,
  );

添加了前缀和后缀。

答案 3 :(得分:1)

我不太明白你想要达到的目标。你能澄清一下吗?您想在页面上更改分类标准下拉列表的位置吗?

同时你可以安装Drupal Devel module(如果你还没有这样做的话)。然后从Admin&gt;启用“显示表​​单元素键和权重”。开发设置。

这可以帮助您调试问题。

反馈后修改:

我进一步研究了一下。分类权重在第556行(Drupal 6.12)的taxonomy.module中设置:

$form['taxonomy']['#weight'] = -3;

为了测试,我还为我的模块实现了hook_form_alter,如下所示:

function mymodule_form_alter(&$form, $form_state, $form_id) {
      ...
      $form['taxonomy']['#weight'] = -9;
      ...
} 

这对我有用,即它将分类法下拉菜单移到页面顶部。我可以改变重量,并在渲染页面上相应移动。

由于您说过您尝试在原始帖子中设置$form['taxonomy']['#weight'],我目前只能考虑两种可能的检查:

  1. 确保在测试前清除缓存。 (你可以使用Devel模块)
  2. hook_form_alter
  3. 之后检查 taxonomy_form_alter是否被称为

    我发布了您目前拥有的代码,我们可以更详细地查看它。


    请注意:Devel模块显示的权重对于这种情况不是很有用。显示“子表单”上元素的权重,而不是“子表单”本身的权重。例如。当我设置$form['taxonomy']['#weight'] = -9;时,Devel模块不显示-9,而是$form['taxonomy']内的元素权重。

答案 4 :(得分:0)

您是否指定了另一个字段的权重,现在您的节点表单组织不正确?形式api有点敏感,改变形式可能导致事情变得混乱。我有时必须将重量重新分配给我的提交/预览按钮,以便将它们放回到它们所属的表单底部。

答案 5 :(得分:0)

只是为了覆盖所有基础,请确保在必要时清除缓存。如果启用了缓存模块,Drupal默认将表单存储在缓存中。