Показать сообщение отдельно

  #5  
Старый 31.05.2009, 22:16
Kuzya
Участник форума
Регистрация: 27.04.2008
Сообщений: 224
Провел на форуме:
140661

Репутация: 313
По умолчанию

3.3 Оформление покупки.
В отдельном разделе нашего сайта посетителям должна предоставляться возможность оформить заказ на программу. Они будут делать это с помощью формы, в которой нужно указать все необходимые регистрационные данные. После чего запрос уйдёт на E-mail менеджеру.
Создайте контроллер buy с методом index. Разместим в нём код показа формы, которую клиент должен будет заполнить. Вот её шаблон. Сохраните его в директории отображений, в папке buy, под именем index.php.

Код:
<?=$header?>
<body>
<?=$menu?>
<!-- start page -->
<div id="page">
<!-- start content -->
<div id="content">
<div class="post">
<h1 class="title"><a href="/buy/">Купить программу</a></h1>
<div class="entry">
<p>
<form action="/buy/send/" method="POST" >
<table width="100%" cellspacing="10" cellpadding="5">
<tr>
<td width="25%">Ваше ФИО:</td>
<td><input type="text" name="fio" /></td>
</tr>
<tr>
<td width="25%">E-mail для связи:</td>
<td><input type="text" name="email" /></td>
</tr>
<tr>
<td width="25%">Тип необходимой лицензии:</td>
<td>
<select name="license">
<option value="0">Корпоративная</option>
<option value="1">Домашняя</option>
</select>
</td>
</tr>
<tr>
<td width="25%">Тип программы:</td>
<td>
<select name="type">
<option value="0">Lite</option>
<option value="1">Standart</option>
<option value="2">Pro</option>
</select>
</td>
</tr>
<tr>
<td width="25%">Дополнительная информация:</td>
<td><textarea name="additional" rows="7"></textarea></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="Отправить заявку"/></td>
</tr>
</table>
</form>
</p>
</div>
</div>
</div>
<!-- end content -->

<div style="clear: both;">&nbsp;</div>
</div>
<!-- end page -->
<?=$footer?>
И код контроллера.

PHP код:
class Byu_Controller extends Controller {
public function 
index() {
$view               = new View('buy/index');
$view->header = new View('header');
$view->menu   = new View('menu');
$view->footer  = new View('footer');

$view->render(true);
}

Ничего сложного. После отправки формы информация передаётся методу send. В него поместим код отправки письма менеджеру. Отправка будет происходить с помощью SwiftMailer (хэлпер email - http://docs.kohanaphp.com/helpers/email). Сначала получим нужные данные

PHP код:
$fio        $_POST['fio'];
$email    $_POST['email'];
$license = ((int) $_POST['license']) ? "Домашняя" "Корпоративная";

$type       = (int) $_POST['type'];
switch(
$type) {
case 
1$type "Lite"; break;
case 
2$type "Standart"; break;
case 
3$type "Pro"; break;
}

$additional nl2br($_POST['additional']); 
Затем формируем информацию для письма.

PHP код:
$to            "manager@company.com";
$from       "site@company.com";
$subject    "Заказ на покупку программы";
$message  "Здравствуйте. {$fio}($email) оформил заказ на покупку нашей программы.<br />";
$message .= "Выбранный тип лицензии - `{$license}`, тип программы - `{$type}`<br />";
$message .= "Дополнительная информация от клиента: {$additional}"
И отправим сообщение.

PHP код:
email::send($to$from$subject$messageTRUE); 
Параллельно с этим нужно показать пользователю сообщение о том что заказ отправлен и скоро ему ответят. Возьмём для этого следующий шаблон и сохраним его под именем sended.php в той же директории.

PHP код:
<?=$header?>
<body>
<?=$menu?>
<!-- start page -->
<div id="page">
<!-- start content -->
<div id="content">
<div class="post">
<div class="entry">
<p>
Спасибо за заказ. Наш менеджер обработает его в самое ближайшее время и вышлет ответ на указанный Вами E-mail.
</p>
</div>
</div>
</div>
<!-- end content -->
<div style="clear: both;">&nbsp;</div>
</div>
<!-- end page -->
<?=$footer?>
И внесём отображение в контроллер. В итоге код метода send примет следующий вид.

PHP код:
public function send() {
$fio        $_POST['fio'];
$email      $_POST['email'];
$license    = ((int) $_POST['license']) ? "Домашняя" "Корпоративная";

$type       = (int) $_POST['type'];
switch(
$type) {
case 
1$type "Lite";
case 
2$type "Standart";
case 
3$type "Pro";
}

$additional nl2br($_POST['additional']);

$to         "manager@company.com";
$from    "site@company.com";
$subject "Заказ на покупку программы";
$message "Здравствуйте. {$fio}($email) оформил заказ на покупку нашей программы.<br />";
$message .= "Выбранный тип лицензии - `{$license}`, тип программы - `{$type}`<br />";
$message .= "Дополнительная информация от клиента: {$additional}";

email::send($to$from$subject$messageTRUE);

$view  = new View("buy/sended");

$view->header = new View('header');
$view->menu   = new View('menu');
$view->footer = new View('footer');

$view->render(true);

Если Вы сейчас отправите форму, то увидите сообщение об обработке заказа. А с сайта, на адрес manager@company.com, уйдёт письмо с введённой информацией. Те кто используют Denwer могут убедится в этом просмотрев папку /tmp/!sendmail.
Но, что бы клиент случайно не пропустил одно из важных полей, мы организуем проверку данных с помощью валидации (http://docs.kohanaphp.com/libraries/validation). Создадим объект класса Validation, передав ему в конструктор массив $_POST. После этого мы обозначим 2 правила. Обязательно должны быть заполнены поля с ФИО и E-mail`ом. И указанный E-mail должен иметь соответствующий формат.

PHP код:
$post = new Validation($_POST);
$post->add_rules('fio','required');
$post->add_rules('email','required','email'); 
Теперь, вызвав метод validate, мы можем проверить совпадают ли с указанными правилами поля массива $_POST. В зависимости от решения этого метода мы либо отправим письмо, либо сообщим о допущенных ошибках.
Немного отойдём от основной темы. Для того что бы отобразить пользователю тексты ошибок мы должны создать языковой файл с ними. Пройдите в директорию /system/i18n/ru_RU и создайте там файл form_errors.php. В него мы должны поместить массив с фраз. Он будет состоять из двух ячеек, названных аналогично полям формы. В ячейках будет содержаться текст ошибок, у которого ключами будут имена правил.

PHP код:
<?php

$lang 
= Array(
'email' => Array(
'required' => 'Вы должны обязательно указать E-mail для связи',
'email'    => 'Введённый вами E-mail ошибочен'
),
'fio' => Array(
'required' => 'Вы должны указать Фамилию, Имя, Отчество'
)
);

?>
Теперь нужно встроить в контроллер обработку данных. Массив же ошибок можно получить сразу после вызова метода validate, из функции errors. Ей в качестве параметра нужно передать имя используемого языкового файла без расширения. Полученный текст мы передадим в шаблон. При отображении просто будем проверять - если массив с ошибками есть то выводим их, если нет - сообщаем об отправке письма. Вот полный код получившегося метода send.

PHP код:
public function send() {
$view         = new View('buy/sended');
$view->header = new View('header');
$view->menu   = new View('menu');
$view->footer = new View('footer');

// Валидация. Установка правил.
$post = new Validation($_POST);
$post->add_rules('fio','required');
$post->add_rules('email','required','email');

// Отсылаем письмо если всё нормально
if($post->validate()) {
$fio        $_POST['fio'];
$email      $_POST['email'];
$license    = ((int) $_POST['license']) ? "Домашняя" "Корпоративная";

$type       = (int) $_POST['type'];
switch(
$type) {
case 
0$type "Lite"; break;
case 
1$type "Standart"; break;
case 
2$type "Pro"; break;
}

$additional nl2br($_POST['additional']);

$to      "manager@company.com";
$from    "site@company.com";
$subject "Заказ на покупку программы";
$message "Здравствуйте. {$fio}($email) оформил заказ на покупку нашей программы.<br />";
$message .= "Выбранный тип лицензии - `{$license}`, тип программы - `{$type}`<br />";
$message .= "Дополнительная информация от клиента: {$additional}";

email::send($to$from$subject$messageTRUE);

} else {
// Если нет, передаём в отображение все ошибки
$view->validation_errors $post->errors('form_errors');
}

$view->render(true);

Центральную часть отображения, в которой сейчас находится текст об успешной отправке, модифицируем вот так.

Код:
<?if(isset($validation_errors)):?>
Внимание! Обнаружены следующие ошибки:
<ul>
<?foreach($validation_errors as $error):?>
<li><?=$error?></li>
<?endforeach;?>
</ul><br />
Вернитесь пожалуйста <a href="/buy/">назад</a> и заполните форму правильно.
<?else:?>
Спасибо за заказ. Наш менеджер обработает его в самое ближайшее время и вышлет ответ на указанный Вами E-mail.
<?endif;?>
Теперь зайдите на страницу оформления заказа и отправьте форму не заполнив поля. Вы должны увидеть страницу с ошибками.



При правильном же заполнении формы пользователь увидит то же сообщение что и раньше.
 
Ответить с цитированием