(обязательное)
Листинг алгоритмов
<?php session_start(); if( ! isset($_SESSION['cart'])){ $_SESSION['cart'] = array(); } include_once '../config/config.php'; //инициализация настроек include_once '../config/db.php'; // инициализация баз данных include_once '../library/mainFunctions.php'; //основные фцнкции //опредеяем, с каким контролером будем работать $controllerName = isset($_GET['controller']) ? ucfirst($_GET['controller']) : 'Index'; //опредеяем, с какой функцией будем работать $actionName = isset($_GET['action']) ? $_GET['action'] : 'index'; if(isset($_SESSION['user'])){ $smarty->assign('arUser', $_SESSION['user']); } $smarty->assign('cartCntItems', count($_SESSION['cart'])); loadPage($smarty, $mysqli, $controllerName, $actionName);
<?php //константы для обращения к контроллерам define('PathPrefix', '../controllers/'); define('PathPostfix', 'Controller.php'); //используемый графический шаблон (по умолчанию - default) $template = 'default'; $templateAdmin = 'admin'; //определяем пути для обращения к графическим шаблонам (файлы *.tpl) define('TemplatePrefix', "../views/{$template}/"); define('TemplateAdminPrefix', "../views/{$templateAdmin}/"); define('TemplatePostfix', '.tpl'); //путь к css-шаблонов в веб-пространстве define('TemplateWebPath', "/templates/{$template}/"); define('TemplateAdminWebPath', "/templates/{$templateAdmin}/"); //инициализация шаблонизатора Smarty //полный путь к Smarty.class.php require('../library/Smarty/libs/Smarty.class.php'); $smarty = new Smarty(); $smarty->setTemplateDir(TemplatePrefix); $smarty->setCompileDir('../tmp/smarty/templates_c'); $smarty->setCacheDir('../tmp/smarty/cache'); $smarty->setConfigDir('../library/Smarty/configs'); $smarty->assign('templateWebPath', TemplateWebPath);
<?php /** * * Инициализация подключения к БД */ $dblocation = "127.0.0.1"; $dbname = "myshop"; $dbuser = "root"; $dbpasswd = ""; $mysqli = new mysqli($dblocation, $dbuser, $dbpasswd, $dbname); $mysqli->set_charset('utf8'); if ($mysqli->connect_errno){ echo "Ошибка соединения с MySQL # ". $mysqli->connect_errno . ". Описание: " . $mysqli->connect_error; exit(); }
<?php /** * Контроллер главной страницы */ include_once '../models/CategoriesModel.php'; include_once '../models/ProductsModel.php'; /** * Формирование главной страницы сайта * @param $smarty * @var TYPE_NAME $rsCategories * */ function indexAction($smarty, $mysqli){ // + PAGINATION BLOCK $paginator = array(); $paginator['perPage'] = 9; $paginator['currentPage'] = isset($_GET['page']) ? $_GET['page'] : 1; $paginator['offset'] = $paginator['currentPage'] * $paginator['perPage'] - $paginator['perPage']; $paginator['link'] = '/index/?page='; list($rsProducts, $allCount) = getLastProducts($paginator['offset'], $paginator['perPage'], $mysqli); $paginator['pageCnt'] = ceil($allCount / $paginator['perPage']); $smarty->assign('paginator', $paginator); // - PAGINATION BLOCK $rsCategories = getAllMainCatsWithChildren($mysqli); $smarty->assign('pageTitle', 'Главная страница'); $smarty->assign('rsCategories', $rsCategories); $smarty->assign('rsProducts', $rsProducts); loadTemplate($smarty, 'header'); loadTemplate($smarty, 'index'); loadTemplate($smarty, 'footer'); }
<?php /** * Контроллер функций пользователя */ include_once '../models/CategoriesModel.php'; include_once '../models/UsersModel.php'; include_once '../models/OrdersModel.php'; include_once '../models/PurchaseModel.php'; function isInArray($array, $key, $default=NULL){ return isset($array[$key]) ? $array[$key] : $default; } function registerAction($smarty, $mysqli){ $email = isInArray($_REQUEST, 'email'); $email = trim($email); $pwd1 = isInArray($_REQUEST, 'pwd1'); $pwd2 = isInArray($_REQUEST, 'pwd2'); $phone = isInArray($_REQUEST, 'phone'); $address = isInArray($_REQUEST, 'address'); $name = isInArray($_REQUEST, 'name'); $name = trim($name); //$resData == null при отсутствии ошибок регистрации // или массив с индексами: [message] == код ошибки и [success] != null $resData = null; $resData = checkRegisterParams($email, $pwd1, $pwd2); if(!$resData && checkUserEmail($email, $mysqli)){ $resData['success'] = null; $resData['message'] = "Пользователь с таким email ('{$email}') уже существует"; } if(! $resData ){ $pwdMd5 = md5($pwd1); $userData = registerNewUser($email, $pwdMd5, $name, $phone, $address, $mysqli); if ($userData['success'] == 1){ $resData['message'] = 'Пользователь успешно зарегистрирован'; $resData['success'] = 1; $userData = $userData[0]; $resData['userName'] = $userData['name'] ? $userData['name'] : $userData['email']; $resData['userEmail'] = $userData['email']; $_SESSION['user'] = $userData; $_SESSION['user']['displayName'] = $userData['name'] ? $userData['name'] : $userData['email']; } else { $resData['success'] = null; $resData['message'] = 'Ошибка регистрации';} } echo json_encode($resData); } /** * Отлогинивание пользователя * Возвращаем в ajax */ function logoutAction(){ $logouted = NULL; if(isset($_SESSION['user'])){ unset($_SESSION['user']); unset($_SESSION['cart']); $logouted = TRUE; } redirect(); } /** * AJAX-авторизация пользователя * * @return json Массив данных залогиненного пользователя */ function loginAction($smarty, $mysqli){ $email = trim(isInArray($_REQUEST, 'email')); $pwd = trim(isInArray($_REQUEST, 'pwd')); $userData = loginUser($email, $pwd, $mysqli); if($userData['success']){ $userData = $userData[0]; $_SESSION['user'] = $userData; $_SESSION['user']['displayName'] = $userData['name'] ? $userData['name'] : $userData['email']; $resData = $_SESSION['user']; $resData['success'] = 1; } else { $resData['success'] = null; $resData['message'] = 'Неверные данные авторизации'; } echo json_encode($resData); } /** * Формирование страницы пользователя (кабинет) * @param type $smarty * @param type $mysqli */ function indexAction ($smarty, $mysqli){ if(!isset($_SESSION['user'])){ redirect(); } $rsCategories = getAllMainCatsWithChildren($mysqli); //все категории с дитями $rsUserOrders = getCurUserOrders($smarty, $mysqli); $smarty->assign('pageTitle', 'Главная страница'); $smarty->assign('rsCategories', $rsCategories); $smarty->assign('rsUserOrders', $rsUserOrders); loadTemplate($smarty, 'header'); loadTemplate($smarty, 'user'); loadTemplate($smarty, 'footer'); } function updateAction($smarty, $mysqli){ if(!isset($_SESSION['user'])){ redirect(); } $resData = array(); $email = $_SESSION['user']['email']; $curPwd = isInArray($_REQUEST, 'curPwd'); $pwd1 = isInArray($_REQUEST, 'newPwd1'); $pwd2 = isInArray($_REQUEST, 'newPwd2'); $phone = isInArray($_REQUEST, 'newPhone'); $address = isInArray($_REQUEST, 'newAddress'); $name = isInArray($_REQUEST, 'newName'); $curPwdMD5 = md5($curPwd); //хэш пароля подтверждения if( ! $curPwd || $_SESSION['user']['pwd'] != $curPwdMD5){ $resData['success'] = 0; $resData['message'] = "Текущий пароль не верен!"; } else{ $resUpdate = updateUserData($email, $name, $phone, $address, $pwd1, $pwd2, $curPwdMD5, $mysqli); if($resUpdate){ $resData['success'] = 1; $resData['message'] = 'Данные успешно сохранены'; $_SESSION['user']['name'] = $name; $_SESSION['user']['phone'] = $phone; $_SESSION['user']['address'] = $address; $_SESSION['user']['pwd'] = $pwd1 ? md5($pwd1) : $_SESSION['user']['pwd']; $resData['userName'] = $_SESSION['user']['dislayName'] = $name ? $name : $email; } else { $resData['success'] = 0; $resData['message'] = "Ошибка. Проверьте вводимые данные!"; } } echo json_encode($resData); }
<?php /** * Модель для таблицв пользователей (users) */ /** * Регистрация пользователя в базе * @param $email * @param $pwdMD5 * @param $name * @param $phone * @param $address * @param $mysqli * @return array|bool массив с [0]=данными пользователя, [success]=флагом успеха */ function registerNewUser($email, $pwdMD5, $name, $phone, $address, $mysqli){ $email = htmlspecialchars($mysqli->real_escape_string($email)); $pwdMD5 = htmlspecialchars($mysqli->real_escape_string($pwdMD5)); $name = htmlspecialchars($mysqli->real_escape_string($name)); $phone = htmlspecialchars($mysqli->real_escape_string($phone)); $address = htmlspecialchars($mysqli->real_escape_string($address)); $sql = "INSERT INTO `users` (`email`, `pwd`, `name`, `phone`, `address`) VALUES ('$email', '$pwdMD5', '$name', '$phone', '$address')"; $rs = $mysqli->query($sql); if($rs){ $sql = "SELECT * FROM `users` WHERE (`email` = '{$email}' and `pwd` = '{$pwdMD5}') LIMIT 1"; $rs = $mysqli->query($sql); $rs = createSmartyRsArray($rs, $mysqli); if(isset($rs[0])){ $rs['success'] = 1; } else {$rs['success'] = 0;} }else {$rs['success'] = 0;} return $rs; } /** * Проверяем регистрационные данные - наличие обоих паролей и их совпадение, наличие email * @param $email * @param $pwd1 * @param $pwd2 * @return array Описание ошибки */ function checkRegisterParams($email, $pwd1, $pwd2){ $res = array(); if(! $email) { $res['success'] = null; $res['message'] = 'Введите e-mail'; } if(! $pwd1){ $res['success'] = null; $res['message'] = ' Введите пароль'; } if(! $pwd2){ $res['success'] = null; $res['message'] = ' Введите повтор пароля'; } if($pwd1 != $pwd2){ $res['success'] = null; $res['message'] = ' Пароли не совпадают'; } return $res; } /** * Проверка почты до регистрации, на наличие в базе * @param $email * @param $mysqli * @return array|bool возвращаем id записи с существующим email или null */ function checkUserEmail($email, $mysqli) { $email = $mysqli->real_escape_string($email); $sql = "SELECT id FROM `users` WHERE `email` = '{$email}'"; $rs = $mysqli->query($sql); $rs = createSmartyRsArray($rs, $mysqli); return $rs; } /** * Забираем данные пользователя из базы * @param type $email * @param type $pwd * @param type $mysqli * @return array данные пользователя и флаг об успешности выполнения запроса */ function loginUser($email, $pwd, $mysqli){ $email = htmlspecialchars($mysqli->real_escape_string($email)); $pwd = md5($pwd); $sql = "SELECT * FROM `users` WHERE (`email` = '{$email}' and `pwd` = '{$pwd}') LIMIT 1"; $rs = $mysqli->query($sql); $rs = createSmartyRsArray($rs, $mysqli); if(isset($rs[0])){ $rs['success'] = 1; } else { $rs['success'] = NULL; } return $rs; } /** * * @param type $email * @param type $name * @param type $phone * @param type $address * @param type $pwd1 * @param type $pwd2 * @param type $curPwd * @param type $mysqli * @return type */ function updateUserData($email, $name, $phone, $address, $pwd1, $pwd2, $curPwd, $mysqli){ //отсеили ещё раз нулевой email и неравные пароли if( ! $email || $pwd1 != $pwd2 ){ return NULL; } $sql = "UPDATE `users` SET `name`='{$name}', `phone`='{$phone}', `address`='{$address}'"; if($pwd1){ $pwdMD5 = md5($pwd1); $sql.=", `pwd`='{$pwdMD5}'"; } $sql.= "WHERE `email`='{$email}' AND `pwd`='{$curPwd}' LIMIT 1"; $rs = $mysqli->query($sql); return $rs; } function getCurUserOrders($smarty, $mysqli){ $userId = isset($_SESSION['user']['id']) ? $_SESSION['user']['id'] : 0; $rs = getOrdersWithProductsByUser($smarty, $userId, $mysqli); return $rs;
{*Страница кабинета авторизованного пользователя*} <h1>регистрационные данные</h1> <div id="userDataBox"> <table border="0"> <tr> <td>Логин (e-mail)</td> <td>{$arUser['email']}</td> </tr> <tr> <td>Имя</td> <td><input type="text" id="newName" name="newName" value="{$arUser['name']}"/></td> </tr> <tr> <td>Тел.</td> <td><input type="text" id="newPhone" name="newPhone" value="{$arUser['phone']}"/></td> </tr> <tr> <td>Адрес</td> <td><textarea id="newAddress" name="newAddress">{$arUser['address']}</textarea></td> </tr> <tr> <td>Новый пароль</td> <td><input type="password" id="newPwd1" name="newPwd1" value=""/></td> </tr> <tr> <td>Повтор пароля</td> <td><input type="password" id="newPwd2" name="newPwd2" value=""/></td> </tr> <tr> <td>Старый пароль для подтверждения изменений</td> <td><input type="password" id="curPwd" name="curPwd" value=""/></td> </tr> <tr> <td> </td> <td><input type="button" onclick="updateUserData();" value="Сохранить изменения"/></td> </tr> </table> <h2>Orders:</h2> {if ! $rsUserOrders} NO ORDERS! {else} <table border = "1"> <tr> <th>#</th> <th>Action</th> <th>Order ID</th> <th>Status</th> <th>Order Date</th> <th>Payment Transaction</th> <th>Info</th> </tr> {foreach $rsUserOrders as $item name=orders} <tr> <td>{$smarty.foreach.orders.iteration}</td> <td><a href="#" onclick="showProducts({$item['id']}); return false;">Show products in order</a></td> <td>{$item['id']}</td> <td>{if {$item['status']} == 1} Payed {else} Not payed {/if}</td> <td>{$item['date_created']}</td> <td>{$item['date_payment']} </td> <td>{$item['comment']}</td> </tr> <tr class="hideme" id="purchasesForOrderId_{$item['id']}"> <td colspan = "7"> {if $item['children']} <table border="1" cellpadding="1" cellspacing="1" width="100%"> <tr> <th>#</th> <th>ID</th> <th>Name</th> <th>Price</th> <th>Amount</th> </tr> {foreach $item['children'] as $itemChild name=products} <tr> <td>{$smarty.foreach.products.iteration}</td> <td>{$itemChild['product_id']}</td> <td><a href="/product/{$itemChild['product_id']}/">{$itemChild['name']}</a></td> <td>{$itemChild['price']}</td> <td>{$itemChild['amount']}</td> </tr> {/foreach} </table> {/if} </td> </tr> {/foreach} </table> {/if} </div>
{*Левый столбец*} <div id="leftColumn"> <div id="leftMenu"> <div class="menuCaption">Меню:</div> {foreach $rsCategories as $item} <a href="/category/{$item['id']}/">{$item['name']}</a><br /> {if isset($item['children'])} {foreach $item['children'] as $child} --<a href="/category/{$child['id']}/">{$child['name']}</a><br /> {/foreach} {/if} {/foreach} </div> {if isset($arUser)} <div id="userBox"> <a href="/user/" id="userLink">{$arUser['displayName']}</a><br /> <a href="/user/logout/" onclick="logout();">Выход</a> </div> {else} <div id="userBox" class="hideme"> <a href="#" id="userLink"></a><br /> <a href="#" onclick="logout();">Выход</a> </div> {if ! isset($hideLoginBox)} <div id="loginBox"> <div class="menuCaption">Авторизация </div> <input type="text" id="loginEmail" name="loginEmail" value=""><br /> <input type="password" id="loginPwd" name="loginPwd" value=""><br /> <input type="button" onclick="login();" value="Войти"><br /> </div> <div id="registerBox"> <div class="menuCaption" onclick="showRegisterBox();" value=""><a href="#">Регистрация</a></div> <div id="registerBoxHidden" class="hideme"> e-mail: <br /> <input type="text" id="email" name="email" value=""/><br /> пароль: <br /> <input type="password" id="pwd1" name="pwd1" value=""/><br /> повторить пароль: <br /> <input type="password" id="pwd2" name="pwd2" value=""/><br /> <input type="button" onclick="registerNewUser();" value="Зарегистрироваться"/><br /> </div> </div> {/if} {/if} <div class="menuCaption">Корзина</div> <a href="/cart/" title="Перейти в корзину">В корзине</a> <span id="cartCntItems"> {if $cartCntItems > 0} {$cartCntItems} {else} Пусто {/if} </span> </div>
Дата | Выполнено, % |
---|---|
2020-05-28 17:34:28 | 10 |
2020-05-28 14:34:25 | 100 |