指定要从显示中排除的$ form元素?


20

我想使用form_alter或模板文件在表单中隐藏某些元素。我在Drupal 7的某个地方读到过,我们可以指定$ form元素,这样它就不会显示在表单中,但是我不记得了!不是unset(),而是其他函数!

Answers:


29

使用unset()表单不是解决表单的好方法(正如我想您所知),因为您永远不知道哪些提交/验证处理程序会期望unset元素在处理时存在。这会导致不必要的错误。

您可以安全地使用三种方法来“隐藏”表单元素

  • '#type' => 'value'在元素上使用,其效果是该元素的值仍将照常传递给Submit / validate函数#value。这是我的首选方法。
  • 使用'#access' => FALSE的元素来表示它不应该被输出到屏幕上。
  • 使用'#type' => 'hidden'如巴特曾建议(尽管使用这个取决于你的使用情况;我想,如果你想隐藏你的表单元素的值不希望它输出的形式隐藏输入)。

忘记了hide()
Yusef 2012年

2
@zhilevan hide()不应在表单元素上使用,因为表单元素仍在运行验证程序,因此很容易使整个表单提交过程混乱。例如,如果您hide($form['title']);使用的是节点表单,那么您将永远无法提交表单,因为标题字段是必填字段,但不会提供值。最好按以下顺序使用上述3种方法:)
Clive

@Clive谢谢,我知道上面的方法,我的问题是我认为与hide()有关的东西(仍然不记得该功能)..无论如何,请参考我的评论在第一个答案中,为什么drupal_render($form['base']['prices']['sell_price'])不起作用?
Serjas 2012年

该代码是否在以表单为主题的模板文件中?如果没有,那是不起作用的原因是,尽管您可以使用来将任何渲染元素打印到屏幕上drupal_render(),但是您将不会获得任何形式的标签/令牌/等。除非您输出整个$form数组
克莱夫(Clive)

我使用了钩子主题,并且print_r($ form)甚至drupal_render($ form ['title'])都在工作,问题是垂直制表符下的元素!
Serjas 2012年

4

如果您使用的是模板文件,则可以使用hide()隐藏东西。

如果要在中隐藏表单元素hook_form_alter,则unset()可能是最佳选择。

如果只是存储一个值,则也可以使用'#type'=>'hidden'


隐藏是排除元素的更好方法。
Yusef 2012年

我试图实现的是一个自定义的Ubsercart产品节点表单,我想显示的只是sell_price,并隐藏了诸如运费,重量等其他元素drupal_render($form['base']['prices']['sell_price'])
Serjas 2012年

4

我发现如果在提交按钮或类似按钮上使用#access为false,可能会破坏某些表格。在那种情况下,我只是使用CSS隐藏元素:

$form['basic']['submit']['#attributes']['class'][] = 'element-hidden';

只是另一个选择。

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.