表单API - 匹配字段错误 -- forms 领域 drupal 相关 的问题

Form API - match field with error


0
vote

问题

中文

我有一个奇怪的问题。假设我们有这种形式:

  $form['field1'] = array(   '#type' => 'textfield',   '#title'  => 'First field' ); $form['container'] = array(   '#type' => 'container' ); $form['container']['field2'] = array(   '#type' => 'textfield',   '#title' => 'Second field' );   
现在,如果您为Field2设置错误,则您可以这样做:
  form_set_error('field2', 'error message');   

而不是喜欢

  form_set_error('container][field2', 'error message');   

我想知道drupal如何识别正确的表单元素以添加错误类。我想做那样的事情,为没有通过验证的每个字段添加一个后缀。

我尝试使用 form_get_errors() 获取错误字段,但它将 field2 返回为具有错误的字段。很明显, $form['field2'] 不存在添加我无法向其添加后缀。

任何帮助都非常感谢。或者至少提示到正确的方向。谢谢:)

英文原文

I have a weird question. Let's say we have this form:

$form['field1'] = array(   '#type' => 'textfield',   '#title'  => 'First field' ); $form['container'] = array(   '#type' => 'container' ); $form['container']['field2'] = array(   '#type' => 'textfield',   '#title' => 'Second field' ); 

Now if you set an error for field2, you do it like this:

form_set_error('field2', 'error message'); 

and not like

form_set_error('container][field2', 'error message'); 

I wonder how does drupal does recognize the right form element to add the error class. I wanna do something like that, to add a suffix for every field who did not passed validation.

I tried getting the error field with form_get_errors() but it returns field2 as a field with an error. It's obvious that $form['field2'] does not exists add I can't add a suffix to it.

Any help is greatly appreciated. Or at least a hint to the right direction. Thanks :)

  
   
   

回答列表

0
 
vote

drupal在元素主题级< / a>与 _form_set_class < / a>函数。此函数获取 $element 数组,并检查它是否具有函数 form_get_error 。因为错误设置了索引,如 998876610 (父母)在 public function autocomplete(Request $request) { $string = $request->query->get('q'); $matches = array(); $query = db_select('node_field_data', 'n') ->fields('n', array('title', 'nid')) ->condition('title', $string . '%', 'LIKE') ->execute() ->fetchAll(); foreach ($query as $row) { $matches[] = array('value' => $row->nid, 'label' => $row->title); } return new JsonResponse($matches); } 1 数组中找到它们可能不那么容易。因此,我建议使用相同的支票在 998876612 中,在pre_render,主题或验证级别中有 public function autocomplete(Request $request) { $string = $request->query->get('q'); $matches = array(); $query = db_select('node_field_data', 'n') ->fields('n', array('title', 'nid')) ->condition('title', $string . '%', 'LIKE') ->execute() ->fetchAll(); foreach ($query as $row) { $matches[] = array('value' => $row->nid, 'label' => $row->title); } return new JsonResponse($matches); } 3 数组。 public function autocomplete(Request $request) { $string = $request->query->get('q'); $matches = array(); $query = db_select('node_field_data', 'n') ->fields('n', array('title', 'nid')) ->condition('title', $string . '%', 'LIKE') ->execute() ->fetchAll(); foreach ($query as $row) { $matches[] = array('value' => $row->nid, 'label' => $row->title); } return new JsonResponse($matches); } 4 < / a>可以是有用的。

超级简单示例:

  public function autocomplete(Request $request) {  $string = $request->query->get('q');     $matches = array();       $query = db_select('node_field_data', 'n')           ->fields('n', array('title', 'nid'))           ->condition('title', $string . '%', 'LIKE')           ->execute()           ->fetchAll();     foreach ($query as $row) {         $matches[] = array('value' => $row->nid, 'label' => $row->title);     }      return new JsonResponse($matches); } 5  
 

Drupal does it on elements theme level with _form_set_class function. This function gets $element array and checks if it has errors with function form_get_error. Because errors are set with indexes like 'foo][bar][value' (parents) that can be not so easy to find them in the $form array. So I suggest to use the same check as in _form_set_class with your function at pre_render, theme or validate level when you have $element array. hook_element_info_alter can be useful.

The super simple example:

function YOUR_MODULE_element_info_alter(&$elements) {   foreach ($elements as $type => $value) {     $elements[$type]['#pre_render'][] = 'YOUR_MODULE_element_error_check';   } }  function YOUR_MODULE_element_error_check($element) {   if (isset($element['#parents']) && form_get_error($element)) {     $element['#suffix'] = t('error!');   }   return $element; } 
 
 
0
 
vote
vote
最佳答案
 

我最终通过查看表单结构并将后缀设置为实现此功能并设置后缀来实现我所需的每个表单所需的一般解决方案。

 

I ended up adapting the general solution to each individual form I needed to achieve this functionality by looking at the form structure and setting the suffix that way.

 
 
0
 
vote

我不知道drupal如何知道如何从名称中获取正确的表单元素而不指示父母。

public function autocomplete(Request $request) { $string = $request->query->get('q'); $matches = array(); $query = db_select('node_field_data', 'n') ->fields('n', array('title', 'nid')) ->condition('title', $string . '%', 'LIKE') ->execute() ->fetchAll(); foreach ($query as $row) { $matches[] = array('value' => $row->nid, 'label' => $row->title); } return new JsonResponse($matches); } 6 给您的名称中获取表单元素,以下为我工作:

  public function autocomplete(Request $request) {  $string = $request->query->get('q');     $matches = array();       $query = db_select('node_field_data', 'n')           ->fields('n', array('title', 'nid'))           ->condition('title', $string . '%', 'LIKE')           ->execute()           ->fetchAll();     foreach ($query as $row) {         $matches[] = array('value' => $row->nid, 'label' => $row->title);     }      return new JsonResponse($matches); } 7  
 

I have no idea how Drupal knows how to fetch the correct form element just from the name without indicating the parents.

As for getting the form element from the name that form_get_errors() gives you, the following worked for me:

$name = 'container][field2';  // Split the elements/indexes apart. $split_name = explode('][', $name);  // Check for integer indexes. (Not sure if this is entirely necessary. foreach($split_name as &$arr_nest) {   // Don't quote integer indexes.   $arr_nest = !is_int($arr_nest) ? '"' . $arr_nest . '"' : $arr_nest; }  // Put the name back together again. eg. "container"]["field2"  $split_name = implode('][', $split_name);  // Get the whole element from the form. eval('$element = $form[' . $split_name . '];');  // Check the results dsm($element, 'form element'); 
 
 
0
 
vote

也许你可以检查内联表单错误模块。我认为它会满足您的需求。

 

Maybe you could check the Inline Form Errors module. I think it will suit your needs.

 
 

相关问题

3  如何在叠加模式中表单提交后重定向用户?  ( How to redirect user after form submit in overlay mode ) 
以下代码将用户重定向到 node/add/article 但不使用叠加。 $form_state['redirect'] = 'node/add/article' 如何在叠加模式中打开 node/add/article ? ...

1  如果使用AJAX加载了评论表单,则忽略Ajax提交  ( Ajax submit ignored if comments form is loaded with ajax ) 
在D7中,我有一个自定义模块,在注释表单上启用Ajax表单。这是伟大的。 我也有注释在 commessblock 模块中使用 block_refresh 用下面的片段。这很好地展示评论和表格。但是,Ajax表单提交停止工作。 我试过呼叫 $Drupal.attachBehaviors() (如下所示)和 $Drupa...

1  Mollom CAPTCHA小部件未显示在自定义表单上  ( Mollom captcha widget not showing up on a custom form ) 
d7 + mollom。我希望我的用户每次点击我网站上的 /file/123/download 如 /file/123/download 这样的链接时都会填写CAPTCHA。我正试图向我的需求弯曲Mollom Captcha,但还没有取得任何成功。 Mollom公共和私钥表示,他们已经被Mollom Server验...

0  树景与复选框  ( Treeview with checkboxes ) 
我需要使用复选框创建树视图菜单,显示从数据库中取出的值。我想使用可折叠复选框树。 jQuery插件的演示是可用的这里 ...

0  创建即可审查表格  ( Create submittable review form ) 
我希望能够允许用户对各种因素进行评估,例如员工的乐于助人和衣物的质量。我被告知,为查看表单创建内容类型的最佳方法将是通过使用整数字段。我现在已经设置了内容类型,但我并不真正确定如何允许用户查看/提交审核。 当我创建内容的"审查" 类型时,所有显示给用户的内容是一个评论部分。它们无法看到内容类型中创建的任何可选字段,...

3  如何主题节点编辑表单上的单选按钮字段?  ( How to theme a radio button field on node edit form ) 
标准方式在节点添加/编辑表单上呈现单选按钮字段是带有类的包装器div: form-item form-type-radio form-item-mymodule-imglayout-und 和内部有输入和标签元素。挂钩改变这个?我想要包装夫人有课程: form-item form-type-radio f...

3  如何在同一页面上提交的表单后显示HTML表?  ( How to display an html table after the form submission on the same page as the f ) 
我试图建立一种饲养食品和否的形式。服务并计算该特定食物的总卡路里,并将其显示给用户。 用户,可以通过再次填写表格添加另一个食物,并将计算的第二种食物的卡路里添加到第一,并且还显示总卡路里。他可以添加尽可能多的食物,并且表格显示所有这些食品的总卡路里。 我想向表中的用户显示此信息。表将具有以下列。食品,祭品,卡路里和最...

0  列出框元素  ( List box elements ) 
如何将一个列表框的值移动到另一个在Drupal的模块中的另一个列表框? listbox的值来自数据库 ...

0  如何替换文本框的值?  ( How to replace value of text box ) 
我有2个在我的drupal形式中的输入字段。当最终用户在第一个输入中插入某个值时,我想自动插入第二个输入字段。我如何实现这一目标。 这是我的代码。 输入表单元素1 // total fee of the payment schedule $form['fee'] = array( '#t...

0  将已创建的自定义内容类型转换为新模块  ( Convert an already created custom content type into a new module ) 
是否有一种自动化(或有助于)基于当前自定义内容类型创建模块的工具? 我有两种新的内容类型(表单)使用Drupal用户界面创建,现在我意识到我需要进一步自定义它,并希望创建一个模块来包装它们全部。自从我已经完成了很多工作建造(大)形式,如果有某种技巧(或模块)来完成这一点,我就会徘徊。 ...

1  表单API在每个表单元素的ID中添加Word“编辑”  ( Form api adds word edit in id of every form element ) 
表单API在任何表单元素的ID之前添加Word"编辑" 。当我必须使用js中的元素时,我必须在元素ID之前添加"编辑" 。 示例如果我有元素$ form ['curdate']那么在drupal_add_js('#ed-ed-curdate'); 为什么如此 ...

3  为什么我在模块中获得这些错误?  ( Why do i get these errors in my module ) 
我正在尝试在我编写的模块中使用日期模块,但我得到以下错误: 警告:myform_data_entry_form()中缺少的pyborm_data_entry_form()的参数1(D: wamp www drupal sites all modules myform myform.module)。 ...

13  单击后如何禁用提交按钮?  ( How to disable the submit button after clicking ) 
drupal似乎没有防止多个表单,即使节点页面也是如此。这个 qa 建议将其固定在服务器端。 如何在单击后禁用提交按钮? 任何其他解决方案? ...

2  表格键入TextField,单击删除默认值  ( Form textfield on click remove default values ) 
我的目标是在被选择/单击时自动删除表单文本字段中的默认值。真的很确定现在怎么样。任何建议? ...

-2  表格API,WEBForm或CCK? [关闭]  ( Form api webform or cck ) 
正如目前所在的那样,这个问题并不适合我们的Q&amp;一种格式。我们预计事实,参考资料或专业知识的支持,但该问题可能会征求辩论,论点,投票或扩展讨论。如果您觉得可以改进此问题并可能重新开放,请访问帮助中心进行指导。 ...

1  如何使用file_save_upload保存文件中的file_save_upload形式  ( How to save a file using file save upload in multistep ajax form ) 
如何使用ajax multiSep表单中使用file_save_upload保存文件?这适用于一个简单的形式,但我不确定我在多学期中出现问题的地方。任何帮助非常感谢! 文件保存以简单的形式工作: function xmlimport_form_submit($form, &$form_state){ $valid...

2  通过hook_node_validate验证字段的正确方法  ( The right way to validate fields via hook node validate ) 
而不是通过字段API创建新字段,并作为一个快速解决方法,我向内容类型添加了一个简单的文本字段,即我现在尝试通过 hook_node_validate() 验证。与以前版本的Drupal不同,此字段的值不仅可以作为 $node->field_name 或 $form['field_name'] ,而是作为包含各种其他信...

3  如何验证在提示用户完成WebForm的其余部分之前可用的日期?  ( How can i validate that a date is available before prompting the user to complet ) 
我有一个包含日期字段的WebForm。我需要运行一些代码检查以确保日期尚未使用(即其他人已提交具有该特定日期的WebForm)。我已经安装了WebForm验证模块,我知道我可以使用它(使用自定义验证器创建自定义模块),但验证不会运行,直到表单提交。因为有一个所需的文件上传,我宁愿能够允许用户检查日期是否可在上传之前可...

4  如何找到在表单提交中更改的值?  ( How to find the values that have changed in a form submission ) 
如何判断表单提交的验证钩子中的值更改了哪些值? ...

2  每节点只评论一次  ( Comment only once per node ) 
我试图让我的用户只在每个产品节点上发布一次......我有点新钩子,我不确定我应该为此使用什么。 怎么样的方法是什么? ...




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


Licensed under cc by-sa 3.0 with attribution required.