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;"> </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, $message, TRUE);
Параллельно с этим нужно показать пользователю сообщение о том что заказ отправлен и скоро ему ответят. Возьмём для этого следующий шаблон и сохраним его под именем 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;"> </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, $message, TRUE);
$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, $message, TRUE);
} 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;?>
Теперь зайдите на страницу оформления заказа и отправьте форму не заполнив поля. Вы должны увидеть страницу с ошибками.
При правильном же заполнении формы пользователь увидит то же сообщение что и раньше.