【问题标题】:Why does the '#weight' property sometimes not have any effect in Drupal forms?为什么 '#weight' 属性有时在 Drupal 表单中没有任何影响?
【发布时间】:2009-08-18 02:47:43
【问题描述】:

我正在尝试为自定义类型创建节点表单。我启用了有机组和分类法,但希望它们的元素以非标准顺序出现。所以我实现了hook_form_alter 并将og_nodeapi 子数组的#weight 属性设置为-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)更改为“字段集”具有不再忽略其权重的效果。

【问题讨论】:

  • 您是否尝试更改表单或呈现页面上的顺序。我不认为钩子形式改变会改变两者。
  • 在下面更新了我的答案,在安装 CCK 模块时添加了另一个可能的原因。
  • 嗨,阿德里安,我再次更新了答案以解决您的最新编辑问题。

标签: forms drupal


【解决方案1】:

这听起来很奇怪,因为表单元素的#weight 参数的操作对我来说总是像宣传的那样可靠地工作。不过需要注意的一点是,权重仅影响相对于元素兄弟的顺序,因此,如果您要移动的元素低于其他元素的级别,则您' d 必须更改与要移动的元素处于同一级别的父元素的权重。

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

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

您不能通过设置“baz”的权重来相对于“foo”移动“baz”。您必须在“bar”上设置权重(也移动它),或者拉出“baz”并将其置于与“foo”相同的水平。

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


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

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

注意:如果您使用标记,如果您的内容未包含在标签中(通常为&lt;p&gt;&lt;div&gt;),您的内容将位于折叠字段集之外。

看起来它不仅不属于折叠的字段集,而且在这些情况下也拒绝尊重权重。将标记字段的内容包装在 &lt;p&gt; 标签中,使其尊重我机器上的重量:

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

【讨论】:

  • 嗯...我确实曾经启用过 CCK,但现在我禁用了它。也许这就是为什么我原来的用例现在可以工作的原因?但正如我在更新的描述中所说,我现在遇到了另一个类似但更容易重现的问题。
  • 在字段集中带有#markup 的业务是一个真正的WTF...感谢您在此提及;它为我省了很多麻烦!
  • 由于元素兄弟的顺序,我也遇到了这个问题。从您的回答中得到想法,这节省了我的时间。谢谢
【解决方案2】:

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

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

【讨论】:

  • 这是这个问题的真实答案
【解决方案3】:

想插入一个 &lt;div&gt; 我可以在 JS 中使用。这对我不起作用:

  $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,
  );

添加前缀和后缀。

【讨论】:

    【解决方案4】:

    我不太明白你想要达到什么目的。你能澄清一下吗?是否要更改分类下拉菜单在页面上的位置?

    与此同时,您可以安装 Drupal Devel module(如果您还没有安装的话)。然后从“管理”>“开发设置”中启用“显示表​​单元素键和权重”。

    这应该可以帮助您调试问题。

    反馈后编辑:

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

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

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

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

    这对我有用,即将分类下拉菜单移动到页面顶部。我可以更改权重,它会在呈现的页面上相应移动。

    既然您说您尝试在原始帖子中设置$form['taxonomy']['#weight'],我目前只能想到两种可能的检查:

    1. 确保在测试前清除缓存。 (您可以为此使用开发模块)
    2. 检查您的 hook_form_alter 是否在之后 taxonomy_form_alter 被调用

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


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

    【讨论】:

    • 嗨,Heinrich,是的,我正在尝试更改分类下拉菜单的位置。我没有开发,但我今晚会安装它并报告。谢谢!
    • 嗨 Heinrich,我安装了 devel 并检查了权重。一切似乎都如我所愿,但字段集根本没有按权重递增的顺序排列。第一个字段集是分类,权重为 1000。第二个是菜单 (-2),然后是书本大纲 (10)。还有更多,然后是文件附件 (30)、创作信息 (20) 和发布信息 (25)。因此,不仅我添加的字段集出现故障,核心字段也出现故障。 hook_form_alter 更改现有字段集的顺序是否为时已晚?
    • 感谢 RE devel 的澄清。我很确定 hook_form_alter 是在 taxonomy_form_alter 之后被调用的,因为我可以从我的钩子中看到所有添加分类的元素。
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

      • 谢谢 - 我禁用了缓存。不过,海因里希似乎已经成功了。
      【解决方案7】:

      这对我有用

      $form['forgot_password']['#markup'] = '<div class="text-align-right"><a class="text-primary" href="/user/password" target="_blank" title="Forgot Password?">Forgot Password?</a></div>';
      
      $form['forgot_password']['#weight'] = 3;
      

      【讨论】:

      • 以 HOOK 形式添加此代码后,请清除所有 drupal 缓存。之后,您可以重新加载页面。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-28
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多