Создание php MVC приложения. Сессии. Получение всех заказов
Мы продолжаем разработку простого php mvc приложения и сегодня мы добавим в наше приложение механизм сессии, чтобы предотвратить доступ в кабинет неавторизованным пользователям, а также напишем метод, который будет выдавать список всех заказов с их детальной информацией на главной странице кабинета.
Во время подготовки к этому уроке я столкнулся с проблемой вывода информации из БД (phpmyadmin). Вместо кириллицы выводились знаки вопроса. Поэтому в phpmyadmin нужно установить для базы данных корректное сравнение (см.рисунок)
Также в файле db.php (конфигурация базы данных) я внес небольшое изменение в код (смотрите код файла ниже).
Код урока (db.php)
<?php
/**
** Класс конфигурации базы данных
*/
class DB{
const USER = "u0016495_cabinet";
const PASS = 123456;
const HOST = "localhost";
const DB = "u0016495_cabinet";
public static function connToDB() {
$user = self::USER;
$pass = self::PASS;
$host = self::HOST;
$db = self::DB;
$conn = new PDO("mysql:dbname=$db;host=$host;charset=UTF8", $user, $pass);
return $conn;
}
}
Код урока (config.php)
<?php
session_start();
$_SERVER['DOCUMENT_ROOT'] = "/var/www/u0016495/data/www/cabinet.kamil-abzalov.ru";
define("ROOT", $_SERVER['DOCUMENT_ROOT']);
define("CONTROLLER_PATH", ROOT. "/controllers/");
define("MODEL_PATH", ROOT. "/models/");
define("VIEW_PATH", ROOT. "/views/");
require_once("db.php");
require_once("route.php");
require_once MODEL_PATH. 'Model.php';
require_once VIEW_PATH. 'View.php';
require_once CONTROLLER_PATH. 'Controller.php';
Routing::buildRoute();
Код урока (CabinetController.php)
<?php
class CabinetController extends Controller {
private $pageTpl = "/views/cabinet.tpl.php";
public function __construct() {
$this->model = new CabinetModel();
$this->view = new View();
}
public function index() {
if(!$_SESSION['user']) {
header("Location: /");
}
$this->pageData['title'] = "Кабинет";
$ordersCount = $this->model->getOrdersCount();
$this->pageData['ordersCount'] = $ordersCount;
$productsCount = $this->model->getProductsCount();
$this->pageData['productsCount'] = $productsCount;
$usersCount = $this->model->getUsersCount();
$this->pageData['usersCount'] = $usersCount;
$orders = $this->model->getOrders();
$this->pageData['orders'] = $orders;
$this->view->render($this->pageTpl, $this->pageData);
}
public function logout() {
session_destroy();
header("Location: /");
}
}
Код урока (CabinetModel.php)
<?php
class CabinetModel extends Model {
public function getOrdersCount() {
$sql = "SELECT COUNT(*) FROM orders";
$stmt = $this->db->prepare($sql);
$stmt->execute();
$res = $stmt->fetchColumn();
return $res;
}
public function getProductsCount() {
$sql = "SELECT COUNT(*) FROM products";
$stmt = $this->db->prepare($sql);
$stmt->execute();
$res = $stmt->fetchColumn();
return $res;
}
public function getUsersCount() {
$sql = "SELECT COUNT(*) FROM users";
$stmt = $this->db->prepare($sql);
$stmt->execute();
$res = $stmt->fetchColumn();
return $res;
}
public function getOrders() {
$sql = "SELECT
orders.id as id,
orders.amount as total,
users.fullName,
users.email
FROM orders
LEFT JOIN users ON users.id = orders.user_id
";
$result = array();
$stmt = $this->db->prepare($sql);
$stmt->execute();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$result[$row['id']] = $row;
}
return $result;
}
}
Код урока (cabinet.tpl.php)
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title><?php echo $pageData['title']; ?></title>
<!-- Bootstrap Core CSS -->
<link href="/css/bootstrap.min.css" rel="stylesheet">
<!-- MetisMenu CSS -->
<link href="/css/admin/metisMenu.min.css" rel="stylesheet">
<!-- Custom CSS -->
<link href="/css/admin/sb-admin-2.css" rel="stylesheet">
<!-- Morris Charts CSS -->
<link href="/css/admin/morris.css" rel="stylesheet">
<!-- Custom Fonts -->
<link href="/css/font-awesome.min.css" rel="stylesheet" type="text/css">
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<div id="wrapper">
<!-- Navigation -->
<nav class="navbar navbar-default navbar-static-top" role="navigation" style="margin-bottom: 0">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="index.html">Кабинет</a>
</div>
<!-- /.navbar-header -->
<ul class="nav navbar-top-links navbar-right">
<!-- /.dropdown -->
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-user fa-fw"></i> <i class="fa fa-caret-down"></i>
</a>
<ul class="dropdown-menu dropdown-user">
<li><a href="#"><i class="fa fa-user fa-fw"></i> Профиль</a>
</li>
<li class="divider"></li>
<li><a href="/cabinet/logout"><i class="fa fa-sign-out fa-fw"></i> Выйти</a>
</li>
</ul>
<!-- /.dropdown-user -->
</li>
<!-- /.dropdown -->
</ul>
<!-- /.navbar-top-links -->
<div class="navbar-default sidebar" role="navigation">
<div class="sidebar-nav navbar-collapse">
<ul class="nav" id="side-menu">
<li>
<a href="/cabinet"><i class="fa fa-area-chart"></i> Статистика</a>
</li>
<li>
<a href="forms.html"><i class="fa fa-cart-plus"></i> Товары</a>
</li>
<li>
<a href="/cabinet/users"><i class="fa fa-user-o"></i> Пользователи</a>
</li>
</ul>
</div>
<!-- /.sidebar-collapse -->
</div>
<!-- /.navbar-static-side -->
</nav>
<div id="page-wrapper">
<div class="row">
<div class="col-lg-12">
<h1 class="page-header">Статистика</h1>
</div>
<!-- /.col-lg-12 -->
</div>
<!-- /.row -->
<div class="row">
<div class="col-lg-4 col-md-4">
<div class="panel panel-primary">
<div class="panel-heading">
<div class="row">
<div class="col-xs-3">
<i class="fa fa-money fa-5x"></i>
</div>
<div class="col-xs-9 text-right">
<div class="huge">
<?php echo $pageData['ordersCount']; ?>
</div>
<div>заказов</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-lg-4 col-md-4">
<div class="panel panel-green">
<div class="panel-heading">
<div class="row">
<div class="col-xs-3">
<i class="fa fa-cart-plus fa-5x"></i>
</div>
<div class="col-xs-9 text-right">
<div class="huge">
<?php echo $pageData['productsCount']; ?>
</div>
<div>товаров</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-lg-4 col-md-4">
<div class="panel panel-yellow">
<div class="panel-heading">
<div class="row">
<div class="col-xs-3">
<i class="fa fa-user-o fa-5x"></i>
</div>
<div class="col-xs-9 text-right">
<div class="huge">
<?php echo $pageData['usersCount']; ?>
</div>
<div>пользователей</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- /.row -->
<div class="row">
<div class="col-lg-12">
<!-- /.panel -->
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-bar-chart-o fa-fw"></i> Заказы
</div>
<!-- /.panel-heading -->
<div class="panel-body">
<div class="row">
<div class="col-lg-12">
<div class="table-responsive">
<table class="table table-bordered table-hover table-striped">
<thead>
<tr>
<th>ID заказа</th>
<th>Сумма заказа</th>
<th>ФИО</th>
<th>E-mail</th>
</tr>
</thead>
<tbody>
<?php foreach ($pageData['orders'] as $key => $value) {
echo "<tr>";
echo "<td>" . $value['id'] . "</td>";
echo "<td>" . $value['total'] . "</td>";
echo "<td>" . $value['fullName'] . "</td>";
echo "<td>" . $value['email'] . "</td>";
echo "<tr>";
}
?>
</tbody>
</table>
</div>
<!-- /.table-responsive -->
</div>
<!-- /.col-lg-4 (nested) -->
<!-- /.col-lg-8 (nested) -->
</div>
<!-- /.row -->
</div>
<!-- /.panel-body -->
</div>
<!-- /.panel -->
<!-- /.panel -->
</div>
<!-- /.col-lg-8 -->
</div>
<!-- /.row -->
</div>
<!-- /#page-wrapper -->
</div>
<!-- /#wrapper -->
<!-- jQuery -->
<script src="/js/jquery.js"></script>
<!-- Bootstrap Core JavaScript -->
<script src="/js/bootstrap.min.js"></script>
<!-- Metis Menu Plugin JavaScript -->
<script src="/js/admin/metisMenu.js"></script>
<!-- Custom Theme JavaScript -->
<script src="/js/admin/sb-admin-2.js"></script>
</body>
</html>
0 Комментариев