如何使用正确的方式使用form_set_error()? -- 7 领域 和 forms 领域 drupal 相关 的问题

How do I use form_set_error() the right way?


9
vote

问题

中文

在我的Drupal 7模块中,我有一个表单及其验证处理程序。我从一个字段称我的表单。用 998887664 ;它按预期工作。

在输入值错误的情况下,问题是错误的。

它需要两个错误的提交在显示错误消息之前:第一次,在错误的输入周围有红色边框,第二次,显示错误消息(使用红色边框)。

所以,使用 form_set_error() 的正确方法是什么?

英文原文

In my Drupal 7 module, I have a form and its validation handlers. I call my form from a field.tpl.php with print render(drupal_get_form('my_form')); it works as expected.

The problem is in case of wrong input value.

It requires two incorrect submissions before displaying the error message: The first time, there is red border around my wrong input, and the second time, the error message is displayed (with the red border).

So, what's the right way to use form_set_error()?

     
   
   

回答列表

6
 
vote
vote
最佳答案
 

表单构建器不应该在模板文件中调用,因为它们被称为太晚。当您调用 render(drupal_get_form('my_form')) 时,已经执行了呈现错误消息的代码,并且从验证处理程序报告的最终错误消息在 drupal_set_message(),从 form_set_error()

要打印错误消息的代码位于 page.tpl.php 文件。

  <?php if ($breadcrumb): ?>   <div id="breadcrumb"><?php print $breadcrumb; ?></div> <?php endif; ?>  <?php print $messages; ?>   

drupal_set_message() 保存要显示的消息是以下一个:

    if ($message) {     if (!isset($_SESSION['messages'][$type])) {       $_SESSION['messages'][$type] = array();     }      if ($repeat || !in_array($message, $_SESSION['messages'][$type])) {       $_SESSION['messages'][$type][] = $message;     }      // Mark this page as being uncacheable.     drupal_page_is_cacheable(FALSE);   }   
 

Form builders are not supposed to be called inside a template file, as they are being called too late. When you are calling render(drupal_get_form('my_form')), the code that renders the error messages has been executed, and the eventual error messages reported from the validation handler are saved in the current session from drupal_set_message(), which is called from form_set_error().

The code to print the error message is in the page.tpl.php file.

<?php if ($breadcrumb): ?>   <div id="breadcrumb"><?php print $breadcrumb; ?></div> <?php endif; ?>  <?php print $messages; ?> 

The code in drupal_set_message() that saves the messages to show is the following one:

  if ($message) {     if (!isset($_SESSION['messages'][$type])) {       $_SESSION['messages'][$type] = array();     }      if ($repeat || !in_array($message, $_SESSION['messages'][$type])) {       $_SESSION['messages'][$type][] = $message;     }      // Mark this page as being uncacheable.     drupal_page_is_cacheable(FALSE);   } 
 
 
     
     
9
 
vote

你应该看 form_set_error 而不是

如果您有这样的元素:

  $form['#submit'][] = array('mymodule_form_followbtn_custom_submit'); 0  

在您的验证中,如果您发现 998876611 中的值没有有效

中,则会执行此操作
  $form['#submit'][] = array('mymodule_form_followbtn_custom_submit'); 2  
 

You should be looking at form_set_error instead

if you have an element like this:

function my_custom_module_form() {   $form = array();   $form['my_element'] = array(     '#type' => 'textfield',     '#title' => 'My Text field',     '#default_value' => 'Some default text.',   );   return $form; } 

in your validation callback function do this if you find that the values in $form_state['values'] aren't valid

function my_custom_module_form_validate($form, &$form_state) {   // Do some checking on $form_state['values'], if you don't like it.   form_set_error('my_element', 'This is the error message that will be displayed.'); } 
 
 
 
 
1
 
vote

$form['#submit'][] = array('mymodule_form_followbtn_custom_submit'); 3 应在 $form['#submit'][] = array('mymodule_form_followbtn_custom_submit'); 4中调用 $form['#submit'][] = array('mymodule_form_followbtn_custom_submit'); 4 函数,如lsu_jbob所答案。

 

form_set_error() should be called inside your hook_validate() function as answered by LSU_JBob.

 
 
 
 

相关问题

7  如何将图像添加到Drupal 7中的块中?  ( How do i add an image to a block in drupal 7 ) 
我想将图像添加到位于Drupal 7中的第一个侧栏中的块。有谁知道如何执行此操作?谢谢。 ...

3  一个主题是面板(或添加风格)  ( How does one theme a panel or add a style ) 
我正在使用drupal 7和面板3. 我正在寻找一个良好的教程,或者教程视频,描述了它们的面板。我理解使用模板文件,通常锄头到主题节点和它们字段,但我真的不明白如何主题面板。我看到在布局设计师中,它允许您向面板窗格添加"样式" 。我理解这可能是基于主题的,但是人们将如何添加另一个风格。 任何帮助都会很棒。 感谢 ...

3  Feeds:如何使用CSV节点导入导入图像?  ( Feeds how to import images using csv node import ) 
我尝试使用带有额外图像字段的节点导入克隆,以将附加图像导入节点。 没有成功,我尝试从本地文件上传内容。 我使用CSV解析器和节点处理器。 我的内容类型有一个名为照片的图像字段,使用映射器映射到CSV格式。 我使用windows作为本地馈送源和drupal 7作为服务器。 如何使用CSV节点导入图像? CSV文件中的图...

6  如何通过馈送向分类学参考字段添加多个术语?  ( How to add multiple terms to a taxonomy reference field via feeds ) 
我想在一个节点字段中导入一个具有多个分类术语的节点。 我如何用饲料和drupal 7做到这一点? ...

3  如何在Drupal日志中保存“用户代理”?  ( How to save the user agent in the drupal logs ) 
浏览日志文件时,知道错误是由真正的用户还是由机器人引起的。 有没有办法将"用户代理" 字符串(浏览器名称)保存到Drupal Log? ...

1  如何在D6中添加CCK字段到我自己的模块提供的内容类型?  ( How to add cck fields to my own content type provided by my own module in d6 ) 
我正在创建一个模块,它提供了一个新的节点内容类型。我可以用自己的默认节点创建字段扩展,但我想添加一些cck字段 too(如 cck imagefield ) 在通过Drupal的内容类型编辑器的通常的管理界面启用我的模块后,不手动 。 所以这里是我自己的表单,它提供了新的内容类型; 这就是我想用CCK Image...

2  用户简单的节点访问控制  ( Simple node access control for users ) 
用户对内容类型的"日记" 具有"编辑自己的内容" 权限。查看自己的日记节点时,我想呈现一个简单的复选框"制作私人" 。然后只有该用户可以查看节点。 我已经看过一些这样做的选项: 1)写入使用hook_node_access()的模块 - overkill? 2)也许现有的内容访问模块提供有用的钩子? 3)创建...

8  如何在视图中设置表格3?  ( How do i set a table header in views 3 ) 
如何究竟获得表格标题以显示在表格上方? 在视图中 - 查看-Table.tpl.php我可以看到 <thead> 部分,但是什么导致它实际得到呈现? 我在哪里指定列标题文本? 我在设置页面中尝试了各种选项,但无济于。 ...

1  如果没有参考,如何制作一个节点参考字段,也可以表现为文本字段  ( How to make a node reference field that can also behave as a text field if no re ) 
我正在寻找灵活的方法来允许用户输入一个字段,而且还要在节点引用已经存在的情况下,该字段是节点参考。换句话说,让我们说我有一个名为Dog的内容类型,每只小狗都有一个收藏玩具的节点参考,如果玩具存在,这个字段应该是节点参考,否则应该允许用户填写。 概念上我可以想到两种方法来做到这一点。一种方式,只是为了使它成为...

6  有没有办法在没有网页中以网址在网址中以编程方式设置寻呼机的页码?  ( Is there a way to set the pagers page number programmatically without the page ) 
我想要一个先前留下了节点的评论的用户,最初看到新的用户的最后一页,而新用户(该节点)最初会看到注释的第一页。 我知道该页面由寻呼机控制,并由URL中的"页面" 变量设置( 99887661 )。有没有办法可以以方便地设置这件事? (只是为了澄清,我不使用这个项目上的视图模块。) ...

3  如何在节点添加表单中添加节点添加链接(对于不同的内容类型)(Drupal 7)  ( How do i add a node add link for a different content type in the node add fo ) 
我将使用面板覆盖节点添加/编辑表单。我添加的一个字段使用自动完成窗口小部件(它是一个节点参考字段)。我还想在自动完成字段下面添加一个链接以添加新节点(其中一个引用的节点)。我想知道是否有一种方法可以添加此链接。 如果在面板中是不可能的,也许有人可以让我知道如何使用模板添加这种链接到节点添加表单。 ...

4  如何基于内容类型更改术语URI  ( How to change a term uri based on content type ) 
我有2种内容类型(照片,视频),两者都有一个术语参考,对"主题" 分类。 主题术语在节点显示页面上显示,我想链接到照片的"/ photo /%" ,用于视频,用于视频,而不是默认的"/taxonomy/term/%". 如何做到这一点? ...

4  如何在查看视图时保存用户想要的过滤器?  ( How can i save what filters a user wants when viewing a view ) 
我不知道这是可能的,但我想允许我的用户能够过滤他们想要在视图中显示的内容,以便每次返回该视图时,他们的偏好保存。 我否如何允许我的用户在视图中过滤内容,但我无法保存它。我正在努力让我的用户控制自己的新闻源。 我已经尝试过一些模块来做这个,我一直在玩一段时间,但我似乎无法破解我所概述的东西。任何帮助,将不胜感激。谢谢...

3  如何在地址域显示城市与州之间放置逗号?  ( How to put a comma between city and state in addressfield display ) 
我正在使用带有drupal 7.10的 addressfield 模块。在显示地址域时,我想要一个逗号。目前地址如下所示: 123 Main St SomeCity California 90100 我希望它显示: 123 Main St SomeCity, California 90100 ...

2  下拉列表框+视图 - 不使用分类物  ( Dropdown with search box views without using taxonomy ) 
好的,所以我一直在谷歌上搜索几周,我如何这样做,我把一些东西在一起。 我想结合年份值,并将其与搜索框组合。 现在,我想知道我可以创建一个视图,然后通过URL传递上下文参数。这完美无缺。我可以通过访问URL http://example.com/cars/来到1977年1977年为汽车制造的制动器的结果1977年,刹...

2  允许用户通过UI设置一些CSS设置  ( Allow user to set some css settings through ui ) 
用户希望能够为网站的外观选择一些尺寸和颜色。这些是CSS规则。我有一个模糊的愿景如何通过模块来完成,但也许已经存在了这样的东西? 我需要的是将某种形式与字段为组合框,允许用户从几个值中进行选择。例如。允许他从{红色,蓝色,黄色}中选择"新闻标题的背景" ,恰好是.News-header-background类。 ...

1  可以在Drupal 7上触发Ajax呼叫重新加载自己的表单吗?  ( Can a form triggering an ajax call reload itself on drupal 7 ) 
我正在尝试建立一个页面,以便在顶部的流提出问题,因此我需要ajax来避免重新加载。它实际上很简单。顶部是一个带有流的节点,我添加到下面的块。 一个问题,问题,问题的票数和"添加投票" 按钮 一种添加新节点的表单"用0投票" 我有两个问题。 a)当我点击2的提交按钮时。块我添加一个问题,我可以用新问题更新表,...

5  如何修改页面中的分类术语路径呈现数组?  ( How to modify taxonomy term path in the page render array ) 
我正在尝试在节点页面上显示之前更改一个术语的路径。我在template.php中使用这个预处理函数: function bartik_preprocess_node(&$variables) { $variables['field_photo_topic']['0']['taxonomy_term']->...

1  用户的论坛CMS? [关闭]  ( Forum cms for user ) 
此问题似乎在帮助中心中定义的范围内涉及Drupal。。 想要改进这个问题?更新问题,所以它是关于drupal答案的主题。 ...

0  可以使用数字启动主题名称吗?  ( Can a theme name be started with a number ) 
我可以用数字开始主题名称吗?例如:"123Go" drupal识别文件夹&amp;以其开头的文件? 它在寺庙中工作.PHP作为函数的开始? ...




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


Licensed under cc by-sa 3.0 with attribution required.