Переменные PHP — Smarty отключаются после перенаправления заголовка

#php #smarty

#php #smarty

Вопрос:

У меня есть php-файл (form.php ) который использует шаблон (form.htm ) для отображения формы. Действие формы файла шаблона является form.php . Если при отправке форма неполная, я хочу перенаправить обратно в форму БЕЗ потери информации, которую пользователь уже ввел.

Я устанавливаю переменные smarty с помощью t-> assign(‘varname’, $ _POST[‘var’]) и устанавливаю значения формы для этих переменных ( value =»{$varname}»), однако при перенаправлении с помощью функции php header () эти переменные Smarty теряются (что я подтвердил с помощью Smarty {debug}).

Есть ли у кого-нибудь идеи о том, как сделать так, чтобы эти переменные не отключались при использовании перенаправления заголовка? Спасибо!

Комментарии:

1. При перенаправлении вы, по сути, указываете браузеру запросить другую страницу, поэтому вы теряете все данные, которые были у вас в предыдущем запросе. Вы можете обмениваться данными между запросами с помощью сеансов.

2. Я думал, что так и будет — значит, в этом случае нет способа использовать переменные шаблона smarty вместо переменных сеанса?

Ответ №1:

Smarty — это всего лишь движок шаблонов, поэтому вы не можете сделать здесь больше, чем в PHP.

Но в вашем случае вы сказали, что хотите перенаправить заголовок после отправки формы (честно говоря, я понятия не имею, почему вы хотите это сделать. В обычном случае вы просто устанавливаете действие в форме и в контроллере, вы просто проверяете данные, и если они действительны, вы делаете то, что хотите — например, отправляете электронное письмо, и если они недействительны, вы просто показываете форму снова — вот и все).

Однако, если вам действительно нужно сделать это таким образом, что вы можете сделать, это использовать данные сеанса и сохранить все данные из post в session, выполнить перенаправление и использовать их из session для отображения в 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}
  

Комментарии:

1. Ах, я думаю, это именно то, что я ищу — чрезмерно усложняющие вещи! Smarty для меня совершенно новый (я работаю с чужим кодом). Спасибо, Марчин!

Ответ №2:

Не перенаправляйте пользователя. Просто перерисуйте форму. В общем, этот HTTP-рабочий процесс следует использовать при работе с формами:

  1. GET /form.php — Отображать форму пользователю
  2. POST /form.php — Обработать ввод формы
    1. Если ввод формы неверен, отправьте обратно form.php
    2. Если ввод формы допустим, сохраните в базе данных, теперь перенаправьте пользователя

Итак, в основном у вас есть:

  1. ПОЛУЧИТЬ
  2. СООБЩЕНИЕ (неверный ввод от пользователя)
  3. POST (допустимый ввод от пользователя)
  4. ПЕРЕНАПРАВЛЕНИЕ

Комментарии:

1. Извините — я относительно новичок в этом. Не могли бы вы немного подробнее рассказать о «перерисовке формы»? По сути, то, что я делаю в данный момент, это перенаправление обратно на страницу формы снова (заголовок(‘Location: form.php ‘);).