Передача переменных из одного скрипта в другой и обратно
Так вот, читаю книгу по PHP и выполняю пример с простой контактной формой.
Есть два скрипта - mail_form.php(с формой, полями и тд) и process.php(куда передаются значения полей, проверяется их заполненность и формируется сообщение об ошибке).
В чем собственно проблема - пользователь заполняет поля, нажимает отослать и запускается process.php и если ошибок нет, то должен опять запуститься mail_form и ниже формы вывести сообщение "Письмо успешно отослано", если же есть ошибки - то опять же пониже формы вывести переменную $error, в которой текст ошибок. Как это сделать?
Может способ и глупый, и лучше делать проверку и отсылку в одном модуле, но все же...
mail_form:
<table>
<tr>
<td align="right"> Ваше имя :</td>
<td> <input name="name" size="53"/></td>
</tr>
<tr>
<td align="right"> Email адрес получателя :</td>
<td> <input name="address" size="53" /></td>
</tr>
<tr>
<td align="right"> Тема :</td>
<td> <input name="theme" size="53" /></td>
</tr>
<tr>
<td align="right"> Ваше сообщение :</td>
<td> <textarea rows="10" cols="41" name="message" size="53"></textarea></td>
</tr>
<tr>
<td></td>
<td> <input type="submit" value="Отослать" /> </td>
</tr>
</table>
<br />
</form>
process:
$error = "";
$name = $_POST['name'];
$address = $_POST['address'];
$theme = $_POST['theme'];
$message = $_POST['message'];
if (empty($name)) $error .= "<li> Не указано имя</li>";
if (empty($address)) $error .= "<li> Не указан email адрес</li>";
if (!isset($theme)) $theme = "Без темы";
if (!isset($message)) $message = "Без текста";
if (empty($error))
mail($address, $theme, $message, "From: ololo");
?>
<?php
if( isset($_REQUEST["error"]) ) {
if( empty($_REQUEST["error"]) ) {
echo("Сообщение отправлено");
} else {
echo($_REQUEST["error"]);
}
}
?>
process:
if (empty($error))
mail($address, $theme, $message, "From: ololo");
header("Location: main_form.php?error=".$error);
Быдлокодерский код конечно, ну раз уж такой пример.
form.tpl
<table>
<tr>
<td align="right"> Ваше имя :</td>
<td> <input name="name" size="53" value="%NAME%" /></td>
</tr>
<tr>
<td align="right"> Email адрес получателя :</td>
<td> <input name="address" size="53" value="%ADDRESS%" /></td>
</tr>
<tr>
<td align="right"> Тема :</td>
<td> <input name="theme" size="53" value="%THEME%" /></td>
</tr>
<tr>
<td align="right"> Ваше сообщение :</td>
<td> <textarea rows="10" cols="41" name="message" size="53">%MESSAGE%</textarea></td>
</tr>
<tr>
<td colspan="2">
<input type="hidden" name="action" value="send" />
<input type="submit" value="Отослать" />
</td>
</tr>
</table>
<br />
</form>
proccess.php
$mail_values = array();
$mail_values["name"] = "";
$mail_values["address"] = "";
$mail_values["theme"] = "";
$mail_values["message"] = "";
if( isset($_POST["action"]) && $_POST["action"] == "send" ) {
$error = "";
if( isset($_POST['name']) ) $mail_values["name"] = $_POST['name'];
if( isset($_POST['address']) ) $mail_values["address"] = $_POST['address'];
if( isset($_POST['theme']) ) $mail_values["theme"] = $_POST['theme'];
if( isset($_POST['message']) ) $mail_values["message"] = $_POST['message'];
if( empty($mail_values["name"]) ) $error .= "<li> Не указано имя</li>";
if( empty($mail_values["address"]) ) $error .= "<li> Не указан email адрес</li>";
if( empty($mail_values["theme"]) ) $_POST['theme'] = "Без темы";
if( empty($mail_values["message"]) ) $_POST['message'] = "Без текста";
if (empty($error)) {
mail($mail_values["address"], $mail_values["theme"], $mail_values["message"], "From: ololo");
} else {
echo($error);
}
}
$print = file_get_contents("form.tpl");
$print = str_replace(
array("%NAME%","%ADDRESS%","%THEME%","%MESSAGE%"),
array($mail_values["name"],$mail_values["address"],$mail_values["theme"],$mail_values["message"]),
);
echo($print);
ЗЫ: Вот простенький слегка быдловатый код (зато Вам понятный). В идеале я бы ещё %ERROR% добавил бы в шаблон формы, чем его выводить через echo. Код писал не проверяя. Возможно ошибки в str_replace (в её параметрах, сейчас просто уже не помню точно так ли там делается. Вообщем, в мануале посмотреть всегда сможете =)
ЗЫ2: кстати теги <li> всегда должны быть внутри <ul>
Забейте вы на эти strtr(), str_replace() и иже с ними! Гораздо быстрее будет вместо:
$print = file_get_contents("form.tpl");
$print = str_replace(
array("%NAME%","%ADDRESS%","%THEME%","%MESSAGE%"),
array($mail_values["name"],$mail_values["address"],$mail_values["theme"],$mail_values["message"]),
);
echo($print);
это:
form.tpl (часть):
<tr>
<td align="right"> Ваше имя :</td>
<td> <input name="name" size="53" value="<?=$mail_values["name"];?>" /></td>
</tr>
...
Дёшево и сердито.
Имхо, это плохой стиль и никто меня не переубедит. Все должно быть разделено, лежать по полочкам + верстальщику или тому кто занимается шаблонами будет напорядок легче и код более читаем.
Эти str_* я привел лишь для примера. В реальной жизни всегда юзаю Smarty.
Не буду начинать холивар по этой теме, но пхп изначально задуман для встраивания в хтмл и подобное. Язык шаблонов, иначе говоря.
Впрочем, дело каждого.
Впрочем, дело каждого.
Ну да, изначально так и было. Когда и уровень веб-страниц и самого веба был соответствующий, т.е. сайты не выше уровня narod.ru.
Когда же проект большой, то я думаю вряд ли кто-то будет возиться вот с таким смешиванием, потому что разбираться потом крайне сложно. Мне только хватило полчаса поработать с Joomla и увидеть как там все организованно. Более быдлокодской CMS, в плане шаблонов также, я и не видел.
Так что, имхо, надо все таки разделять логику и представления. Ведь если идти теми же рассуждениями, то и нет смысла в CSS, ведь всю стилистику можно тупо в хтмл-коде указать.
Так, да, холивар лучше не начинать) Тут спорить бесползено)
Посмотрите phpshop или phpnuke или slaed - по сравнению с ними джумла и битрикс просто образец идеального кода в вакууме
Я лично ничего не понял, что вы конкретно хотите.