tài liệu lập trình zend framework 2.x
TRANSCRIPT
![Page 1: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/1.jpg)
![Page 2: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/2.jpg)
![Page 3: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/3.jpg)
![Page 4: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/4.jpg)
![Page 5: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/5.jpg)
![Page 6: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/6.jpg)
![Page 7: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/7.jpg)
• .htaccess là một file cấu hình có phần mở rộng là htaccess, nó có thể thay đổi các cấu hình do
Apache quản lý (httpd.conf) và có tác dụng trong thư mục chứa nó và các thư mục con của thư mục
chứa nó.
• .htaccess có một sự ảnh hưởng rất lớn đến sự hoạt động của website do đó cần đặc biệt quan tâm
đến file cấu hình này về vấn đề bảo mật, lỗi cú pháp, sự ảnh hưởng, …
• Apache sẽ tìm và thực thi tất cả những file .htaccess , do vậy sẽ ảnh hưởng đến tốc độ của website
chỉ nên dùng .htaccess trong trường hợp bạn không có quyền cấu hình trên httpd.conf của
Apache
Kiến thức tổng quan
![Page 8: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/8.jpg)
1. Hạn chế IP truy cập vào website
2. Điều hướng thông báo lỗi
3. Thiết lập tập tin thực thi mặc định
4. Hạn chế view thư mục
5. Hạn chế truy cập vào tập tin
6. Tạo mật khẩu cho thư mục tập tin
7. Chống chia sẻ tài nguyên
8. Thiết lập kích thước tập tin upload
9. Rewrite URL
…
![Page 9: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/9.jpg)
![Page 10: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/10.jpg)
![Page 11: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/11.jpg)
• Abstract Class (Lớp trừu tượng) là một Class dùng để định nghĩa các thuộc tính và
phương thức chung cho các class khác
• Abstract Class không cho phép khởi tạo đối tượng từ class đó.
• Abstract method không cho phép định nghĩa rõ cách hoạt động của method, chỉ dừng
lại ở khai báo method
• Từ khóa abstract được dùng để định nghĩa một Lớp trừu tượng.
![Page 12: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/12.jpg)
• Interface không phải là class, đây là một mẫu giao diện quy định thêm một số thuộc
tính và phương thức cho một class nào đó
• Interface không cho phép định nghĩa rõ cách hoạt động của method, chỉ dừng lại ở
khai báo method
• Việc định nghĩa các method này sẽ được thực hiện ở class con
![Page 13: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/13.jpg)
• Abstract class là một class Interface không là một class
• Abstract class mỗi method không bắt buộc phải được định nghĩa ở lớp con
Interface mỗi method bắt buộc phải được định nghĩa ở lớp con
• Abstract class mỗi lớp con chỉ kế thừa từ một class abstract, một class abstract có
nhiều class con Interface mỗi lớp con kế thừa từ một hoặc nhiều Interface, một
Interface có nhiều class con
• Abstract class mỗi phương thức abstract có thể ở trạng thái protected hoặc public
Interface mỗi phương thức chỉ ở trạng thái public
![Page 14: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/14.jpg)
• Khi một đối tượng gọi một phương thức, mà phương thức này chưa được định
nghĩa trong class, thì phương thức __call() được gọi để thay thế
• Khi một đối tượng gọi một phương thức static, mà phương thức này chưa được
định nghĩa trong class, thì phương thức __callstatic() được gọi để thay thế
• __call() và __callstatic() phải được khai báo ở trạng thái public
![Page 15: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/15.jpg)
• Lambda là một hàm ẩn danh (hàm không có tên), chỉ đơn giản là các hàm sử dụng
một lần, có thể được định nghĩa vào bất cứ lúc nào, và thường được gắn với một
biến
• Closure tương tự như Lambda, ngoài ra nó có thể truy cập các biến bên ngoài
phạm vị của nó
![Page 16: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/16.jpg)
• Anonymous functions hàm ẩn danh (hàm không có tên)
• Trong lập trình chức năng Lambda được đánh giá khá cao, bởi vì:
o Truyền như một tham số vào hàm khác
o Được gán cho biến
o Được tạo và sử dụng trong thời gian thực thi
![Page 17: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/17.jpg)
• Closure tương tự như Lambda, ngoài ra nó có thể truy cập các biến bên ngoài
phạm vị của nó
![Page 18: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/18.jpg)
• Design pattern cung cấp các "mẫu thiết kế", các giải pháp để giải quyết các vấn đề
chung, thường gặp trong lập trình.
• Có khá nhiều các mẫu design pattern, mỗi loại có thể được dùng để giải quyết một
vấn đề nào đó, tuy nhiên đặc điểm chung là tăng tính dễ bảo trì của phần mềm
![Page 19: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/19.jpg)
• Creational Pattern: Abstract Factory, Factory Method, Singleton, Builder, Prototype
sử dụng một số thủ thuật để khởi tạo đối tượng mà không nhìn thấy từ khóa new
• Structural Pattern: Adapter, Bridge, Composite, Decorator, Facade, Proxy và
Flyweight thiết lập, định nghĩa quan hệ giữa các đối tượng.
• Behavioral Pattern: Interpreter, Template Method, Chain of Responsibility, Command,
Iterator, Mediator, Memento, Observer, State, Strategy và Visitor. thực hiện các
hành vi của đối tượng.
![Page 20: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/20.jpg)
• What ? Đảm bảo chỉ duy nhất môt thực thể của một class được tạo ra
• When? Khi cần tạo ra một class mà class đó chỉ có một đối tượng duy nhất và có
thể truy cập đến đối tượng đó ở bất kỳ nơi đâu
![Page 21: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/21.jpg)
• Decorator thuộc nhóm Structural pattern
• Decorator pattern cho phép thêm method hoặc property của 1 đối tượng trong lúc
chương trình thực thi
![Page 22: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/22.jpg)
• Tạo một đối tượng mà không cần thiết chỉ ra một cách chính xác lớp nào sẽ sẽ
được sử dụng để tạo đối tượng đó.
• Giảm bớt sự phụ thuộc của việc tạo đối tượng với logic của ứng dụng
• Tăng tính dễ đọc và bảo trì của ứng dụng
![Page 23: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/23.jpg)
• Dependency Injection (DI) giúp giảm sự phụ thuộc giữa các lớp, tạo ra sự linh hoạt
cao và tính dễ bảo trì cho ứng dụng
• Lợi ích khi sử dụng DI: giảm sự phụ thuộc giữa các class, tăng khả năng dùng lại và
khả năng dễ đọc của mã nguồn, tạo cho ứng dụng tính mềm dẻo và khả năng nâng
cấp bảo trì trở nên đơn giản và nhanh chóng hơn
![Page 24: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/24.jpg)
ZendVN Công ty tin học
Taxi Vinasun
Vietnam airline
đi công tác
điện thoại đặt vé
khởi hành 20h ngày 20/05
điện thoại đặt xe
khởi hành 19h ngày 20/05
![Page 25: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/25.jpg)
• Thay đổi hãng Taxi
• Thay đổi hãng máy bay
• Thay đổi hình thức đặt vé
![Page 26: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/26.jpg)
ZendVN Công ty tin học
Taxi Vinasun
Vietnam airline
đi công tác vào ngày
21/05/2014
Phòng quản lý
![Page 27: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/27.jpg)
Tránh xung đột đối với tên lớp, tên hàm và tên hằng số giữa tập tin khác nhau
Làm cho mã nguồn ngắn gọn và dễ đọc hơn
Namespaces đơn
Namespaces phân cấp
Multi namespace
Sử dụng hằng số __NAMESPACE__
Truy xuất class, function, constant khi sử dụng namespace
Sử dụng từ khoá use đặt alias cho namespace
![Page 28: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/28.jpg)
![Page 29: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/29.jpg)
![Page 30: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/30.jpg)
![Page 31: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/31.jpg)
![Page 32: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/32.jpg)
![Page 33: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/33.jpg)
![Page 34: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/34.jpg)
![Page 35: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/35.jpg)
![Page 36: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/36.jpg)
![Page 37: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/37.jpg)
![Page 39: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/39.jpg)
![Page 40: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/40.jpg)
![Page 41: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/41.jpg)
Tập tin / Thư mục Thông tin / Chức năng
config Folder chứa các cấu hình
data Folder chứa các tài file dữ liệu được tạo bởi ứng dụng
module Folder chứa các module
public Folder chứa các tập tin thư mục dùng chung
vendor Folder chứa thư viện
![Page 42: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/42.jpg)
Tập tin / Thư mục Thông tin / Chức năng
config Folder chứa các cấu hình cho module
language Folder chứa các tài nguyên ngôn ngữ
src/Application Folder chứa các controller và model của module hiện tại
view/application Folder chứa view cho các controller
view/error Folder chứa view cho các thông báo lỗi
view/layout Folder chứa các layout
![Page 43: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/43.jpg)
![Page 44: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/44.jpg)
config/application.config.php
System configuration
Cấu hình được chuyển đến trình ứng dụng, và sau đó
là Module manager để kích hoạt hệ thống
Được sử dụng ngay lập tức, không kết hợp và không
bị ghi đè với bất kỳ cấu hình nào khác
ModuleManager đọc các cấu hình của các Module
Application configuration
Thứ tự đọc là thứ tự được khai báo trong System
Configuration
Kết hợp các phần tử service_manager ở mỗi module
Kết hợp cấu hình được trả bởi Module::getConfig()
Tập tin cấu hình được thiết lập ở config_glob_paths được kết hợp lại dựa trên
thứ tự được khai báo
ConfigListener kết hợp các cấu hình và gửi về ServiceManager
![Page 45: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/45.jpg)
![Page 46: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/46.jpg)
![Page 47: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/47.jpg)
![Page 48: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/48.jpg)
![Page 49: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/49.jpg)
![Page 50: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/50.jpg)
![Page 51: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/51.jpg)
Filter Class Input Output
Zend\I18n\Filter\Alnum abc !@#$^&*( dec 12 ()*() 12 abcdec1212
Zend\I18n\Filter\Alpha abc !@#$^&*( dec 12 ()*() 12 abcdec
Zend\Filter\BaseName www.zend.vn/public/test.html test.html
Zend\Filter\Dir www.zend.vn/public/test.html www.zend.vn/public/
Zend\Filter\Callback Gọi các phương thức xử lý khác đã được xây dựng sẵn
Zend\Filter\Digits Zend Framework 2.34 !@# 234
Zend\Filter\StringToLower Khóa học Zend Framework 2 khóa học zend framework 2
Zend\Filter\StringToUpper Khóa học Zend Framework 2 KHÓA HỌC ZEND FRAMEWORK 2
![Page 52: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/52.jpg)
Filter Class Input Output
Zend\Filter\StringTrim Zend Framework 2 Zend Framework 2
Zend\Filter\StripTags
<h3>Khóa học lập trình <a
href="www.zend.vn">Zend Framework
2</a></h3>
Khóa học lập trình Zend Framework 2
Zend\Filter\Compress Abc.txt Abc.zip
Zend\Filter\Decompress Abc.zip Abc.txt
Zend\Filter\PregReplace Sử dụng biểu thức chính quy trong Filter
Zend\Filter\HtmlEntities This is a test " <> This is a test " <>
![Page 53: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/53.jpg)
Filter Class Input Output
Zend\Filter\Word\CamelCaseToDash AbcDefGeh Abc-Def-Geh
Zend\Filter\Word\CamelCaseToSeparator AbcDefGeh Abc(x)Def(x)Geh
Zend\Filter\Word\CamelCaseToUnderscore AbcDefGeh Abc_Def_Geh
Zend\Filter\Word\DashToCamelCase Abc-Def-Geh AbcDefGeh
Zend\Filter\Word\DashToSeparator Abc-Def-Geh Abc(x)Def(x)Geh
Zend\Filter\Word\DashToUnderscore Abc-Def-Geh Abc_Def_Geh
![Page 54: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/54.jpg)
Filter Class Input Output
Zend\Filter\Word\SeparatorToCamelCase Abc(x)Def(x)Geh AbcDefGeh
Zend\Filter\Word\SeparatorToDash Abc(x)Def(x)Geh Abc-Def-Geh
Zend\Filter\Word\SeparatorToSeparator Abc(x)Def(x)Geh Abc(x)Def(x)Geh
Zend\Filter\Word\UnderscoreToCamelCase Abc_Def_Geh AbcDefGeh
Zend\Filter\Word\UnderscoreToSeparator Abc_Def_Geh Abc(x)Def(x)Geh
Zend\Filter\Word\UnderscoreToDash Abc_Def_Geh Abc-Def-Geh
![Page 55: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/55.jpg)
![Page 56: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/56.jpg)
![Page 57: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/57.jpg)
![Page 58: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/58.jpg)
![Page 59: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/59.jpg)
![Page 60: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/60.jpg)
![Page 62: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/62.jpg)
![Page 63: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/63.jpg)
![Page 64: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/64.jpg)
![Page 65: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/65.jpg)
![Page 66: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/66.jpg)
![Page 67: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/67.jpg)
![Page 68: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/68.jpg)
![Page 69: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/69.jpg)
![Page 70: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/70.jpg)
![Page 71: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/71.jpg)
![Page 72: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/72.jpg)
![Page 73: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/73.jpg)
![Page 74: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/74.jpg)
Thay đổi layout đang hiển thị
![Page 75: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/75.jpg)
Zend\View\Helper\BasePath
<a href="<?php echo $this->basePath(); ?>">basePath</a>
<link rel="stylesheet" type="text/css"href="<?php echo $this->basePath('css/base.css'); ?>"
/>
![Page 76: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/76.jpg)
Zend\View\Helper\Cycle
<table><?php foreach ($this->course as $book): ?>
<tr style="background-color: <?php echo $this->cycle(array('red', 'yellow'))->next() ?>">
<td><?php echo $this->escapeHtml($book['name']) ?></td></tr>
<?php endforeach ?></table>
![Page 77: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/77.jpg)
Zend\View\Helper\Doctype
<?php echo $this->docType(); ?>
![Page 78: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/78.jpg)
Zend\View\Helper\EscapeX
<?php echo $this->escapeHtml($value);?>
![Page 79: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/79.jpg)
Zend\View\Helper\Gravatar
$settings = array('img_size' => 40,'default_img' => \Zend\View\Helper\Gravatar::DEFAULT_MM,'secure' => null,
);$email = '[email protected]';echo $this->gravatar($email, $settings);
![Page 80: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/80.jpg)
Zend\View\Helper\HeadTitle
![Page 81: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/81.jpg)
Zend\View\Helper\HeadMeta
![Page 82: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/82.jpg)
Zend\View\Helper\HeadLink
$renderer = $this->getServiceLocator()->get('Zend\View\Renderer\PhpRenderer');$headLink = $renderer->headLink();
$headLink->appendStylesheet(PUBLIC_URL . '/css/style.css', 'screen');$headLink->appendStylesheet(PUBLIC_URL . '/css/bootstrap.css', 'screen');$headLink->appendStylesheet(PUBLIC_URL . '/css/bootstrap1.css', 'screen', 'lte IE6');
$headLink->offsetSetStylesheet(0, PUBLIC_URL . '/css/bootstrap1.css', 'screen');$headLink->getContainer()->exchangeArray(array());
![Page 83: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/83.jpg)
Zend\View\Helper\HeadScript
$renderer = $this->getServiceLocator()->get('Zend\View\Renderer\PhpRenderer');$headScript = $renderer->headScript();
$headScript->appendFile(PUBLIC_URL . '/js/jquery.min.js', 'text/javascript');$headScript->appendFile(PUBLIC_URL . '/js/bootstrap.js', 'text/javascript', array('conditional' => 'lt IE 7'));$headScript->offsetSetFile(0, PUBLIC_URL . '/js/bootstrap.min.js', 'text/javascript');
![Page 84: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/84.jpg)
Zend\View\Helper\InlineScript
$viewhelpermanager = $this->getServiceLocator()->get('viewhelpermanager');$script = $viewhelpermanager->get('inlineScript');$script->appendScript(
'$(document).ready(function() { alert("Hello"); });','text/javascript',array('noescape' => true)); // Disable CDATA comments
![Page 85: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/85.jpg)
Zend\View\Helper\HtmlList
$this->htmlList($items, $ordered, $attribs, $escapes);
![Page 86: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/86.jpg)
Zend\View\Helper\HtmlFlash
echo $this->htmlFlash($data, $attribs, $params, $content);
![Page 87: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/87.jpg)
Zend\View\Helper\Json
echo $this->json($arrayData);
![Page 88: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/88.jpg)
Zend\View\Helper\Partial
<?phpecho $this->partial('course.phtml', array(
'name' => 'Khóa học lập trình PHP','description' => 'PHP đã và đang trở thành một ngôn ngữ lập trình phổ...','attributes' => array(
'color' => 'yellow','font-weight'=> 'bold'
)));
?>
![Page 89: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/89.jpg)
Zend\View\Helper\PartialLoop
echo $this->partialLoop('course.phtml', $arrCourse);
![Page 90: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/90.jpg)
Zend\View\Helper\Placeholder
$this->placeholder('fooTwo')->exchangeArray($arrCourse);$this->placeholder('fooTwo')->setPrefix('<ul><li>')
->setPostfix('</li></ul>')->setSeparator('</li><li>');
echo $this->placeholder('fooTwo');
<?php $this->placeholder('foo')->captureStart(); ?><div>
<h3 style="color:blue">Khóa học lập trình PHP</h3><p>PHP ngôn ngữ lập trình phổ biến trong các ứng dụng web… </p>
</div><?php $this->placeholder('foo')->captureEnd() ?>
<?php echo $this->placeholder('foo') ?>
![Page 91: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/91.jpg)
$this->currencyFormat()
![Page 92: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/92.jpg)
$this->dateFormat()
![Page 93: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/93.jpg)
$this->numberFormat()
![Page 94: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/94.jpg)
Zend\View\Helper\ServerUrl
$serverURL = $this->serverUrl();
echo '<h3 style="color:red;">$serverURL: ' . $serverURL .'</h3>';
![Page 95: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/95.jpg)
![Page 96: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/96.jpg)
Tìm hiểu các key word trong view_manager
'view_manager' => array('display_not_found_reason' => true,'not_found_template' => 'error/404','display_exceptions' => true,'exception_template' => 'error/index','doctype' => 'HTML5','template_map' => array(
'layout/layout' => __DIR__ . '/../view/layout/layout.phtml','error/404' => __DIR__ . '/../view/error/404.phtml','error/index' => __DIR__ . '/../view/error/index.phtml',
),'template_path_stack' => array( __DIR__ . '/../view'),'default_template_suffix' => 'php','layout' => 'layout/layout'
),
![Page 97: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/97.jpg)
Truyền dữ liệu từ Controller ra View
return array('message' => 'Hello world','message2' => 'Hello world 2',
);
$view = new ViewModel();$view->setVariables(array(
'variable_one' => 'Some Variable','variable_two' => 'Some other Variable',
));return $view;
![Page 98: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/98.jpg)
Lý thuyết
![Page 99: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/99.jpg)
Tìm hiểu các lớp router
![Page 100: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/100.jpg)
Chuẩn bị
![Page 101: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/101.jpg)
Zend\Mvc\Router\Http\Hostname
$hostnameRoute = array(
'type' => 'hostname',
'options' => array(
'route' => 'zendskeleton.training.com',
'defaults' => array(
'__NAMESPACE__' => 'Mvc\Controller',
'controller' => 'Index',
'action' => 'index'
)
)
);
![Page 102: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/102.jpg)
Zend\Mvc\Router\Http\Literal
$literalRoute = array(
'type' => 'Literal',
'options' => array(
'route' => '/contact',
'defaults' => array(
'__NAMESPACE__' => 'Mvc\Controller',
'controller' => 'Index',
'action' => 'index'
),
),
);
![Page 103: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/103.jpg)
Zend\Mvc\Router\Http\Scheme
$schemeAccountRoute = array(
'type' => 'Scheme',
'options' => array(
'route' => '/account',
'scheme' => 'http',
'defaults' => array(
'__NAMESPACE__ => 'Mvc\Controller',
'controller' => 'Index',
'action' => 'account',
),
),
);
![Page 104: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/104.jpg)
Zend\Mvc\Router\Http\Segment
$segmentRoute = array(
'type' => 'Segment',
'options' => array(
'route' => '/:module[/]',
'constraints' => array(
'module' => 'm..',
),
'defaults' => array(
'__NAMESPACE__ => 'Mvc\Controller',
'controller' => 'index',
'action' => 'segment',
),
),
);
![Page 105: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/105.jpg)
Zend\Mvc\Router\Http\Regex
$regexRoute = array('type' => 'Regex','options' => array(
'regex' => '/course/(?<name>[a-zA-Z0-9-]+)-(?<id>[0-9]+)\.(?<extension>(html|php|asp))',
'defaults' => array('__NAMESPACE__' => 'Mvc\Controller','controller' => 'Router','action' => 'course','name' => 'zend-2x','id' => '100','extension' => 'phtml',
),'spec' => '/course/%name%-%id%.%extension%',
),);
![Page 106: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/106.jpg)
Router Types
![Page 107: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/107.jpg)
Tree Routing
$route = array('type‘ => 'Literal','options' => array(
'route' => '/account','defaults' => array(),
),'may_terminate'=> true,'child_routes'=> array(
'query' => array('type' => 'segment','options' => array(
'route' => '/profile[/type/:upload]','defaults' => array( 'action' => 'course' ),'constraints' => array( 'upload'=> '[0,1]', ),
),),
),);
![Page 108: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/108.jpg)
![Page 109: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/109.jpg)
Tìm hiểu các controller plugins (Zend\Mvc\Controller\Plugin\)
![Page 110: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/110.jpg)
Zend\Mvc\Controller\Plugin\Forward
public function forwardAction(){return $this->forward()->dispatch('Mvc/controller/Index', array(
'action' => 'detail','params' => array(
'name'=> 'John smith','age'=> 21,
)));
}
public function detailAction(){$object = $this->params('params');return false;
}
![Page 111: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/111.jpg)
Zend\Mvc\Controller\Plugin\Layout
$this->layout()->setTemplate('view/abc');
$this->layout('layout/home');
![Page 112: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/112.jpg)
Zend\Mvc\Controller\Plugin\Params
$paramPost= $this->params()->fromPost();
echo $paramQuery= $this->params()->fromQuery('username');
$paramRoute= $this->params()->fromRoute('name');
$paramHeader= $this->params()->fromHeader();
$paramFiles= $this->params()->fromFiles();
Params Plugin giúp nhận các tham số ở Action từ các nguồn khác nhau
![Page 113: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/113.jpg)
Zend\Mvc\Controller\Plugin\Redirect
$this->redirect()->toUrl('http://www.zend.vn');
$this->redirect()->toRoute('regexRoute', array('name'=> 'lap-trinh-zend-framework-2x','id'=> 100,'extension' => 'html'
));
Redirect (sự chuyển hướng) là quá trình chuyển từ URL này đến một URL khác
![Page 114: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/114.jpg)
Zend\Mvc\Controller\Plugin\Url
$params= array('name' => 'lap-trinh-ios', 'id' => 989, 'extension' => 'php'
);
$router = $this->getEvent()->getRouter();$url = $router->assemble($params, array('name' => 'regexRoute'));
$url = $this->url()->fromRoute('regexRoute', $params);
![Page 115: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/115.jpg)
Zend\Mvc\Controller\Plugin\FlashMessenger (P1)
public function flashMessenger01Action() {
$flashMessenger = $this->flashMessenger();$flashMessenger->addInfoMessage('InfoMessage 1');$flashMessenger->addInfoMessage('InfoMessage 2');if($flashMessenger->hasCurrentInfoMessages()){
$infoMessages = $flashMessenger->getInfoMessages();}else{
echo '<h3 style="color:red;">No message</h3>';}
}
![Page 116: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/116.jpg)
Zend\Mvc\Controller\Plugin\FlashMessenger (P2)
public function flashMessenger02Action(){
$flashMessenger = $this->flashMessenger();$flashMessenger->addInfoMessage('InfoMessage 1');$flashMessenger->addInfoMessage('InfoMessage 2');$flashMessenger->addErrorMessage('ErrorMessage 1');
$infoMessages = $flashMessenger->getInfoMessages();$errorMessages = $flashMessenger->getErrorMessages();
$flashMessenger->clearMessagesFromNamespace('info');$flashMessenger->clearMessagesFromContainer();
return false;
}
![Page 117: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/117.jpg)
Zend\Mvc\Controller\Plugin\FlashMessenger (P3)
public function flashMessenger03Action(){$flashMessenger= $this->flashMessenger();
$namespace= $flashMessenger->getNamespace();$flashMessenger->setNamespace('zendvn');$flashMessenger->addMessage('Zend framework 2.x 1');
if($flashMessenger->hasMessages()){$messages = $flashMessenger->getMessages();
}else{echo '<h3 style="color:red;">No message</h3>';
}
return false;}
![Page 118: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/118.jpg)
Zend\Mvc\Controller\Plugin\FlashMessenger (P4)
public function flashMessenger05Action(){$this->flashMessenger()->addSuccessMessage('Bạn đã đăng nhập thành công!');return $this->redirect()->toRoute('mvcRoute/default', array(
'controller'=> 'index','action'=> 'success'
));}
public function successAction(){$flashMessenger = $this->flashMessenger();
if ($flashMessenger->hasSuccessMessages()) {$result['messages'] = $flashMessenger->getSuccessMessages();
}return $result;
}
![Page 119: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/119.jpg)
Zend\Mvc\Controller\Plugin\FlashMessenger (P5)
echo $this->flashMessenger()->render('error', array('alert', 'alert-danger'));
echo $this->flashMessenger()->setMessageOpenFormat('<div><h4>')->setMessageSeparatorString('</h4><h4>')->setMessageCloseString('</h4></div>')->render('error');
'view_helper_config' => array('flashmessenger' => array(
'message_open_format' => '<div><h4>','message_close_string' => '</h4><h4>','message_separator_string' => '</h4></div>'
))
![Page 120: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/120.jpg)
Xây dựng Controller Plugin
![Page 121: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/121.jpg)
Zend\Mvc\Controller\Plugin\Url
$params= array('name' => 'lap-trinh-ios', 'id' => 989, 'extension' => 'php'
);
$router = $this->getEvent()->getRouter();$url = $router->assemble($params, array('name' => 'regexRoute'));
$url = $this->url()->fromRoute('regexRoute', $params);
![Page 122: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/122.jpg)
Zend\Mvc\Controller\Plugin\Url
$params= array('name' => 'lap-trinh-ios', 'id' => 989, 'extension' => 'php'
);
$router = $this->getEvent()->getRouter();$url = $router->assemble($params, array('name' => 'regexRoute'));
$url = $this->url()->fromRoute('regexRoute', $params);
![Page 123: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/123.jpg)
Zend\Mvc\Controller\Plugin\Url
$params= array('name' => 'lap-trinh-ios', 'id' => 989, 'extension' => 'php'
);
$router = $this->getEvent()->getRouter();$url = $router->assemble($params, array('name' => 'regexRoute'));
$url = $this->url()->fromRoute('regexRoute', $params);
![Page 124: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/124.jpg)
Zend\Mvc\Controller\Plugin\Url
$params= array('name' => 'lap-trinh-ios', 'id' => 989, 'extension' => 'php'
);
$router = $this->getEvent()->getRouter();$url = $router->assemble($params, array('name' => 'regexRoute'));
$url = $this->url()->fromRoute('regexRoute', $params);
![Page 125: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/125.jpg)
Zend\Mvc\Controller\Plugin\Url
$params= array('name' => 'lap-trinh-ios', 'id' => 989, 'extension' => 'php'
);
$router = $this->getEvent()->getRouter();$url = $router->assemble($params, array('name' => 'regexRoute'));
$url = $this->url()->fromRoute('regexRoute', $params);
![Page 126: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/126.jpg)
![Page 127: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/127.jpg)
Giới thiệu
![Page 128: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/128.jpg)
Các lớp Validator phổ biến
![Page 129: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/129.jpg)
Tùy biến thông báo lỗi
$validator->setMessages(array(\Zend\Validator\StringLength::TOO_SHORT =>
"Giá trị đầu vào <b>%value%</b> phải lớn hơn %min% ký tự",\Zend\Validator\StringLength::TOO_LONG =>
"Giá trị đầu vào <b>%value%</b> phải nhỏ hơn %max% ký tự",));
$validator = new \ZendVN\Validator\StringLength(array('max' => 9,'min' => 7
));
![Page 130: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/130.jpg)
ValidatorChain
$validatorChain = new \Zend\Validator\ValidatorChain();
$validatorChain->attach(new \Zend\Validator\StringLength(array('min' => 6,'max' => 12)), true)
->attach(new \Zend\Validator\EmailAddress());
![Page 131: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/131.jpg)
Xây dựng lớp Validate
![Page 132: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/132.jpg)
Quá trình upload tập tin
![Page 133: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/133.jpg)
Thao tác upload với một tập tin
if($this->request->isPost()){$upload = new \Zend\File\Transfer\Adapter\Http();$fileInfo= $upload->getFileInfo();$fileSize= $upload->getFileSize();$fileName= $upload->getFileName();$upload->setDestination(FILES_PATH . '/photo');$upload->receive();
}
![Page 134: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/134.jpg)
Thao tác upload với nhiều tập tin
if($this->request->isPost()){$upload = new \Zend\File\Transfer\Adapter\Http();
// Mảng lưu trữ thông tin của một file upload$file01Info= $upload->getFileInfo('my_file_01');
$upload->setDestination(FILES_PATH . '/photo', 'my_file_01');$upload->receive('my_file_01');
}
![Page 135: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/135.jpg)
Kiểm tra điều kiện upload tập tin
if($this->request->isPost()){$upload = new \Zend\File\Transfer\Adapter\Http();$upload->addValidator('Extension', true, array('png', 'jpg'), 'picture');$upload->addValidator('Size', false, array('min' => '10Kb', 'max' => '8mb'), 'zip');$upload->setDestination(FILES_PATH . '/photo', 'my_file_01');$upload->setDestination(FILES_PATH . '/zip', 'my_file_02');
$fileName = $upload->getFileName();foreach($fileName as $key => $value){
if($upload->isValid($key)){$upload->receive($key);
}else{$messages= $upload->getMessages();echo current($messages);
}}
}
![Page 136: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/136.jpg)
Sử dụng Filter
if($this->request->isPost()){$upload = new \Zend\File\Transfer\Adapter\Http();
$upload->addValidator('Extension', true, array('doc', 'png', 'jpg'), 'my_file_01');$options= array(
'target'=> FILES_PATH . '/photo/my_file_01.jpg','overwrite' => true,'randomize' => true,
);$upload->addFilter('Rename',$options,'my_file_01');
if($upload->isValid('my_file_01')){$upload->receive('my_file_01');
}else{$messages= $upload->getMessages();echo current($messages);
}}
![Page 137: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/137.jpg)
Các loại input mới
![Page 138: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/138.jpg)
Các thuộc tính mới trong thẻ <form>
![Page 139: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/139.jpg)
Các thuộc tính mới trong thẻ <input>
![Page 140: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/140.jpg)
Zend\Form\Element
![Page 141: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/141.jpg)
Zend\Form\View\Helper
![Page 142: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/142.jpg)
Zend\Form\Element
![Page 143: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/143.jpg)
Ràng buộc dữ liệu với InputFilter
![Page 144: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/144.jpg)
Fieldset
![Page 145: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/145.jpg)
Tùy biến giao diện thông báo lỗi (Dạng 1)
![Page 146: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/146.jpg)
Tùy biến giao diện thông báo lỗi (Dạng 2)
![Page 147: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/147.jpg)
Tùy biến giao diện thông báo lỗi (Dạng 3)
![Page 148: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/148.jpg)
Các vấn đề khác
![Page 149: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/149.jpg)
Sử dụng Ajax trong Zend Framework (Load content)
![Page 150: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/150.jpg)
Sử dụng Ajax trong Zend Framework (Selectbox)
![Page 151: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/151.jpg)
![Page 152: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/152.jpg)
Kết nối cơ sở dữ liệu
$adapter = new \Zend\Db\Adapter\Adapter(array('driver' => 'Pdo_Mysql','database' => 'bookstore','username' => 'root','password' => '','charset' => 'utf8',
));
![Page 153: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/153.jpg)
Thực hiện SQL đơn giản
$result= $adapter->query('SELECT * FROM `user` WHERE `id` = ?', array(5));
$sql = 'SELECT * FROM '. $adapter->platform->quoteIdentifier('user'). ' WHERE ' . $adapter->platform->quoteIdentifier('id') . ' = ' . $adapter-
>driver->formatParameterName('id');
$statement = $adapter->query($sql);$parameters = array('id' => 2);$results = $statement->execute($parameters);
![Page 154: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/154.jpg)
Đăng ký Adapter qua Servicemanager
'service_manager'=> array('factories'=> array(
'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory',),
)
$adapter = $this->getServiceLocator()->get('Zend\Db\Adapter\Adapter');
![Page 155: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/155.jpg)
Giới thiệu
![Page 156: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/156.jpg)
Các trường hợp truy vấn cần thực hiện
![Page 157: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/157.jpg)
Các trường hợp truy vấn cần thực hiện
![Page 158: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/158.jpg)
![Page 159: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/159.jpg)
Kiểm tra dữ liệu với Zend\Db\Sql\Predicate\ trong mệnh đề WHERE
![Page 160: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/160.jpg)
Insert – Update – Delete
![Page 161: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/161.jpg)
Xây dựng class database kế thừa từ AbstractTableGateway
![Page 162: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/162.jpg)
Kiểm tra sự tồn tại của dữ liệu
![Page 163: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/163.jpg)
Bài tập tìm kiếm thông tin user theo địa chỉ email
![Page 164: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/164.jpg)
Thông tin
![Page 165: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/165.jpg)
List user
![Page 166: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/166.jpg)
Form add (edit)
![Page 167: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/167.jpg)
Bổ sung chức năng
![Page 168: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/168.jpg)
![Page 169: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/169.jpg)
Các vấn đề cần tìm hiểu
![Page 170: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/170.jpg)
Các vấn đề cần tìm hiểu
![Page 171: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/171.jpg)
Các vấn đề cần tìm hiểu
![Page 173: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/173.jpg)
Tích hợp & Sử dụng module ZF2-AcMailer
Alejandro Celayaacelaya
Abdul Malik Ikhsansamsonasik
![Page 174: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/174.jpg)
Các vấn đề cần tìm hiểu
![Page 175: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/175.jpg)
Bài tập
Page Login Page Logout
Page User
![Page 176: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/176.jpg)
Member
Manager
Admin
Zend\Permissions\Acl\Resource\GenericResource
NewsController
index
info
add
edit
delete
parent
allow
![Page 177: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/177.jpg)
![Page 178: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/178.jpg)
Member
Manager
Admin
Zend\Permissions\Acl\Resource\GenericResource
NewsController
index
info
add
edit
delete
BooksController
index
info
add
edit
delete
![Page 179: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/179.jpg)
Module ABC
Admin
Zend\Permissions\Acl\Resource\GenericResource
NewsController
index
info
add
edit
delete
BooksController
index
info
add
edit
delete
Module DEF
UsersController
index
info
add
edit
delete
GroupsControllerindex
info
add
edit
delete
![Page 180: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/180.jpg)
![Page 181: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/181.jpg)
Xây dựng cấu trúc ứng dụng
![Page 182: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/182.jpg)
Xây dựng cấu trúc tập tin và thư mục
Các tập tin application.config.php, global.php,
local.php, để đơn giản trả về array rỗng
Truy cập vào index.php để kiểm tra kết quả
![Page 183: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/183.jpg)
xampp\apache\conf\extra\httpd-vhosts.conf
C:\Windows\System32\drivers\etc
![Page 184: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/184.jpg)
public/define.php
![Page 185: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/185.jpg)
public/index.php
![Page 186: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/186.jpg)
/config/application.config.php
![Page 187: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/187.jpg)
• Xây dựng cấu trúc tập tin và thư mục như hình vẽ
• Xây dựng controller và tập tin view của action
index trong controller đó
• Xây dựng tập tin Module.php chưa sử dụng
autoload_classmap.php
• Xây dựng module.config.php
![Page 188: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/188.jpg)
/module/Backend/Module.php
![Page 189: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/189.jpg)
/module/Backend/config/module.config.php
![Page 190: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/190.jpg)
/module/Backend/Module.php
![Page 191: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/191.jpg)
Cập nhật phương thức getConfig trong tập tin Module.php
Cấu trúc thư mục
![Page 192: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/192.jpg)
Cấu trúc thư mục
Cập nhật phương thức getAutoloaderConfig trong tập tin Module.php
![Page 193: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/193.jpg)
Cấu trúc thư mục
Thay đổi layout đối với tập tin view
![Page 194: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/194.jpg)
1. Sử dụng .htaccess
2. Tạo thêm tập tin index.php “ảo”
3. Cấu hình lại virtualhost
(keyword: zend framework 2 remove public from url)
![Page 195: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/195.jpg)
1. Đặt folder Zendvn cùng cấp với folder Zend
2. Điều chỉnh namespace cho phù hợp (phân biệt hoa – thường)
3. Kiểm tra một số class đã hoạt động tốt hay chưa
![Page 196: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/196.jpg)
![Page 197: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/197.jpg)
Full document & source: https://github.com/zendframework/ZendDeveloperTools
![Page 198: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/198.jpg)
![Page 199: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/199.jpg)
Xây dựng ứng dụng Bookstore (Backend)
![Page 200: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/200.jpg)
Xây dựng cấu trúc project
Xây dựng hệ thống folder chứa các giao diện của ứng dụng
Hướng dẫn thay đổi giao diện đối với mỗi module
![Page 201: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/201.jpg)
Xây dựng header
Xây dựng breadcrumb
Xây dựng sidebar
Xây dựng dashboard
![Page 202: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/202.jpg)
1. Cơ sở dữ liệu lưu trữ thông tin group
2. Kết nối cơ sơ dữ liệu trong dự án
3. Hiển thị danh sách group
4. Phân trang
5. Sắp xếp danh sách
6. Lọc danh sách theo trạng thái của group
7. Lọc danh sách theo giá trị được tìm kiếm
![Page 203: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/203.jpg)
8. Thay đổi trạng thái (status) của một group
9. Thay đổi trạng thái (status) của nhiều group
10.Thay đổi thứ tự sắp xếp (ordering) của một hoặc nhiều group
11.Xóa một hoặc nhiều group
12.Xem thông tin chi tiết của một group
13.Thêm mới group (add)
14.Cập nhật thông tin của một group nào đó (edit)
![Page 204: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/204.jpg)
1. Cơ sở dữ liệu lưu trữ thông tin user
2. Xây dựng trang index với order, status (multi), paginator, delete (multi), search
(keyword, status, group)
3. Xây dựng formAction với các lưu ý:
Thêm mới và chỉnh sửa thông tin của một group
Điều kiện username và email duy nhất
Chỉnh sửa thông tin nhưng không thay đổi mật khẩu
![Page 205: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/205.jpg)
Download & document: http://phpimageworkshop.com/
Tìm hiểu các thao tác trên hình ảnh: Cropping, Filter, Flip, Opacity, Resizing,
Rotating, Writing
Tạo watermark cho hình ảnh
Lưu hình ảnh
![Page 206: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/206.jpg)
Cập nhật lại giao diện hiển thị danh sách người dùng
Upload và lưu trữ hình ảnh gốc mà người dùng đã upload
Resize hình ảnh (tỉ lệ ?)
Xử lý trường hợp người dùng cập nhật thông tin user nhưng không thay đổi avatar
Lưu ý trường hợp xóa tài khoản của một người dùng cần xóa luôn cả hình ảnh của
người dùng.
![Page 207: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/207.jpg)
1. Download, cài đặt và nhúng CKEditor vào ứng dụng
2. Tùy chỉnh giao diện cho CKEditor: language, size, color, resize
3. Tùy chỉnh toolbar cho CKEditor: item, button, plugin, …
4. Cấu hình CKEditor với ràng buộc dữ liệu
5. Cài đặt plugin và skin cho CKEditor
6. Tích hợp CKFinder vào CKEditor
![Page 208: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/208.jpg)
1. Tích hợp CKEditor vào project Zend 2
2. Kiểm tra dữ liệu hợp lệ
3. Lọc và hiển thị dữ liệu
![Page 209: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/209.jpg)
Quản trị hệ thống menu (category) đa cấp
Chuyên ngành
Kinh tế
Tạp chí
Tiếng anh
…
Doanh nhân Khởi nghiệp Lãnh đạo
Nhân sự
![Page 210: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/210.jpg)
Quản trị hệ thống menu (category) đa cấp
![Page 211: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/211.jpg)
Root0 23
Quản trị hệ thống menu (category) đa cấp
Chuyên ngành
1 2 Kinh tế3 12 Tạp chí13 20 Tiếng anh21 22
Doanh nhân
4 5 Khởi nghiệp
6 7 Lãnh đạo
8 11 IT14 17 Sức khỏe
18 19
Nhân sự
9 10 Echip15 16
![Page 212: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/212.jpg)
Quản trị hệ thống menu (category) đa cấp
![Page 213: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/213.jpg)
• Hiển thị toàn bộ cây menu (category) có phân cấp
• Hiển thị cây menu (category) theo level
• Hiển thị nhánh cây menu (category)
• Hiển thị đường đi đến một nút nào đó (breadcrumb)
![Page 214: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/214.jpg)
Root0 1
Root0 3
A1 2
Nút gốc Nút gốc có 1 con
Root
Nút gốc có 2 con
0
1
5
4A B2 3
![Page 215: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/215.jpg)
Root0 7
B3 4 C5 6
New ? ?
A1 2
4 trường hợp thêm node vào cây
![Page 216: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/216.jpg)
Root0 7
B3 4 C5 6
New ? ?
A1 2
4 trường hợp thêm node vào cây
left right
beforeafter
![Page 217: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/217.jpg)
Root0 9
B3 6 C7 8
New 6 7
A1 2
4 trường hợp thêm node vào cây (right)
right
B14 5
![Page 218: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/218.jpg)
Root0 9
B3 6 C7 8
New 6 7
A1 2
4 trường hợp thêm node vào cây (right)
right
8 9 10
11
B14 5
![Page 219: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/219.jpg)
Root0 9
B3 6 C7 8
New 6 7
A1 2
4 trường hợp thêm node vào cây (right)
right
8 9 10
11Left = Left + 2
(left > ParentRight)Right = Right + 2
(right >= ParentRight)
Left = ParentRightRight = ParentRight + 1Level = ParentLevel + 1Parent = ParentID
B14 5
![Page 220: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/220.jpg)
Root0 9
B3 6 C7 8
New 6 7
A1 2
4 trường hợp thêm node vào cây (left)
left
B14 5
![Page 221: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/221.jpg)
Root0 9
B3 6 C7 8
New 4 5
A1 2
4 trường hợp thêm node vào cây (left)
left
8 9 10
11
B14 5
6 7
![Page 222: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/222.jpg)
Root0 9
B3 6 C7 8
New 4 5
A1 2
4 trường hợp thêm node vào cây (left)
left
8 9 10
11Left = Left + 2
(left > ParentLeft)Right = Right + 2
(right > ParentLeft)
Left = ParentLeft + 1Right = ParentLeft + 2Level = ParentLevel + 1Parent = ParentID
B14 5
6 7
![Page 223: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/223.jpg)
Root0 7
B3 4 C5 6
New 3 4
A1 2
4 trường hợp thêm node vào cây (before)
8
before
![Page 224: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/224.jpg)
Root0 7
B3 4 C5 6
New 3 4
A1 2
4 trường hợp thêm node vào cây (before)
before
6 7 8
9
5
![Page 225: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/225.jpg)
Root0 7
B3 4 C5 6
New 3 4
A1 2
4 trường hợp thêm node vào cây (before)
before
6 7 8
9
Left = Left + 2(left >= BrotherLeft)
Right = Right + 2 (right > BrotherLeft)
Left = BrotherLeftRight = BrotherLeft + 1Level = BrotherLevelParent = BrotherParent
5
![Page 226: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/226.jpg)
Root0 7
B3 4 C5 6
New 5 6
A1 2
4 trường hợp thêm node vào cây (after)
after
![Page 227: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/227.jpg)
Root0 7
B3 4 C5 6
New 5 6
A1 2
4 trường hợp thêm node vào cây (after)
after
7 8
9
![Page 228: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/228.jpg)
Root0 7
B3 4 C5 6
New 5 6
A1 2
4 trường hợp thêm node vào cây (after)
after
7 8
9
Left = Left + 2(left > BrotherRight)
Right = Right + 2 (right > BrotherRight)
Left = BrotherRight + 1Right = BrotherRight + 2Level = BrotherLevelParent = BrotherParent
![Page 229: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/229.jpg)
Tách nhánh trên cây (Tình huống)
Root0 17
B3 6 C7 8 E15 16D9 14A1 2
B14 5 D110 11 D212 13
![Page 230: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/230.jpg)
Tách nhánh trên cây (bước 1)
Root0 17
B3 6 C7 8 E15 16D9 14A1 2
B14 5 D110 11 D212 13
0
1
left = left – nodeMove[left]right = right – nodeMove[right]nodeMove[left] <= left <= nodeMove[right]
0
-1
![Page 231: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/231.jpg)
Tách nhánh trên cây (bước 2)
Root0 17
C7 8 E15 16D9 14A1 2
D110 11 D212 13
TotalNode= (right – left + 1)/2Left = left – totalNode*2
left > nodeMove[right]Right = right – totalNode*2
right > nodeMove[right]
3 4
6
5 10 12
7 8 9
11
13
B3 6
B14 5
0
1
0
-1
![Page 232: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/232.jpg)
Kết quả tách nhánh trên cây
Root0 13
C3 4 E11 12D5 10A1 2
B0 0
B11 -1
D16 7 D28 9
left right
before after
![Page 233: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/233.jpg)
Thêm nhánh vào cây ở vị trí right (tình huống)
Root0 13
C3 4 E11 12D5 10A1 2
B0 0
B11 -1
D16 7 D28 9
right
![Page 234: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/234.jpg)
Thêm nhánh vào cây ở vị trí right (kết quả)
Root0 13
C3 4 E11 12D5 10A1 2
B0 0
B11 -1
D16 7 D28 9
right
10 13
11 12
14 15 16
17
![Page 235: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/235.jpg)
Thêm nhánh vào cây ở vị trí right (thuật toán node trên cây)
Root0 13
C3 4
E11 12
D5 10A1 2
B0 0
B11 -1D16 7 D28 9
right
10 13
11 12
14
15 16
17
Left = Left + totalNode*2(left > ParentRight & right > 0)
Right = Right + totalNode*2(right >= ParentRight)
![Page 236: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/236.jpg)
Thêm nhánh vào cây ở vị trí right (thuật toán node trên nhánh)
Root0 13
C3 4
E11 12
D5 10A1 2
B0 0
B11 -1D16 7 D28 9
right
10 13
11 12
14
15 16
17
Level = level –nodeMoveLevel + ParentLevel + 1(right <= 0)nodeMove[parent] = ParentID
Left = left + ParentRight (right <= 0)
Right = right + ParentRight +totalNode*2 - 1 (right <= 0)
![Page 237: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/237.jpg)
Thêm nhánh vào cây ở vị trí left (tình huống)
Root0 13
C3 4 E11 12D5 10A1 2
B0 0
B11 -1D16 7 D28 9
left
![Page 238: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/238.jpg)
Thêm nhánh vào cây ở vị trí left (kết quả)
Root0 13
C3 4 E11 12D5 10A1 2
B0 0
B11 -1D16 7 D28 9
left
12 1310 11
1415 16
17
6
7
9
8
![Page 239: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/239.jpg)
Thêm nhánh vào cây ở vị trí left (thuật toán node trên cây)
Root0 13
C3 4 E11 12D5 10A1 2
B0 0
B11 -1D16 7 D28 9
left
12 1310 11
1415 16
17
6
7
9
8
Left = Left + totalNode*2(left > ParentLeft & right > 0)
Right = Right + totalNode*2(right > ParentLeft)
![Page 240: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/240.jpg)
Thêm nhánh vào cây ở vị trí left (thuật toán node trên nhánh)
Root0 13
C3 4 E11 12D5 10A1 2
B0 0
B11 -1D16 7 D28 9
left
12 1310 11
1415 16
17
6
7
9
8
Left = left + ParentLeft + 1 (right <= 0)
Right = right + ParentLeft + 1 +totalNode*2 - 1 (right <= 0)
Level = level –nodeMoveLevel + ParentLevel + 1(right <= 0)nodeMove[parent] = ParentID
![Page 241: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/241.jpg)
Thêm nhánh vào cây ở vị trí before (tình huống)
Root0 13
C3 4 E11 12D5 10A1 2 B0 0
B11 -1 D16 7 D28 9
before
![Page 242: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/242.jpg)
Thêm nhánh vào cây ở vị trí before (kết quả)
Root0 13
C3 4 E11 12D5 10A1 2 B0 0
B11 -1 D16 7 D28 9
before
5
6 7
8 9
10 11
14
12 13
15 16
17
![Page 243: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/243.jpg)
Thêm nhánh vào cây ở vị trí before (thuật toán node trên cây)
Root0 13
C3 4 E11 12D5 10A1 2 B0 0
B11 -1 D16 7 D28 9
before
5
6 7
8 9
10 11
14
12 13
15 16
17
Left = Left + totalNode*2(left >= selectionLeft & right > 0)
Right = Right + totalNode*2(right > selectionLeft)
![Page 244: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/244.jpg)
Thêm nhánh vào cây ở vị trí before (thuật toán node trên nhánh)
Root0 13
C3 4 E11 12D5 10A1 2 B0 0
B11 -1 D16 7 D28 9
before
5
6 7
8 9
10 11
14
12 13
15 16
17Left = left + selectionLeft(right <= 0)
Right = right + selectionLeft + totalNode*2 - 1 (right <= 0)
Level = level –nodeMoveLevel + selectionLevel(right <= 0)nodeMove[parent] = selectionParent
![Page 245: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/245.jpg)
Thêm nhánh vào cây ở vị trí after (tình huống)
Root0 13
C3 4 E11 12D5 10A1 2 B0 0
B11 -1D16 7 D28 9
after
![Page 246: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/246.jpg)
Thêm nhánh vào cây ở vị trí after (kết quả)
Root0 13
C3 4 E11 12D5 10A1 2 B0 0
B11 -1D16 7 D28 9
after
11
12
14
13
16
17
15
![Page 247: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/247.jpg)
Thêm nhánh vào cây ở vị trí after (thuật toán node trên cây)
Root0 13
C3 4 E11 12D5 10A1 2 B0 0
B11 -1D16 7 D28 9
after
11
12
14
13
16
17
15
Left = Left + totalNode*2(left > selectionRight & right > 0)
Right = Right + totalNode*2(right > selectionRight )
![Page 248: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/248.jpg)
Thêm nhánh vào cây ở vị trí after (thuật toán node trên nhánh)
Root0 13
C3 4 E11 12D5 10A1 2 B0 0
B11 -1D16 7 D28 9
after
11
12
14
13
16
17
15
Level = level – nodeMoveLevel + selectionLevel(right <= 0)nodeMove[parent] = selectionParent
Left = left + selectionRight + 1(right <= 0)
Right = right + selectionRight + totalNode*2(right <= 0)
![Page 249: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/249.jpg)
Di chuyển node (move up)
Root0 17
B3 6 C7 8 E15 16D9 14A1 2
B14 5 D110 11 D212 13
Di chuyển node C ra phía trước anh em liền kề bên trái
![Page 250: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/250.jpg)
Di chuyển node (move down)
Root0 17
B3 6 C7 8 E15 16D9 14A1 2
B14 5 D110 11 D212 13
Di chuyển node C ra phía sau anh em liền kề bên phải
![Page 251: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/251.jpg)
Cập nhật thông tin của node
Root0 17
B3 6 C7 8 E15 16D9 14A1 2
B14 5 D1110 11 D212 13
Cập nhật thông tin:- Chỉ cập nhật giá trị của node- Thay đổi cha của node
![Page 252: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/252.jpg)
Xóa node trên cây (xóa toàn bộ nhánh)
Root0 17
B3 6 C7 8 E15 16D9 14A1 2
B14 5 D110 11 D212 13
9 10
11
![Page 253: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/253.jpg)
Xóa node trên cây (chỉ xóa node)
Root0 17
B3 6 C7 8 E15 16D9 14A1 2
B14 5 D110 11 D212 13
13 14
15
9 10 11 12
![Page 254: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/254.jpg)
1. Hiển thị danh sách category có phân cấp cha con
2. Hiển thị ordering
3. Sắp xếp và lọc danh sách category: column, status, keyword, level
4. Thay đổi trạng thái của một hoặc nhiều category: inactive, active
5. Xóa một hoặc nhiều category
6. Di chuyển category: move up, move down
7. Cập nhật thông tin của một category: add, edit
![Page 255: Tài liệu Lập trình Zend Framework 2.x](https://reader036.vdocuments.net/reader036/viewer/2022062401/58ee380a1a28ab8a788b46a5/html5/thumbnails/255.jpg)
1. Nhận xét: cách xây dựng chức năng quản lý sách hoàn toàn tương tự như chức
năng quản lý user
2. Đối với trang danh sách các quyển sách cần bổ sung: show special, filter special,
change special, show price, show sale off
3. Đối với trang thêm mới (cập nhật) thông tin quyển sách cần bổ sung: special, price,
sale off, customize description