在drupal 7中使用form_set_value() -- 7 领域 和 forms 领域 drupal 相关 的问题

Using form_set_value() in Drupal 7


4
vote

问题

中文

我正在尝试在节点形式的验证阶段期间更新值,即,如果触发自定义验证错误,只需空"一个字段。

在过去的30个小时里,我试图了解Drupal API,但我放弃了。我似乎没有明白不同的价值观是什么意思。

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

现在我知道最后一个值只是$ form_state,我通过验证函数。但美元和价值怎么样?

我正在尝试很多,显然所需的值驻留在$ 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()   

谢谢任何帮助!

[编辑]

我的完整功能是:

      function hook_node_validate($node,$form,&$form_state) {       if(fancy_stuff){         form_set_value();         form_set_error();       }      }   

[编辑]

      //calls when node is being created     function eventcheck_node_validate($node,$form,&$form_state) {       //checks if the node type is applicable       if($node -> type=='article') {         //checks if field 'field_event_choose' AND either 'field_event_title'          //or 'field_event' is supplied, if so, fire form_set_value() and form_set_error()         if ((array_key_exists('endpoints',$node -> field_event_choose['und'][0])) &&          (($node -> field_event_title['und'][0]['value']<>'') || (isset($node ->          field_event['und'][0]['value'])))) {            //fire away           $form_set_value(???);           $form_set_error('event_checker_group',t('sorry blabla'));          }       }     }   

我希望有帮助。

英文原文

I am trying to update a value during the validate phase of a node-form, i.e. if the custom validation error is fired, just empty one of the fields.

for the last 30 hours I am trying to make sense of the drupal api, but I am giving up. I just do not seem to get the idea what the different values mean.

the function is: form_set_value($element, $value, &$form_state)

now i understand that the last value is simply the $form_state, that I am having through the validate function. but what about $element and $value?

I was trying a lot and apparently the desired value resides in $form['field_name']['und'][0]['value']['#value'] and only there.

but when I am trying form_set_value($form['field_name']['und'][0]['value']['#value'],'foo',$form_state) it raises

    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() 

and when I am trying:

    $newvalue = $form['field_name']['und'][0]['value'];     $newvalue['#value']='foo';     form_set_value($form['field_name']['und'][0]['value'],$newvalue,$form_state); 

it raises:

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

Thanks for any help!

[EDIT]

My complete function is:

    function hook_node_validate($node,$form,&$form_state) {       if(fancy_stuff){         form_set_value();         form_set_error();       }      } 

[EDIT2]

    //calls when node is being created     function eventcheck_node_validate($node,$form,&$form_state) {       //checks if the node type is applicable       if($node -> type=='article') {         //checks if field 'field_event_choose' AND either 'field_event_title'          //or 'field_event' is supplied, if so, fire form_set_value() and form_set_error()         if ((array_key_exists('endpoints',$node -> field_event_choose['und'][0])) &&          (($node -> field_event_title['und'][0]['value']<>'') || (isset($node ->          field_event['und'][0]['value'])))) {            //fire away           $form_set_value(???);           $form_set_error('event_checker_group',t('sorry blabla'));          }       }     } 

I hope that helps.

     
 
 

回答列表

11
 
vote
vote
最佳答案
 

经过大量的调试,我终于设法做了这项工作。诀窍在于 $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'的textfield,这是我在创建时给它的名称。在 $form 中,所有字段都有一个子阵列 $form['field_name'] ,在我的情况下是 $form['field_event_title'] 。这是存储所提交的值的位置。由于它是一个文本场,Drupal维护了语言和Delta [编辑器的问题:是输入数据的正确吗?]。因此,实际上,该值未存储在 $form['field_name']['value'] 中,但在 form_set_value()0 form_set_value()1 )中。请注意,"und" 是网站默认语言的Drupal键;如果它是德语,那么它将是"de" ;但是,在大多数情况下,它应该是"und" 。

要使用 form_set_value()2 实际更改值,应该通过编写来调用函数:

  form_set_value()3  

更新表单以将其重新掺杂,而不是提交的值(或清除它们)

到目前为止,这是Krister Andersson建议的,但这在我的情况下没有工作,因为我一旦调用了自定义验证错误,我就想要清除字段。一个人怀疑,表单使用 form_set_value()4 中的值(实际上是存储值的位置,在使用 998876615 时更新的实际位置生成 form_set_value()6 稍后),但不是这种情况:它使用 998876617 中的值,这是 form_set_value()8 (请注意,它被拼写为"完整的表格" ,具有空间,而不是下划线)。

使用 form_set_value()9 是什么更新实际在验证错误上重新填充表单的值。 (注意:您可以在我的useCase中设置它,将其设置为 form_set_value()0 以简单地清空字段。)

摘要

form_set_value()1 (例如通过 form_set_value()2 )和 form_set_value()3 之间的区别在哪里嗯,前者更新实际值,然后将其存储在数据库中;后者用于在失败验证时重新填充表单。

 

After a lot of debugging, I finally managed to make this work. The trick lies inside $form['complete form']. but first things first, how does form_set_value() work and what does it do?

The form_set_value() function

As the documentation suggests:

If you want to update the value of $form['elem1']['elem2'], which should be stored in $form_state['values']['elem1']['elem2'], you would set $element['#parents'] = array('elem1','elem2').

Now what does that mean? In my case, I had a textfield called 'field_event_title', which is the name I gave it on creation. In $form, all fields have a sub-array in $form['field_name'], which in my case is $form['field_event_title']. This is where the submitted value also is stored. Since it is a textfield, Drupal maintains both the language and the delta [question for editors: is this right?] of the input data. So in fact, the value is not stored in $form['field_name']['value'], but in $form['field_name']['und'][0]['value'] (['und']=language; [0]=delta). Note that "und" is the Drupal key for the default language of the site; if it is in German, then it would be "de"; however, in most cases it should be "und."

To actually change the value using form_set_value(), one is ought to invoke the function by writing:

form_set_value($form['field_name'], array('und' => array(0 => array('value' => 'foo'))), $form_state); 

Updating a form to repopulate it with different values than submitted (or clearing them)

Thus far, this was what Krister Andersson suggested, but that did not work in my case, since I wanted to clear fields once a custom validation error has been invoked. One would suspect that the form repopulates itself using the values inside $form_state['values'] (which is actually the place where the values are stored, the actual place that gets updated when using form_set_value() and the place which generates the $form later), but that is not the case: It uses the values inside $form_state['complete form'], which is a 'copy' of $form (notice that it is spelled 'complete form', with a space, not an underscore).

Using $form_state['complete form']['field_name']['und'][0]['value']['#value'] = 'foo'; is what updates the values that actually repopulate the form on a validation error. (Note: you can, as do I in my usecase, set it to =NULL to simply empty the field.)

Summary

Where is the difference between $form['field_name'] (e.g. updating through form_set_value()) and $form['complete form']? Well, the former updates the actual value, which then gets stored inside the database; the latter is being used to repopulate a form when it failed a validation.

 
 
       
       
1
 
vote

我设法通过这样做,使其工作:

  form_set_value()4  

如果您还没有这样做,您应该看看文档 form_set_value()5

*编辑*

在您举例中,我猜测验证方法中的代码应该是:

  form_set_value()6  

从参数的文档:

$元素:应该更新其值的表单元素;多数情况 虽然,您可以从$表单数组中传递到元素 实际使用的唯一组件是'#parents'。如果 构建自己,将$元素['#父母']设置为一个数组给予 通过表单数组的键对您的价值的元素的路径 想要更新。例如,如果要更新值 $ form ['elem1'] ['elem2'],应该存储在 $ form_state ['值'] ['elem1'] ['elem2'],你会设置 $元素['#父母] =数组('elem1','elem2')。

 

I managed to get it working by doing this:

// hook_form_alter, check so it's the correct form and attach a validate function function sample_form_alter(&$form,&$form_state,$form_id) {   if ($form_id == "sample_dummy_node_form") {     $form['#submit']['#validate'] = 'sample_dummy_node_form_validate';   } }  // validate function, wich just sets the `title` field to `tjoohooo` using `form_set_value` function sample_dummy_node_form_validate($form, &$form_state) {   $form['title']['#parents'] = array('title');   form_set_value($form['title'],t('tjoohooo'), $form_state); } 

If you haven't done so already, you should have a look at the documentation form_set_value

* EDIT *

In you example I guess the code in your validate method should be:

function hook_node_validate($node,$form,&$form_state) {   if (fancy_stuff){     $form['field_name']['#parents'] = array('field_name');     form_set_value($form['field_name'],t('foo'),$form_state);   }  } 

From the documentation for the parameters:

$element: The form element that should have its value updated; in most cases you can just pass in the element from the $form array, although the only component that is actually used is '#parents'. If constructing yourself, set $element['#parents'] to be an array giving the path through the form array's keys to the element whose value you want to update. For instance, if you want to update the value of $form['elem1']['elem2'], which should be stored in $form_state['values']['elem1']['elem2'], you would set $element['#parents'] = array('elem1','elem2').

 
 
         
         

相关问题

1  标签和词汇模块或模拟堆栈交换标记行为的技术?  ( Tag vocabulary module or technique that mimics stack exchange tag behavior ) 
我正在寻找重新创建堆栈交换的标记功能: - 在单个文本输入行上输入标记,逗号分离。 - 将新标签添加到分类物中 - 现有标记的增量计数 - 基于初始字符条目的内联建议 是否有一个Drupal模块或提供此功能的组工具? ...

1  如何创建模块作为JS的包装器  ( How to create a module as a wrapper for js ) 
我做了很多主题,但我没有太多的php技能。所以当我使用或创建一个很酷的javascript时,我将它放入我的主题层。问题是,90%的时间它不属于那里,我真的无法分享我对他人所做的事情。 所以,我如何创建一个模块,基本上是包装器,对于JS代码?我需要了解更多关于该基本自定义模块结构以及用于插入JS和CSS的PHP。奖金...

0  Drupal说“发送电子邮件”,但我没有收到[复制]  ( Drupal says e mail sent but i dont receive ) 
这个问题已经在这里有答案: 无法发送电子邮件。如果问题仍然存在,请联系站点管理员 (10个答案) ...

5  如何从Drupal Admin中添加到Drupal站点的背景图像壁纸?  ( How to add a background image wallpaper to a drupal site from within the drupal ) 
如何从Drupal admin i.e内添加到Drupal站点的背景图像壁纸。未编辑主题或PHP? 我对PHP或主题不是不利,但添加了背景图像壁纸是通用非主题特定功能,所以应该需要编辑特定主题。 这必须是一个人想要与他们的网站有关的最简单/基本/流行之一。它应该在Drupal中显而易见 - 和 - 可能在Drupa...

0  有机组和其他方法之间的安全权力是什么?  ( What are the security trade offs between organic groups and other methods ) 
我正在实施一个社区网站的早期阶段,该网站将由许多子社区/组组成。大多数内容将在所有组之间共享(例如社区范围的公告和新闻),但每个集团将有几个网站的部分。为了讨论,让我们说每个小组都有自己的私人维基,博客和地址簿。 一般来说,似乎有两个选项: 一个网站有一些内容拆分(有机组 多个站点,其中包含某些内容它们之间(dru...

1  有什么可以覆盖Preloader覆盖层的Drupal方式直到他们完成加载?  ( What would be the drupal way to have a preloader overlay divs untill they were f ) 
我正在尝试在主题的每个部分上运行预加载程序映像,直到相应的div部分完成加载。 我正在尝试避免$(窗口).load(函数());如果我能。 是什么最好的方法?提前致谢。 ...

6  在Drupal 7中的Hook_User等同于Hook_User是什么?  ( What is the equivalent of hook user with op form in drupal 7 ) 
在Drupal 7中的 $op = 'form' 中的 $op = 'form' 是什么?根据 hook_user ,的文档'form' 手段: 表单:将显示用户帐户编辑表单。该模块应呈现它希望注入表格的表单元素。 但我找不到drupal 7 <代码> user.api.php 。 谢谢 ...

1  时区问题  ( Problem with timezone ) 
当我编辑我的节点时,我有这个日期 但是当我保存系统时,更改时间: 我真的不明白,因为我在服务器上的时区和drupal都是一样的。 我的领域很好地配置: 为您的信息 提前感谢 ...

2  Drupal 7中的相关内容  ( Related content in drupal 7 ) 
我正在开发一个需要一个相关内容块的Drupal 7的网站。问题是我尝试了类似的条目和类似的条款模块,但它看起来与views 7.x-3.0我不兼容。 当我安装两个模块和错误报告时,我发现了一个错误的消息,我找到了错误的帖子,就像我一样,但没有良好的解决方案。 我在思考,直到模块准备好,也许可以,以某种方式,使用视图并...

2  如何从父对象复制位置国家字段值到子对象字段默认值?  ( How to copy location country field value from parent object to child object fiel ) 
我使用父和子内容类型,其中包含两种类型的字段。 我希望drupal从父值自动传播字段值,以子字段默认值。 怎么办? 在Location&gt的一个例子中,我感兴趣。国家字段。 我使用节点参考或有机组模块来设置父级&lt; - &gt;子关系。 ...

0  致命错误:调用未定义的函数quiz_type_access_load()  ( Fatal error call to undefined function quiz type access load ) 
切换服务器后获取以下错误。安装在Linux框中是多电路。麻烦制造者在子域名。 迄今为止: 禁用测验和测验子模块, 清除缓存,没有什么工作。 Fatal error: Call to undefined function quiz_type_access_load() in /path/to/drupal/incl...

3  组重复视图中的日期  ( Group repeating dates in views ) 
我有这种情况: ContentType"事件" 具有Date-Field(具有重复选项)。每周一次重复所有重复事件的时间。 我想要实现此视图 - 块: 告诉我所有重复的事件(让这个可以用条件工作 eventdate:rrule不是空的)。 event-id组,不要向我展示每次重复事件(因为 该事件的描述...

1  如何获得地点作为令牌?  ( How to get location as tokens ) 
我想使用节点位置值(例如location:country-name)作为令牌。 是否有可能使用像[node:location:country-name]的东西? ...

1  钩为“欢迎(等待批准)”电子邮件  ( Hook for the welcome awaiting approval email ) 
我需要修改电子邮件,以"欢迎(等待批准" 。" 我知道我可以使用 hook_mail_alter(),但我不知道ID为"欢迎(等待批准)" ,我也不知道如何直接访问用户的Profile2字段。 我假设我必须做一些这样的事情: function module_mail_alter(&$message) { if...

4  在注册上更改“密码匹配”和“密码强度”文本  ( Change passwords match and password strength text on signup ) 
如何更改注册页面上的"密码强度:弱" 和"密码匹配:否" 文本。有这个吗? ...

1  Facebook for Drupal在安装时抛出错误。 [关闭]  ( Facebook for drupal throws errors on install ) 
这个问题不太可能帮助任何未来的访客;它仅与小地理区域,特定时刻及时的特定时刻或非常狭窄的情况,这些情况通常不适用于互联网的全球观众。有关帮助提出这个问题更广泛适用,请访问帮助中心。 ...

2  基于上一个选择框值的动态选项列表  ( Dynamic options list based on the previous select box value ) 
我有一个webform。我希望基于第1个选择框值加载第二个选择框值。这些值应从DB表加载。请告诉我我需要使用哪个钩子以及如何进行。 ...

0  菜单权限/可见性控制  ( Menu permission visibility control ) 
我参与使用drupal 7开发一个站点构建器7.由于它是一个站点构建器,我需要一个用户可以根据需要创建菜单项,然后编辑这些菜单项 - 但不是任何其他菜单用户。 也是可以在注册期间创建子域(沿着Drupal Gardens的线)? ...

0  显示页面中的文本作为弹出窗口  ( Show text in a page as popup ) 
我在我的页面中有一些文字。和一个阅读更多链接。当我点击链接时,它应该在弹出窗口中打开文本。有没有模块要这样做吗?我需要只打开弹出窗口的文本而不是一些网址/ html页面。 ...

1  什么是Drupal 7中的Sess_count  ( What is the equivalent of sess count in drupal 7 ) 
为将6.x模块转换为7.x 解释: 从 sess_*开始的所有会话函数以及 session_save_session() ,现在重命名为 drupal_session_* 或 _drupal_session_* 我必须使用 sess_count() 在我的D7模块中,自然地使用 drupal_session_...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.