--------------- <> -----------------
--- KHOA HỌC - CÔNG NGHỆ - GIÁO DỤC - VIỆC LÀM ---
--- Học để đi cùng bà con trên thế giới ---

Tìm kiếm trong Blog

Ngu ngơ học làm web (x5) - CakePHP2 - Tạo home page

Tiếp theo của: Ngu ngơ học làm web (x4) - CakePHP2 – Quan hệ bảng Containable
------

Phần x5. CakePHP2 – Tạo home page


Xem (clip số 10 – chickenrainshop):

Cấu hình Routes (phút 1:00).

Routing là ánh xạ các URL sang các controller và action tương ứng, nhằm làm cho URL trên thanh địa chỉ đẹp hơn, dễ sử dụng và linh hoạt hơn.  


Tập tin routes.php nằm trong thư mục chickenrainshop\Config.

Cú pháp,

Router::connect('/', ['controller' => 'books', 'action' => 'index']);

Nghĩa là: nếu người dùng chỉ nhập tên website vào đường dẫn (/), ví dụ http://local.chickenrainshop. thì sẽ chuyển hướng tới trang index của controller Books.

Ví dụ, thực hiện hiển thị 10 quyển sách mới nhất lên trang chủ.

[BooksController, index( )]

$books = $this->Book->find('all', [
                                    'fields' => ['title', 'image', 'sale_price', 'slug'],
                                    'order' => ['created' => 'desc'],
                                    'limit' => 10,
                                    'contain' => ['Writer' => ['fields' => 'name']]
                                    ]);

Gửi dữ liệu từ controller lên view, sử dụng hàm set(), (phút 5:08).

$this->set('books', $books);

Trong đó, ‘books’ là tên biến ở bên view, $books là giá trị sẽ được gán vào ‘books’.

Bên view index, dùng hàm pr($books) để kiểm tra xem dữ liệu đã được gửi từ controller lên view chưa, đồng thời xem cách tổ chức dữ liệu để truy xuất và hiển thị cho hợp lý. (phút 7:30).

Học thêm cách viết vòng lặp foreach, rất gọn và tiện.

<?php foreach($books as $book): ?>
//mã xử lý trong vòng lặp
<?php endforeach; ?>

[view Books\index]

<div class="books index">
            <h2><?php echo __('Books'); ?></h2>
            <?php foreach($books as $book): ?>
                        <?php echo $book['Book']['title']; ?> <br>
                        <?php echo $book['Book']['image']; ?> <br>
                        Giá bán:<?php echo $book['Book']['sale_price']; ?> <br>
                        <?php foreach($book['Writer'] as $writer): ?>
                                    <?php echo $writer['name'].' '; ?>
                        <?php endforeach; ?>
                        <br>
                        <hr>
            <?php endforeach; ?>
</div>

Ở trên thấy có dòng mã sau:

<h2><?php echo __('Books'); ?></h2>

Vậy __( ) là gì?

Đọc thêm tại đây:

__() là một hàm toàn cục (global function) của CakePHP, nó cho phép chèn thêm tham số vào một chuỗi khi xuất. Giống với hàm sprintf() của PHP.

Ví dụ,

<?php $string = 'Nguyễn Văn Tèo'; ?>
<h2><?php echo __('anh %s', $string); ?></h2>

Kết quả xuất ra là:

anh Nguyễn Văn Tèo.

Xem (clip số 11 – chickenrainshop):

Viết hàm truy vấn dữ liệu trong model, rồi trong controller sẽ gọi hàm truy vấn này. Việc này giúp tối ưu khi viết mã, không phải viết lại câu truy vấn nhiều lần (phút 1:40).

Trong model Book định nghĩa hàm latest().

[model Book]

public function latest() {
                        return $this->find('all', [
                                    'fields' => ['id','title', 'image', 'sale_price', 'slug'],
                                    'conditions' => ['published' => 1],
                                    'order' => ['created' => 'desc'],
                                    'limit' => 10,
                                    'contain' => ['Writer' => ['fields' => ['name', 'slug']]]
                                    ]);
            }

Trong controller Books sẽ gọi hàm latest() để lấy 10 cuốn sách.

[controller Books]

public function index() {
                        $books = $this->Book->latest();
                        $this->set('books', $books);
            }

Hiển thị hình ảnh bằng html helper (phút 4:25).

<?php echo $this->Html->image($book['Book']['image']); ?>

Trong đó,

$book['Book']['image'] sẽ chứa đường dẫn của tập tin hình ảnh, ví dụ: /webroot/files/ki-nang-song/ba-diem-tinh-yeu-tren-duong-tu-tap.jpg

Chỉnh kích thước của hình ảnh bằng html helper:

<?php echo $this->Html->image($book['Book']['image'], ['width' => '60px', 'height' => '80px']); ?>

Định dạng xuất tiền bằng html helper:

Giá bán:<?php echo $this->Number->currency($book['Book']['sale_price'],' VND',['places' => 0,'wholePosition' => 'after']); ?>

Kết quả là: Giá bán:46,000 VND


Đọc thêm về định dạng xuất số tại đây: https://book.cakephp.org/2.0/en/core-libraries/helpers/number.html

Ngu ngơ học làm web (x4) - CakePHP2 - Quan hệ bảng Containable

-----

Phần x4. CakePHP2 – Quan hệ bảng Containable


Xem (clip số 8 – chickenrainshop):

Giải thích về mối quan hệ một – nhiều (phút 0:39).

- một – nhiều

(hasMany >) – (< belongsTo)

Ví dụ:

(hasMany)

- Một book thì có một hoặc nhiều comment (một cuốn sách có thể có một hoặc nhiều nhận xét)

- Một category thì có nhiều book (một lĩnh vực có thể có một hoặc nhiều cuốn sách).

(belongsTo)

- Một comment thì phải thuộc về một book nào đó

- Một book thì phải thuộc về một category nào đó

Mối quan hệ này được thiết lập ngay từ khi tạo bảng, để ý trong bảng comments sẽ có trường book_id, nghĩa là nó đã ngầm định là comment này phải thuộc về book có id là book_id nào đó. Tương tự, trong bảng book, sẽ có trường category_id.

Khi thực hiện sinh mã tự động bằng Cake console, thì mối quan hệ này lại tiếp tục được ghi vào trong model. Tất nhiên, người lập trình vẫn có thể thiết lập và chỉnh sửa các thông tin này.

Ví dụ,

[Book model]

public $belongsTo = array(
                        'Category' => array(
                                    'className' => 'Category',
                                    'foreignKey' => 'category_id',
                                    'conditions' => '',
                                    'fields' => '',
                                    'order' => ''
                        )
            );

public $hasMany = array(
                        'Comment' => array(
                                    'className' => 'Comment',
                                    'foreignKey' => 'book_id',
                                    'dependent' => false,
                                    'conditions' => '',
                                    'fields' => '',
                                    'order' => '',
                                    'limit' => '',
                                    'offset' => '',
                                    'exclusive' => '',
                                    'finderQuery' => '',
                                    'counterQuery' => ''
                        )
            );

[Comment model]

public $belongsTo = array(
                        'User' => array(
                                    'className' => 'User',
                                    'foreignKey' => 'user_id',
                                    'conditions' => '',
                                    'fields' => '',
                                    'order' => ''
                        ),
                        'Book' => array(
                                    'className' => 'Book',
                                    'foreignKey' => 'book_id',
                                    'conditions' => '',
                                    'fields' => '',
                                    'order' => ''
                        )
            );

- nhiều – nhiều

(hasAndBelongsToMany >) – (< hasAndBelongsToMany)

Ví dụ, book – writer

- Một cuốn sách có thể được viết bởi nhiều người và ngược lại một người cũng có thể viết nhiều cuốn sách.

Mối quan hệ này cũng được thiết lập ngay từ  khi tạo bảng, bằng cách ra tạo một bảng phụ để thể hiện mối quan hệ này, ví dụ bảng books_writers.

Khi thực hiện sinh mã tự động bằng Cake console, thì mối quan hệ này lại tiếp tục được ghi vào trong model.

Ví dụ,

[Book model]

public $hasAndBelongsToMany = array(
                        'Writer' => array(
                                    'className' => 'Writer',
                                    'joinTable' => 'books_writers',
                                    'foreignKey' => 'book_id',
                                    'associationForeignKey' => 'writer_id',
                                    'unique' => 'keepExisting',
                                    'conditions' => '',
                                    'fields' => '',
                                    'order' => '',
                                    'limit' => '',
                                    'offset' => '',
                                    'finderQuery' => '',
                        )
            );

[Writer model]

public $hasAndBelongsToMany = array(
                        'Book' => array(
                                    'className' => 'Book',
                                    'joinTable' => 'books_writers',
                                    'foreignKey' => 'writer_id',
                                    'associationForeignKey' => 'book_id',
                                    'unique' => 'keepExisting',
                                    'conditions' => '',
                                    'fields' => '',
                                    'order' => '',
                                    'limit' => '',
                                    'offset' => '',
                                    'finderQuery' => '',
                        )
            );

Xem (clip số 9 – chickenrainshop):

Sử dụng behavior Containable để lấy dữ liệu từ các bảng có mối quan hệ với nhau (thay thế cho recursive) (phút 1:43)

- Khai báo trong model là sẽ sử dụng Containable,

class Book extends AppModel {
            public $actsAs = ['Containable'];

- Ví dụ, trong controller Books, để lấy thêm dữ liệu từ hai bảng Writers và Comments, sử dụng thêm tùy chọn contain trong hàm find(), cú pháp là:

‘contain’ => [‘bảng1’, ‘bảng 2’]

Hoặc phức tạp hơn, hạn chế số field của các bảng lấy thêm.

‘contain’ => [
‘bảng 1’ => [‘fields’ => [
                        ‘tên trường 1’, ‘tên trường 2’
]
],
‘bảng 2’ => [‘fields’ => [
                        ‘tên trường 1’, ‘tên trường 2’
]
]
]

Ví dụ,

public function truyvan(){
                        $books = $this->Book->find('all', [
                                    'contain' => ['Writer', 'Comment']
                                    ]);
                        pr($books);exit;
            }

Hạn chế số field của hai bảng lấy thêm:

public function truyvan(){
                        $books = $this->Book->find('all', [
                                    'fields' => ['id', 'title'],
                                    'contain' => [
                                                'Writer' => [
                                                            'fields' => ['id', 'name']
                                                            ],
                                                'Comment']
                                    ]);
                        pr($books);exit;

            }
-----------
Cập nhật 23/4/2017
-----------
Xem thêm:
- Tổng hợp các bài viết về Ngu ngơ học làm web

Ngu ngơ học làm web (x3) - CakePHP2 - MVC Layout Truy vấn

Tiếp theo của: Ngu ngơ học làm web (x2) - CakePHP2 – Tạo CSDL  MVC
-----

Phần X3. CakePHP2 – MVC Layout Truy vấn

Xem (clip số 6 – chickenrainshop):

Cách gọi và truyền tham số cho action của một controller (phút 2:25).

Nhớ lại mô hình MVC, quá trình xử lý logic của một ứng dụng web sẽ bắt đầu từ giao diện website của người dùng (client), cụ thể trong ví dụ ở đây là bắt đầu từ thanh địa chỉ URL, dữ liệu sẽ được gửi từ client về controller qua URL (client gửi request về server bằng phương thức get), sau đó controller xử lý và trả lại kết quả về cho view, hệ thống sẽ gửi view này về lại trình duyệt. Xem thêm hình dưới đây (https://book.cakephp.org/2.0/en/getting-started/a-typical-cakephp-request.html)



Đọc thêm để hiểu về hoạt động của mô hình MVC tại đây: https://techmaster.vn/posts/33903/giai-thich-ve-mo-hinh-mvc

Giới thiệu về việc xây dựng các chức năng người dùng và các chức năng quản trị của một website (phút 4:40).

Định dạng URI của chức năng người dùng, và chức năng quản trị (phút 6:51):

- Chức năng người dùng: /controller/action

- Chức năng quản trị: /admin/controller/action

Cách đặt tên action và view:

- Chức năng người dùng:  function index(), index.ctp

- Chức năng quản trị: function admin_index(), admin_index.ctp

Sử dụng layout (phút 8:36):

- Chức năng người dùng:  default.ctp

- Chức năng quản trị: admin.ctp

Giới thiệu về layout và hoạt động của layout (phút 9:15).

Layout: là bố cục mặc định cho trang web, là cái khung cho các trang web, các trang web cùng sử dụng một layout sẽ có bố cục giống nhau và chỉ khác nhau phần nội dung riêng của từng trang, xem lại cái hình bên trên sẽ dễ hiểu hơn.

Phần nội dung riêng của từng trang (từng view) sẽ được gọi bằng lệnh:

<?php echo $this->fetch(‘content’); ?> //nội dung của view sẽ được đặt tại vị trí của câu lệnh này

Xem (clip số 7 – chickenrainshop):

Hai hàm dùng để truy vấn dữ liệu là: find và query (phút 0:00)

- find():

Gồm các kiểu (type) sau:

+ all: lấy tất cả các mẩu tin

+ first: lấy mẩu tin đầu tiên

+ list: giống all, tuy nhiên chỉ trả về danh sách id (cộng thêm trường title hoặc name), tùy chọn này thường được sử dụng để lấy dữ liệu từ một bảng và đưa ra element select của HTML (trong view).

+ count: trả về số mẩu tin thỏa yêu cầu

+ neighbor: trả về mẩu tin đứng trước và sau

+ threaded: dữ liệu có cấu trúc cây (dùng trong tree behavior)

Các tùy chọn của hàm find():

+ fields: tên trường muốn lấy

+ conditions: điều kiện lấy

+ order: sắp xếp kết quả truy vấn

+ limit: giới hạn số lượng mẩu tin lấy

+ recursive: lấy theo mối quan hệ giữa các bảng, -1,0,1,2

- query(): cú pháp query(“SQL statement”)

Thực hành truy vấn trên CakePHP (phút 3:30)

Sử dụng hàm pr() và exit để xem kết quả truy vấn, giúp debug và thực hiện các xử lý trên dữ liệu. (phút 4:11).

Ví dụ về recursive (phút 7:05):

-1: chỉ lấy dữ liệu của bảng hiện tại

0: hiển thị thêm dữ liệu của bảng mà bảng hiện tại có quan hệ “belongsTo”

1: là giá trị mặc định, giống với giá trị 0, ngoài ra hiển thị thêm dữ liệu của bảng có quan hệ 
“hasMany” với bảng hiện tại.

2: tùy chọn này ít khi dùng, lấy tất cả dữ liệu mà hệ thống tìm được.

Ví dụ về các tùy chọn truy vấn (phút 9:52)

Hàm truyvan(),

public function truyvan(){
                        $books = $this->Book->find('first', [
                                    'recursive' => -1,
                                    'fields' => ['id', 'title']
                                    ]);
                        pr($books);exit;
            }

Thêm điều kiện truy vấn, lấy cuốn sách có id = 2

public function truyvan(){
                        $books = $this->Book->find('first', [
                                    'recursive' => -1,
                                    'fields' => ['id', 'title'],
                                    'conditions' => [
                                                            'id' => '2'
                                                ]
                                    ]);
                        pr($books);exit;
            }

Thêm điều kiện truy vấn, lấy các cuốn sách có id <= 2

public function truyvan(){
                        $books = $this->Book->find('all', [
                                    'recursive' => -1,
                                    'fields' => ['id', 'title'],
                                    'conditions' => [
                                                            'id <=' => '2'
                                                ]
                                    ]);
                        pr($books);exit;

            }
-----------
Cập nhật 22/4/2017
-----------
Xem thêm:
- Tổng hợp các bài viết về Ngu ngơ học làm web

Ngu ngơ học làm web (x2) - CakePHP2 - Tạo CSDL MVC

Tiếp theo của: Ngu ngơ học làm web (x1) - CakePHP2 – Cài đặt
-----

Phần x2. CakePHP2 – Tạo CSDL  MVC

Xem clip về phân tích, thiết kế cơ sở dữ liệu (clip số 4 – chickenrainshop):

Đây là đoạn mã để tạo các bảng của cơ sở dữ liệu, import vào cơ sở dữ liệu để làm các bước tiếp theo. Cách làm: nếu chưa tạo cơ sở dữ liệu cho dự án này, thì vào phpmyadmin, tạo cơ sở dữ liệu mới, đặt tên là chickenrainshop, chép (copy) toàn bộ đoạn mã dưới đây, mở một tập tin mới trong Sublime Text (hoặc một editor bất kì), dán (paste) vào đó, lưu lại với tên là database.sql, rồi import vào cơ sở dữ liệu chickenrainshop.

drop table if exists books;
drop table if exists books_writers;
drop table if exists categories;
drop table if exists comments;
drop table if exists coupons;
drop table if exists groups;
drop table if exists orders;
drop table if exists users;
drop table if exists writers;

/*--table books--*/
create table books
(
            id                                             int not null auto_increment,
            category_id                             int,
            title                                          varchar(100) not null,
            slug                                          varchar(255) not null,
            image                                      varchar(255),
            info                                          text not null,
            price                                        int not null,
            sale_price                                int not null,
            publisher                                 varchar(100) not null,
            publish_date                            date not null,
            link_download                         varchar(255) not null,
            published                                 bool default 0,
            created                                                datetime,
            modified                                  datetime,
            primary key (id)
);

/*--table books_writers--*/
create table books_writers
(
            book_id                                   int not null,
            writer_id                                  int not null,
            primary key (book_id, writer_id)
);

/*--table categories--*/
create table categories
(
            id                                             int not null auto_increment,
            name                                       varchar(100) not null,
            slug                                          varchar(255) not null,
            description                               text,
            created                                                datetime,
            primary key (id)
);

/*--table comments--*/
create table comments
(
            id                                             int not null auto_increment,
            user_id                                    int not null,
            book_id                                   int not null,
            content                                     text not null,
            created                                                datetime,
            primary key (id)
);

/*--table coupons--*/
create table coupons
(
            id                                             int not null auto_increment,
            code                                         varchar(255) not null,
            percent                                                float(3) not null,
            description                               text,
            time_start                                datetime not null,
            time_end                                  datetime not null,
            created                                                datetime,
            modified                                  datetime,
            primary key (id)
);

/*--table groups--*/
create table groups
(
            id                                             int not null auto_increment,
            name                                       varchar(100) not null,
            percent                                                float(3) not null,
            description                               text,
            created                                                datetime,
            primary key (id)
);

/*--table orders--*/
create table orders
(
            id                                             int not null auto_increment,
            user_id                                    int not null,
            customer_info                          text not null,
            orders_info                              text not null,
            payment_info                           text not null,
            status                                       int default 1,
            created                                                datetime,
            modified                                  datetime,
            primary key (id)
);

/*--table users--*/
create table users
(
            id                                             int not null auto_increment,
            group_id                                  int not null,
            username                                 varchar(100) not null,
            password                                 varchar(100) not null,
            email                                       varchar(100) not null,
            firstname                                 varchar(100) not null,
            lastname                                  varchar(100) not null,
            address                                    varchar(255),
            phone_number                                    char(13),
            created                                                datetime,
            modified                                  datetime,
            primary key (id)
);

/*--table writers--*/
create table writers
(
            id                                             int not null auto_increment,
            name                                       varchar(100) not null,
            slug                                          varchar(255) not null,
            biography                                text,
            created                                                datetime,
            primary key (id)
);

Sinh mã của dự án theo mô hình MVC.

Vì cơ sở dữ liệu đã được đặt tên theo quy ước của CakePHP, nên có thể sử dụng cake console để sinh mã tự động cho các chức năng cơ bản.

Mở cửa sổ dòng lệnh, chuyển tới thư mục của dự án, ví dụ: E:\webroot\chickenrainshop nhập lệnh sau: cake bake all

Màn hình sẽ hiển thị tên của các model mà hệ thống có thể sinh mã, ví dụ:

1. Book
2. BooksWriter
3. Category
4. Comments
5. Coupons
6. Groups
7. Orders
8. Users
9. Writers

Nhập từng số ở danh sách trên để sinh mã tự động. Lưu ý: xong mỗi model sẽ gõ lại cake bake all và nhập số kế tiếp, do books_writers là bảng phụ nên sẽ không cần sinh mã cho bảng này.

Sau khi chạy xong các lệnh cake bake all, Cake console sẽ tạo ra các model, view, controller tương ứng trong dự án chickenrainshop, vào Sublime Text, mở dự án ra để kiểm tra.

Cấu trúc thư mục của một dự án CakePHP, và quy ước đặt tên, đọc thêm tại đây: https://kysutho.com/cakephp-bai-3-cau-truc-thu-muc-va-cac-quy-uoc-chung/

Để ý các thư mục sẽ làm việc nhiều với nó là: Config, Controller, Model, View và webroot.


Nhập dữ liệu mẫu vào để lập trình các chức năng.

Hoặc có thể tải một ít dữ liệu mẫu tại đây:
Hình ảnh:

-----------
Cập nhật 22/4/2017
-----------
Xem thêm:
- Tổng hợp các bài viết về Ngu ngơ học làm web

Ngu ngơ học làm web (x1) - CakePHP2/3 - Cài đặt

Tiếp theo của: Ngu ngơ học làm web (x) -
-----

Phần x1. CakePHP2/3 – Cài đặt


Đọc qua lý thuyết trước:


– Vào đường dẫn sau để tải nguồn về, lấy bản CakePHP2 (ví dụ 2.10.17), bấm vào chữ zip để tải file zip về:


– Giải nén tập tin cakephp-2.10.17.zip, rồi chép thư mục đã được giải nén vào webroot (ví dụ xampp\htdocs).

– Cấu hình để chạy Cake Console trên Windows:

Cake Console là một tiện ích chạy ở chế độ dòng lệnh, tiện ích này có sẵn trong framework CakePHP. Tiện ích này giúp tạo project dựa trên CakePHP được dễ dàng mà không cần phải copy toàn bộ framework CakePHP cho mỗi dự án khác nhau; giúp sinh mã tự động theo mô hình MVC, giúp người học dễ dàng tìm hiểu và học theo cách viết mã dựa trên CakePHP; giúp tạo template dựa trên Bootstrap.

Để chạy được tiện ích Cake Console cần thiết lập biến môi trường trên Windows.

Đọc thêm về biến môi trường trên Windows tại đây:


Hiểu nôm na:

– Biến môi trường được sử dụng để tham chiếu tới ứng dụng

– Giá trị của biến chính là đường dẫn tới tập tin thực thi (.exe) của ứng dụng, các giá trị của biến được ngăn cách nhau bằng dấu chấm phẩy (;)

– Trong cửa sổ dòng lệnh, gõ lệnh “set” để xem các biến môi trường và giá trị tương ứng

– Biến môi trường gồm hai loại: biến hệ thống và biến người dùng; biến hệ thống cho phép mọi người đều dùng được, admin mới được phép thay đổi biến này; biến người dùng chỉ cho một người cụ thể được thay đổi giá trị và sử dụng.

Cần thiết lập biến môi trường cho lệnh php.exe và cake.exe. Mục đích là: để khi vào cửa sổ dòng lệnh, gõ lệnh “cake” và “php” ở mọi vị trí thì Windows đều tìm được hai tập tin cake.exe và php.exe để thực thi.


Ví dụ, thiết lập biến môi trường trên cho lệnh php.exe, và cake.exe Windows 10,

– Nhấn phím window (biểu tượng cửa sổ) trên bàn phím

– Nhập chữ “system”, sẽ thấy xuất hiện mục System (control panel), bấm vào mục System

– Tại cửa sổ System, chọn mục Advanced system settings

– Trong cửa sổ System Properties, tab Advanced, chọn mục Environment Variables…

– Trong cửa sổ Environment Variables, mục User variables for…, chọn Path, chọn Edit

– Trong cửa sổ Edit environment variable, bấm nút New và nhập giá trị của biến môi trường, ví dụ: C:\xampp\php và D:\WEBROOT\myapp\app\Console (đây chính là thư mục Cakephp vừa tải về, vào thư mục app\Console, trong đó sẽ có tập tin cake.exe)

­– Bấm OK (một số lần) để hoàn thành việc thiết lập biến môi trường


– Để kiểm tra xem việc thiết lập thành công hay chưa, mở cửa sổ dòng lệnh (cmd), nhập lệnh “php –v”, hoặc cake, nếu các lệnh này chạy được, nghĩa việc thiết lập biến môi trường đã thành công


- Tạo dự án bằng Cake Console:

+ Mở cửa sổ dòng lệnh (Run > cmd).

+ Tại dấu nhắc lệnh: gõ lệnh cake bake

+ Hệ thống sẽ hiển thị câu hỏi: What is the path to the project you want to bake? (đường dẫn và tên dự án sẽ tạo), ví dụ sẽ nhập là: E:\webroot\chickenrainshop hoặc C:\xampp\htdocs\chickenrainshop

+ Hệ thống hỏi tiếp: What is the path to the directory layout you wish to copy? (đường dẫn của dự án mẫu (khung dự án) sẽ được nhân bản sang dự án của bạn), ví dụ, lấy luôn cái mẫu mặc định của CakePHP là […Console\Templates\skel], không cần nhập gì, chỉ việc gõ Enter.

+ Look okay? (kiểm tra lại thông tin vừa nhập xem được chưa): bấm Enter.

+ Sang tới phần cấu hình database.

Gồm các thông tin sau:
                        'datasource' => 'Database/Mysql',
                        'persistent' => false,
                        'host' => ,
                        'login' =>,
                        'password' => ,
                        'database' => ,
                        'prefix' => '',
                        'encoding' => 'utf8',

+ Name: tên của datasource, để mặc định, gõ Enter.

+ Persistent: để mặc định là false hay [n], gõ Enter.

+ Database host: để mặc định là localhost, gõ Enter.

+ Port: để mặc định, gõ Enter.

+ User: để mặc định là root, gõ Enter.

+ Password: để mặc định là trống, gõ Enter. Nó hỏi là có chắc là sử dụng mật khẩu trắng không? Gõ y (yes).

+ Database name: nhập tên của cơ sở dữ liệu, ví dụ: chickenrainshop, cứ nhập tên vào đây trước, tí nữa sẽ tạo database sau.

+ Table prefix: để mặc định, gõ Enter.

+ Table encoding: nhập utf8, gõ Enter.

+ Hệ thống sẽ xuất lại các thông tin đã cấu hinh, và hỏi thế đã được chưa (look ok?), bấm Enter.

+ Hệ thống hỏi có muốn cấu hình thêm database khác nữa không? Đủ rồi! bấm Enter.

+ Vào thư mục webroot\chickenrainshop hoặc htdocs\chickenrainshop để xem dự án kết quả đã được tạo ra.

Xem thêm clip này để rõ thêm (clip số 1 – chickenrainshop): https://www.youtube.com/watch?v=OTYeFyVxVCQ&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E

Cấu hình tên miền cho dự án là: local.chickenrainshop. Tham khảo cách tạo tên miền ảo tại đây: https://thachpham.com/thu-thuat/cach-them-ten-mien-ao-cho-localhost-voi-xampp.html

Mở trình duyệt lên để kiểm tra trang web.

Xem thêm hướng dẫn cài DebugKit, không cần làm, vì sau này sẽ tự debug (clip số 2 – chickenrainshop):

Xem clip về yêu cầu của dự án sẽ cài đặt (clip số 3 – chickenrainshop):

-----------
Cập nhật: 11/7/2019 (21/4/2017)
-----------
Xem thêm:
- Tổng hợp các bài viết về Ngu ngơ học làm web