#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-рабочий процесс следует использовать при работе с формами:
GET /form.php
— Отображать форму пользователюPOST /form.php
— Обработать ввод формы- Если ввод формы неверен, отправьте обратно
form.php
- Если ввод формы допустим, сохраните в базе данных, теперь перенаправьте пользователя
- Если ввод формы неверен, отправьте обратно
Итак, в основном у вас есть:
- ПОЛУЧИТЬ
- СООБЩЕНИЕ (неверный ввод от пользователя)
- POST (допустимый ввод от пользователя)
- ПЕРЕНАПРАВЛЕНИЕ
Комментарии:
1. Извините — я относительно новичок в этом. Не могли бы вы немного подробнее рассказать о «перерисовке формы»? По сути, то, что я делаю в данный момент, это перенаправление обратно на страницу формы снова (заголовок(‘Location: form.php ‘);).