Php Drupal 6:如何隐藏字段集,使其不显示在表单中?

Php Drupal 6:如何隐藏字段集,使其不显示在表单中?,php,drupal-6,location,drupal-modules,Php,Drupal 6,Location,Drupal Modules,我已启用位置用户模块,在用户注册期间,我收集了2个位置字段“国家/地区”和“邮政编码”。当我为用户注册表单设置主题时,我想删除围绕国家和邮政编码元素设置的位置字段 您能告诉我吗?由于位置表单结构不同于其他表单数组,所以目前还没有直接的答案。基本上使用drupal\u render函数,我在默认位置字段集之外填充了邮政编码和国家表单元素。所以模板显示的是空的位置字段集 我使用肮脏的技术纠正了它-CSS hack暂时隐藏字段集,如下所示: #user-register fieldset {displ

我已启用位置用户模块,在用户注册期间,我收集了2个位置字段“国家/地区”和“邮政编码”。当我为用户注册表单设置主题时,我想删除围绕国家和邮政编码元素设置的位置字段


您能告诉我吗?

由于位置表单结构不同于其他表单数组,所以目前还没有直接的答案。基本上使用
drupal\u render
函数,我在默认位置字段集之外填充了邮政编码和国家表单元素。所以模板显示的是空的位置字段集

我使用肮脏的技术纠正了它-CSS hack暂时隐藏字段集,如下所示:

#user-register fieldset {display:none;}

如果您只想隐藏视图中的字段,那么可以使用一个简单的CSS类将其设置为
display:none将完成此操作

如果您想实际更改表单中显示的字段(而不是简单地隐藏它们),可以使用
form\u alter
hook覆盖表单中的字段

form\u alter
hook允许您覆盖任何表单的内容。例如,如果要将字段添加到“user\u login”表单,可以编写如下函数:

function mymodule_form_user_login_alter(&$form, &$form_state, $form_id) {
  $form['myfield'] = array(
          '#type' => 'textfield',
          '#title' => t('My new field')
  );
}
function alter_location_elements($form_element, &$form_state) {
  $form_element['locations'][0]['street']['#type'] = 'hidden';
  $form_element['locations'][0]['city']['#type'] = 'hidden';
  $form_element['locations'][0]['postal_code']['#type'] = 'hidden'; 

  return $form_element;
}
然后,当显示用户登录表单时,它现在将包含您的新字段。在此
$form
数组中,您可以设置任意数量的字段

同样,您可以通过如下方式取消设置字段,将其从表单中删除:

unset($form['fieldname']);
然而,您将面临的问题是,在Drupal6中,
form\u alter
hook仅适用于模块,而不适用于主题。因此,您可能需要创建一个小模块来完成所需的工作。我相信这个限制在Drupal7中已经消除了

有关更多详细信息,请参见Drupal

您可能还想看看哪一个是Drupal bug问题,他们讨论了在主题上添加允许
form\u alter
的功能。您会注意到,它被标记为固定的,Drupal版本号为7

表单的另一个选择是在主题中编写自己的模板。使用此选项,您可以使用
drupal\u render
单独输出表单中的每个字段/字段集。这也允许你做更复杂的主题,如果你想额外的HTML代码等。然而,这种方法充满了危险,如果任何其他领域添加到表单以后,你的主题将无法应付它。通常不建议以这种方式手动呈现表单


希望这会有所帮助。

要更改内容类型表单上的location字段集,您必须添加一个after build,如下所示

function hook_form_alter(&$form, &$form_state, $form_id) {
  ...
  $form['#after_build'][] = 'alter_location_elements';
}
回调函数将如下所示:

function mymodule_form_user_login_alter(&$form, &$form_state, $form_id) {
  $form['myfield'] = array(
          '#type' => 'textfield',
          '#title' => t('My new field')
  );
}
function alter_location_elements($form_element, &$form_state) {
  $form_element['locations'][0]['street']['#type'] = 'hidden';
  $form_element['locations'][0]['city']['#type'] = 'hidden';
  $form_element['locations'][0]['postal_code']['#type'] = 'hidden'; 

  return $form_element;
}
对于D6,最好的方法(不要使用
['#type']='hidden'
;或
unset()
,这些方法可能会产生bug):

在表格中:

$form['field']['#access'] = false;
按Css:

display:none;
作者:Js:

$('#IDELEMENT').css('display') == "none"); or $('#IDELEMENT').hide;

不需要id元素

嗨,斯普德利,谢谢你提供了非常好的信息。我试图使用预处理方法取消设置一些元素,但在位置模块的情况下,这个技巧不知怎么地不起作用。顺便说一下,对于你的努力和一般解决方案,我接受你的回答。