Trang 1 / 5 1234 ... LastLast
Hiển thị kết quả từ 1 đến 10 / 42
  1. #1
    Tham gia
    22-10-2014
    Bài viết
    103
    Like
    0
    Thanked 12 Times in 11 Posts

    Từng bước học lập trình PHP nâng cao qua dự án website giới thiệu sản phẩm

    Sau loạt bài hướng dẫn "Từng bước học lập trình PHP cơ bản qua dự án website giới thiệu sản phẩm" tôi sẽ tiếp tục viết loạt bài hướng dẫn các bạn học lập trình PHP nâng cao (Lập trình hướng đối tượng) thông qua việc hoàn thành dự án website giới thiệu sản phẩm (Tương tự như ở loạt bài cơ bản).

    Từng bước hoàn thành dự án website giới thiệu sản phẩm (Trang quản trị và trang người dùng) các bạn sẽ được học các vấn đề liên quan tới lập trình PHP nâng cao (Lập trình hướng đối tượng).

    Các bạn lưu ý, bài hướng dẫn này tôi chỉ trình bày và giải thích các vấn đề nâng cao trong lập trình PHP. Các vấn đề tôi đã trình bày, giải thích ở loạt bài cơ bản rồi thì tôi sẽ không trình bày hay giải thích cho các bạn nữa. Và tôi cũng khuyên các bạn nên tìm hiểu, nghiên cứu thật kỹ phần cơ bản trước khi tìm hiểu phần nâng cao này.

    Loạt bài hướng dẫn "Từng bước học lập trình PHP nâng cao qua dự án website giới thiệu sản phẩm" tôi đã đăng trên trang cá nhân Google+ của tôi tại địa chỉ plus[dot]google[dot]com/103116221369826139041.

    Trong quá trình theo dõi bài hướng dẫn các bạn có thể tham gia thảo luận và đóng góp ý kiến để bài viết ngày càng hoàn thiện hơn.

    Chân thành cảm ơn sự quan tâm của các bạn!
    Lê Trung Hiếu - Lập Trình Web & Di Động
    Quote Quote

  2. Thành viên Like bài viết này:


  3. #2
    Tham gia
    22-10-2014
    Bài viết
    103
    Like
    0
    Thanked 12 Times in 11 Posts
    THÔNG TIN CẤU HÌNH WEBSITE (PHẦN 1 + 2)

    Về cấu trúc thư mục, cấu trúc DB và các chức năng của website tương tự như ở loạt bài hướng dẫn "Từng bước học lập trình PHP cơ bản qua dự án website giới thiệu sản phẩm".

    Nội dung kiến thức phần này gồm:

    - Lớp (Class).
    - Hằng.

    Trong thư mục configs, tạo mới file Config[dot]php để khai báo các thông tin cấu hình website. Bạn lưu ý file Config[dot]php tôi viết hoa chữ "C". Chuẩn đặt tên file, lớp, hàm, biến... các bạn lưu ý các nội dung hướng dẫn của tôi.

    Nội dung file configs/Config[dot]php như sau:
    PHP Code:
    <?php
    class Config {
    //Thông tin website
    const SITE_URL 'localhost/';
    const 
    BASE_PATH 'C:\Wamp\www\\';

    //Thông tin cấu hình DB
    const DB_SERVER 'localhost';
    const 
    DB_USERNAME 'root';
    const 
    DB_PASSWORD '';
    const 
    DB_DATABASE 'php_2';
    }
    ?>
    * Lớp (Class):

    Lớp các bạn có thể hiểu như một bản thiết kế (Hay khuôn mẫu) của một đối tượng nào đó với các thuộc tính, trạng thái, hành động... theo mục đích của người lập trình.

    Bên trong một lớp có các thành phần:

    - Thuộc tính (Property): Mô tả thuộc tính của đối tượng. Thuộc tính của một lớp bao gồm các biến, các hằng, hay tham số nội tại của lớp đó. Ở đây, vai trò quan trọng nhất của các thuộc tính là các biến vì chúng có thể bị thay đổi trong suốt quá trình hoạt động của một đối tượng. Các thuộc tính có thể được xác định kiểu và kiểu của chúng có thể là các kiểu dữ liệu cổ điển hay đó là một lớp đã định nghĩa từ trước.
    - Phương thức (Method): Mô tả một hành vi nào đó của đối tượng (Hoặc của lớp). Phương thức thực chất như một hàm bên trong một lớp.

    Ví dụ:

    Lớp "Người" dùng để chỉ những thực thể sống trên trái đất với các thuộc tính là "chân, tay, mắt, mũi..." và có những hành vi như "đi, đứng, nằm...".

    Để tạo ra một lớp, các bạn thực hiện theo mẫu sau:

    class Tên_lớp {
    //Nội dung của lớp
    }

    Ví dụ:
    PHP Code:
    class Person {

    Các bạn lưu ý khi đặt tên lớp:

    - Tên lớp trùng với tên file PHP (Vì vậy tên file PHP cũng phải tuân thủ quy tắc đặt tên của lớp).
    - Nếu tên lớp có từ hai từ trở lên thì phải viết hoa đầu từ và có thể viết liền nhau hoặc sử dụng dấu gạch dưới "_" để phân cách (Ví dụ: Person, UserProfile hoặc User_Profile).

    Liên quan tới lớp còn có khái niệm đối tượng (Object), thuộc tính, phương thức.. tôi sẽ trình bày sau.

    Các bạn có thể tìm hiểu thêm về lớp ở liên kết php[dot]net/manual/en/keyword[dot]class[dot]php.

    * Hằng:

    Hằng là gì thì tôi đã trình bày ở loạt bài hướng dẫn "Từng bước học lập trình PHP cơ bản qua dự án website giới thiệu sản phẩm". Ở phần này thì tôi chỉ trình bày cho các bạn biết cách khai báo, sử dụng hằng trong một lớp.

    Ở file configs/Config[dot]php, tôi đã khai báo 6 hằng (SITE_URL, BASE_PATH, DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_DATABASE). Như vậy, để khai báo hằng trong một lớp các bạn thực hiện theo mẫu sau:

    const Tên_hằng = Giá_trị_của_hằng;

    Ví dụ:
    PHP Code:
    const SITE_URL 'localhost/'
    Hằng cũng có thể xem như một thuộc tính của lớp nhưng giá trị của hằng là không thay đổi.

    Để gọi (Sử dụng) hằng các bạn thực hiện theo mẫu sau:

    Tên_lớp::Tên_hằng;

    Ví dụ:
    PHP Code:
    Config::SITE_URL
    Bạn có thể tìm hiểu thêm về hằng ở liên kết php[dot]net/manual/en/language[dot]oop5[dot]constants[dot]php.
    Lê Trung Hiếu - Lập Trình Web & Di Động

  4. Thành viên Like bài viết này:


  5. #3
    Tham gia
    22-10-2014
    Bài viết
    103
    Like
    0
    Thanked 12 Times in 11 Posts
    KẾT NỐI DB (PHẦN 3)

    Nội dung kiến thức phần này gồm:

    - Thuộc tính (Property).
    - Phương thức (Method).
    - Kế thừa (Extends).

    Trong thư mục libraries, bạn tạo mới hai file MySql[dot]php và Db[dot]php để viết mã lệnh kết nối DB.

    Nội dung file libraries/MySql[dot]php như sau:
    PHP Code:
    <?php
    class MySql {
        protected 
    $_query;

        public function 
    __construct(){
            
    //Connect
            
    $connection mysql_pconnect(Config::DB_SERVERConfig::DB_USERNAMEConfig::DB_PASSWORD) or die('Not connected DB!');
            
    $dbSelected mysql_select_db(Config::DB_DATABASE$connection) or die('Not selected DB!');

            
    //Set UTF8
            
    mysql_query('SET NAMES UTF8'$connection);
        }

        public function 
    query($sql){
            
    //Truy vấn và return
            
    return $this->_query mysql_query($sql);
        }

        public function 
    fetch(){
            
    //Fetch và return
            
    return mysql_fetch_assoc($this->_query);
        }
    }
    ?>
    Nội dung file libraries/Db[dot]php như sau:
    PHP Code:
    <?php
    require BASE_PATH 'libraries/MySql***91;dot***93;php';

    class 
    Db extends MySql {
    }
    ?>
    Như các bạn thấy, toàn bộ các câu lệnh kết nối tới DB đều nằm ở lớp MySql được viết trong file libraries/MySql[dot]php. Vậy lớp Db được viết trong file libraries/Db[dot]php có vai trò gì khi mà lớp Db này chỉ mở rộng (Extends) từ lớp MySql chứ không có thêm thuộc tính hay phương thức nào mới? Lớp Db này có một vai trò quan trọng mà tôi hi vọng các bạn sẽ tìm hiểu thêm.

    Các bạn lưu ý tới hai phương thức query và fetch của lớp MySql. Trong đó:

    - Phương thức query dùng để thực thi câu lệnh SQL và gán kết quả vào thuộc tính $_query để sử dụng ở phương thức fetch (Trong trường hợp truy vấn lấy dữ liệu).
    - Phương thức fetch dùng để lấy từng dòng dữ liệu theo kết quả truy vấn được lưu ở thuộc tính $_query (Trong trường hợp truy vấn lấy dữ liệu).

    * Thuộc tính (Property):

    Để khai báo thuộc tính trong lớp, các bạn thực hiện theo mẫu sau:

    Phạm_vi $Tên_thuộc_tính;

    Hoặc

    Phạm_vi $Tên_thuộc_tính = Giá_trị_của_thuộc_tính;

    Thuộc tính trong lớp phải có phạm vị hoạt động (Tầm vực) và được thể hiện qua ba từ khóa phạm vi sau:

    - Public: Có phạm vị sử dụng "rộng" nhất và không bị giới hạn. Nếu các bạn không khai báo phạm vi cho thuộc tính thì mặc định thuộc tính đó là public.
    - Protected: Có phạm vi hoạt động bên trong nội tại của lớp và các lớp kế thừa (Còn gọi là lớp con hoặc lớp dẫn xuất).
    - Private: Có phạm vi hoạt động "hẹp" nhất, chỉ hoạt động bên trong nội tại của lớp.

    Ví dụ:
    PHP Code:
    public $a;
    protected 
    $_b;
    private 
    $_c
    Các bạn lưu ý về cách đặt tên thuộc tính (Áp dụng cho cả tên biến):

    - Tuân theo các qui tắc đặt tên biến.
    - Từ đầu tiên là chữ thường. Nếu có từ hai từ trở lên thì chữ cái đầu tiên của từ thứ hai trở đi là chữ hoa (Ví dụ: $user, $userProfile, $deltailUserProfile).
    - Những thuộc tính có phạm vi protected và private thì tên thuộc tính bắt đầu bằng dấu gạch dưới "_" (Ví dụ: $_query).

    Để gọi (Sử dụng) thuộc tính đã được khai báo các bạn thực hiện theo mẫu sau:

    $this->Tên_thuộc_tính;

    Hoặc

    self::$Tên_thuộc_tính;

    Hoặc

    parent::$Tên_thuộc_tính;

    Ví dụ:
    PHP Code:
    $this->a;
    self::$_b;
    parent::$_c
    Với ba mẫu trên, tùy từng trường hợp các bạn sử dụng cho đúng chứ không phải muốn sử dụng mẫu nào cũng được.

    Mẫu thứ nhất được dùng khi gọi một thuộc tính của chính lớp đó hoặc lớp cơ sở (Còn gọi là lớp cha).

    Mẫu thứ hai được dùng khi gọi một thuộc tính của chính lớp đó.

    Mẫu thứ ba được dùng khi gọi một thuộc tính của lớp cơ sở.

    Trình bày thì đơn giản như vậy nhưng khi sử dụng thì tùy từng mục đích, yêu cầu mà các bạn sử dụng cho phù hợp. Ngoài ra, còn có một cách sử dụng nữa dành cho thuộc tính có phạm vi public tôi sẽ trình bày sau.

    Các bạn có thể tìm hiểu thêm về thuộc tính ở liên kết php[dot]net/manual/en/language[dot]oop5[dot]properties[dot]php.

    * Phương thức (Method):

    Để khai báo phương thức trong lớp, các bạn thực hiện theo mẫu sau:

    Phạm_vi function Tên_phương_thức(){
    //Nội dung phương thức
    }

    Hoặc

    Phạm_vi function Tên_phương_thức($Tham_số_1, $Tham_số_2, $Tham_số_n){
    //Nội dung phương thức
    }

    Ví dụ:
    PHP Code:
    public function query($sql){

    Phạm vi của phương thức hoàn toàn tương tự với phạm vi của thuộc tính.

    Quy tắc đặt tên phương thức cũng tương tự như thuộc tính.

    Để gọi (Sử dụng) phương thức đã khai báo các bạn thực hiện theo mẫu sau:

    $this->Tên_phương_thức();

    Hoặc

    self::Tên_phương_thức();

    Hoặc

    parent::Tên_phương_thức();

    Ví dụ:
    PHP Code:
    $this->query('SQL');
    self::fetch();
    parent::get(); 
    Ba cách sử dụng trên cũng hoàn toàn tương tự như thuộc tính.

    Ngoài các phương thức do người lập trình định nghĩa, PHP còn cung cấp các phương thức "magic" như: __construct, __destruct... Các bạn có thể tìm hiểu thêm về các phương thức "magic" ở liên kết php[dot]net/manual/en/language[dot]oop5[dot]magic[dot]php.

    Thuộc tính và phương thức còn nhiều kiến thức nâng cao khác mà tôi không trình bày cho các bạn ở đây. Trong quá trình tìm hiểu, các bạn có vấn đề cần hỗ trợ thì các bạn có thể hỏi và tôi sẽ giải đáp cho các bạn.

    * Kế thừa (Extends):

    Trong PHP, các bạn có thể mở rộng lớp, hay nói một cách khác, một lớp có thể được kế thừa từ một lớp nào đó đã được khai báo trước. Trong đó, lớp được kế thừa gọi là lớp cơ sở (Lớp cha), lớp kế thừa gọi là lớp dẫn xuất (Lớp con). Lớp dẫn xuất có quyền sử dụng các thuộc tính, phương thức có phạm vi public và protected của lớp cơ sở.

    Một lớp có thể kế thừa các thuộc tính và phương thức của lớp khác, bằng cách sử dụng từ khóa extends. Các bạn có thể khai báo kế thừa theo mẫu sau:

    class Lớp_dẫn_xuất extends Lớp_cơ_sở {
    }

    Ví dụ:
    PHP Code:
    class Db extends MySql {

    Với ví dụ trên, lớp Db được gọi là lớp dẫn xuất, lớp MySql được gọi là lớp cơ sở. Toàn bộ các thuộc tính, phương thức có phạm vi public và protected của lớp MySql (Lớp cơ sở) đều được lớp Db (Lớp dẫn xuất) kế thừa (Tức có quyền sử dụng).

    Các bạn có thể tìm hiểu thêm về kế thừa (Chủ yếu là nói về từ khóa extends) ở liên kết php[dot]net/manual/en/keyword[dot]extends[dot]php.

    Kế thừa và các kỹ thuật lập trình liên quan tới kế thừa các bạn có thể tìm hiểu thêm để mở rộng kiến thức.
    Lê Trung Hiếu - Lập Trình Web & Di Động

  6. Thành viên Like bài viết này:


  7. #4
    Tham gia
    22-10-2014
    Bài viết
    103
    Like
    0
    Thanked 12 Times in 11 Posts
    TRANG ĐĂNG NHẬP, ĐĂNG XUẤT (PHẦN 4)

    Từ phần này, tôi sẽ hướng dẫn các bạn thực hiện các trang trong phần quản trị (Admin).

    Các bạn lưu ý là trang chủ quản trị tôi sẽ không hướng dẫn các bạn.

    Nội dung kiến thức phần này gồm:

    - Đối tượng (Object).

    Trong thư mục admin, các bạn tạo mới thư mục tên là user để chứa các file xử lý liên quan tới thành viên (Đăng nhập, đăng xuất, danh sách, thêm mới, chỉnh sửa).

    Trong thư mục admin/user, tạo mới file login[dot]php để viết mã lệnh xử lý đăng nhập.

    Nội dung file admin/user/login[dot]php như sau:
    PHP Code:
    <?php
    //Khởi động session
    session_start();

    //Kiểm tra nếu đã đăng nhập thì quay về trang chủ quản trị
    if(isset($_SESSION***91;'user'***93;)){
    header('location:../home/home***91;dot***93;php');
    }

    //Require các file cần thiết
    require '../../configs/Config***91;dot***93;php';
    require 
    '../../models/User***91;dot***93;php';

    //Kiểm tra dữ liệu POST lên
    if(isset($_POST***91;'username'***93;)  && !empty($_POST***91;'username'***93;) &&  isset($_POST***91;'password'***93;) && !empty($_POST***91;'password'***93;)){
        
    //Gán tài khoản và mật khẩu nhận được từ form vào 2 biến tương ứng
        
    $username $_POST***91;'username'***93;;
        
    $password $_POST***91;'password'***93;;

        
    //Khởi tạo đối tượng thành viên (User)
        
    $userModel = new User();

        
    //Lấy thông tin thành viên
        
    $user $userModel->getByUsername($username);

        
    //Kiểm tra sự tồn tại của thành viên và mật khẩu có trùng khớp
        
    if($user && $user->getPassword() === md5($password)){
            
    //Tạo session lưu thông tin thành viên đăng nhập thành công
            
    $_SESSION***91;'user'***93; = $user;

            
    //Chuyển hướng về trang chủ quản trị
            
    header('location:../home/home***91;dot***93;php');
        }else{
            
    //Bật cờ lỗi
            
    $error true;
        }
    }

    //Require file giao diện (View)
    require '../../views/admin/user/login***91;dot***93;tpl***91;dot***93;php';
    ?>
    Trong thư mục models các bạn tạo mới hai file UserObj[dot]php và User[dot]php để thể hiện đối tượng thành viên (Lớp UserObj) và tương tác với DB (Lớp User).

    Nội dung file models/UserObj[dot]php như sau:
    PHP Code:
    <?php
    class UserObj {
        protected 
    $userId;
        protected 
    $username;
        protected 
    $password;
        protected 
    $fullname;
        protected 
    $email;
        protected 
    $status;
        protected 
    $created;
        protected 
    $modified;

        public function 
    setUserId($userId){
            
    $this->userId $userId;
        }

        public function 
    getUserId(){
            return 
    $this->userId;
        }

        public function 
    setUsername($username){
            
    $this->username $username;
        }

        public function 
    getUsername(){
            return 
    $this->username;
        }

        public function 
    setPassword($password){
            
    $this->password $password;
        }

        public function 
    getPassword(){
            return 
    $this->password;
        }

        public function 
    setFullname($fullname){
            
    $this->fullname $fullname;
        }

        public function 
    getFullname(){
            return 
    $this->fullname;
        }

        public function 
    setEmail($email){
            
    $this->email $email;
        }

        public function 
    getEmail(){
            return 
    $this->email;
        }

        public function 
    setStatus($status){
            
    $this->status $status;
        }

        public function 
    getStatus(){
            return 
    $this->status;
        }

        public function 
    setCreated($created){
            
    $this->created $created;
        }

        public function 
    getCreated(){
            return 
    $this->created;
        }

        public function 
    setModified($modified){
            
    $this->modified $modified;
        }

        public function 
    getModified(){
            return 
    $this->modified;
        }
    }
    ?>
    Nội dung file models/User[dot]php như sau:
    PHP Code:
    <?php
    require_once Config::BASE_PATH 'libraries/Db***91;dot***93;php';
    require_once 
    Config::BASE_PATH 'models/UserObj***91;dot***93;php';

    class 
    User {
        protected 
    $db;

        public function 
    __construct(){
            
    $this->db = new Db();
        }

        public function 
    getByUsername($username){
            
    //SQL
            
    $sql "SELECT * FROM tbl_user WHERE username = '$username' AND status = 1";

            
    //Query
            
    $this->db->query($sql);

            
    //Fetch
            
    $row $this->db->fetch();

            
    //Khởi tạo đối tượng UserObj
            
    $userObj = new UserObj();

            
    //Gán thông tin
            
    $userObj->setUserId($row***91;'user_id'***93;);
            
    $userObj->setUsername($row***91;'username'***93;);
            
    $userObj->setPassword($row***91;'password'***93;);
            
    $userObj->setFullname($row***91;'fullname'***93;);
            
    $userObj->setEmail($row***91;'email'***93;);
            
    $userObj->setStatus($row***91;'status'***93;);
            
    $userObj->setCreated($row***91;'created'***93;);
            
    $userObj->setModified($row***91;'modified'***93;);

            
    //Return
            
    return $userObj;
        }
    }
    ?>
    Trong thư mục views/admin, các bạn tạo mới thư mục tên là user để chứa các file trình bày giao diện HTML trang thành viên.

    Trong thư mục views/admin/user, tạo mới file login[dot]tpl[dot]php để trình bày giao diện trang đăng nhập.

    Nội dung file views/admin/user/login[dot]tpl[dot]php như sau:
    Code:
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Quản trị - Đăng nhập</title>
    </head>
    <body>
    
    <form name="login" method="POST" action="">
    <?php if(isset($error) && $error == true): ?>
    <p style="color:red;">Sai Tài khoản hoặc Mật khẩu!</p>
    <?php endif; ?>
    
    <p>
    <label>Tài khoản:</label>
    <input type="text" name="username" value="" />
    </p>
    <p>
    <label>Mật khẩu:</label>
    <input type="password" name="password" value="" />
    </p>
    <p>
    <input type="submit" value="Đăng nhập" />
    </p>
    </form>
    
    </body>
    </html>
    Bây giờ các bạn vào phpMyAdmin để thêm mới một dòng dữ liệu vào bảng tbl_user với các thông tin như: Tài khoản, mật khẩu (Mã hóa MD5), kích hoạt (Nhập giá trị là 1)... rồi bắt đầu truy cập trang đăng nhập theo địa chỉ localhost/admin/user/login[dot]php để kiểm tra.

    Đối với trang đăng xuất, trong thư mục admin/user các bạn tạo mới file logout[dot]php để xử lý đăng xuất.

    Nội dung file admin/user/logout[dot]php như sau:
    PHP Code:
    <?php
    //Khởi động session
    session_start();

    //Hủy toàn bộ session
    session_destroy();

    //Quay về trang đăng nhập
    header('location:login***91;dot***93;php');
    ?>
    Trang đăng xuất không có giao diện hay truy cập DB nên mã lệnh chỉ đơn giản như vậy.

    * Đối tượng (Object):

    Đối tượng có thể xem như một "thực thể" của lớp. Trong thực tế, các đối tượng thường được trừu tượng hóa qua việc định nghĩa của các lớp. Trong đó:

    - Tập hợp các giá trị hiện có của các thuộc tính tạo nên trạng thái của một đối tượng.
    - Mỗi phương thức hay mỗi dữ liệu nội tại cùng với các tính chất được định nghĩa được xem là một đặc tính riêng của đối tượng.

    Như vậy có thể hiểu một đối tượng được tạo ra từ một lớp và mang các đặc điểm, trạng thái của lớp đó. Sự khác biệt giữa lớp và đối tượng là không rõ ràng, vì vậy để phân biệt hai khái niệm này đòi hỏi các bạn phải có kinh nghiệm trong lập trình hướng đối tượng (OOP).

    Để khởi tạo một đối tượng các bạn thực hiện theo mẫu sau:

    $Tên_đối_tượng = new Tên_lớp();

    Ví dụ:
    PHP Code:
    $userObj = new UserObj(); 
    Đối tượng được tạo ra từ một lớp có quyền truy cập (Sử dụng) các thuộc tính và phương thức có phạm vi public của lớp đó. Để truy cập các thuộc tính, phương thức của lớp các bạn thực hiện theo mẫu sau:

    $Tên_đối_tượng->Tên_thuộc_tính;
    $Tên_đối_tượng->Tên_phương_thức();

    Ví dụ:
    PHP Code:
    $obj = new Obj();
    $obj->propertyOne;
    $obj->methodOne(); 
    Với ví dụ trên thì các bạn biết chắc chắn rằng thuộc tính propertyOne và phương thức methodOne đều có phạm vi public.

    Các bạn có thể tìm hiểu thêm về đối tượng ở liên kết php[dot]net/manual/en/language[dot]types[dot]object[dot]php.
    Lê Trung Hiếu - Lập Trình Web & Di Động

  8. Thành viên Like bài viết này:


  9. #5
    Tham gia
    22-10-2014
    Bài viết
    103
    Like
    0
    Thanked 12 Times in 11 Posts
    TRANG DANH SÁCH THÀNH VIÊN (PHẦN 5)

    Từ phần này tôi sẽ trình bày cho các bạn các kiến thức PHP nâng cao mà không liên quan tới dự án website tôi đang hướng dẫn các bạn thực hiện.

    Nội dung kiến thức phần này gồm:

    - Biểu thức chính quy (Regular expressions).

    Trong thư mục admin/user, tạo mới file list{dot}php để viết mã lệnh trang danh sách thành viên.

    Nội dung file admin/user/list{dot}php như sau:
    PHP Code:
    <?php
    //Khởi động session
    session_start();

    //Kiểm tra nếu chưa đăng nhập thì quay về trang đăng nhập
    if(!isset($_SESSION***91;'user'***93;)){
        
    header('location:login{dot}php');
    }

    //Require các file cần thiết
    require '../../configs/Config{dot}php';
    require 
    '../../models/User{dot}php';

    //Khởi tạo đối tượng thành viên (User)
    $userModel = new User();

    //Lấy danh sách thành viên
    $userList $userModel->getList();

    //Tiêu đề trang
    $title 'Thành viên - Danh sách';

    //View
    $view 'user/list{dot}tpl{dot}php';

    //Require layout
    require '../../views/admin/layout{dot}tpl{dot}php';
    ?>
    Mở file models/User{dot}php và thêm vào lớp User khối lệnh mới dưới đây:
    PHP Code:
    public function getList(){
        
    //SQL
        
    $sql "SELECT * FROM tbl_user ORDER BY user_id DESC";

        
    //Query
        
    $this->db->query($sql);

        
    //Tạo mãng lưu trữ
        
    $listUser = array();

        
    //Fetch
        
    while($row $this->db->fetch()){
            
    //Khởi tạo đối tượng UserObj
            
    $userObj = new UserObj();

            
    //Gán thông tin
            
    $userObj->setUserId($row***91;'user_id'***93;);
            
    $userObj->setUsername($row***91;'username'***93;);
            
    $userObj->setPassword($row***91;'password'***93;);
            
    $userObj->setFullname($row***91;'fullname'***93;);
            
    $userObj->setEmail($row***91;'email'***93;);
            
    $userObj->setStatus($row***91;'status'***93;);
            
    $userObj->setCreated($row***91;'created'***93;);
            
    $userObj->setModified($row***91;'modified'***93;);

            
    //Gán vào mãng lưu trữ
            
    $listUser***91;***93; = $userObj;
        }

        
    //Return
        
    return $listUser;

    Về phần giao diện (View) của website, tôi mở rộng thêm phần layout (Bộ khung) của website. Layout là phần giao diện HTML chung của toàn bộ các trang (Trừ trang đăng nhập). Mục đích của việc tạo ra layout là để giúp cho việc lập trình, bảo trì đơn giản, khoa học hơn.

    Trong thư mục views/admin, tạo mới file layout{dot}tpl{dot}php để trình bày layout của website.

    Nội dung file views/admin/layout{dot}tpl{dot}php như sau:
    Code:
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Quản trị - <?php echo $title; ?></title>
    </head>
    <body>
    
    <?php require Config::BASE_PATH . 'views/admin/' . $view; ?>
    
    </body>
    </html>
    Trong thư mục views/admin/user, tạo mới file list{dot}tpl{dot}php để trình bày giao diện trang danh sách thành viên.

    Nội dung file views/admin/user/list{dot}tpl{dot}php như sau:
    Code:
    <table width="100%" cellpadding="10">
    <tr>
    <th>ID</th>
    <th>Tài khoản</th>
    <th>Họ tên</th>
    <th>Trạng thái</th>
    <th>Ngày tạo</th>
    <th>Ngày chỉnh sửa</th>
    <th>Tác vụ</th>
    </tr>
    <?php foreach($userList as $user): ?>
    <tr>
    <td><?php echo $user->getUserId(); ?></td>
    <td><a  href="<?php echo Config::SITE_URL . 'admin/user/edit{dot}php?user_id=' .  $user->getUserId(); ?>"><?php echo $user->getUsername();  ?></a></td>
    <td><?php echo $user->getFullname(); ?></td>
    <td><?php echo ($user->getStatus() == 1) ? 'Kích hoạt' : 'Không kích hoạt'; ?></td>
    <td><?php echo date('d-m-Y H:i:s', $user->getCreated()); ?></td>
    <td><?php echo date('d-m-Y H:i:s', $user->getModified()); ?></td>
    <td><a  href="<?php echo Config::SITE_URL . 'admin/user/delete{dot}php?user_id='  . $user->getUserId(); ?>">Xóa</a></td>
    </tr>
    <?php endforeach; ?>
    </table>
    Các bạn truy cập trang danh sách thành viên theo địa chỉ localhost/admin/user/list{dot}php để kiểm tra.

    * Biểu thức chính quy (Regular expressions):

    Biểu thức chính quy là một chuỗi hoặc một mẫu các ký tự miêu tả một bộ các chuỗi khác.

    Biểu thức chính quy thường được sử dụng trong trường hợp tìm kiếm một chuỗi bên trong một chuỗi khác, thay thế một chuỗi bằng chuỗi khác và có thể tách một chuỗi thành nhiều chuỗi.

    Nếu bạn sử dụng tốt những kỹ năng về biểu thức chính quy. Chúng sẽ đơn giản hơn nhiều trong lập trình và quá trình xử lý văn bản, có những vấn đề sẽ không thể giải quyết được nếu không sử dụng biểu thức chính quy.

    Về biểu thức chính quy, các bạn có thể tìm hiểu thêm về khái niệm, nguồn gốc của nó trên mạng. Và tôi khuyên các bạn nên sử dụng biểu thức chính quy để việc lập trình trở nên đơn giản, tối ưu và chính xác hơn.

    Tôi giới thiệu với các bạn một số "cú pháp" về biểu thức chính quy sau đây hi vọng đủ để các bạn có kiến thức tiếp tục tìm hiểu:

    - Dấu "ngoặc vuông" ([]): Dấu "ngoặc vuông" có một ý nghĩa đặc biệt khi sử dụng trong bối cảnh của biểu thức thông thường. Dấu "ngoặc vuông" thường được dùng khi các bạn muốn tìm kiếm một loạt các ký tự theo mẫu đã khai báo bên trong dấu.

    Ví dụ:

    [0-9]: Phù hợp với bất kỳ các chữ số từ 0 đến 9.
    [a-z]: Phù hợp với bất kỳ các ký tự chữ in thường từ a đến z.
    [A-Z]: Phù hợp với bất kỳ các ký tự chữ in hoa từ A đến Z.
    [0-9a-zA-Z]: Phù hợp với bất kỳ các chữ số từ 0 đến 9, ký tự in thường và in hoa từ a đến z.

    - Các ký hiệu định lượng: Các bạn cần quan tâm tới các ký hiệu sau: +, *, ?, {} và $. Các ký hiệu này biểu thị số lượng hoặc vị trí hoặc một ký tự cụ thể nào đó.

    Ví dụ:

    p+: Phù hợp với bất kỳ chuỗi mà có chứa ít nhất một ký tự p.
    p*: Phù hợp với bất kỳ chuỗi mà có chứa số 0 hoặc chứa nhiều hơn ký tự p.
    p?: Có ý nghĩa tương tự như p*.
    p{5}: Phù hợp với chuỗi có chứa đúng 5 ký tự p.
    p{1,5}: Phù hợp với bất kỳ chuỗi mà có chứa từ 1 đến 5 ký tự p.
    p{5,}: Phù hợp với bất kỳ chuỗi mà có chứa ít nhất 5 ký tự p.
    p$: Phù hợp với bất kỳ chuỗi mà có ký tự p là cuối cùng.
    ^p: Phù hợp với bất kỳ chuỗi mà có ký tự p là bắt đầu.
    [^a-zA-Z]: Phù hợp với bất kỳ chuỗi mà không chứa các ký tự in thường và in hoa từ a đến z.
    ^.{2}$: Phù hợp với bất kỳ chuỗi có chứa hai ký tự.

    Lưu ý là các mẫu ví dụ trên không tính dấu hai chấm (.

    Ngoài loại biểu thức chính quy như trên (POSIX), trong PHP còn có một loại biểu thức chính quy khác gọi là PCRE (Hoặc PERL) các bạn có thể tìm hiểu thêm.

    Các bạn có thể tìm hiểu thêm về các hàm PHP xử lý biểu thức chính quy ở liên kết php{dot}net/manual/en/ref{dot}regex{dot}php và php{dot}net/manual/en/ref{dot}pcre{dot}php.

    PS:

    DDTH filter dấu ngoặc vuông thành dấu sao nên các bạn khi copy code thì replace lại (Nếu có) hoặc truy cập vào Google+ của tôi để copy code plus{dot}google{dot}com/103116221369826139041.
    Lê Trung Hiếu - Lập Trình Web & Di Động

  10. Thành viên Like bài viết này:


  11. #6
    Tham gia
    22-10-2014
    Bài viết
    103
    Like
    0
    Thanked 12 Times in 11 Posts
    TRANG THÊM MỚI THÀNH VIÊN (PHẦN 6)

    Nội dung kiến thức phần này gồm:

    - Xử lý lỗi (Error handling).

    Trong thư mục admin/user, tạo mới file add{dot}php để viết mã lệnh trang thêm mới thành viên.

    Nội dung file admin/user/add{dot}php như sau:
    PHP Code:
    <?php
    //Khởi động session
    session_start();

    //Kiểm tra nếu chưa đăng nhập thì quay về trang đăng nhập
    if(!isset($_SESSION***91;'user'***93;)){
    header('location:login{dot}php');
    }

    //Require các file cần thiết
    require '../../configs/Config{dot}php';
    require 
    '../../models/User{dot}php';

    //Nếu có POST dữ liệu lên thì xử lý
    if($_POST){
    //Nhận dữ liệu từ form và gán vào một mãng (Có thể sử dụng UserObj để lưu dữ liệu)
    $data = array(
    'username' => $_POST***91;'username'***93;,
    'password' => md5($_POST***91;'password'***93;),
    'fullname' => $_POST***91;'fullname'***93;,
    'email' => $_POST***91;'email'***93;,
    'status' => isset($_POST***91;'status'***93;) ? 0,
    'created' => date('Y-m-d H:i:s'),
    'modified' => date('Y-m-d H:i:s')
    );

    //Khởi tạo đối tượng thành viên (User)
    $userModel = new User();

    //Thêm mới
    if($userModel->add($data)){
    //Tạo session để lưu cờ thông báo thành công
    $_SESSION***91;'success'***93; = true;

    //Tải lại trang (Mục đích là để reset form)
    header('location:add{dot}php');

    //Ngừng thực thi
    exit();
    }
    }

    //Tiêu đề trang
    $title 'Thành viên - Thêm mới';

    //View
    $view 'user/add{dot}tpl{dot}php';

    //Require layout
    require '../../views/admin/layout{dot}tpl{dot}php';
    ?>
    Mở file models/User{dot}php và thêm vào lớp User khối lệnh mới dưới đây:
    PHP Code:
    public function add($data){
    //SQL
    $sql "INSERT INTO tbl_user(username, password, fullname, email, status, created, modified) VALUES('{$data***91;'username'***93;}', '{$data***91;'password'***93;}', '{$data***91;'fullname'***93;}', '{$data***91;'email'***93;}', {$data***91;'status'***93;}, '{$data***91;'created'***93;}', '{$data***91;'modified'***93;}')";

    //Query và return
    return $this->db->query($sql);

    Trong thư mục views/admin/user, tạo mới file add{dot}tpl{dot}php để trình bày giao diện trang thêm mới thành viên.

    Nội dung file views/admin/user/add{dot}tpl{dot}php như sau:
    Code:
    <form name="add" method="POST" action="">
    <?php if(isset($_SESSION['success'])): ?>
    <p style="color:green;">Thành viên đã được thêm mới thành công!</p>
    <?php unset($_SESSION['success']); ?>
    <?php endif; ?>
    
    <p>
    <label>Tài khoản:</label>
    <input type="text" name="username" value="" />
    </p>
    <p>
    <label>Mật khẩu:</label>
    <input type="password" name="password" value="" />
    </p>
    <p>
    <label>Họ tên:</label>
    <input type="text" name="fullname" value="" />
    </p>
    <p>
    <label>Email:</label>
    <input type="text" name="email" value="" />
    </p>
    <p>
    <label>Trạng thái:</label>
    <input type="checkbox" name="status" value="1" />
    </p>
    <p>
    <input type="submit" value="Thêm mới" />
    </p>
    </form>
    Các bạn truy cập trang thêm mới thành viên theo địa chỉ localhost/admin/user/add{dot}php để kiểm tra.

    * Xử lý lỗi (Error handling):

    Xử lý lỗi là quá trình bắt lỗi chương trình (Khối lệnh) do người lập trình viết với mục đích thực hiện những hành động (Hoặc thông báo) tương ứng với lỗi để chương trình không thực thi sai mục đích.

    Việc xử lý lỗi trong PHP khá đơn giản và các bạn sẽ thường thấy hai cách xử lý lỗi sau đây:

    - Sử dụng hàm die.
    - Sử dụng trường hợp ngoại lệ (Exceptions).

    Hàm die có chức năng kết thúc thực thi khối lệnh. Các lập trình viên thường ít khi sử dụng hàm die vào mục đích bắt lỗi vì thường không đáp ứng được yêu cầu lập trình.

    Ví dụ:
    PHP Code:
    if(!file_exists('path/content{dot}txt')){
    die(
    'File not found!');
    }else{
    unlink('path/content{dot}txt');

    Trong PHP 5 thì có thêm cách sử lý lỗi chuyên nghiệp hơn đó là dùng ngoại lệ (Exceptions) với cú pháp try..catch. Các bạn có thể sử dụng theo mẫu sau:

    try{
    //Khối lệnh cần bắt lỗi
    }catch(Exception $Biến_exception){
    //Xử lý ngoại lệ
    }

    Ví dụ:
    PHP Code:
    try{
    if(!
    file_exists('path/content{dot}txt')){
    //Nếu không tìm thấy file thì lưu thông báo lỗi và chuyển sang catch
    throw new Exception('File not found!');
    }

    //Nếu tìm thấy file
    unlink('path/content{dot}txt');
    }catch(
    Exception $e){
    echo 
    $e->getMessage();

    Các bạn có thể tìm hiểu thêm về xử lý lỗi ngoại lệ ở liên kết php{dot}net/manual/en/language{dot}exceptions{dot}php.

    Ngoài ra, trong PHP các bạn có thể tùy biến xuất các thông báo lỗi PHP mà người lập trình không kiểm soát được bằng hàm error_reporting. Các bạn có thể sử dụng hàm error_reporting theo mẫu sau:

    error_reporting(Cấp_độ_lỗi);

    Ví dụ:
    PHP Code:
    error_reporting(E_ALL);
    error_reporting(0); 
    Trong đó, câu lệnh đầu với cấp độ "E_ALL" là hiển thị tất cả các thông báo lỗi còn câu lệnh thứ hai thì ngăn chặn tất cả các thông báo lỗi.

    Các bạn có thể tìm hiểu thêm về hàm error_reporting ở liên kết php{dot}net/manual/en/function{dot}error-reporting{dot}php.
    Lê Trung Hiếu - Lập Trình Web & Di Động

  12. Thành viên Like bài viết này:


  13. #7
    Tham gia
    22-10-2014
    Bài viết
    103
    Like
    0
    Thanked 12 Times in 11 Posts
    TRANG CHỈNH SỬA THÀNH VIÊN (PHẦN 7)

    Nội dung kiến thức phần này gồm:

    - Ngày giờ (Date time).

    Trong thư mục admin/user, tạo mới file edit{dot}php để viết mã lệnh trang chỉnh sửa thành viên.

    Nội dung file admin/user/edit{dot}php như sau:
    PHP Code:
    <?php
    //Khởi động session
    session_start();

    //Kiểm tra nếu chưa đăng nhập thì quay về trang đăng nhập
    if(!isset($_SESSION***91;'user'***93;)){
    header('location:login{dot}php');
    }

    //Require các file cần thiết
    require '../../configs/Config{dot}php';
    require 
    '../../models/User{dot}php';

    //Lấy user_id từ URL
    $user_id $_GET***91;'user_id'***93;;

    //Khởi tạo đối tượng thành viên (User)
    $userModel = new User();

    //Nếu có POST dữ liệu lên thì xử lý cập nhật
    if($_POST){
    //Nhận dữ liệu từ form và gán vào một mãng
    $data = array(
    'username' => $_POST***91;'username'***93;,
    'password' => empty($_POST***91;'password'***93;) ? null md5($_POST***91;'password'***93;),
    'fullname' => $_POST***91;'fullname'***93;,
    'email' => $_POST***91;'email'***93;,
    'status' => isset($_POST***91;'status'***93;) ? 0,
    'modified' => date('Y-m-d H:i:s')
    );

    //Cập nhật
    if($userModel->edit($data$user_id)){
    //Tạo session để lưu cờ thông báo thành công
    $_SESSION***91;'success'***93; = true;

    //Tải lại trang (Mục đích là để tải lại thông tin mới)
    header('location:edit{dot}php?user_id=' $user_id);

    //Ngừng thực thi
    exit();
    }
    }

    //Lấy thông tin thành viên để trình bày trên form
    $user $userModel->getById($user_id);

    //Tiêu đề trang
    $title 'Thành viên - Chỉnh sửa';

    //View
    $view 'user/edit{dot}tpl{dot}php';

    //Require layout
    require '../../views/admin/layout{dot}tpl{dot}php';
    ?>
    Mở file models/User{dot}php và thêm vào lớp User khối lệnh mới dưới đây:
    PHP Code:
    public function getById($user_id){
    //SQL
    $sql "SELECT * FROM tbl_user WHERE user_id = $user_id";

    //Query
    $this->db->query($sql);

    //Fetch
    $row $this->db->fetch();

    //Khởi tạo đối tượng UserObj
    $userObj = new UserObj();

    //Gán thông tin
    $userObj->setUserId($row***91;'user_id'***93;);
    $userObj->setUsername($row***91;'username'***93;);
    $userObj->setPassword($row***91;'password'***93;);
    $userObj->setFullname($row***91;'fullname'***93;);
    $userObj->setEmail($row***91;'email'***93;);
    $userObj->setStatus($row***91;'status'***93;);
    $userObj->setCreated($row***91;'created'***93;);
    $userObj->setModified($row***91;'modified'***93;);

    //Return
    return $userObj;
    }

    public function 
    edit($data$user_id){
    //SQL
    $sql "UPDATE tbl_user SET username = '{$data***91;'username'***93;}', fullname = '{$data***91;'fullname'***93;}', email = '{$data***91;'email'***93;}', status = {$data***91;'status'***93;}, modified = '{$data***91;'modified'***93;}'";

    //Nếu có cập nhật mật khẩu
    if($data***91;'password'***93; != null){
    $sql .= ", password = '$data***91;'password'***93;'";
    }

    //Điều kiện
    $sql .= " WHERE user_id = $user_id";

    //Query và return
    return $this->db->query($sql);

    Trong thư mục views/admin/user, tạo mới file edit{dot}tpl{dot}php để trình bày giao diện trang chỉnh sửa thành viên.

    Nội dung file views/admin/user/edit{dot}tpl{dot}php như sau:
    [HTML]<form name="edit" method="POST" action="">
    <?php if(isset($_SESSION['success'])): ?>
    <p style="color:green;">Thành viên đã được chỉnh sửa thành công!</p>
    <?php unset($_SESSION['success']); ?>
    <?php endif; ?>

    <p>
    <label>Tài khoản:</label>
    <input type="text" name="username" value="<?php echo $user->getUsername(); ?>" />
    </p>
    <p>
    <label>Mật khẩu:</label>
    <input type="password" name="password" value="" />
    </p>
    <p>
    <label>Họ tên:</label>
    <input type="text" name="fullname" value="<?php echo $user->getFullname(); ?>" />
    </p>
    <p>
    <label>Email:</label>
    <input type="text" name="email" value="<?php echo $user->getEmail(); ?>" />
    </p>
    <p>
    <label>Trạng thái:</label>
    <input type="checkbox" name="status" value="1" <?php echo ($user->getStatus() == 1) ? 'checked="checked"' : ''; ?> />
    </p>
    <p>
    <input type="submit" value="Chỉnh sửa" />
    </p>
    </form>[/HTML]

    Các bạn truy cập trang danh sách thành viên và nhấp vào tài khoản để truy cập tới trang chỉnh sửa thành viên.

    * Ngày giờ (Date time):

    Hàm time trong PHP là một hàm "đa năng" về ngày giờ hiện tại giúp các bạn có thể có nhiều thông tin cũng như xử lý ngày giờ hiện tại. Hàm time sẽ trả về cho các bạn một số nguyên đó chính là số giây được tính từ 0 giờ 0 phút 0 giây ngày 1 tháng 1 năm 1970 tới thời điểm bạn gọi hàm.

    Có một vài yêu cầu về ngày giờ hoặc do thói quen mà các bạn có thể sử dụng cách lưu trữ ngày giờ trong DB bằng số nguyên giây.

    Các bạn có thể tìm hiểu thêm về hàm time ở liên kết php{dot}net/manual/en/function{dot}time{dot}php.

    Trong PHP, hàm date cũng là một hàm quan trọng để định dạng ngày giờ theo yêu cầu lập trình. Các bạn có thể sử dụng hàm date và hàm strtotime để chuyển đổi kiểu định dạng ngày giờ từ dạng này sang dạng khác một cách linh hoạt và nhanh chóng chứ không cần phải tách ngày giờ rồi ghép lại theo cách thủ công.

    Các bạn có thể tìm hiểu thêm về hàm date ở liên kết php{dot}net/manual/en/function{dot}date{dot}php và hàm strtotime ở liên kết php{dot}net/manual/en/function{dot}strtotime{dot}php.

    Ngoài ra, các bạn có thể tìm hiểu thêm về hàm getdate ở liên kết php{dot}net/manual/en/function{dot}getdate{dot}php.
    Lê Trung Hiếu - Lập Trình Web & Di Động

  14. Thành viên Like bài viết này:


  15. #8
    Tham gia
    22-10-2014
    Bài viết
    103
    Like
    0
    Thanked 12 Times in 11 Posts
    XÓA THÀNH VIÊN (PHẦN 8)

    Phần này tôi không trình bày kiến thức lập trình PHP, các bạn chỉ thực hiện chức năng xóa thành viên dưới đây.

    Trong thư mục admin/user, tạo mới file delete{dot}php để viết mã lệnh chức năng xóa thành viên.

    Nội dung file admin/user/delete{dot}php như sau:
    PHP Code:
    <?php
    //Khởi động session
    session_start();

    //Kiểm tra nếu chưa đăng nhập thì quay về trang đăng nhập
    if(!isset($_SESSION***91;'user'***93;)){
    header('location:login{dot}php');
    }

    //Require các file cần thiết
    require '../../configs/Config{dot}php';
    require 
    '../../models/User{dot}php';

    //Lấy user_id từ URL
    $user_id $_GET***91;'user_id'***93;;

    //Khởi tạo đối tượng thành viên (User)
    $userModel = new User();

    //Xóa
    $userModel->delete($user_id);

    //Quay về trang danh sách thành viên
    header('location:list{dot}php');
    ?>
    Mở file models/User{dot}php và thêm vào lớp User khối lệnh mới dưới đây:
    PHP Code:
    public function delete($user_id){
    //SQL
    $sql "DELETE FROM tbl_user WHERE user_id = $user_id";

    //Query và return
    return $this->db->query($sql);

    Xóa là một chức năng nên các bạn không phải tạo giao diện (View).

    Các bạn truy cập trang danh sách thành viên, ở cột "Tác vụ" các bạn chọn tác vụ "Xóa" để thực hiện xóa thành viên tương ứng.
    Lê Trung Hiếu - Lập Trình Web & Di Động

  16. Thành viên Like bài viết này:


  17. #9
    Tham gia
    22-10-2014
    Bài viết
    103
    Like
    0
    Thanked 12 Times in 11 Posts
    TRANG DANH SÁCH DANH MỤC SẢN PHẨM (PHẦN 9)

    Nội dung kiến thức phần này gồm:

    - Hàm tạo (__construct).
    - Hàm hủy (__destruct).

    Trong thư mục admin, tạo mới thư mục tên là category để chứa các file xử lý liên quan tới danh mục sản phẩm.

    Trong thư mục admin/category, tạo mới file list{dot}php để viết mã lệnh trang danh sách danh mục sản phẩm.

    Nội dung file admin/category/list{dot}php như sau:
    PHP Code:
    <?php
    //Khởi động session
    session_start();

    //Kiểm tra nếu chưa đăng nhập thì quay về trang đăng nhập
    if(!isset($_SESSION***91;'user'***93;)){
    header('location:login{dot}php');
    }

    //Require các file cần thiết
    require '../../configs/Config{dot}php';
    require 
    '../../models/Category{dot}php';

    //Khởi tạo đối tượng danh mục sản phẩm (Category)
    $categoryModel = new Category();

    //Lấy danh sách danh mục sản phẩm
    $categoryList $categoryModel->getList();

    //Tiêu đề trang
    $title 'Danh mục sản phẩm - Danh sách';

    //View
    $view 'category/list{dot}tpl{dot}php';

    //Require layout
    require '../../views/admin/layout{dot}tpl{dot}php';
    ?>
    Trong thư mục models các bạn tạo mới hai file CategoryObj{dot}php và Category{dot}php để thể hiện đối tượng danh mục sản phẩm (Lớp CategoryObj) và tương tác với DB (Lớp Category).

    Nội dung file models/CategoryObj{dot}php như sau:
    PHP Code:
    <?php
    class CategoryObj {
    protected 
    $categoryId;
    protected 
    $name;
    protected 
    $status;
    protected 
    $created;
    protected 
    $modified;

    public function 
    setCategoryId($categoryId){
    $this->categoryId $categoryId;
    }

    public function 
    getCategoryId(){
    return 
    $this->categoryId;
    }

    public function 
    setName($name){
    $this->name $name;
    }

    public function 
    getName(){
    return 
    $this->name;
    }

    public function 
    setStatus($status){
    $this->status $status;
    }

    public function 
    getStatus(){
    return 
    $this->status;
    }

    public function 
    setCreated($created){
    $this->created $created;
    }

    public function 
    getCreated(){
    return 
    $this->created;
    }

    public function 
    setModified($modified){
    $this->modified $modified;
    }

    public function 
    getModified(){
    return 
    $this->modified;
    }
    }
    ?>
    Nội dung file models/Category{dot}php như sau:
    PHP Code:
    <?php
    require_once Config::BASE_PATH 'libraries/Db{dot}php';
    require_once 
    Config::BASE_PATH 'models/CategoryObj{dot}php';

    class 
    Category {
    protected 
    $db;

    public function 
    __construct(){
    $this->db = new Db();
    }

    public function 
    getList(){
    //SQL
    $sql "SELECT * FROM tbl_category ORDER BY category_id DESC";

    //Query
    $this->db->query($sql);

    //Tạo mãng lưu trữ
    $listCategory = array();

    //Fetch
    while($row $this->db->fetch()){
    //Khởi tạo đối tượng CategoryObj
    $categoryObj = new CategoryObj();

    //Gán thông tin
    $categoryObj->setCategoryId($row***91;'category_id'***93;);
    $categoryObj->setName($row***91;'name'***93;);
    $categoryObj->setStatus($row***91;'status'***93;);
    $categoryObj->setCreated($row***91;'created'***93;);
    $categoryObj->setModified($row***91;'modified'***93;);

    //Gán vào mãng lưu trữ
    $listCategory***91;***93; = $categoryObj;
    }

    //Return
    return $listCategory;
    }
    }
    ?>
    Trong thư mục views/admin, tạo mới thư mục tên là category để chứa các file trình bày giao diện các trang danh mục sản phẩm.

    Trong thư mục views/admin/category, tạo mới file list{dot}tpl{dot}php để trình bày giao diện trang danh sách danh mục sản phẩm.

    Nội dung file views/admin/category/list{dot}tpl{dot}php như sau:
    Code:
    <table width="100%" cellpadding="10">
    <tr>
    <th>ID</th>
    <th>Tên danh mục</th>
    <th>Trạng thái</th>
    <th>Ngày tạo</th>
    <th>Ngày chỉnh sửa</th>
    <th>Tác vụ</th>
    </tr>
    <?php foreach($categoryList as $category): ?>
    <tr>
    <td><?php echo $category->getCategoryId(); ?></td>
    <td><a href="<?php echo Config::SITE_URL . 'admin/category/edit{dot}php?category_id=' . $category->getCategoryId(); ?>"><?php echo $category->getName(); ?></a></td>
    <td><?php echo ($category->getStatus() == 1) ? 'Kích hoạt' : 'Không kích hoạt'; ?></td>
    <td><?php echo date('d-m-Y H:i:s', $category->getCreated()); ?></td>
    <td><?php echo date('d-m-Y H:i:s', $category->getModified()); ?></td>
    <td><a href="<?php echo Config::SITE_URL . 'admin/category/delete{dot}php?category_id=' . $category->getCategoryId(); ?>">Xóa</a></td>
    </tr>
    <?php endforeach; ?>
    </table>
    Các bạn truy cập trang danh sách danh mục sản phẩm theo địa chỉ localhost/admin/category/list{dot}php để kiểm tra.

    * Hàm tạo (__construct):

    Hàm tạo là một phương thức đặc biệt, được thực thi ngay khi tạo ra đối tượng. Hàm tạo thường được sử dụng để khởi tạo các chức năng như gán thuộc tính với giá trị hay tạo ra các đối tượng khác từ đối tượng vừa tạo.

    Trong PHP, hàm tạo có thể được định nghĩa theo hai cách như sau:

    - Đặt tên hàm (Phương thức) trùng tên với tên lớp. Đây là cách được sử dụng ở PHP 4.

    Ví dụ:
    PHP Code:
    class {
    public function 
    A(){
    //Nội dung hàm tạo
    }

    - Dùng hàm __construct (Chỉ PHP 5 mới có).

    Ví dụ:
    PHP Code:
    class {
    public function 
    __construct(){
    //Nội dung hàm tạo
    }

    Trong kế thừa, hàm tạo có một số đặc điểm các bạn cần lưu ý như sau:

    - Trường hợp lớp dẫn xuất và lớp cơ sở đều có hàm tạo thì hàm tạo của lớp dẫn xuất sẽ được thực thi, còn hàm tạo của lớp cơ sở không được thực thi.
    - Trường hợp lớp dẫn xuất không có hàm tạo còn lớp cơ sở có hàm tạo thì hàm tạo của lớp cơ sở sẽ được thực thi.
    - Trường hợp lớp dẫn xuất có hàm tạo còn lớp cơ sở không có hàm tạo thì hàm tạo của lớp dẫn xuất sẽ được thực thi.
    - Trường hợp cả lớp dẫn xuất và lớp cơ sở đều không có hàm tạo thì hiển nhiên là không có hàm nào được thực thi khi khởi tạo đối tượng.

    * Hàm hủy (__destruct):

    Hàm hủy là hàm tự động gọi sau khi đối tượng bị hủy. Hàm hủy thường được sử dụng để giải phóng bộ nhớ chương trình hoặc thực hiện một tác vụ nào đó theo yêu cầu của người lập trình. Lập trình hướng đối tượng trong PHP thì hàm hủy có thể có hoặc không.

    Ví dụ:
    PHP Code:
    class {
    public function 
    __destruct(){
    //Nội dung hàm hủy
    }

    Cách thức hoạt động của hàm hủy trong kế thừa cũng tương tự như hàm tạo.

    Các bạn có thể tìm hiểu thêm về hàm tạo và hàm hủy ở liên kết php{dot}net/manual/en/language{dot}oop5{dot}decon{dot}php.
    Lê Trung Hiếu - Lập Trình Web & Di Động

  18. Thành viên Like bài viết này:


  19. #10
    Tham gia
    22-10-2014
    Bài viết
    103
    Like
    0
    Thanked 12 Times in 11 Posts
    TRANG THÊM MỚI DANH MỤC SẢN PHẨM (PHẦN 10)

    Nội dung kiến thức phần này gồm:

    - Autoload (Lazy loading).

    Trong thư mục admin/category, tạo mới file add{dot}php để viết mã lệnh trang thêm mới danh mục sản phẩm.

    Nội dung file admin/category/add{dot}php như sau:
    PHP Code:
    <?php
    //Khởi động session
    session_start();

    //Kiểm tra nếu chưa đăng nhập thì quay về trang đăng nhập
    if(!isset($_SESSION***91;'user'***93;)){
    header('location:../user/login{dot}php');
    }

    //Require các file cần thiết
    require '../../configs/Config{dot}php';
    require 
    '../../models/Category{dot}php';

    //Nếu có POST dữ liệu lên thì xử lý
    if($_POST){
    //Nhận dữ liệu từ form và gán vào một mãng (Có thể sử dụng đối tượng CategoryObj để lưu)
    $data = array(
    'name' => $_POST***91;'name'***93;,
    'status' => isset($_POST***91;'status'***93;) ? 0,
    'created' => date('Y-m-d H:i:s'),
    'modified' => date('Y-m-d H:i:s')
    );

    //Khởi tạo đối tượng danh mục sản phẩm (Category)
    $categoryModel = new Category();

    //Thêm mới
    if($categoryModel->add($data)){
    //Tạo session để lưu cờ thông báo thành công
    $_SESSION***91;'success'***93; = true;

    //Tải lại trang (Mục đích là để reset form)
    header('location:add{dot}php');

    //Ngừng thực thi
    exit();
    }
    }

    //Tiêu đề trang
    $title 'Danh mục sản phẩm - Thêm mới';

    //View
    $view 'category/add{dot}tpl{dot}php';

    //Require layout
    require '../../views/admin/layout{dot}tpl{dot}php';
    ?>
    Mở file models/Category{dot}php và thêm vào lớp Category khối lệnh mới dưới đây:
    PHP Code:
    public function add($data){
    //SQL
    $sql "INSERT INTO tbl_category(name, status, created, modified) VALUES('{$data***91;'name'***93;}', {$data***91;'status'***93;}, '{$data***91;'created'***93;}', '{$data***91;'modified'***93;}')";

    //Query và return
    return $this->db->query($sql);

    Trong thư mục views/admin/category, tạo mới file add{dot}tpl{dot}php để trình bày giao diện trang thêm mới danh mục sản phẩm.

    Nội dung file views/admin/category/add{dot}tpl{dot}php như sau:
    Code:
    <form name="add" method="POST" action="">
    <?php if(isset($_SESSION['success'])): ?>
    <p style="color:green;">Danh mục sản phẩm đã được thêm mới thành công!</p>
    <?php unset($_SESSION['success']); ?>
    <?php endif; ?>
    
    <p>
    <label>Tên danh mục:</label>
    <input type="text" name="name" value="" />
    </p>
    <p>
    <label>Trạng thái:</label>
    <input type="checkbox" name="status" value="1" />
    </p>
    <p>
    <input type="submit" value="Thêm mới" />
    </p>
    </form>
    Các bạn truy cập trang thêm mới danh mục sản phẩm theo địa chỉ localhost/admin/category/add{dot}php để kiểm tra.

    * Autoload (Lazy loading):

    Trong lập trình hướng đối tượng, đặc biệt là trong mô hình MVC thì autoload là một "thành phần" không thể thiếu.

    Autoload sẽ giúp cho việc lập trình trở nên gọn gàng và đơn giản hơn vì nhờ có nó ta có thể tiết kiệm được rất nhiều thao tác gọi nạp file khi sử dụng nhưng cũng tiềm ẩn những bất cập khiến các bạn sẽ gặp khó khăn. Vì vậy, cần phải lưu ý và tìm hiểu thật kỹ càng chức năng này trước khi ứng dụng vào trong dự án của các bạn.

    Cụ thể, trong PHP có một hàm "magic" để thực hiện việc này là hàm __autoload. Hàm __autoload sẽ được gọi khi các bạn khởi tạo một đối tượng, PHP sẽ dựa vào tên lớp và khai báo đường dẫn trong hàm __autoload mà tự động require file chứa lớp đó.

    Ví dụ:
    PHP Code:
    function __autoload($class){
    require 
    'libraries/' $class '{dot}php';

    Với ví dụ trên, khi các bạn khởi tạo một đối tượng từ một lớp bất kỳ nào trong thư mục libraries thì PHP sẽ tự động require file chứa lớp đó.

    Vì chức năng tự động này nên về cấu trúc thư mục, cách đặt tên file, tên lớp phải có quy luật (Tôi đã lưu ý ở những phần trước).

    Các bạn có thể tìm hiểu thêm về autoload ở liên kết php{dot}net/manual/en/language{dot}oop5{dot}autoload{dot}php.
    Lê Trung Hiếu - Lập Trình Web & Di Động

  20. Thành viên Like bài viết này:


Trang 1 / 5 1234 ... LastLast

Tags for this Thread

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •