如何隐藏和/或阻止访问表单中的字段,例如有机组的group_audience


9

这一直困扰着我一段时间。.当我尝试从表单中隐藏诸如组受众字段或发布设置之类的字段时,在验证时,将这两个字段都设置为空值,即使默认值是已正确声明。

我尝试使用Invisible,#access,unset hidden无效!这很麻烦,因为对于我当前的项目,用户当时只能编辑其个人资料的一小部分,例如仅编辑地址或图片,因此,如果我隐藏组观众,则用户最终会被逐出他所属的组编辑。

我最终使用下面的代码隐藏了这些字段,同时仍将用户保留在他们的组中。

$variables['user_edit_about']['group_audience']= $temp['group_audience'];       
$variables['user_edit_about']['group_audience']['#prefix'] = '<div style="display:none;">';
$variables['user_edit_about']['group_audience']['#suffix'] = '</div>';

有人会想到一种更好的方法来实现这一目标吗?

谢谢


这个答案并不完美,因为使用仍可以通过DOM操作更改值
iStryker

Answers:


6

编辑:

好吧,我知道了。将其放在您的自定义模块中:

function example_form_alter(&$form, &$form_state, $form_id) {
    if($form_id == 'story_node_form') {
        $form['title']['#value'] = 'hot stuff';
        $form['title']['#access'] = FALSE;

    }
}

这会将故事节点的标题设置为“热门内容”,并且由于#access = FALSE;不会在页面上呈现。

您可以在hook_form_alter()中添加更多粒度控制,例如

  global $user;

  // Check to see if $user has does not have the administrator role.
  if (!in_array('administrator', array_values($user->roles))) {
    $form['title']['#access'] = FALSE;
  }

这适用于Drupal 6和7。

旧答案(忽略):

自从我做了这样的事情已经有一段时间了,所以我可能错了。如果您设置 [#value]表单项的,则它将在表单上不可见。

我是在Drupal 6 hook_form_alter()中的自定义模块中完成此操作的。我不知道它是否可以在Drupal 7中使用,也不知道您是否可以在预处理功能中使用


感谢您的回答,尽管不幸的是,在我的情况下,该表单无法正常工作,但表单域已经预先填写了#value,因为它们是编辑表单
SilkAdmin 2011年

@silkAdmin请查看新的编辑
iStryker

感谢Stryker花时间来解决这个问题,尽管您的上述技术确实可以隐藏字段,但似乎在提交时也没有考虑默认值。因此,我最终在每次个人资料编辑时,用户仍然被踢出他们的群组。到目前为止,只有#prefix#后缀技巧似乎可以使其正常运行。
silkAdmin 2011年

做$ form ['title'] ['
#value

5

您也可以只将“隐藏元素” CSS类添加到表单元素

$form['user_edit_about']['group_audience']['#attributes']['class'][] = 'element-hidden';

正如iStryker之前提到的,仍然可以通过DOM操作来更改值。但是,这是一种隐藏表单字段(或任何其他渲染元素)的好方法。的element-hidden类中定义system.base.css


老兄,你救了我。谢谢。我见过的所有其他方法都不会在表单本身上输出元素。就我而言,我想将表单元素隐藏在contrib模块中,该模块希望这些元素位于表单中,否则它将无法正常工作。您的CSS修复程序隐藏了不需要的元素,但一切仍然有效。感谢您还指出,这不是“防黑客”的方法,仅在您需要简化呈现给受信任的编辑器用户的界面时才起作用。
Mario Awad
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.