getUser();
$this->view->set('cart', $cart);
$this->view->set('address', $user->getAdress());
$this->useForm('checkout_form');
if(!$this->request->hasPost())
{
if(!$cart->getItemsCount())
return $this->flashAndRedirect('Your cart is empty! Nothing to checkout!', array('controller' => 'main_page'));
if(!$user->getIsLoggedIn())
return $this->flashAndRedirect('Your are not logged in yet! Please login or register to checkout!');
}
else
{
$order = Order :: createForCart($cart);
$order->setAddress($this->request->get('address'));
$order->setUser($user);
if($order->trySave($this->error_list))
{
$cart->reset();
return $this->flashAndRedirect('Your order has been sent. Your cart is now empty.', array('controller' => 'main_page'));
}
}
}
function doDisplay()
{
$this->cart = $this->_getCart());
}
function doCheckout()
{
$cart = $this->_getCart();
return $this->_checkoutCart($cart);
}
[...]
Для оформления заказа мы создали отдельный protected метод %%_checkoutCart($cart)%% в который будем передавать объект корзины $cart.
Передача ошибок валидации в шаблон производится автоматически.
class CartController extends lmbController
{
[...]
protected function _checkoutCart($cart)
{
[...]
if(!$this->request->hasPost())
{
if(!$cart->getItemsCount())
return $this->flashAndRedirect('Your cart is empty! Nothing to checkout!', array('controller' => 'main_page'));
if(!$user->getIsLoggedIn())
return $this->flashAndRedirect('Your are not logged in yet! Please login or register to checkout!');
}
[...]
}
[...]
}
Используя объект **request** в условии **if(!$this->request->hasPost()))**, определяем что был запрос на отправку заказа и далее делаем 2 проверки:
* корзина должна содержать хотя бы одну товарную позицию.
* пользователь должен быть залогинен.
Если какое-либо из этих условий не выполняется, мы даем знать пользователю об этом при помощи метода flashAndRedirect() и перебрасываем его на главную страницу сайта.
class CartController extends lmbController
{
[...]
protected function _checkoutCart($cart)
{
$user = lmbToolkit::instance()->getUser();
$this->view->set('cart', $cart);
$this->view->set('address', $user->getAdress());
$this->useForm('checkout_form');
[...]
}
Если форма будет отображена в первый раз (не вообще в первый раз, имеется ввиду отображение начального состояния формы, а не тогда когда она была отправлена), мы должны заполнить ее содержимое данными текущего пользователя.
Плюс мы передаем в шаблон объект корзины для того, чтобы иметь возможность вывести содержимое корзины на страницы.
И последнее...
class CartController extends lmbController
{
[...]
protected function _checkoutCart($cart)
[...]
$order = Order :: createForCart($cart);
$order->setAddress($this->request->get('address'));
$order->setUser($user);
if($order->trySave($this->error_list))
{
$cart->reset();
return $this->flashAndRedirect('Your order has been sent. Your cart is now empty.', array('controller' => 'main_page'));
}
}
}
[...]
}
Мы создали новый объект класса Order при помощи статического метода createForCart($cart), заполнили поле адреса доступки address и указали пользователя. Если заказ был успешно сохранен, мы ошищаем корзину при помощи метода **reset()**, даем знать пользователю, что операция прошла успешно и перебрасываем его на главную страницу.
===== Шаблон /cart/checkout.phtml =====
Наконец, приведем код шаблона по оформлению заказа cart/checkout.phtml
Файл shop/template/cart/checkout.phtml:
$this->title ='Checkout'; ?>
{{wrap with="front_page_layout.phtml" in="content_zone"}}
Your cart contains {$#cart.items_count} items.
{{list using="$#cart.items"}}
Title
Price
Quantity
Summ
{{list:item}}
{$item.product.title}
${$item.price|number:2, '.', ' '}
{$item.quantity}
${$item.summ|number:2, '.', ' '}
{{/list:item}}
{{/list}}
Total summ is : ${$#cart.total_summ|number:2, '.', ' '}
{{form name='checkout_form' id='checkout_form' method='POST'}}
{{textarea type="text" name="address" id="address" title="Delivery address"/}}
{{/form}}
{{/wrap}}
Шаблон содержит отображение списка товарных позиций корзины, также как и в шаблоне /cart/display.phtml.
Ниже находится форма, которая позволяет ввести адрес доставки. Помните, что мы передали в эту форму данные текущего пользователя, поэтому если пользователь ранее ввел адрес доставки при регистрации или на странице профайла, то это значение будет отображено в соответствующем поле.
===== Предварительные итоги =====
Ссылка на действие по оформлению заказа уже должны была у нас быть на странице /cart.
Вот так должна выглядеть страница /cart/checkout, если мы предварительно положим что-нибудь в корзину:
{{limb3:ru:tutorials:shop:checkout.png|}}
===== Далее =====
Наши пользователи могут теперь добавлять новые заказы. Осталость совсем немного из того, что мы запланировали:
* работа с заказами в панели управления,
* просмотр покупателями своих заказов.
Итак, следующий шаг: [[step8|Шаг8. Работа с заказами]].