Step 1: tạo file xử lý Logic cho Trang chủ Frontend
- Tạo file
frontend\index.php
- Trong xử lý logic Frontend, chúng ta cần phải:
- Lấy dữ liệu Danh sách Sản phẩm, cần có các cột dữ liệu: id, ten, giacu, giamoi, hinhsanpham, loaisanpham
<?php
// Include file cấu hình ban đầu của `Twig`
require_once __DIR__.'/../bootstrap.php';
// Truy vấn database để lấy danh sách
// 1. Include file cấu hình kết nối đến database, khởi tạo kết nối $conn
include_once(__DIR__.'/../dbconnect.php');
// 2. Chuẩn bị câu truy vấn $sql
// HEREDOC
$sqlDanhSachSanPham = <<<EOT
SELECT sp.sp_ma, sp.sp_ten, sp.sp_gia, sp.sp_giacu, sp.sp_mota_ngan, sp.sp_soluong, lsp.lsp_ten, MAX(hsp.hsp_tentaptin) AS hsp_tentaptin
FROM `sanpham` sp
JOIN `loaisanpham` lsp ON sp.lsp_ma = lsp.lsp_ma
LEFT JOIN `hinhsanpham` hsp ON sp.sp_ma = hsp.sp_ma
GROUP BY sp.sp_ma, sp.sp_ten, sp.sp_gia, sp.sp_giacu, sp.sp_mota_ngan, sp.sp_soluong, lsp.lsp_ten
EOT;
// 3. Thực thi câu truy vấn SQL để lấy về dữ liệu
$result = mysqli_query($conn, $sqlDanhSachSanPham);
// 4. Khi thực thi các truy vấn dạng SELECT, dữ liệu lấy về cần phải phân tích để sử dụng
// Thông thường, chúng ta sẽ sử dụng vòng lặp while để duyệt danh sách các dòng dữ liệu được SELECT
// Ta sẽ tạo 1 mảng array để chứa các dữ liệu được trả về
$dataDanhSachSanPham = [];
while($row = mysqli_fetch_array($result, MYSQLI_ASSOC))
{
$dataDanhSachSanPham[] = array(
'sp_ma' => $row['sp_ma'],
'sp_ten' => $row['sp_ten'],
'sp_gia' => number_format($row['sp_gia'], 2, ".", ",") . ' vnđ',
'sp_giacu' => number_format($row['sp_giacu'], 2, ".", ","),
'sp_mota_ngan' => $row['sp_mota_ngan'],
'sp_soluong' => $row['sp_soluong'],
'lsp_ten' => $row['lsp_ten'],
'hsp_tentaptin' => $row['hsp_tentaptin'],
);
}
//var_dump($dataDanhSachSanPham);die;
print_r($dataDanhSachSanPham);die;
// Yêu cầu `Twig` vẽ giao diện được viết trong file `frontend/pages/home.html.twig`
// với dữ liệu truyền vào file giao diện được đặt tên
// echo $twig->render('frontend/pages/home.html.twig', [
// 'danhsachsanpham' => $dataDanhSachSanPham
// ]);
?>
Step 2: tạo giao diên template cho Trang chủ
- Tạo file
templates\frontend\page\home.html.twig
{# Kế thừa layout frontend #}
{% extends "frontend/layouts/layout.html.twig" %}
{# Nội dung trong block title #}
{% block title %}
Trang chủ
{% endblock %}
{# End Nội dung trong block title #}
{# Nội dung trong block content #}
{% block content %}
<!-- Carousel - Slider -->
<div id="myCarousel" class="carousel slide" data-ride="carousel">
<ol class="carousel-indicators">
<li data-target="#myCarousel" data-slide-to="0" class="active"></li>
<li data-target="#myCarousel" data-slide-to="1"></li>
<li data-target="#myCarousel" data-slide-to="2"></li>
</ol>
<div class="carousel-inner">
<div class="carousel-item active">
<img src="/assets/frontend/img/slider-1.jpg" />
<div class="container">
<div class="carousel-caption text-left">
<h1>Nền Tảng - Nơi mua sắm tuyệt vời</h1>
</div>
</div>
</div>
<div class="carousel-item">
<img src="/assets/frontend/img/slider-2.jpg" />
<div class="container">
<div class="carousel-caption">
<h1>Hàng triệu sản phẩm - Lựa chọn mỏi tay</h1>
</div>
</div>
</div>
<div class="carousel-item">
<img src="/assets/frontend/img/slider-3.jpg" />
<div class="container">
<div class="carousel-caption text-right">
<h1>Chất lượng là Hàng đầu.</h1>
</div>
</div>
</div>
</div>
<a class="carousel-control-prev" href="#myCarousel" role="button" data-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="sr-only">Previous</span>
</a>
<a class="carousel-control-next" href="#myCarousel" role="button" data-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="sr-only">Next</span>
</a>
</div>
<!-- Tính năng Marketing -->
<div class="container marketing">
<!-- Three columns of text below the carousel -->
<div class="row">
<div class="col-lg-4">
<img class="bd-placeholder-img rounded-circle" width="140" height="140"
src="/assets/frontend/img/icon-1.png" />
<h2>Đặt hàng</h2>
<p>Chọn sản phẩm bạn yêu thích, và Đặt hàng.</p>
</div><!-- /.col-lg-4 -->
<div class="col-lg-4">
<img class="bd-placeholder-img rounded-circle" width="140" height="140"
src="/assets/frontend/img/icon-2.png" />
<h2>Tạo đơn hàng</h2>
<p>Theo dõi đơn hàng của bạn.</p>
</div><!-- /.col-lg-4 -->
<div class="col-lg-4">
<img class="bd-placeholder-img rounded-circle" width="140" height="140"
src="/assets/frontend/img/icon-3.png" />
<h2>Giao hàng</h2>
<p>Giao hàng tận nơi.</p>
</div><!-- /.col-lg-4 -->
</div><!-- /.row -->
<!-- START THE FEATURETTES -->
<hr class="featurette-divider">
<div class="row featurette">
<div class="col-md-7">
<h2 class="featurette-heading">Đặt hàng, Tạo đơn hàng, Giao hàng <span class="text-muted">Nhanh chóng</span>
</h2>
<p class="lead">Nơi mua sắm tuyệt vời cho mọi lứa tuổi.</p>
</div>
<div class="col-md-5">
<img src="/assets/frontend/img/marketing-1.png" />
</div>
</div>
<hr class="featurette-divider">
<div class="row featurette">
<div class="col-md-7 order-md-2">
<h2 class="featurette-heading">Báo cáo Doanh thu tuyệt vời <span class="text-muted">Theo dõi đơn hàng của
bạn.</span></h2>
<p class="lead">Hệ thống theo dõi đơn hàng chi tiết, thông tin mọi lúc mọi nơi.</p>
</div>
<div class="col-md-5 order-md-1">
<img src="/assets/frontend/img/marketing-2.png" />
</div>
</div>
<hr class="featurette-divider">
<!-- /END THE FEATURETTES -->
</div>
<!-- Danh sách sản phẩm -->
<section class="jumbotron text-center">
<div class="container">
<h1 class="jumbotron-heading">Danh sách Sản phẩm</h1>
<p class="lead text-muted">Các sản phẩm với chất lượng, uy tín, cam kết từ nhà Sản xuất, phân phối và bảo hành
chính hãng.</p>
</div>
</section>
<!-- Giải thuật duyệt và render Danh sách sản phẩm theo dòng, cột của Bootstrap -->
{% set counter = 0 %}
{% set group = 3 %}
{% set limit = danhsachsanpham|length %}
{% set col_class_name = (12 / group) %}
<div class="danhsachsanpham py-5 bg-light">
<div class="container">
<div class="row">
{% for sanpham in danhsachsanpham %}
<div class="col-md-{{ col_class_name }}">
<div class="card mb-4 shadow-sm">
{% if sanpham.hsp_tentaptin %}
<a href="/frontend/sanpham/chitiet.php?sp_ma={{ sanpham.sp_ma }}">
<img class="bd-placeholder-img card-img-top" width="100%" height="350"
src="/assets/uploads/{{ sanpham.hsp_tentaptin }}" />
</a>
{% else %}
<a href="/frontend/sanpham/chitiet.php?sp_ma={{ sanpham.sp_ma }}">
<img class="bd-placeholder-img card-img-top" width="100%" height="350"
src="/assets/shared/img/default-image_600.png" />
</a>
{% endif %}
<div class="card-body">
<a href="/frontend/sanpham/chitiet.php?sp_ma={{ sanpham.sp_ma }}">
<h5>{{ sanpham.sp_ten }}</h5>
</a>
<p class="card-text">{{ sanpham.sp_mota_ngan }}</p>
<div class="d-flex justify-content-between align-items-center">
<div class="btn-group">
<a class="btn btn-sm btn-outline-secondary" href="/frontend/sanpham/chitiet.php?sp_ma={{ sanpham.sp_ma }}">Xem chi tiết</a>
</div>
<small class="text-muted text-right">
<s>{{ sanpham.sp_giacu }}</s>
<b>{{ sanpham.sp_gia }}</b>
</small>
</div>
</div>
</div>
</div>
{% set counter = counter + 1 %}
{% if (counter % group == 0 and counter < limit) %}
</div><div class="row">
{% endif %}
{% endfor %}
</div>
</div>
</div>
{% endblock %}
{# End Nội dung trong block content #}
|