PHP - 标题重定向后未设置Smarty变量

时间:2014-07-03 19:56:38

标签: php smarty

我有一个php文件(form.php),它使用模板(form.htm)来显示表单。模板文件的表单操作是form.php。如果表单在提交时不完整,我想重定向回到表单而不会丢失用户已经输入的信息。

我使用t-> assign('varname',$ _POST ['var'])设置智能变量并将表单值设置为这些变量(value =“{$ varname}”),但重定向时使用php的header()函数,这些Smarty变量丢失了(我已经使用Smarty {debug}确认了)。

有没有人知道如何制作它以便在使用标题重定向时不会取消这些变量?谢谢!

2 个答案:

答案 0 :(得分:1)

请勿重定向用户。只需重绘表单。通常,在处理表单时应使用此HTTP工作流:

  1. GET /form.php - 向用户显示表单
  2. POST /form.php - 处理表单输入
    1. 如果表单输入无效,请发送回form.php
    2. 如果表单输入有效,请保存到数据库,立即重定向用户
  3. 所以基本上你有:

    1. GET
    2. POST(来自用户的无效输入)
    3. POST(来自用户的有效输入)
    4. REDIRECT

答案 1 :(得分:1)

Smarty只是模板引擎,所以你不能在这里做更多的事情。

但是在你的情况下,你说你想在发送表单之后重新定位页面(说实话我不知道你为什么要这样做。通常情况下你在表单中简单设置动作,在控制器中你可以简单地检查数据和如果它们是有效的,你可以做你想做的事情 - 例如发送电子邮件,如果它们无效,你可以再次简单地显示表格 - 那就是它。)

但是,如果您真的需要这样做,那么您可以做的是使用会话数据并将所有数据从发布到会话保存,进行重定向并使用会话中的数据在Smarty中显示。

所以在PHP中你可以这样做:

$_SESSION['post_data'] = $_POST;
// now you make redirection 

在文件中,您可以轻松地执行重定向:

$smarty->assign('post_data',$SESSION['post_data']);
unset($SESSION['post_data']);

然后在模板文件中,您可以使用:

{$post_data.var}

修改

但正如我通常所说的那样你在PHP文件中这样做:

  $isValid = false; 

  if (isset($_POST['submit']) {
     $isValid = validateData($_POST);

     if ($isValid) {
          // do something here - for example send email
     }
     else {
         $smarty->assign('error', 'There were errors in your form. Try again');
     }
  } 
  $smarty->assign('is_valid',$isValid);

在Smarty你做:

{if $isValid}
   form was sent
{else}
   {if isset($error)}{$error}{/if}
   you display form here
{/if}