欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

表单提交 验证错误 表单字段有红色的警告框 但是错误信息不出来,是刷新或重新打开一个页面才出来 有大用 有大大用 有大大大用

表单提交 验证错误 表单字段有红色的警告框 但是错误信息不出来,是刷新或重新打开一个页面才出来 有大用 有大大用 有大大大用



经仔细查看,原来是在 page.tpl.php 中调用了 <?php drupal_get_form('ribao_data_form'); ?> 这个方法


正确的做法应该是 

放在 区块中 (区块的block.tpl.php文件中或者,node.tpl.php中,应该也是正确的,但从未测试过),

或者 'page callback' 函数中 调用 drupal_get_form


我的做法是 hook_block(),然后 把 drupal_get_form('ribao_data_form');  放在这个 hook 钩子函数里

代码如下:

1)第一种方法 自己亲自测试 成功

function shipingzhongcustomsixteen_block($op='list',$delta=0,$edit=array()){
   if($op=='list'){
       $blocks[0]['info'] = '上传excel日报表单';
       return $blocks;
   }
   else if($op=='view'){
       //$blocks['subject'] = '历史转交记录';

       $blocks['content'] ='<div class="upload_ribao_file_form_outer">';
       if($_GET['q'] == 'list_ribao_data_dazhong2'){
           $blocks['content'] .= drupal_get_form('ribao_data_form',2);
       }
       else if($_GET['q'] == 'list_ribao_data_dazhong'){
           $blocks['content'] .= drupal_get_form('ribao_data_form');
       }
       else if($_GET['q']=='list_bd_sh_gjz_rb'){
           $blocks['content'] .= drupal_get_form('bd_gjz_ribao_data_form');
       }
       $blocks['content'] .='</div>';
       return $blocks;
   }

}





我最近在将D6网站迁移到D7时遇到了这个问题。尽管我发现这个讨论早就开始了,但我想强调此问题的根本原因,这样,即使遇到同一问题,也可以很容易地从中找到答案。

如果我们直接在任何特定的模板文件中使用drupal_get_form()函数,则会出现此问题,因为在单击按钮后生成验证消息之前,已加载了模板文件。该消息将在系统中保持活动状态(因为它存储在$ _SESSION中),直到被打印为止。这就是为什么在下一次重新加载时,变量$ message将消息打印在模板文件中。

要解决此问题,您必须创建一个块(忽略该块是否已创建)并在所需区域中分配该块(如果需要,在主题信息文件中创建一个区域)。如果需要,还可以使用hook_form_alter()。

Jaypan的图片

表单不应在模板文件中调用。它们应该在预处理函数中调用,并分配给变量,然后将其输出到模板文件中



来自  https://www.drupal.org/forum/support/module-development-and-code-questions/2011-07-04/form_set_error-doesnot-display-error


2) 第二种方法 未测试


(下面的例子是 drupal 7 ,,drupal 6 中代码可能有细微不同,但原理一样)问题在于,Drupal在处理表单时已经为当前请求设置了消息。为了使事情正常工作,请drupal_get_formtemplate_preprocess_page中调用        

function myThemeOrModulename_preprocess_page(&$variables) {
  // For node templates.
  // $variables['node']->my_form = drupal_get_form('form_name');
  // For page templates.
  $variables['my_form'] = drupal_get_form('form_name');
}
       

然后在您的模板文件中呈现表单:        

<?php print render($my_form); ?>
       

目前我不知道还有另一个原因,但是在同一函数中添加$variables['messages'] = theme('status_messages');(请参阅theme_status_messagespreprocess_page可以解决该问题。        


普通分类: