2010-07-31 66 views
4

我没有经验的PHP。我遵循几个教程,使用template.php中的主题方法修改我的Drupal表单。修改Drupal表单字段 - [#weight]不被尊重的数组?

由于某些原因,字段的[#weight]属性不符合其值。我想将Subject字段[subject]上的Category字段[cid]移动。这些是代码行我用:

$form['cid']['#weight'] = 0.003; 
$form['subject']['#weight'] = 0.004; 

当我打印我的阵列来查看我看到的值发生了变化,但是当我渲染表单没有更改。每次修改后,我已经清除了性能缓存。

如果你有兴趣,这里是我的印刷阵列的一个片段:

[subject] => Array 
     (
      [#type] => textfield 
      [#title] => Subject 
      [#maxlength] => 255 
      [#required] => 1 
      [#post] => Array 
       (
       ) 

      [#programmed] => 
      [#tree] => 
      [#parents] => Array 
       (
        [0] => subject 
       ) 

      [#array_parents] => Array 
       (
        [0] => subject 
       ) 

      [#weight] => 0.004 
      [#processed] => 1 
      [#description] => 
      [#attributes] => Array 
       (
       ) 

      [#input] => 1 
      [#size] => 60 
      [#autocomplete_path] => 
      [#process] => Array 
       (
        [0] => form_expand_ahah 
       ) 

      [#name] => subject 
      [#id] => edit-subject 
      [#value] => 
      [#defaults_loaded] => 1 
      [#sorted] => 1 
     ) 

    [cid] => Array 
     (
      [#type] => select 
      [#title] => Category 
      [#default_value] => 1 
      [#options] => Array 
       (
        [1] => General Enquiries 
        [2] => Support 
       ) 

      [#required] => 1 
      [#post] => Array 
       (
       ) 

      [#programmed] => 
      [#tree] => 
      [#parents] => Array 
       (
        [0] => cid 
       ) 

      [#array_parents] => Array 
       (
        [0] => cid 
       ) 

      [#weight] => 0.003 
      [#processed] => 1 
      [#description] => 
      [#attributes] => Array 
       (
       ) 

      [#input] => 1 
      [#size] => 0 
      [#multiple] => 
      [#process] => Array 
       (
        [0] => form_expand_ahah 
       ) 

      [#name] => cid 
      [#id] => edit-cid 
      [#value] => 1 
      [#defaults_loaded] => 1 
      [#sorted] => 1 
     ) 

大加赞赏,

克里斯

回答

9

您通常看到的节点形式的行为被启用时,CCK。这是因为CCK覆盖重量与自己订购系统配置的默认和CCK领域转到内容管理 - >内容类型 - >[内容类型] - >管理领域

当然,如果您禁用CCK(可能不是一个选项),您的#weight值将被尊重。

有一点要注意的是,尽管Forms API允许使用小数点#weight,但最好使用整数。


编辑

如果你想限制CCK礼物内工作,自定义模块中,你需要实现一个#pre_render处理CCK涂改后,将改变表单元素的权重其中:

function mymodule_form_alter(&$form, &$form_state, $form_id) { 
    $form['#pre_render'][] = 'mymodule_form_alter_weight'; 
} 

function mymodule_form_alter_weight($elements) { 
    $elements['cid']['#weight'] = 0.003; 
    $elements['subject']['#weight'] = 0.004; 

    return $elements; 
} 

的问题是,你不知道的权重值CCK已经用于其他形式的元素,所以当你订购的问题之前CID,这两个领域可能会出现在页面上所有其他字段的中间,而不是原来的位置。

当谈到体重时,CCK迫使你进入角落。正确的是,Drupal/CCK的方式来处理表格排序是尊重由管理员做出的选择上内容管理 - >内容类型 - >[内容类型] - >管理领域

如果您有自定义表单元素,您可以告诉CCK关于它的信息,以便它显示在中通过执行hook_content_extra_fields()来管理字段。继续上面的代码:

function mymodule_content_extra_fields() { 
    $extras['mymodule'] = array(// Name of field 
    'label' => t('Mymodule'), 
    'description' => t('Mymodule field'), 
    'weight' => 10, // The default weight, can be overriden on Manage Fields 
); 

    return $extras; 
} 
+0

这是有道理的。那么有没有办法解决这个问题?我只需要一个例外就是联系表单。我知道我可以主题它,但有没有编码修复? – 2010-07-31 10:13:43

+0

@克里斯,是的,没有。我已经用更多信息和一些可能的解决方案更新了我的答案。 – 2010-07-31 10:38:15

+0

感谢您的解决方案。我了解CCK现在如何处理表单字段。我想如果我有一个自定义窗体,那么我会走这条路线,但因为我只需要重新排列整个站点范围内的一个[cid]字段,我只需要使用CSS就可以了。我会记下您的解决方案以备将来参考。非常感谢! – 2010-07-31 10:46:37