Tự học lập trình web

(đọc, xem, làm theo từ dưới lên...1 lần, 2 lần, 3 lần, 4 lần,....n lần... Bắt chước phương pháp học từ cuốn "Ngũ luân thư")
---------------------------------------------------------------------------------------------------------------------
UTM 2016
Refactor: https://www.youtube.com/watch?v=r0xlTsTxCGY
http://hocvienagile.com/agipedia/tai-cau-truc-ma-nguon/

Bitcode + LLVM
https://tinhte.vn/threads/bitcode-vu-khi-giup-apple-thoai-mai-trien-khai-kien-truc-cpu-moi-ma-khong-lo-van-de-tuong-thich-app.2472904/
------------
series CakePHP của nhóm chickenrain
(cám ơn nhóm, rất tiếc họ không còn tiếp tục hoạt động)
---------
Tài liệu về cakePHP (bonus3p1&2)
cookbook
API
google
error
https://www.youtube.com/watch?v=eKhexbQG2lU&index=90&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
xây dựng plugin (bonus2p3)
chạy schema (2":53)
https://www.youtube.com/watch?v=GyBvidaxozI&index=85&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
xây dựng plugin (bonus2p2)
tạo schema (10":58)
https://www.youtube.com/watch?v=IQAz9N4mw-s&index=83&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
xây dựng plugin (bonus2p1)
https://www.youtube.com/watch?v=FWBoBSTywW0&index=84&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
ràng buộc các loại file được upload (bonus1p2)
upload nhiều file (10":30)
tạo thư mục để chứa file (18":14)
https://www.youtube.com/watch?v=4qIreMwDkIo&index=86&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E

---------
upload file nhiều định dạng (bonus1)
plugin Uploader (10":18)
nạp plugin (12":46)
https://www.youtube.com/watch?v=c_kYzhKR0CY&index=87&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
hosting website (54)
cpanel (4":08)
fileZilla (7":25)
sửa đường dẫn tới source của cakePHP (13":03)
https://www.youtube.com/watch?v=nSBZlH1eVCY&index=82&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
thiết lập quyền cho các group (53)
thiết lập menu theo từng người dùng (2":21)
bảo mật tránh một số lỗi xss, hàm h, token fields (4":10) 
error 400 (8":10) 
tắt debug (9":09) 
https://www.youtube.com/watch?v=uMr2ITYPdYs&index=79&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
cài đặt ACL, gán quyền logout cho một group (52e)
https://www.youtube.com/watch?v=AZh3b2_kQX4&index=78&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
cài đặt ACL, thêm dữ liệu vào aros_acos (52d)
https://www.youtube.com/watch?v=swkawOaCsHg&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=81

---------
cài đặt ACL, thêm dữ liệu vào acos (52c)
https://www.youtube.com/watch?v=H453_bmEN4g&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=76
---------
cài đặt ACL, thêm dữ liệu vào aros (52b)
sử dụng acl behavior (5":07)
https://www.youtube.com/watch?v=0TM_-tNwc18&index=75&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
cài đặt ACL, thêm group, user vào aros (52a)
https://www.youtube.com/watch?v=Sv-wlPkLyoc&index=80&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
ACL (51)
Auth và ACL (2":51)
https://www.youtube.com/watch?v=Ue4CYsnJgLY&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=73
---------
tạo các trang tĩnh, PagesController (50)
khai báo controller không sử dụng model (2":06)
xử lý tab active (10":31)
https://www.youtube.com/watch?v=eM4g6rIyqoY&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=77
---------
khóa tài khoản người dùng (49)(3":27)
định dạng ngày và thời gian (7":22)
https://www.youtube.com/watch?v=VBc-th1UyfY&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=72
---------
update nhiều mẩu tin cùng lúc (48)
checkbox (2":17)
select box (3":06)
form chứa các checkbox và select box không nằm cạnh nhau (5":04) 
xử lý tình trạng vừa có postlink vừa có submit (6":31) 
https://www.youtube.com/watch?v=F25T2DQrO2c&index=74&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
cập nhật thông tin tác giả (47)
https://www.youtube.com/watch?v=SMxYJ9l1mQ0&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=71
---------
lấy phần mở rộng của một file, hàm explode (46b)(2":17)
hàm end (3":04)
https://www.youtube.com/watch?v=vCuk4hk7ru0&index=67&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
upload ảnh (46a)
Html->image (1":19)
khai báo type='file' trong form  (3":19)
uploadFile (8":05)
https://www.youtube.com/watch?v=uKN0wrt4i7A&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=70
---------
xóa thư mục (45b)
cập nhật dữ liệu trong mySQL (2":21)
https://www.youtube.com/watch?v=kB61qL4hnOc&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=65
---------
tạo link thân thiện slug (45a) 
sử dụng novalidate (2":01)
chuyển kí tự có dấu thành không dấu stripUnicode, preg_replace, Inflector, slug (4":08)
tạo thư mục trong cakePHP sử dụng Folder (9":02)
lây đường dẫn tuyệt đối - APP (10":51)
https://www.youtube.com/watch?v=o5LL4peDLP8&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=66
---------
tích hợp trinh soạn thảo vào ứng dụng CKEditor (44)
include tập tin javascript vào view (4":08)
sửa lỗi tiếng Việt trong CKeditor (7":05)
sử dụng block để gọi javascript (12":10)
https://www.youtube.com/watch?v=QpzUdvb9qcc&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=69
---------
find(threaded) (43c) (1":34)
tạo mới một helper (2":08)
hiển thị theo cấu trúc cây phân cấp (4":37)
https://www.youtube.com/watch?v=8dgMhSExU2w&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=62

---------
hiển thị theo thứ tự của cây (43b)
hàm removeFromTree để xóa dữ liệu (4":03)
làm việc với quan hệ hasMany, dependent (6":42)
chuyển danh mục lên một bậc (10":08)
hàm exist, moveUp (11":13)
https://www.youtube.com/watch?v=3pR68XnrhuU&index=63&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
sử dụng tree behavior để tạo danh mục phân cấp (43a) (3":51)
recover để xây dựng dữ liệu cho parent, children (4":35)
sử dụng select box (8":03)
generateTreeList (9":09)
https://www.youtube.com/watch?v=QpRKToe-d-c&index=64&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
lập trình chức năng admin (42)
cấu hình prefixes (2":28)
lựa chọn layout mặc định cho một controller (7":03) 
định nghĩa trong beforeFilter để không phải định nghĩa lại nhiều lần trong các controller (10":28)  
this->request->params (11":01)
substr  (12":24)
https://www.youtube.com/watch?v=h2_8aPWLs-0&index=60&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
gửi link confirm về email người dùng (41d)
sử dụng cakeEmail (1":00)
cấu hình smtp (6":44)
https://www.youtube.com/watch?v=jrzR8LRW_-I&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=58
---------
cập nhật mật khẩu mới cho người dùng (41c)
https://www.youtube.com/watch?v=skgV6rAlfNk&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=56 ---------
xác thực yêu cầu đổi mật khẩu qua email (41b)
https://www.youtube.com/watch?v=00XxfEdBnLk&index=57&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
xử lý quên mật khẩu (41a)
hàm sinh mã generate_code (10":09)
xác nhận qua email (12":12)
https://www.youtube.com/watch?v=0170DGZYGNk&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=55
---------
bài tập hiển thị sách bán chạy (40)
https://www.youtube.com/watch?v=Du4OxfByFBw&index=53&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
Router có kèm id ví dụ /abc/:id (39b) (1":49)
sử dụng loadModel khi truy vấn trong controller (6":56)
https://www.youtube.com/watch?v=E_-weWRRddQ&index=61&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
hiển thị lịch sử người dùng (39a)
findAllByUserId (2":59)
định dạng thời gian dùng Time->format (6":38)
dùng json_decode (7":14) https://www.youtube.com/watch?v=EQTVKLJ7Oj8&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=59 ---------
cập nhật thông tin người dùng đã đăng nhập (38)
findById (4":39)
hàm unset (12":13) 
https://www.youtube.com/watch?v=vchVE7Y01MI&index=54&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
hàm Callback (37)
https://www.youtube.com/watch?v=Rh2npngKtK0&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=51
---------
ràng buộc trong đăng kí người dùng mới (36)
https://www.youtube.com/watch?v=ozRzPkWiEYo&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=48
---------
tự viết ràng buộc trong model (35b) (1":12)
sử dụng saveField để lưu một trường dữ liệu (6":18)
viết một hàm callback (10":45)
gọi class :: (12":07)
https://www.youtube.com/watch?v=p62oNqv0XSE&index=50&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&spfreload=1
---------
đổi mật khẩu cho người dùng (35a)
ràng buộc mật khẩu (7":02)
kiểm tra thỏa ràng buộc validates (8":53)
strcmp (12":20)
https://www.youtube.com/watch?v=jLfT_-_yvgU&index=49&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
Ràng buộc login trên các form (34b)
https://www.youtube.com/watch?v=q6jXGdV3bbI&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=52
---------
lấy thông tin người dùng, sau khi đăng nhập (34a)
sử dụng trường dữ liệu ảo virtualFields (8":26)
https://www.youtube.com/watch?v=Kr8f-WosoTU&index=47&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
lọc các action nào yêu cầu phải đăng nhập (33b)
sử dụng Auth->allow, beforeFilter (3":21)
sử dụng parent để không ghi đè hàm cha (8":15) 
https://www.youtube.com/watch?v=lXdg9SNKIQ0&index=46&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
Viết chức năng login (33a)
Khai báo sử dụng component (2":23)
https://www.youtube.com/watch?v=pvNFCy1Ca4g&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=45 ---------
Các bước để xây dựng một chức năng: khởi tạo -> xử lý -> hiển thị  (2":23)
https://www.youtube.com/watch?v=BzJLqYz_CD8&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=42
---------
form sử dụng action nào? (31) (2":07)
lable của helper (3":05)
sử dụng inputDefault để không tạo label trong form (6":37)
tạo một button (7":02)
lưu dữ liệu vào database dùng saveAll (15":08) 
chuyển chuỗi thành đối tượng JSON (18":20) 
https://www.youtube.com/watch?v=3qe2p042DHE&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=44
---------
request->data() để lấy giá trị từ form post lên server (30a)(5":55)
sử dụng findBy(7":28)
lấy ngày hiện tại date()(9":43)
kiểm tra một ngày có nằm trong ngày bắt đầu và ngày kết thúc (9":59)
lưu session theo khóa vị trí (13":23)
redirect về trang hiện tại (15":42)
https://www.youtube.com/watch?v=yS5h8Qc4BQc&index=43&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
escapse => false: để hiển thị nội dung html (28)(7":07)
https://www.youtube.com/watch?v=HBX-7aY3N6w&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=40

---------
set->(compact()) - gửi hai biến lên view (27b) (2":56)
sử dụng layout khác thay thế cho layout default (10":10) 
https://www.youtube.com/watch?v=uhIbU0ojj2I&index=39&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
Number->currency() - định dạng xuất tiền (27a) (4":49)
Tính tổng tiền của giỏ hàng bằng biến session (10":52)
Khai báo hàm trong AppController để có thể gọi trong mọi controller(13":04)
Khai báo hàm trong component để có thể gọi trong mọi project (14":00)
set->(compact()) - gửi hai biến lên view (2":56)
https://www.youtube.com/watch?v=dQ5uztTvZlk&index=38&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
postLink - tạo một link giống 1 button(26) (2":09)
session->setFlash() - lưu thông báo xuống session(12":30)
https://www.youtube.com/watch?v=e_BzdQBRVbM&index=36&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------

Session component - Session helper (25)
https://www.youtube.com/watch?v=GNv-QC8jeUE&index=35&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
Tạo link hình ảnh bằng helper (24e) (2":35)
Gửi thông báo, thành công, thất bại (20":00)
Cho trang web load lại đúng vị trí mình đã gửi comment (21":29)
https://www.youtube.com/watch?v=DHOBub30AOQ&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=34
---------
Trang tìm kiếm + nút tìm kiếm (search) (24d)
Hủy bỏ thẻ div của một input trong helper (5":57)
Gán giá trị title bằng helper (10":46)
https://www.youtube.com/watch?v=DKGAHRIoEhg&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=31
---------
Áp dụng giao diện mới cho một website (24c)
Tùy chỉnh lại Paginator từ kiểu <span> sang <li> +... (7":10)
https://www.youtube.com/watch?v=hvyR0OoGrNQ&index=32&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
Áp dụng giao diện mới cho một website (24b)
Đặt lời gọi jquery + bootstrap ở cuối <body> bằng helper (1":33)
Sử dụng element sql_dump để xem dữ liệu truy vấn (2":05)
https://www.youtube.com/watch?v=Ef66WolGYuI&index=33&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
Áp dụng giao diện mới cho một website (24a)
Bố cục (layout) của một trang web (4":40)
Tùy biến layouts\default (5":30)
Tham chiếu đến file CSS bằng helper (8":30)
đặt class cho một form bằng helper (11":29)
this->fetch('content')(16":11)
https://www.youtube.com/watch?v=Q7T1r5l_SrE&index=29&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E

---------
Hiển thị dữ liệu từ controller này lên một view khác (23)
Sử dụng requestAction
Hiển thị dữ liệu trong mọi view, đặt trong layouts\default (9":19)
https://www.youtube.com/watch?v=HMNgBbQ8vYU&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=30
---------
lấy keyword của form tìm kiếm (22c)(3":18)
lấy giá trị của một biến gửi từ các function khác nhau trong cùng controller (7":32)
(request->params hoặc request->passedArgs)
gửi lại từ khóa tìm kiếm lên form (14":40) https://www.youtube.com/watch?v=UVmhJMtQXWg&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=28
---------
cách join 2 bảng để truy vấn (22b)(1":18)
điều kiện AND và OR trong condition khi truy vấn (3":21)
phân trang cho kết quả tìm kiếm (4":49)
ẩn phần thông báo lỗi của input  (9":49)
https://www.youtube.com/watch?v=Pv6NKda6i4A&index=27&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E

---------
tạo form tìm kiếm bằng helper, liên kết đến một model (22a)
kiểm tra request có phải là post không? (2":56)
xem dữ liệu bằng hàm pr()(3":04)
truy vấn tìm kiếm tương đối (6":19) 
kiểm tra một biến có rỗng hay không empty() (7":45)
kiểm tra biến có tồn tại hay không isset() (8":33)
https://www.youtube.com/watch?v=kWG6puWdhmk&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=26
---------
đếm dòng dữ liệu bằng counterCache (21)
https://www.youtube.com/watch?v=JLNudqTwXS4&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=25
---------
kiểm tra dữ liệu (validate) ngay tại controller thay vì tại model (20b)
lưu biến thông báo lỗi vào session (6":16)
ẩn dấu * của require (7":50)
tắt validate mặc định của trình duyệt (9":04)
đọc và kiểm tra session có tồn tại không (11":35)
kiểm tra biến có tồn tại hai không trên view (isset)(15":57) 
https://www.youtube.com/watch?v=mrt3ZPIRstA&index=24&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&spfreload=1
---------
chuyển trang web sang action khác: redirect (20a)(6":57)
reload trang hiện tại: redirect(referer())(8":57)
ẩn label: (10":16)
https://www.youtube.com/watch?v=QeTiVSxPHpk&index=23&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
Truy vấn các quyển sách cùng loại với nó và không tính nó (19)(2":01)
Limit: giới hạn số lượng kết quả, và lấy ngẫu nhiên 5 kết quả ('order'=> rand())(3":01)
https://www.youtube.com/watch?v=iwR7BnHlWxY&index=22&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
Truy vấn model từ một model khác trong controller (18b)(3":15)
Giải quyết tình trạng bị trùng tên field
Gửi biến từ controller lên view ($this->set)(6":47)
https://www.youtube.com/watch?v=qcJvuP67cQw&index=21&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&spfreload=1 
---------
hàm image của helper (18a)(4":52)
https://www.youtube.com/watch?v=oIotPCx7uZo&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=20
---------
Phân trang dữ liệu với quan hệ nhiều - nhiều (17b)
https://www.youtube.com/watch?v=HGbxhlKSBjI&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=19
---------
Phân trang có điều kiện (17a)
https://www.youtube.com/watch?v=onWFjcE3v3E&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=18
---------
Tạo link thân thiện (15)
https://www.youtube.com/watch?v=OKKcLf7tSb4&index=16&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
Element (view) (14)
https://www.youtube.com/watch?v=vgOyCjTNiDs&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=15
--------
Phân trang cho Writers (13)
    public function index()
    {
        $this->paginate = [
            'fields' => 'name',
            'order' => ['name' =>'incs'],
            'limit' => 5
        ];
        
        $writers = $this->paginate();
        $this->set('writers',$writers);
        // $this->set(compact('writers'));
        // $this->set('_serialize', ['writers']);

    }
---
<nav class="large-3 medium-4 columns" id="actions-sidebar">
</nav>
<div class="writers index large-9 medium-8 columns content">
    <h3><?= __('Các Tác Giả') ?></h3>
    <p>
        <?= $this->Paginator->sort('name','Xếp theo thứ tự ngược lại') ?>
    </p>
            <?php foreach ($writers as $writer): ?>
                <?= h($writer->name) ?><br>
            <?php endforeach; ?>
    <div class="paginator">
        <ul class="pagination">
            <?= $this->Paginator->prev('< ' . __('Quay lại')) ?>
            <?= $this->Paginator->numbers() ?>
            <?= $this->Paginator->next(__('Kế tiếp') . ' >') ?>
        </ul>
        <p><?= $this->Paginator->counter("Trang {{page}}/{{pages}}, hiển thị {{current}} tác giả trong tổng số {{count}} tác giả.") ?>
        </p>
    </div>

</div>
https://www.youtube.com/watch?v=sRMlUttfDLE&index=14&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
---------
Sử dụng Paginator của helper (12b)
<nav class="large-3 medium-4 columns" id="actions-sidebar">
</nav>

<div class="books index large-9 medium-8 columns content">
    <h2><?= __('Sách mới') ?></h2>
    <p>
        <?= $this->Paginator->sort('title','Sắp xếp theo tên sách') ?> 
        <?= $this->Paginator->sort('created','Mới nhất/Cũ nhất') ?>       
    </p>
    <?php //pr($books); ?>
    <?php foreach($books as $book): ?>
        <?= $book->title ?> <br>
        <?= $this->Html->image($book->image, ['width'=>'70px', 'height'=>'100px']) ?> <br>
        Giá bán:<?= $this->Number->format($book->sale_price, ['places'=>0, 'after'=>' VND'])?> <br>
        <?php foreach($book->writers as $writer): ?>
            <?= $writer->name.' ' ?>
        <?php endforeach ?>
        <br>
        <hr>
    <?php endforeach ?>
    <div class="paginator">
        <?= $this->Paginator->counter("Trang {{page}}/{{pages}}, hiển thị {{current}} quyển sách trong tổng số {{count}} quyển."); ?>
        <ul class="pagination">
            <?= $this->Paginator->prev('< ' . __('Quay lại')); ?>
            <?= $this->Paginator->numbers(); ?>
            <?= $this->Paginator->next(__('Kế tiếp') . ' >'); ?>
        </ul>
    </div>
</div>
Đổi link mặc định của paginator sang kiểu GET
    * Latest_books method
    * Hiển thị tất cả quyển sách và sắp xếp từ mới đến cũ
    * Phân trang dữ liệu
    */ 

    public function latestBooks ()
    {
        $this->paginate = [
            'fields' => ['id','title','slug','image','sale_price'],
            'order' => ['created' => 'desc'],
            'limit' => 5,
            'contain' => ['Writers'=> function($q) {
                            return $q
                        ->select(['name','slug']);
                }],
            'conditions' => ['published' => 1],
            'paramType' => 'querystring'
        ];
        $books = $this->paginate();
        $this->set('books',$books);   

    }
https://www.youtube.com/watch?v=nBYGRpe6Pak&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=13
---------
Phân trang 
Cấu hình route để trỏ một link -> tới một controller/action(12)
 $routes->connect('/sach-moi', ['controller'=>'books', 'action'=>'latestBooks']);
https://www.youtube.com/watch?v=-fHDbh7XA_M&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=12
---------
Chuyển hàm truy vấn từ controller vào model (11)
public function latest()
    {
        return $this->find('all', [
            'fields' => ['id','title','image','sale_price','slug'],
            'order' => ['created' => 'desc'],
            'limit' => 5,
            'conditions' => ['published' => 1]
            ])
            ->contain([
                'Writers' => function($q) {
                    return $q
                        ->select(['name','slug']);
                }
            ]);

    } 
--
$query = $this->Books->latest();
--
Hiển thị + định dạng hình ảnh,
<?= $this->Html->image($book->image, ['width' => '30px', 'height' => '40px']) ?>
 định dạng tiền tệ (11)
Giá bán:<?= $this->Number->format($book->sale_price, ['places'=>0, 'after'=>' VND'])?> <br>
https://www.youtube.com/watch?v=myA1tunUsuk&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=11 
---------
Đổi trang chủ - Truy vấn và hiển thị 10 sách (10)
https://www.youtube.com/watch?v=wjz6sSL88wk&index=10&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E
<?php foreach($books as $book): ?>
        <?= $book->title ?> <br>
        <?= $book->image ?> <br>
        Giá bán:<?= $book->sale_price ?> <br>
        <?php foreach($book->writers as $writer): ?>
            <?= $writer->name.' ' ?>
        <?php endforeach ?>
        <br>
        <hr>

    <?php endforeach ?>
---
$query = $this->Books->find('all', [
            'fields' => ['id','title','image','sale_price','slug'],
            'order' => ['created' => 'desc'],
            'limit' => 5
            ])
            ->contain([
                'Writers' => function($q) {
                    return $q
                        ->select(['name']);
                }
                ]);
        $books = $query->all(); 

        $this->set('books',$books);
---------
Containable behavior
https://www.youtube.com/watch?v=qByCfFsdBTA&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=9
---------
quan hệ một - nhiều và nhiều nhiều trong cakephp
https://www.youtube.com/watch?v=XkyrfCIdIpM&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=8
----------
Truy vấn: find(); và query(); - recursive
https://www.youtube.com/watch?v=DdqeZNCYxoA&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=7
----------
Cấu hình cakePHP
https://www.youtube.com/watch?v=OTYeFyVxVCQ&list=PLCAoQYeCcECgTO5zuWfh5rHj7sqVMu73E&index=1
------------------------------------------------------------------------------------------------------------------------
Bookmarker (phan 2)
http://book.cakephp.org/3.0/en/tutorials-and-examples/bookmarks/part-two.html
------------
Accessors & Mutators
http://book.cakephp.org/3.0/en/orm/entities.html
----------
Bookmarker (phan 1)
http://book.cakephp.org/3.0/en/tutorials-and-examples/bookmarks/intro.html
-----------
CakePHP2.5.4 - Blog Application
(29 clip - tiếng Anh - Youtube)
-------------
CakePHP3 - BookMarker
(3 clip - tiếng Anh - Youtube)
-------------

Loạt bài viết về CakePHP
(đọc các kiến thức cần thiết - vì hiện tại đã có phiên bản mới)
(Tiếng Việt - text)
http://nongdanit.info/php-mysql/gioi-thieu-cakephp-framework.html
--------------
Quy trình làm việc của CakePHP (hiểu được khối thứ)
(Tiếng Việt - text)
https://lcdung.wordpress.com/2013/06/18/phan-1-moi-tiep-can-cakephp/
--------------
Seminar về CakePHP
(Tiếng Anh - video - Youtube)
--------------
Định dạng code cho file .ctpIn the latest version of SublimeText 3 (at least), you can open a CTP file, then:
View -> Syntax -> Open all current extension as -> PHP
Then just close your open files, and when you re-open them, they'll be highlighted like the language you chose for that extension.
Nguồn: stackoverflow
--------------
Cài đặt CakePHP3 với XAMPP + Login App
(Tiếng Anh - Youtube)

--------------
CakePHP3
http://book.cakephp.org/3.0/en/index.html
----------
Các ngôn ngữ, công cụ đang dùng trong nghề làm web (2016, 2017)
(video - tiếng Anh - 22" - youtube)
----------
Bootstrap
Tiếng Việt - youtube
--------------
Validate trên form
https://github.com/skaterdav85/validatorjs
---------------
Array trong HTML <form>
http://php.net/manual/en/faq.html.php
http://stackoverflow.com/questions/4688880/html-element-array-name-something-or-name-something
-------------
Nháy đơn và nháy kép trong PHP
http://phanstasmal.github.io/layout/2015/02/06/Nhay-don-vs-nhap-kep-trong-php/
-------------
JSON
http://www.json.org/
------------
XAMPP

Video hướng dẫn:
http://thachpham.com/thu-thuat/cach-them-ten-mien-ao-cho-localhost-voi-xampp.html

Virtual host
https://sites.google.com/site/hocvt89/programming/virtual-host-with-xampp

{
NameVirtualHost *:80


<VirtualHost *:80>
DocumentRoot "/xampp/htdocs/ThuMucDuAn" 
ServerName websiteduan.com
<Directory "/xampp/htdocs/ThuMucDuAn">
        Options FollowSymLinks
        AllowOverride All
        DirectoryIndex index.php
        Require all granted
    </Directory>
</VirtualHost>
}
...hosts
127.0.0.1 websiteduan.com

----------------------------------------------------------------------------------------------------------------------
-------------
Viết ứng dụng PHP an toàn
(văn bản - tiếng Việt)
https://www.ibm.com/developerworks/vn/library/os-php-secure-apps/
-------------
Quy ước đặt tên - Naming conventions
(văn bản - tiếng Việt)
http://tapchilaptrinh.vn/2012/08/03/phpquy-uoc-dat-ten-naming-conventions/

-------------
Quy ước trong lập trình (coding conventions)
(văn bản - tiếng Anh)
http://pear.php.net/manual/en/standards.php
--------------
Vấn đề về Line Length - Volume - Density
(văn bản - tiếng Anh)
http://paul-m-jones.com/archives/276
-------------
PHP

Cơ bản
-------------

[Bootstrap 3]
Tutorial for beginners (3 tiếng)
----------------------------------------------------
JIRA và Agile
http://congbley.blogspot.com/2016/03/jira-tutorials-bai-6-lam-nao-e-su-dung.html
------
Ví dụ minh họa về Scrum
http://labs.septeni-technology.jp/none/huong-ap-dung-scrum-vao-septech/
-----
JIRA
Các khái niệm của JIRA
https://dinhnn.com/2014/12/06/jira-ngy-1-cch-khi-niem-cua-jira/

Agile & Scrum

Tổng quan về Agile
http://vntesters.com/tong-quan-agile/

Tuyên ngôn của Agile
http://vntesters.com/tuyen-ngon-cua-agile/

12 nguyên tắc trong Agile
http://vntesters.com/12-nguyen-tac-trong-agile/

Tổng quan về Scrum
http://vntesters.com/tong-quan-scrum/

---------
[Git]
---------
Đọc thêm về Git
(tiếng Việt)
http://sotatek.com/git-successful-model/
---------
Stash
(tiếng Việt)
http://kipalog.com/posts/Su-dung-git-stash-hieu-qua
---------
Rebasing
Nhánh Remote
Quy trình làm việc phân nhánh
Quản lý các nhánh
Phân nhánh và tích hợp
Nhánh là gì?
Phân nhánh
Mẹo nhỏ
Đánh dấu
Làm việc từ xa
Phục hồi
Xem lịch sử commit
Ghi lại thay đổi vào kho chứa
Tạo một kho chứa (repository)
Làm việc với Git - mở đầu
Trợ giúp
Cấu hình Git lần đầu
Cài đặt Git
Cơ bản về Git
Sơ lược lịch sử của Git
Về quản lý phiên bản
Bắt đầu
----------------------------------------------------------------------------------------------------------------------
PHP cơ bản
http://streampow.net/tu-hoc-php-nang-cao-6/viet-ung-dung-web-bang-php-xu-ly-du-lieu-form-36.html
------------
debug trong PHP
(tiếng Anh - văn bản)
http://php.net/manual/en/debugger.php
------------
Bài 4. Xử lý giá trị Form trong PHP
(tiếng Việt - văn bản - qhonline)
------------
Bài 3. Toán tử và biểu thức trong PHP
(tiếng Việt - văn bản - qhonline)
------------
Bài 2. Kiến thức tổng quan về lập trình PHP
(tiếng Việt - văn bản - qhonline)
------------
Bài 1. Giới thiệu, cấu hình và cài đặt PHP
(tiếng Việt - văn bản - qhonline)
----------------------------------------------------------------------------------------------------------------------
------------
Tự học PHP (16/61) - (Ví dụ áp dụng vòng lặp - bài toán rút tiền)
(tiếng Việt - 16" - youtube)
------------
Tự học PHP (15/61) - (Ví dụ áp dụng vòng lặp - giải toán yêu ghét)
(tiếng Việt - 8" - youtube)
------------
Tự học PHP (14/61) - (break và continue, sự khác nhau giữa nháy đơn và nháy kép)
(tiếng Việt - 11" - youtube)
------------
Tự học PHP (13/61) - (Vòng lặp Do While - hiển thị album ảnh)
(tiếng Việt - 14" - youtube)
------------
Tự học PHP (12/61) - (Vòng lặp While - tiếp theo)
(tiếng Việt - 7" - youtube)
------------
Tự học PHP (11/61) - (Vòng lặp While)
(tiếng Việt - 18" - youtube)
------------
Tự học PHP (10/61) - (Vòng lặp For)
(tiếng Việt - 11" - youtube)
------------
Tự học PHP (9/61) - Câu lệnh điều kiện (ví dụ 2)
(tiếng Việt - 16" - youtube)
------------
Tự học PHP (8/61) - Câu lệnh điều kiện (ví dụ 1)
(tiếng Việt - 14" - youtube)
------------
Tự học PHP (7/61) - Câu lệnh điều kiện (tt)
(tiếng Việt - 18" - youtube)
------------
Tự học PHP (6/61) - Câu lệnh điều kiện
(tiếng Việt - 21" - youtube)
------------
Tự học PHP (5/61) - Form (tiếp theo) - phân trang
(tiếng Việt - 10" - youtube)
------------
Tự học PHP (4/61) - Form
(tiếng Việt - 16" - youtube)
------------
Tự học PHP (3/61) - Toán tử
(tiếng Việt - 18" - youtube)
------------
Tự học PHP (2/61) - Biến, hẳng, kiểu dữ liệu
(tiếng Việt - 17" - youtube)
------------
Tự học PHP (1/61) - Tổng quan
(tiếng Việt - 21" - youtube)
---------------------------------------------



-----------
Kiểm tra kiến thức về javascript và học đọc tiếng Anh
https://www.codecademy.com/learn/learn-javascript
------------
Javascript và JQuery
- Học chuyên môn + luyện khả năng nghe tiếng Anh -> để tiến xa hơn.
(video - tiếng Anh - 6h23" - youtube)
(11 phút cuối bị lỗi video).
------------
Thói quen tốt cho lập trình viên
(3) https://www.youtube.com/watch?v=tnuli75rtMs
(2) https://www.youtube.com/watch?v=6sRNGi3ozlw
(1) https://www.youtube.com/watch?v=qTxLuKmXUmQ
-------------
Tạo editor bằng javascript
------
Javascript và form
-------
Căn bản lập trình javascript
----
Làm quen với lập trình javascript
https://www.youtube.com/watch?v=ZtfR95oMfls
---------------------------
Tài liệu chuẩn về javascript
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide
---------
Tổng quan về javascript
https://www.youtube.com/watch?v=3EhchbRSg3Q
---------------------------------------------
Phân tích, tìm và sửa lỗi bằng Dev Tools
https://www.youtube.com/watch?v=kUKjlhSu4Rw
----------
Tự học lý thuyết + thực hành + tương tác trên codecademy (HTML + CSS)
(Website - tiếng Anh)
https://www.codecademy.com/learn/web
------------
Các trang web hay để tự học lập trình
https://vinacode.net/2014/06/16/day-lap-trinh-truc-tuyen/
------------
Các đơn vị đo: em - % - px - pt
http://kyleschaeffer.com/development/css-font-size-em-vs-px-vs-pt-vs/
------------
Tài liệu cập nhật về HTML5
https://www.w3.org/TR/2016/WD-html51-20160602/index.html
------------
Trang web dùng để kiểm ra mã HTML đã ổn chưa?
https://validator.w3.org/
------------
HTML5 & CSS3
- Học chuyên môn + luyện khả năng nghe tiếng Anh -> để tiến xa hơn.
- Cho tải về toàn bộ code mẫu, dùng để thực hành theo
- Giáo viên có thể lấy code mẫu về làm bài thực hành cho học viên
(video - tiếng Anh - 6h46" - youtube)
----------------------------------
Viết code chuyên nghiệp và hiệu quả với Sublime Text
(video - tiếng Việt 10 clip - youtube)
--------------
Thiết kế layout dùng thẻ div
https://www.youtube.com/watch?v=Og1acXRcse0
----------------------------------
Thiết kết website sử dụng HTML5 và CSS3 - làm mẫu từng bước

(Phần 5 (hết) - tiếng Việt - 30" - youtube )
------------
(Phần 4 - tiếng Việt - 1h6" - youtube)
------------
(Phần 3 - tiếng Việt - 36" - youtube)
------------
(Phần 2 - tiếng Việt - 37" - youtube)
------------
(Phần 1 - tiếng Việt - 53" - youtube)
---------------------------------
Thông tin hữu ích cho việc định hướng nghề lập trình.
10 bước trở thành lập trình viên chuyên nghiệp.
(video - tiếng Việt - 1h51" - youtube)
------------
Các thẻ và thuộc tính HTML đã lỗi thời
(văn bản - tiếng Anh)
https://www.codehelp.co.uk/html/deprecated.html
------------
Cách code HTML, CSS tốt
(video - tiếng Việt - 1h50" - youtube)
------------
How a web browser builds and displays a web page
(Video - tiếng Anh)
https://www.youtube.com/watch?v=DuSURHrZG6I
------------
How browsers work
(văn bản - tiếng Anh)
http://taligarsiel.com/Projects/howbrowserswork1.htm
------------
HTML5 & CSS3 cơ bản (35 bài)
(video - tiếng Việt - youtube)
------------
Các ngôn ngữ, công cụ đang dùng trong nghề làm web (2015)
(video - tiếng Anh - 26" - youtube)
------------