
- •Аннотация
- •Мазмуну
- •Интернет дүкөн: иштөө принциби жана колдонулушу
- •Интернет дүкөндүн жалпы схемасы
- •Интернет аудитория
- •Интернет дүкөндүн функционалдык мүмкүнчүлүктөрү
- •Интернет дүкөндү иштеп чыгуу процесстердин фазалары.
- •Колдонуулучу технологиялар
- •Долбоорлоо методун аныктоо
- •Программалоо тилин тандоо
- •Модель – көрүнүш – башкаруу
- •Фрэймворк
- •Жалпы түзүлүш
- •Проекттин файлдык архитектурасы
- •Берилиштер базасы
- •Коддук реализация
- •3.4.1 Кутуча, BinController.Php
- •Интернет-дүкөндүн колдонуу көрсөтмөлөрү
- •Интернет дүкөндү башкаруу
- •Административдик панель
- •Колдонуучулар үчүн интернет-дүкөн
- •4.3.1 Каттоо процесси.
- •4.3.2 Каталог
- •4.3.3 Заказ кылуу процесси
- •4.3.4 Онлайн көрүү функционалы
- •Колдонулган булактар
- •Глоссарий
Коддук реализация
Интернет-дүкөндүн эң маанилүү функционалдарын карап кетели. Интернет-дүкөн дегенде биринчиден биздин оюбузга кутуча келет. Кутучасыз интернет-дүкөн болбойт, ошондуктан биринчиден кутучадан баштасак.
3.4.1 Кутуча, BinController.Php
Кутучага тандалган товар кошуу, өчүрүү, санын көбөйтүү, азайтуу функциялары BinController.php файлында жазылган. BinController.php ичин карап көрсөк.
Колдонуучу товар заказ кылгысы келсе, биринчиден заказ кылуу баскычын басат, анан керектүү амал иштейт. Заказ кылынган товар кутучага түшөт, кийинчереек кутучага өтүп колдонуучу стандарттык амалдарын(кошуу, өчүрүү, төлөм) аткара билет. Коддо кутучага кошуу функциясы төмөндө жазылган:
public function addAjaxBinAction($id) {
if($this->getRequest()->isXmlHttpRequest()) {
$discs = $this->getDoctrine()
->getRepository("CinemaxBundle:Discs")
->find($id);
$request = $this -> getRequest();
if($discs) {
$disc = $request -> cookies -> get("cookieDiscs");
if(!isset($disc[$id]) || empty($disc[$id]))
$disc[$id] = 0;
$amount = $request->query->get('amount',1);
$discPage = $request->query->get('discPage');
if($discPage == "true")
$disc[$id] = $amount;
else
$disc[$id]++;
$response = new Response();
$cookie = new Cookie("cookieDiscs[$id]", $disc[$id], time() + 3600);
$response->headers->setCookie($cookie);
$response->send();
return $this->render('CinemaxBundle:Bin:addAjaxBin.html.twig', array('disc' => $discs));
}
else {
throw new \Exception('Что то не так');
}
}
return new Response();
Заказ кылуу баскычын басканда жогорудагы addAjaxBinAction функциясы аткарылат. Бул эң биринчи иштейт турган функция десек болот. Заказ кылып жаткан учурда дисктин id-си функцияга аргумент катары жиберилет. Ошо id боюнча discs жадыбалынан керектүү диск изделет. Табылган диск кукиге сакталат. Сакталгандан кийин товар кутучага кошулду деген popup чыгат. Popup ajax-тын жардамы менен чакырылат. Ошол чакырылган popup-та кутучага өтүү деген шилтемеси бар. Эгер колдонуучу кааласа кутучага өтүшү мүмкүн же болбосо popup-ты жабып товар тандоону улантып кетиши мүмкүн.
Ал эми кутучага өтүү функциясын карасак:
public function binAction() {
/* @var DiscsRepository $repository */
$request = $this->getRequest();
$discsIds = $request->cookies->get("cookieDiscs");
$discs = null;
if (!empty($discsIds)) {
$repository = $this->getDoctrine()->getRepository("CinemaxBundle:Discs");
$discs = $repository->getDiscsById($discsIds);
}
return $this->render('CinemaxBundle:Bin:discsInBin.html.twig', array(
'discs' => $discs,
'discsCount' => $discsIds
));
}
binAction функциясы эч кандай аргумент албайт. Анын макстаты кутучага өтүү. Өткөндө айтылды, заказ кылынан дисктер кукиде сакталат деп. Ушул функция кукиден баардык товарды алып discsInBin.html.twig файлын чакырат. Ушу менен кутучага өтүү амалы бүтөт.
Товардын санын көбөйтүү, азайтуу, товарды, жыйынтыгы чыгару bin.js аттуу файлда жазылган.
$(".disc_add").click(function () {
var input = $(this).prev('.disc_input');
var amount = input.val();
amount++;
input.val(amount);
discTotal(input,amount);
});
$(".disc_rem").click(function () {
var input = $(this).next('.disc_input');
var amount = input.val();
if (amount > 1)
amount--;
input.val(amount);
discTotal(input,amount);
});
function discTotal(input,amount){
var html_price = input.nextAll('.disc_total_price').children('.som');
var price = 40;
html_price.html(price * amount);
calculate();
}
function calculate() {
var sumPrice = 0;
$('.bin_table').find('tr[id]').each(function (i, el) {
var value = $(this).children('td:last').find('.som').html();
sumPrice += parseInt(value);
});
$('.total_value').html(sumPrice.toString());
}
Товарды өчүрүү функциясын карасак:
public function delAjaxBinAction($id)
{
if ($this->getRequest()->isXmlHttpRequest()) {
$request = $this->getRequest();
$response = new Response();
$cookie = new Cookie("cookieDiscs[$id]", null, 9999);
$response->headers->setCookie($cookie);
$response->send();
return new JsonResponse(array());
}
return $this->redirect($this->generateUrl("cinemax_homepage"));
}
Бул жерде delAjaxBinAction функциясы бир аргумент кабыл алат, анан ошол аргумент аркылуу керектүү дискти кукиден өчүрөт.
Дисктер тандалып, сандары берилип, өчүрө тургандар өчүрүлүп бүткөндөн кийин, эң акыркы этап, бул төлөм. Төлөм баскычын баскандан кийин төмөнкү код ишке ашырылат.
public function binFormAction(Request $request)
{
$response = new RedirectResponse($this->generateUrl('cinemax_bin_discs'));
if ($request->isMethod('POST')) {
$data = $request->request->get('bin');
$discs = $request->cookies->get("cookieDiscs");
if (!empty($discs)) {
foreach ($discs as $key => $value) {
if (!isset($data[$key])) {
$response->headers->clearCookie("cookieDiscs[$key]");
}
}
}
if (!empty($data)) {
foreach ($data as $key => $value) {
if ($value == 0) {
$response->headers->clearCookie("cookieDiscs[$key]");
} else {
$cookie = new Cookie("cookieDiscs[$key]", $value, time() + 3600);
$response->headers->setCookie($cookie);
}
}
}
if ($request->request->get('button_bin') == 'Оформить заказ') {
$response->setTargetUrl($this->generateUrl('cinemax_order'));
}
elseif ($request->request->get('button_bin') == 'Продолжить выбор') {
$response->setTargetUrl($this->generateUrl('cinemax_homepage'));
}
}
return $response;
binFormAction() функциясы кутучадагы болгон маалыматты сактап, мисалы канча диск кошулду, өчүрүлдү ж.б., анан эгер заказды аткаруу баскычы басылган болсо заказ кылуу формасын жиберет. Тандоону улант деген баскычы басылган болсо, сайттын баштапкы баракчасына жиберет. Биздин учурда заказды аткаруу баскычы басылды.
public function binOrderAction(Request $request)
{
/* @var User $user */
/* @var DiscsRepository $repository */
/* @var Discs $disc */
$discsIds = $request->cookies->get("cookieDiscs");
if (empty($discsIds)) {
return $this->redirect($this->generateUrl("cinemax_bin_discs"));
}
$binClients = new BinClients();
$user = $this->getUser();
if (!is_null($user)) {
$binClients->setUser($user);
$binClients->setFio($user->getFullname());
$binClients->setEmail($user->getEmail());
$binClients->setPhone($user->getPhone());
$binClients->setAddress($user->getAddress());
}
$form = $this->createForm(new BinClientsFormType(), $binClients);
if ($request->isMethod("POST")){
$form->handleRequest($request);
if ($form->isValid()){
$em = $this->getDoctrine()->getManager();
$binClients->setDateOrder(new \DateTime());
$em->persist($binClients);
$em->flush();
$repository = $this->getDoctrine()->getRepository("CinemaxBundle:Discs");
$discs = $repository->getDiscsById($discsIds);
if (!empty($discs)){
foreach ($discs as $disc){
$binOrders = new BinOrders();
$binOrders->setBinClient($binClients);
$binOrders->setDisc($disc);
$binOrders->setAmount($discsIds[$disc->getId()]);
$binOrders->setCoast($disc->getPrice());
$em->persist($binOrders);
}
$em->flush();
}
$this->sendEmail($binClients);
$this->ClearCookies($discsIds);
$this->get('session')->getFlashBag()->add('notice', 'Ваш заказ принят');
}
}
return $this->render("CinemaxBundle:Bin:binOrderForm.html.twig", array("form" => $form->createView()));
}
binOrderAction() функциясы заказ кылынган диск жөнүндө маалыматты кукиден алат. Функция аргумент катары суроо талап алгандыктан, текшерүүдөн өтөт:
if ($request->isMethod("POST"))
Эгерде суроо талап текшерүүдөн өтпөсө, бизге заказ кылуу формасы жиберилет. Ал жерде колдонуучу жеке маалыматтарын киргизет. Жеке маалыматтарын киргизип бүткөндөн кийин, сактоо баскычын басат. Баскандайн кийин жогорудагы функция кайрадан аткарылат, бирок бул учурда шартка туура келет. Ал эми клиентти bin_clients, заказды bin_orders жадыбалына сактоо амалдары аткарылат. Сактоо аткарылгандан кийин администратордун почтасына жаңы заказ келди деген билдирме жиберилет. Куки тазаланат. Заказынар кабыл алынды деген маалымдоо көрсөтүлөт. Ошентип заказ кылуу амалы бүтөт.
3.4.2 SearchController.php
SearchController.php файлында издөө функциясы жазылган. Ар интернет-дүкөндө издөө болушу зарыл.
public function indexAction(){
$form = $this->createForm(new SearchType());
$request = $this->getRequest();
if ($request->isMethod('GET')) {
$form->submit($request);
$searchText =$form->get('search')->getData();
$repository = $this->getDoctrine()->getRepository('CinemaxBundle:Discs');
$discs = $repository->searchDiscs($searchText);
$paginator = $this -> get('knp_paginator');
$pagination = $paginator
->paginate($discs, $this->get('request')->query->get('page',1),12);
$count = count($pagination);
return $this -> render('CinemaxBundle:Search:index.html.twig', array('count'=> $count, 'pagination'=>$pagination, 'searchText'=>$searchText, 'form'=>$form->createView()));
}
}
public function showFormAction(){
$form = $this->createForm(new SearchType);
return $this -> render('CinemaxBundle:Search:searchForm.html.twig', array('form'=>$form->createView()));
}
Бул коддо издөө амалы аткарылбайт. Бул жерде издөө функциясы чакырылат.
$discs = $repository->searchDiscs($searchText);
searchDiscs() функциясы аргумент катары суралган сөздү алат.
Ушу фукнцияны карап көрсөк.
public function searchDiscs($searchText){
$query = $this->createQueryBuilder('q')
->orWhere("q.name like :search")
->orWhere('q.description like :search')
->andWhere('q.active = 1')
->setParameter('search', '%' . $searchText . '%');
return $query->getQuery();
}
Демек searchDiscs() функциясы базага суроо талап жиберип, керектүү сөздү таап чыгат.
Мындан сыркары дагы көптөгөн класстар, функциялар ишке ашырлыган. Бирок мен эң маанилүүлөрүн гана көрсөттүм.