我正在尝试在节点表单的验证阶段更新值,即如果触发了自定义验证错误,则只清空其中一个字段。
过去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()
感谢您的帮助!
答案 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()
之间的差异在哪里?好吧,前者更新实际值,然后将其存储在数据库中,后者用于在验证失败时重新填充表单。