drupal 7:使用form_set_value()

时间:2011-12-19 16:40:29

标签: php api drupal

我正在尝试在节点表单的验证阶段更新值,即如果触发了自定义验证错误,则只清空其中一个字段。

过去30小时我试图理解drupal api,但我放弃了。我似乎并不知道不同的值意味着什么。

函数是:form_set_value($ element,$ value,& $ form_state)

现在我明白最后一个值只是$ form_state,我通过validate函数获得了。但是$ element和$ value呢?

我尝试了很多,显然所需的值存在于$ form ['field_name'] ['und'] [0] ['value'] ['#value']中,并且只存在于此。

但是当我尝试使用form_set_value($ form ['field_name'] ['und'] [0] ['value'] ['#value'],'foo',$ form_state)时,它会提升

    Recoverable fatal error: Argument 2 passed to drupal_array_set_nested_value() must be an array, string given, called in /includes/form.inc on line 2436 and defined in drupal_array_set_nested_value()

当我尝试时:

    $newvalue = $form['field_name']['und'][0]['value'];
    $newvalue['#value']='foo';
    form_set_value($form['field_name']['und'][0]['value'],$newvalue,$form_state);
它提出了:

    Warning: mb_strlen() expects parameter 1 to be string, array given in drupal_strlen()

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

除非我真的误解了你想要做的事情,否则这将有效:

$form_state['values']['field_name']['und'][0]['value'] = '';

在验证错误后重新构建表单时,$form_state['values']中的值用于重新填充表单中的字段。因此,如果您重置$form_state['values']数组中的值,则当表单显示验证错误时,它将不会出现。

答案 1 :(得分:1)

经过大量调试后,我终于成功完成了这项工作。诀窍在于$form['complete form']。但首先要看的是,form_set_value()是如何工作的以及它的作用是什么?

form_set_value()函数

正如文档建议的那样:

  

如果你想更新$ form ['elem1'] ['elem2']的值,它应存储在$ form_state ['values'] ['elem1'] ['elem2']中,你会设置$ element ['#parents'] = array('elem1','elem2')。

现在是什么意思?在我的情况下,我有一个名为'field_event_title'的文本字段,这是我在创建时给它的名称。在$form中,所有字段都在$form['field_name']中有一个子数组,在我的情况下$form['field_event_title']。这也是存储提交值的地方。既然它是一个文本字段,drupal维护输入数据的语言和delta [编辑问题:这是对吗?]。实际上,该值不存储在$form['field_name']['value']中,而是存储在$form['field_name']['und'][0]['value']中(['und'] =语言; [0] = delta)。请注意,'und'是网站默认语言的drupal密钥,如果是德语,那么它将是'de',但在大多数情况下它应该是'und'。

要使用form_set_value()实际更改值,应该通过编写以下内容来调用该函数: form_set_value($form['field_name'],array('und' => array(0 => array('value' => 'foo'))),$form_state);

即。 $element = $form['field_name'] $value=array('und' => array(0 => array('value' => 'foo')))

更新表单以使用与提交(或清除它们)不同的值重新填充表单

但是这在我的情况下不起作用,因为我想在调用自定义验证错误后清除字段。现在,人们会怀疑表单使用$form_state['values']中的值重新填充自身(这实际上是存储值的位置,使用form_set_value()时获得更新的实际位置以及生成{的位置{1}}稍后。),但事实并非如此:它使用$form内的值,这是$form_state['complete form']的“副本”(注意它拼写为“完整形式”,空间,而不是下划线)。

所以使用$form更新实际在验证错误上重新填充表单的值。 (注意:您可以像在我的用例中一样将其设置为$form_state['complete form']['field_name']['und'][0]['value']['#value']='foo';以简单地清空字段。)

摘要

现在=NULL(例如,通过$form['field_name']更新)和form_set_value()之间的差异在哪里?好吧,前者更新实际值,然后将其存储在数据库中,后者用于在验证失败时重新填充表单。