Thực hiện tạo giao diện trang chủ Frontend
Step 1: tạo controller chứa các action thực thi các tác vụ cho Frontend
- Thực thi câu lệnh
php artisan make:controller Frontend/FrontendController
- Laravel Framework sẽ tạo cho bạn file controller ở
app/Http/Controllers/Frontend/FrontendController.php
Mô hình hoạt động của action index():
Step 2: tạo route index
- Hiệu chỉnh file
routes/web.php
Route::get('/', 'Frontend\FrontendController@index')->name('frontend.home');
Step 3: viết code action
Viết code cho action index()
:
- Action
index()
dùng để hiển thị giao diện trang chủFrontend
.
Hiệu chỉnh file app/Http/Controllers/Frontend/FrontendController.php
<?php namespace App\Http\Controllers\Frontend; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use App\Loai; use DB; class FrontendController extends Controller { /** * Action hiển thị view Trang chủ * GET / */ public function index(Request $request) { // Query top 3 loại sản phẩm (có sản phẩm) mới nhất $ds_top3_newest_loaisanpham = DB::table('cusc_loai') ->join('cusc_sanpham', 'cusc_loai.l_ma', '=', 'cusc_sanpham.l_ma') ->orderBy('l_capNhat')->take(3)->get(); // Query tìm danh sách sản phẩm $danhsachsanpham = $this->searchSanPham($request); // Hiển thị view `frontend.index` với dữ liệu truyền vào return view('frontend.index') ->with('ds_top3_newest_loaisanpham', $ds_top3_newest_loaisanpham) ->with('danhsachsanpham', $danhsachsanpham); } /** * Hàm query danh sách sản phẩm theo nhiều điều kiện */ private function searchSanPham(Request $request) { $query = DB::table('cusc_sanpham')->select('*'); // Kiểm tra điều kiện `searchByLoaiMa` $searchByLoaiMa = $request->query('searchByLoaiMa'); if ($searchByLoaiMa != null) { } $data = $query->get(); return $data; } }
Tạo view index.blade.php
- Do nhận thấy, trong giao diện trang chủ của theme
Cozastore
có các thành phần có thể tái sử dụng lại nhiều lần. Chúng ta sẽ tiến hành tách các thành phần của giao diện trang chủ thành các widget như sau:
- Để dễ dàng quản lý các view, ta sẽ tạo 1 thư mục tương ứng với tên Controller, mỗi action sẽ tương ứng với tên view.
- Tạo folder
resources/views/frontend
- Tạo file
resources/views/frontend/index.blade.php
- Nội dung file
index.blade.php
{{-- View này sẽ kế thừa giao diện từ `frontend.layouts.master` --}} @extends('frontend.layouts.master') {{-- Thay thế nội dung vào Placeholder `title` của view `frontend.layouts.master` --}} @section('title') Shop Hoa tươi - Sunshine @endsection {{-- Thay thế nội dung vào Placeholder `custom-css` của view `frontend.layouts.master` --}} @section('custom-css') @endsection {{-- Thay thế nội dung vào Placeholder `main-content` của view `frontend.layouts.master` --}} @section('main-content') <!-- Slider --> @include('frontend.widgets.homepage-slider') <!-- Banner --> @include('frontend.widgets.homepage-banner', [$data = $ds_top3_newest_loaisanpham]) <!-- Product --> @include('frontend.widgets.product-list', [$data = $danhsachsanpham]) @endsection {{-- Thay thế nội dung vào Placeholder `custom-scripts` của view `frontend.layouts.master` --}} @section('custom-scripts') @endsection
- Nội dung file
resources\views\frontend\widgets\homepage-banner.blade.php
<div class="sec-banner bg0 p-t-80 p-b-50"> <div class="container"> <div class="row"> @foreach($data as $index=>$item) <div class="col-md-6 col-xl-4 p-b-30 m-lr-auto"> <!-- Block{{$index+1}} --> <div class="block1 wrap-pic-w"><img src="{{ asset('themes/cozastore/images/banner-0'. ($index+1) .'.jpg') }}" alt="IMG-BANNER"><a href="#" id="homepageBannerLoaiSanPham_{{ $item->l_ma }}" class="block1-txt ab-t-l s-full flex-col-l-sb p-lr-38 p-tb-34 trans-03 respon3"> <div class="block1-txt-child1 flex-col-l"><span class="block1-name ltext-102 trans-04 p-b-8">{{ $item->l_ten }} </span><span class="block1-info stext-102 trans-04">Hàng hot 2018 </span></div> <div class="block1-txt-child2 p-b-4 trans-05"> <div class="block1-link stext-101 cl0 trans-09">Shop Now </div> </div> </a></div> </div> @endforeach </div> </div> </div>
- Nội dung file
resources\views\frontend\widgets\homepage-slider.blade.php
<section class="section-slide"> <div class="wrap-slick1"> <div class="slick1"> <div class="item-slick1" style="background-image: url({{ asset('themes/cozastore/images/slide-01.jpg') }});"> <div class="container h-full"> <div class="flex-col-l-m h-full p-t-100 p-b-30 respon5"> <div class="layer-slick1 animated visible-false" data-appear="fadeInDown" data-delay="0"> <span class="ltext-101 cl2 respon2"> Women Collection 2018 </span> </div> <div class="layer-slick1 animated visible-false" data-appear="fadeInUp" data-delay="800"> <h2 class="ltext-201 cl2 p-t-19 p-b-43 respon1"> NEW SEASON </h2> </div> <div class="layer-slick1 animated visible-false" data-appear="zoomIn" data-delay="1600"> <a href="product.html" class="flex-c-m stext-101 cl0 size-101 bg1 bor1 hov-btn1 p-lr-15 trans-04"> Shop Now </a> </div> </div> </div> </div> <div class="item-slick1" style="background-image: url({{ asset('themes/cozastore/images/slide-02.jpg') }});"> <div class="container h-full"> <div class="flex-col-l-m h-full p-t-100 p-b-30 respon5"> <div class="layer-slick1 animated visible-false" data-appear="rollIn" data-delay="0"> <span class="ltext-101 cl2 respon2"> Men New-Season </span> </div> <div class="layer-slick1 animated visible-false" data-appear="lightSpeedIn" data-delay="800"> <h2 class="ltext-201 cl2 p-t-19 p-b-43 respon1"> Jackets & Coats </h2> </div> <div class="layer-slick1 animated visible-false" data-appear="slideInUp" data-delay="1600"> <a href="product.html" class="flex-c-m stext-101 cl0 size-101 bg1 bor1 hov-btn1 p-lr-15 trans-04"> Shop Now </a> </div> </div> </div> </div> <div class="item-slick1" style="background-image: url({{ asset('themes/cozastore/images/slide-03.jpg') }});"> <div class="container h-full"> <div class="flex-col-l-m h-full p-t-100 p-b-30 respon5"> <div class="layer-slick1 animated visible-false" data-appear="rotateInDownLeft" data-delay="0"> <span class="ltext-101 cl2 respon2"> Men Collection 2018 </span> </div> <div class="layer-slick1 animated visible-false" data-appear="rotateInUpRight" data-delay="800"> <h2 class="ltext-201 cl2 p-t-19 p-b-43 respon1"> New arrivals </h2> </div> <div class="layer-slick1 animated visible-false" data-appear="rotateIn" data-delay="1600"> <a href="product.html" class="flex-c-m stext-101 cl0 size-101 bg1 bor1 hov-btn1 p-lr-15 trans-04"> Shop Now </a> </div> </div> </div> </div> </div> </div> </section>
- Nội dung file
resources\views\frontend\widgets\product-list.blade.php
<div class="bg0 m-t-23 p-b-140"> <div class="container"> <div class="flex-w flex-sb-m p-b-52"> <div class="flex-w flex-l-m filter-tope-group m-tb-10"> <button class="stext-106 cl6 hov1 bor3 trans-04 m-r-32 m-tb-5 how-active1" data-filter="*"> All Products </button> <button class="stext-106 cl6 hov1 bor3 trans-04 m-r-32 m-tb-5" data-filter=".women"> Women </button> <button class="stext-106 cl6 hov1 bor3 trans-04 m-r-32 m-tb-5" data-filter=".men"> Men </button> <button class="stext-106 cl6 hov1 bor3 trans-04 m-r-32 m-tb-5" data-filter=".bag"> Bag </button> <button class="stext-106 cl6 hov1 bor3 trans-04 m-r-32 m-tb-5" data-filter=".shoes"> Shoes </button> <button class="stext-106 cl6 hov1 bor3 trans-04 m-r-32 m-tb-5" data-filter=".watches"> Watches </button> </div> <div class="flex-w flex-c-m m-tb-10"> <div class="flex-c-m stext-106 cl6 size-104 bor4 pointer hov-btn3 trans-04 m-r-8 m-tb-4 js-show-filter"> <i class="icon-filter cl2 m-r-6 fs-15 trans-04 zmdi zmdi-filter-list"></i> <i class="icon-close-filter cl2 m-r-6 fs-15 trans-04 zmdi zmdi-close dis-none"></i> Filter </div> <div class="flex-c-m stext-106 cl6 size-105 bor4 pointer hov-btn3 trans-04 m-tb-4 js-show-search"> <i class="icon-search cl2 m-r-6 fs-15 trans-04 zmdi zmdi-search"></i> <i class="icon-close-search cl2 m-r-6 fs-15 trans-04 zmdi zmdi-close dis-none"></i> Search </div> </div> <!-- Search product --> <div class="dis-none panel-search w-full p-t-10 p-b-15"> <div class="bor8 dis-flex p-l-15"> <button class="size-113 flex-c-m fs-16 cl2 hov-cl1 trans-04"> <i class="zmdi zmdi-search"></i> </button> <input class="mtext-107 cl2 size-114 plh2 p-r-15" type="text" name="search-product" placeholder="Search"> </div> </div> <!-- Filter --> <div class="dis-none panel-filter w-full p-t-10"> <div class="wrap-filter flex-w bg6 w-full p-lr-40 p-t-27 p-lr-15-sm"> <div class="filter-col1 p-r-15 p-b-27"> <div class="mtext-102 cl2 p-b-15"> Sort By </div> <ul> <li class="p-b-6"> <a href="#" class="filter-link stext-106 trans-04"> Default </a> </li> <li class="p-b-6"> <a href="#" class="filter-link stext-106 trans-04"> Popularity </a> </li> <li class="p-b-6"> <a href="#" class="filter-link stext-106 trans-04"> Average rating </a> </li> <li class="p-b-6"> <a href="#" class="filter-link stext-106 trans-04 filter-link-active"> Newness </a> </li> <li class="p-b-6"> <a href="#" class="filter-link stext-106 trans-04"> Price: Low to High </a> </li> <li class="p-b-6"> <a href="#" class="filter-link stext-106 trans-04"> Price: High to Low </a> </li> </ul> </div> <div class="filter-col2 p-r-15 p-b-27"> <div class="mtext-102 cl2 p-b-15"> Price </div> <ul> <li class="p-b-6"> <a href="#" class="filter-link stext-106 trans-04 filter-link-active"> All </a> </li> <li class="p-b-6"> <a href="#" class="filter-link stext-106 trans-04"> $0.00 - $50.00 </a> </li> <li class="p-b-6"> <a href="#" class="filter-link stext-106 trans-04"> $50.00 - $100.00 </a> </li> <li class="p-b-6"> <a href="#" class="filter-link stext-106 trans-04"> $100.00 - $150.00 </a> </li> <li class="p-b-6"> <a href="#" class="filter-link stext-106 trans-04"> $150.00 - $200.00 </a> </li> <li class="p-b-6"> <a href="#" class="filter-link stext-106 trans-04"> $200.00+ </a> </li> </ul> </div> <div class="filter-col3 p-r-15 p-b-27"> <div class="mtext-102 cl2 p-b-15"> Color </div> <ul> <li class="p-b-6"> <span class="fs-15 lh-12 m-r-6" style="color: #222;"> <i class="zmdi zmdi-circle"></i> </span> <a href="#" class="filter-link stext-106 trans-04"> Black </a> </li> <li class="p-b-6"> <span class="fs-15 lh-12 m-r-6" style="color: #4272d7;"> <i class="zmdi zmdi-circle"></i> </span> <a href="#" class="filter-link stext-106 trans-04 filter-link-active"> Blue </a> </li> <li class="p-b-6"> <span class="fs-15 lh-12 m-r-6" style="color: #b3b3b3;"> <i class="zmdi zmdi-circle"></i> </span> <a href="#" class="filter-link stext-106 trans-04"> Grey </a> </li> <li class="p-b-6"> <span class="fs-15 lh-12 m-r-6" style="color: #00ad5f;"> <i class="zmdi zmdi-circle"></i> </span> <a href="#" class="filter-link stext-106 trans-04"> Green </a> </li> <li class="p-b-6"> <span class="fs-15 lh-12 m-r-6" style="color: #fa4251;"> <i class="zmdi zmdi-circle"></i> </span> <a href="#" class="filter-link stext-106 trans-04"> Red </a> </li> <li class="p-b-6"> <span class="fs-15 lh-12 m-r-6" style="color: #aaa;"> <i class="zmdi zmdi-circle-o"></i> </span> <a href="#" class="filter-link stext-106 trans-04"> White </a> </li> </ul> </div> <div class="filter-col4 p-b-27"> <div class="mtext-102 cl2 p-b-15"> Tags </div> <div class="flex-w p-t-4 m-r--5"> <a href="#" class="flex-c-m stext-107 cl6 size-301 bor7 p-lr-15 hov-tag1 trans-04 m-r-5 m-b-5"> Fashion </a> <a href="#" class="flex-c-m stext-107 cl6 size-301 bor7 p-lr-15 hov-tag1 trans-04 m-r-5 m-b-5"> Lifestyle </a> <a href="#" class="flex-c-m stext-107 cl6 size-301 bor7 p-lr-15 hov-tag1 trans-04 m-r-5 m-b-5"> Denim </a> <a href="#" class="flex-c-m stext-107 cl6 size-301 bor7 p-lr-15 hov-tag1 trans-04 m-r-5 m-b-5"> Streetstyle </a> <a href="#" class="flex-c-m stext-107 cl6 size-301 bor7 p-lr-15 hov-tag1 trans-04 m-r-5 m-b-5"> Crafts </a> </div> </div> </div> </div> </div> <div class="row isotope-grid"> @foreach($data as $index=>$sp) <div class="col-sm-6 col-md-4 col-lg-3 p-b-35 isotope-item women"> <!-- Block2 --> <div class="block2"> <div class="block2-pic hov-img0"> <img src="{{ asset('storage/photos/' . $sp->sp_hinh) }}" alt="IMG-PRODUCT"> <a href="#" class="block2-btn flex-c-m stext-103 cl2 size-102 bg0 bor2 hov-btn1 p-lr-15 trans-04 js-show-modal1"> Quick View </a> </div> <div class="block2-txt flex-w flex-t p-t-14"> <div class="block2-txt-child1 flex-col-l "> <a href="product-detail.html" class="stext-104 cl4 hov-cl1 trans-04 js-name-b2 p-b-6"> {{ $sp->sp_ten }} </a> <span class="stext-105 cl3"> {{ $sp->sp_giaBan }} </span> </div> <div class="block2-txt-child2 flex-r p-t-3"> <a href="#" class="btn-addwish-b2 dis-block pos-relative js-addwish-b2"> <img class="icon-heart1 dis-block trans-04" src="{{ asset('themes/cozastore/images/icons/icon-heart-01.png') }}" alt="ICON"> <img class="icon-heart2 dis-block trans-04 ab-t-l" src="{{ asset('themes/cozastore/images/icons/icon-heart-02.png') }}" alt="ICON"> </a> </div> </div> </div> </div> @endforeach </div> <!-- Load more --> <div class="flex-c-m flex-w w-full p-t-45"> <a href="#" class="flex-c-m stext-101 cl5 size-103 bg2 bor1 hov-btn1 p-lr-15 trans-04"> Load More </a> </div> </div> </div>
Chương trình học
Các bài học
Bài học trước Bài học tiếp theo
Chương trình học
Bao gồm Module, Chương, Bài học, Bài tập, Kiểm tra...Chương trình học
Bài học trước Bài học tiếp theo