form_set_error消息延迟了一个页面刷新 -- 7 领域 和 forms 领域 drupal 相关 的问题

form_set_error message delayed one page refresh


5
vote

问题

中文

我正在制作形式的自定义验证,但我的错误消息始终延迟一页刷新。

  $form['submit']['#validate'][] = 'asap_sollicitation_form_validate';   function asap_sollicitation_form_validate($form, &$form_state) {     if(strlen($form_state['values']['pass']) < 6){         form_set_error('pass', t('Must be longer than 6'));     }    }   

它成功标记为红色,但消息延迟。如果我只使用 drupal_set_messsage 而没有form_set_error,我确实收到时间显示的消息。 我在节点模板中渲染我的表单:

  $arr = drupal_get_form('asap_sollicitation_form'); print drupal_render($arr);   

如何在表单提交后获取我的消息来显示?

英文原文

I'm making a custom validation in a form I'm making but my error message is always delayed by one page refresh.

$form['submit']['#validate'][] = 'asap_sollicitation_form_validate';   function asap_sollicitation_form_validate($form, &$form_state) {     if(strlen($form_state['values']['pass']) < 6){         form_set_error('pass', t('Must be longer than 6'));     }    } 

It successfully marks the field in red but the message is delayed. If I use only drupal_set_messsage without the form_set_error I do get a message displayed in time. I render my form in a node template:

$arr = drupal_get_form('asap_sollicitation_form'); print drupal_render($arr); 

How can I get my message to display after form submit?

     
       
       

回答列表

3
 
vote

我有同样的,这是解决方案和解释: 此问题的关键是DRUPAL_GET_FORM('foo')在主题层中调用。例如,_preprocess_whover或直接在bar.tpl.php

在 _process_page()之后,它在更深的主题函数中是不可改变的,如foo_preprocess_node。 (这并不完全是真的,但它的范围不符。)

我打赌,你通过 drupal_get_form < / a>('foo')在_preprocess_node中,可能稍后。

您应该使用 hook_entity_view_alter 或 hook_node_view_alter ,也许 cok_page_alter 如有必要,还有什么比主题钩。

只是为了记录:最后一次通过drupal_set_message()设置消息是 _ preprocess_page

 

I had the same, here is the solution and explanation: The key of this problem is the drupal_get_form('FOO') is called in theme layer. For example _preprocess_WHATEVER or directly in BAR.tpl.php

The messages are prepared in _process_page() After that it's unchangeable in deeper theme functions, like FOO_preprocess_node. (That's not exactly true, but it's out of scope of this topic.)

I bet, you prepared a variable by drupal_get_form('FOO') in _preprocess_node, maybe later.

You should use hook_entity_view_alter or hook_node_view_alter, maybe hook_page_alter if necessary, anything else than theme hooks.

Just for the record: The last time you are able to set a message by drupal_set_message() is _preprocess_page

 
 
0
 
vote

这可能与您有关,或者如果不是可能会帮助别人遇到这一点。

如果您通过块调用表格,则在TPL.php中呈现,而不是使用鼠标块系统,上下文或面板,则邮件将延迟页面。 (大概是因为你在生成过程中调用了太晚段的街区?不确定为什么。)

我的解决方法是将块放在页面上,以上下文将其自然出现,然后隐藏,并让人们使用正确放置的块。

i.e。您需要在模板的HTML内生成一个块(可能是jQuery选项卡),因此您可能会调用它template.php,然后在tpl.php中呈现它。

将导致此问题的示例代码。

模板文件

  function theme_preprocess_entity_profile2(&$vars, $hook) {   //profile2 preprocess function   //invoking the block from the correct module and storing it   //to be accessible in the tpl.php   $vars['my_form_module_var'] = module_invoke('form_module', 'block_view', 0); }   

tpl.php文件

  <div class="my-class"><?php print render($my_form_module_var['content']); ?></div>   
 

This might be relevant to you, or if not maybe it will help someone else who comes across this.

If you're calling the form through a block, which is rendered in a tpl.php as opposed to with drupals block system, context or panels, then the messages will be delayed a page. (Presumably because you call the block too late in the generation process? not quite sure why.)

My workaround was to place the block on the page with context so it appeared naturally, then hide that and have people use the correctly placed block.

i.e. You need a block to be generated inside the HTML of a template (perhaps for jquery tabs) so you might call it template.php and then render it in your tpl.php.

Example code that would cause this problem.

Template File

function theme_preprocess_entity_profile2(&$vars, $hook) {   //profile2 preprocess function   //invoking the block from the correct module and storing it   //to be accessible in the tpl.php   $vars['my_form_module_var'] = module_invoke('form_module', 'block_view', 0); } 

Tpl.php file

<div class="my-class"><?php print render($my_form_module_var['content']); ?></div> 
 
 
0
 
vote

我也遇到了这个问题。我在自定义模块中有一个不明重的tpl.php文件。我使用以下代码输出WebForm

  $objMessages = drupal_get_messages(); ...error output code...  webform_node_view($node,'full');  print theme_webform_view($node->content);   

我无法将验证错误消息放到下一页之前输出。阅读上述答案后,我意识到我需要重新排列代码,如此

  //process the form first to send //error messages to the session vars webform_node_view($node,'full');   $objMessages = drupal_get_messages(); ...error output code...  print theme_webform_view($node->content);   
 

I ran into this issue as well. I had an unthemed tpl.php file in a custom module. I was outputting a webform using the following code

$objMessages = drupal_get_messages(); ...error output code...  webform_node_view($node,'full');  print theme_webform_view($node->content); 

I could not get the validation error messages to output until the following page. After reading the above answers, I realized that I need to rearrange the code as such

//process the form first to send //error messages to the session vars webform_node_view($node,'full');   $objMessages = drupal_get_messages(); ...error output code...  print theme_webform_view($node->content); 
 
 
-3
 
vote

如果 drupal_set_message()正在工作对你来说,你应该使用它。您可以将第二个参数传递给函数,以控制将显示哪种类型的消息Drupal。

string $ type :(可选)消息的类型。默认为"status" 。 支持这些值:

'状态'

'警告'

'错误'

还,form_set_error()调用drupal_set_message(),带有$ type ='错误',因此它可能是有其他导致禁止键入的其他键入消息。

 

If drupal_set_message() is working for you then you should use it. You can pass a second parameter to the function to control which type of message drupal will display.

string $type: (optional) The message's type. Defaults to 'status'. These values are supported:

'status'

'warning'

'error'

Also, form_set_error() calls drupal_set_message() with a $type = 'error' so it may be that there is something else causing 'error' type messages to be suppressed.

 
 
 
 

相关问题

0  查看:即将到来的活动列表,顶部的第一个即将到来的活动  ( Views upcoming events list with first upcoming event at the top ) 
我的内容类型具有日期字段(多个)。它还收集结束日期。 现在我正在创建一个视图,它将列出该内容类型的节点。 将在升序顺序排列中的节点。 并且只将显示那些节点的开始日期大于当前日期。 我已添加开始日期的过滤器。如果开始日期大于当前日期。选项 Add multiple value identifier 在过滤器设置中设置为...

1  视图预告值阅读更多加载到另一个节点而不是幻灯片  ( Views teaser read more loading to another node instead of slideshow ) 
我使用预告片显示创建了5个新闻,并提供了一个阅读更多链接。当我点击阅读更多时,它指向另一个页面而不是幻灯片。我尝试了观点幻灯片,但无所事事。 ...

1  单击使用drupal_form_submit for tas-to to外部登录  ( Using drupal form submit for pass through to external login on click ) 
我需要一种验证的用户可以单击菜单链接并将提交到外部站点的帖子,允许它们自动登录。这是我见过的许多其他SSO问题的态度。我无法控制其他服务。这是我现在的位置: 创建了一个模块,将所需路径注册为页面回调函数 为该路径添加了一个菜单链接 添加了表单构建器功能以生成必要的字段 在页面回调中,我正在使用 drupal_for...

0  设置实体的权限,好像它是一个节点  ( Set permissions on an entity as though it were a node ) 
我正在使用 field collection 模块为其他节点创建实体。我想使用权限页面以与其他节点内容类型相同的方式管理这些实体的创建/编辑/查看权限。这可能(也许是另一个模块吗?) ...

8  警告:file_put_contents(临时://):无法打开流[复制]  ( Warning file put contentstemporary failed to open stream ) 
这个问题已经在这里有答案: 文件问题导入drupal site后 (2个答案) ...

1  如何在Drupal 7中预先配置块的模块中的设置?  ( How do i pre configure a blocks settings in my module in drupal 7 ) 
我正在建立一个包含几块的自定义模块。这些块始终只显示在前页或其他页面上,互斥。 我希望能够在安装上预先配置这些块,但我不确定如何实现它。 hook_block_configure 提到 '#options' 键,但没有关于该信息的格式的详细信息。 有人可以在这里朝着正确的方向指向吗? ...

0  只需要制作邮政编码  ( Cant make postal code only required ) 
我正在使用地址字段模块,并喜欢仅制作所需的邮政编码字段。 我喜欢隐藏的其余部分。 字段的隐藏是没有问题,但是我只有所需的后阳极字段遇到问题。 我可以隐藏整个字段: <?php function my_form_user_profile_form_alter(&$form, $form_state, $form...

1  向前节点与原始友好URL翻译版本  ( Forward node to translated version with original friendly url ) 
以下是用例: 节点/查看1的路径是"关于 - 美国" ,它有语言设置为英语。 节点/查看2的路径是"Acerca-de-Nuestra-historia" ,语言设置为西班牙语。 我需要一个将将"es / everca-de-nuestra-historia" 转发给"es / acerca-de-nuestra-h...

1  从第二语言翻译字符串到英语  ( Translating strings to english from a second language ) 
似乎Drupal 7不提供将非英语字符串转换为其英语等效的函数。我想为我正在努力的项目来做这件事,但没有反向翻译功能表明也许我不应该。是否有任何原因缺乏将字符串转回英语的函数?我应该如何使用我的项目实现此功能? ...

1  查看数据关系?  ( Views data relationships ) 
我试图弄清楚如何在View_Data中添加关系... 我有一个hook_views_data,它设置了基本表和一个名为list的组。它有两个表 主要列表 列表内容 ,它们通过list_id与之相关。我有一张桌子 - &gt;加入与列表内容和所有这些有趣的东西加入表格,并且似乎都在工作。但是当我添加列表内容的关系...

0  基于布尔字段添加类到模板[已关闭]  ( Add class to template based on boolean field ) 
此问题似乎在帮助中心中定义的范围内涉及Drupal。。 想要改进这个问题?更新问题,所以它是关于drupal答案的主题。 ...

2  如何以编程方式填充现场集合中的图像字段?  ( How do you populate an image field in a field collection programmatically ) 
我正在尝试做一个比饲料更复杂的大型导入可以很好地播放,所以我在编写自定义导入脚本的过程中。除了通过现场集合关联的加载图像之外的一切工作。我有一个字段集合,包含节点和分类率,但我在图像字段上没有运气。 我在名为field_signature_media的节点上有一个字段,它引用一个可以是各种媒体类型的字段集合。在Fie...

0  试图获得“在”日期过滤器之间工作......它返回+ 1天后。  ( Trying to get a is between date filter to work it is returning an offset by ) 
请看我的网站看看我在说什么: http://apollo.tbc.iit.edu/~sspaceweathert/sw_test/?q=下载--cases-data# ive发现了一些例子和帖子如何执行此操作,但即使在遵循它们之后,我仍然存在问题。 我正在尝试过滤表中显示的结果。我希望用户可能投入的两个指定日期...

-1  如何覆盖bootstrap.js?  ( How do i override bootstrap js ) 
我在drupal 7中使用bootstrap 3子主题。all工作良好,除了我似乎无法在站点/所有/主题/ bootstrap / js / bootstrap.js中覆盖bootstrap.js我自己的主题。 我错过了什么? ...

0  一遍又一遍地重复首次操作的批处理  ( Batch process stuck repeating first operation over and over ) 
是我第一次使用批处理API。我有一个批量操作,我有几乎工作,但它被困在第一个项目上,我就如何解决了如何解决它。 批次内容确实在一堆节点上迭代并将分散在十几个文本字段的假位置转换为实际位置CCK字段。当批处理运行时,它会在又一遍地贯穿第一个节点。我的日志填写了删除孤立位置的位置模块,如果i dpm($node) ,它...

1  有没有方法可以将注释部分添加到节点编辑页面?  ( Is there a way to add the comment section to the node edit page ) 
我正在开发一个用于信息收集的网站。所有视图都旨在向用户发送节点编辑页面(而不是节点视图页面),以便它们可以同时查看和更新​​信息。我想使用评论系统,但我无法弄清楚(尚)如何在节点编辑页面上启用注释部分。此部分显示在节点视图上。我想知道是否有一种方法可以在节点编辑页面上显示它。 ...

0  将VBO添加到实体  ( Adding vbo to an entity ) 
我已经创建了一个实体。我已经使用 price3 曝光了它。 我可以为我的数据创建一个视图,但是当我尝试添加 price4 时,没有为我的实体类型列出的字段。 如何将我的实体暴露给vbo? ...

0  如何使用preprocess_image函数添加CSS?  ( How to add css using the preprocess image function ) 
我正在尝试预处理我的图像样式,如此【举例】 <img class="media-object img-rounded img-responsive" src="http://placehold.it/350x250"> 我的预处理_image函数看起来如此: function bootstrap_sub...

1  使用DSM时的奇怪行为  ( Weird behaviour when using dsm ) 
我在Centos 6.5盒上使用Drupal 7。我正在尝试调试一些产生以下错误的代码: 用户错误:imagemagick错误1:转换:没有解码委托 图像格式 /tmp/thesis-163.OBJ.xml' @ constitute.c/ReadImage/503. convert: missing an...

-2  页面效率的最佳实践  ( Best practice for page efficiency ) 
我想知道是否有人知道以下哪项是最有效的(或者如果适用的替代方案)。该想法是创建包含特定节点的信息的标题。这假设所有其他变量,例如缓存是相等的。这将是一个Drupal 7安装。 i)创建一个块,将其限制为特定节点 或 ii)使用硬编码的信息创建自定义TPL(我知道这是一个drupal no-no) 使用块更简单地处...




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


Licensed under cc by-sa 3.0 with attribution required.