SlideShare a Scribd company logo
• .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
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
…
• 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.
• 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
• 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
• 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
• 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ó
• 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
• 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ó
• 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
• 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.
• 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
• 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
• 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
• 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
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
• Thay đổi hãng Taxi
• Thay đổi hãng máy bay
• Thay đổi hình thức đặt vé
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ý
 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
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
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
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
Filter Class Input Output
ZendI18nFilterAlnum abc !@#$^&*( dec 12 ()*() 12 abcdec1212
ZendI18nFilterAlpha abc !@#$^&*( dec 12 ()*() 12 abcdec
ZendFilterBaseName www.zend.vn/public/test.html test.html
ZendFilterDir www.zend.vn/public/test.html www.zend.vn/public/
ZendFilterCallback Gọi các phương thức xử lý khác đã được xây dựng sẵn
ZendFilterDigits Zend Framework 2.34 !@# 234
ZendFilterStringToLower Khóa học Zend Framework 2 khóa học zend framework 2
ZendFilterStringToUpper Khóa học Zend Framework 2 KHÓA HỌC ZEND FRAMEWORK 2
Filter Class Input Output
ZendFilterStringTrim Zend Framework 2 Zend Framework 2
ZendFilterStripTags
<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
ZendFilterCompress Abc.txt Abc.zip
ZendFilterDecompress Abc.zip Abc.txt
ZendFilterPregReplace Sử dụng biểu thức chính quy trong Filter
ZendFilterHtmlEntities This is a test " <> This is a test &quot; &lt;&gt;
Filter Class Input Output
ZendFilterWordCamelCaseToDash AbcDefGeh Abc-Def-Geh
ZendFilterWordCamelCaseToSeparator AbcDefGeh Abc(x)Def(x)Geh
ZendFilterWordCamelCaseToUnderscore AbcDefGeh Abc_Def_Geh
ZendFilterWordDashToCamelCase Abc-Def-Geh AbcDefGeh
ZendFilterWordDashToSeparator Abc-Def-Geh Abc(x)Def(x)Geh
ZendFilterWordDashToUnderscore Abc-Def-Geh Abc_Def_Geh
Filter Class Input Output
ZendFilterWordSeparatorToCamelCase Abc(x)Def(x)Geh AbcDefGeh
ZendFilterWordSeparatorToDash Abc(x)Def(x)Geh Abc-Def-Geh
ZendFilterWordSeparatorToSeparator Abc(x)Def(x)Geh Abc(x)Def(x)Geh
ZendFilterWordUnderscoreToCamelCase Abc_Def_Geh AbcDefGeh
ZendFilterWordUnderscoreToSeparator Abc_Def_Geh Abc(x)Def(x)Geh
ZendFilterWordUnderscoreToDash Abc_Def_Geh Abc-Def-Geh
Thay đổi layout đang hiển thị
ZendViewHelperBasePath
<a href="<?php echo $this->basePath(); ?>">basePath</a>
<link rel="stylesheet" type="text/css"
href="<?php echo $this->basePath('css/base.css'); ?>"
/>
ZendViewHelperCycle
<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>
ZendViewHelperDoctype
<?php echo $this->docType(); ?>
ZendViewHelperEscapeX
<?php echo $this->escapeHtml($value);?>
ZendViewHelperGravatar
$settings = array(
'img_size' => 40,
'default_img' => ZendViewHelperGravatar::DEFAULT_MM,
'secure' => null,
);
$email = 'email@example.com';
echo $this->gravatar($email, $settings);
ZendViewHelperHeadTitle
ZendViewHelperHeadMeta
ZendViewHelperHeadLink
$renderer = $this->getServiceLocator()->get('ZendViewRendererPhpRenderer');
$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());
ZendViewHelperHeadScript
$renderer = $this->getServiceLocator()->get('ZendViewRendererPhpRenderer');
$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');
ZendViewHelperInlineScript
$viewhelpermanager = $this->getServiceLocator()->get('viewhelpermanager');
$script = $viewhelpermanager->get('inlineScript');
$script->appendScript(
'$(document).ready(function() { alert("Hello"); });',
'text/javascript',
array('noescape' => true)); // Disable CDATA comments
ZendViewHelperHtmlList
$this->htmlList($items, $ordered, $attribs, $escapes);
ZendViewHelperHtmlFlash
echo $this->htmlFlash($data, $attribs, $params, $content);
ZendViewHelperJson
echo $this->json($arrayData);
ZendViewHelperPartial
<?php
echo $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'
)
));
?>
ZendViewHelperPartialLoop
echo $this->partialLoop('course.phtml', $arrCourse);
ZendViewHelperPlaceholder
$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') ?>
$this->currencyFormat()
$this->dateFormat()
$this->numberFormat()
ZendViewHelperServerUrl
$serverURL = $this->serverUrl();
echo '<h3 style="color:red;">$serverURL: ' . $serverURL .'</h3>';
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'
),
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;
Lý thuyết
Tìm hiểu các lớp router
Chuẩn bị
ZendMvcRouterHttpHostname
$hostnameRoute = array(
'type' => 'hostname',
'options' => array(
'route' => 'zendskeleton.training.com',
'defaults' => array(
'__NAMESPACE__' => 'MvcController',
'controller' => 'Index',
'action' => 'index'
)
)
);
ZendMvcRouterHttpLiteral
$literalRoute = array(
'type' => 'Literal',
'options' => array(
'route' => '/contact',
'defaults' => array(
'__NAMESPACE__' => 'MvcController',
'controller' => 'Index',
'action' => 'index'
),
),
);
ZendMvcRouterHttpScheme
$schemeAccountRoute = array(
'type' => 'Scheme',
'options' => array(
'route' => '/account',
'scheme' => 'http',
'defaults' => array(
'__NAMESPACE__ => 'MvcController',
'controller' => 'Index',
'action' => 'account',
),
),
);
ZendMvcRouterHttpSegment
$segmentRoute = array(
'type' => 'Segment',
'options' => array(
'route' => '/:module[/]',
'constraints' => array(
'module' => 'm..',
),
'defaults' => array(
'__NAMESPACE__ => 'MvcController',
'controller' => 'index',
'action' => 'segment',
),
),
);
ZendMvcRouterHttpRegex
$regexRoute = array(
'type' => 'Regex',
'options' => array(
'regex' => '/course/(?<name>[a-zA-Z0-9-]+)-(?<id>[0-
9]+).(?<extension>(html|php|asp))',
'defaults' => array(
'__NAMESPACE__' => 'MvcController',
'controller' => 'Router',
'action' => 'course',
'name' => 'zend-2x',
'id' => '100',
'extension' => 'phtml',
),
'spec' => '/course/%name%-%id%.%extension%',
),
);
Router Types
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]', ),
),
),
),
);
Tìm hiểu các controller plugins (ZendMvcControllerPlugin)
ZendMvcControllerPluginForward
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;
}
ZendMvcControllerPluginLayout
$this->layout()->setTemplate('view/abc');
$this->layout('layout/home');
ZendMvcControllerPluginParams
$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
ZendMvcControllerPluginRedirect
$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
ZendMvcControllerPluginUrl
$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);
ZendMvcControllerPluginFlashMessenger (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>';
}
}
ZendMvcControllerPluginFlashMessenger (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;
}
ZendMvcControllerPluginFlashMessenger (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;
}
ZendMvcControllerPluginFlashMessenger (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;
}
ZendMvcControllerPluginFlashMessenger (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>'
)
)
Xây dựng Controller Plugin
ZendMvcControllerPluginUrl
$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);
ZendMvcControllerPluginUrl
$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);
ZendMvcControllerPluginUrl
$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);
ZendMvcControllerPluginUrl
$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);
ZendMvcControllerPluginUrl
$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);
Giới thiệu
Các lớp Validator phổ biến
Tùy biến thông báo lỗi
$validator->setMessages(array(
ZendValidatorStringLength::TOO_SHORT =>
"Giá trị đầu vào <b>%value%</b> phải lớn hơn %min% ký tự",
ZendValidatorStringLength::TOO_LONG =>
"Giá trị đầu vào <b>%value%</b> phải nhỏ hơn %max% ký tự",
));
$validator = new ZendVNValidatorStringLength(array(
'max' => 9,
'min' => 7
));
ValidatorChain
$validatorChain = new ZendValidatorValidatorChain();
$validatorChain->attach(new ZendValidatorStringLength(array(
'min' => 6,
'max' => 12)), true)
->attach(new ZendValidatorEmailAddress());
Xây dựng lớp Validate
Quá trình upload tập tin
Thao tác upload với một tập tin
if($this->request->isPost()){
$upload = new ZendFileTransferAdapterHttp();
$fileInfo= $upload->getFileInfo();
$fileSize= $upload->getFileSize();
$fileName= $upload->getFileName();
$upload->setDestination(FILES_PATH . '/photo');
$upload->receive();
}
Thao tác upload với nhiều tập tin
if($this->request->isPost()){
$upload = new ZendFileTransferAdapterHttp();
// 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');
}
Kiểm tra điều kiện upload tập tin
if($this->request->isPost()){
$upload = new ZendFileTransferAdapterHttp();
$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);
}
}
}
Sử dụng Filter
if($this->request->isPost()){
$upload = new ZendFileTransferAdapterHttp();
$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);
}
}
Các loại input mới
Các thuộc tính mới trong thẻ <form>
Các thuộc tính mới trong thẻ <input>
ZendFormElement
ZendFormViewHelper
ZendFormElement
Ràng buộc dữ liệu với InputFilter
Fieldset
Tùy biến giao diện thông báo lỗi (Dạng 1)
Tùy biến giao diện thông báo lỗi (Dạng 2)
Tùy biến giao diện thông báo lỗi (Dạng 3)
Các vấn đề khác
Sử dụng Ajax trong Zend Framework (Load content)
Sử dụng Ajax trong Zend Framework (Selectbox)
Kết nối cơ sở dữ liệu
$adapter = new ZendDbAdapterAdapter(array(
'driver' => 'Pdo_Mysql',
'database' => 'bookstore',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
));
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);
Đăng ký Adapter qua Servicemanager
'service_manager'=> array(
'factories'=> array(
'ZendDbAdapterAdapter' => 'ZendDbAdapterAdapterServiceFactory',
),
)
$adapter = $this->getServiceLocator()->get('ZendDbAdapterAdapter');
Giới thiệu
Các trường hợp truy vấn cần thực hiện
Các trường hợp truy vấn cần thực hiện
Kiểm tra dữ liệu với ZendDbSqlPredicate trong mệnh đề WHERE
Insert – Update – Delete
Xây dựng class database kế thừa từ AbstractTableGateway
Kiểm tra sự tồn tại của dữ liệu
Bài tập tìm kiếm thông tin user theo địa chỉ email
Thông tin
List user
Form add (edit)
Bổ sung chức năng
Các vấn đề cần tìm hiểu
Các vấn đề cần tìm hiểu
Các vấn đề cần tìm hiểu
Các định nghĩa
Tích hợp & Sử dụng module ZF2-AcMailer
Alejandro Celaya
acelaya
Abdul Malik Ikhsan
samsonasik
Các vấn đề cần tìm hiểu
Bài tập
Page Login Page Logout
Page User
Member
Manager
Admin
ZendPermissionsAclResourceGene
ricResource
NewsController
index
info
add
edit
delete
parent
allow
Member
Manager
Admin
ZendPermissionsAclResource
GenericResource
NewsController
index
info
add
edit
delete
BooksController
index
info
add
edit
delete
Module ABC
Admin
ZendPermissionsAclResourceG
enericResource
NewsController
index
info
add
edit
delete
BooksController
index
info
add
edit
delete
Module DEF
UsersController
index
info
add
edit
delete
GroupsControlle
rindex
info
add
edit
delete
Xây dựng cấu trúc ứng dụng
 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ả
xamppapacheconfextrahttpd-vhosts.conf
C:WindowsSystem32driversetc
public/define.php
public/index.php
/config/application.config.php
• 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
/module/Backend/Module.php
/module/Backend/config/modu
le.config.php
/module/Backend/Module.php
Cập nhật phương thức getConfig trong tập tin Module.php
Cấu trúc thư mục
Cấu trúc thư mục
Cập nhật phương thức getAutoloaderConfig trong
tập tin Module.php
Cấu trúc thư mục
Thay đổi layout đối với tập tin view
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)
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
Full document & source: https://github.com/zendframework/ZendDeveloperTools
Xây dựng ứng dụng Bookstore
(Backend)
 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
 Xây dựng header
 Xây dựng breadcrumb
 Xây dựng sidebar
 Xây dựng dashboard
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
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)
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
 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
 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.
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
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
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ự
Quản trị hệ thống menu (category) đa cấp
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
Quản trị hệ thống menu (category) đa cấp
• 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)
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
Root0 7
B3 4 C5 6
New? ?
A1 2
4 trường hợp thêm node vào cây
Root0 7
B3 4 C5 6
New? ?
A1 2
4 trường hợp thêm node vào cây
left right
before
after
Root0 9
B3 6 C7 8
New6 7
A1 2
4 trường hợp thêm node vào cây (right)
right
B14 5
Root0 9
B3 6 C7 8
New6 7
A1 2
4 trường hợp thêm node vào cây (right)
right
8 9 10
11
B14 5
Root0 9
B3 6 C7 8
New6 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 = ParentRight
Right = ParentRight + 1
Level = ParentLevel + 1
Parent = ParentID
B14 5
Root0 9
B3 6 C7 8
New6 7
A1 2
4 trường hợp thêm node vào cây (left)
left
B14 5
Root0 9
B3 6 C7 8
New4 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
Root0 9
B3 6 C7 8
New4 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 + 1
Right = ParentLeft + 2
Level = ParentLevel + 1
Parent = ParentID
B14 5
6 7
Root0 7
B3 4 C5 6
New3 4
A1 2
4 trường hợp thêm node vào cây (before)
8
before
Root0 7
B3 4 C5 6
New3 4
A1 2
4 trường hợp thêm node vào cây (before)
before
6 7 8
9
5
Root0 7
B3 4 C5 6
New3 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 = BrotherLeft
Right = BrotherLeft + 1
Level = BrotherLevel
Parent = BrotherParent
5
Root0 7
B3 4
C5 6
New5 6
A1 2
4 trường hợp thêm node vào cây (after)
after
Root0 7
B3 4
C5 6
New5 6
A1 2
4 trường hợp thêm node vào cây (after)
after
7 8
9
Root0 7
B3 4
C5 6
New5 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 + 1
Right = BrotherRight + 2
Level = BrotherLevel
Parent = BrotherParent
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
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
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)/2
Left = 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
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
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
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
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 -1
D16 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)
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 -1
D16 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)
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 -1
D16 7 D28 9
left
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 -1
D16 7 D28 9
left
12 1310 11
14
15 16
17
6
7
9
8
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 -1
D16 7 D28 9
left
12 1310 11
14
15 16
17
6
7
9
8
Left = Left + totalNode*2
(left > ParentLeft & right > 0)
Right = Right + totalNode*2
(right > ParentLeft)
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 -1
D16 7 D28 9
left
12 1310 11
14
15 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
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
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
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)
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
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
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
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 )
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)
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
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
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
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
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
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
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

More Related Content

What's hot

Web201 slide 2
Web201   slide 2Web201   slide 2
Web201 slide 2
tuanduongcntt
 
Bài 2 Làm quen với môi trường PHP và MySQL (phần 2) - Giáo trình FPT
Bài 2 Làm quen với môi trường PHP và MySQL (phần 2) - Giáo trình FPTBài 2 Làm quen với môi trường PHP và MySQL (phần 2) - Giáo trình FPT
Bài 2 Làm quen với môi trường PHP và MySQL (phần 2) - Giáo trình FPT
MasterCode.vn
 
Cac giai phap_lap_trinh_c___final_[bookbooming.com]
Cac giai phap_lap_trinh_c___final_[bookbooming.com]Cac giai phap_lap_trinh_c___final_[bookbooming.com]
Cac giai phap_lap_trinh_c___final_[bookbooming.com]bookbooming1
 
Bài 1 Lập trình website theo mô hình MVC - Xây dựng ứng dụng web
Bài 1 Lập trình website theo mô hình MVC - Xây dựng ứng dụng webBài 1 Lập trình website theo mô hình MVC - Xây dựng ứng dụng web
Bài 1 Lập trình website theo mô hình MVC - Xây dựng ứng dụng web
MasterCode.vn
 
tao module joomla 1.5
tao module  joomla 1.5tao module  joomla 1.5
tao module joomla 1.5
dvms
 
Web201 slide 7
Web201   slide 7Web201   slide 7
Web201 slide 7
tuanduongcntt
 
Bài 4 Bảo mật cho website - Xây dựng ứng dụng web
Bài 4 Bảo mật cho website - Xây dựng ứng dụng webBài 4 Bảo mật cho website - Xây dựng ứng dụng web
Bài 4 Bảo mật cho website - Xây dựng ứng dụng web
MasterCode.vn
 
Giao trinh PHP nang cao - Kỹ thuật đệ qui trong PHP (CH003 Bài 3)
Giao trinh PHP nang cao - Kỹ thuật đệ qui trong PHP (CH003 Bài 3)Giao trinh PHP nang cao - Kỹ thuật đệ qui trong PHP (CH003 Bài 3)
Giao trinh PHP nang cao - Kỹ thuật đệ qui trong PHP (CH003 Bài 3)
KhanhPham
 
Bài 6 Lập trình PHP (phần 4) Làm việc với cookie và session - Giáo trình FPT
Bài 6 Lập trình PHP (phần 4) Làm việc với cookie và session - Giáo trình FPTBài 6 Lập trình PHP (phần 4) Làm việc với cookie và session - Giáo trình FPT
Bài 6 Lập trình PHP (phần 4) Làm việc với cookie và session - Giáo trình FPT
MasterCode.vn
 
Web201 slide 6
Web201   slide 6Web201   slide 6
Web201 slide 6
tuanduongcntt
 
Web201 slide 4
Web201   slide 4Web201   slide 4
Web201 slide 4
tuanduongcntt
 
Web203 slide 5
Web203   slide 5Web203   slide 5
Web203 slide 5
tuanduongcntt
 
Bài 4 Lập trình PHP (phần 2) - Giáo trình FPT
Bài 4 Lập trình PHP (phần 2) - Giáo trình FPTBài 4 Lập trình PHP (phần 2) - Giáo trình FPT
Bài 4 Lập trình PHP (phần 2) - Giáo trình FPT
MasterCode.vn
 
Tài liệu Zend Framework 2 - Cài đặt và cấu hình Zend Framework 2 - Bài 2
Tài liệu Zend Framework 2 - Cài đặt và cấu hình Zend Framework 2 - Bài 2Tài liệu Zend Framework 2 - Cài đặt và cấu hình Zend Framework 2 - Bài 2
Tài liệu Zend Framework 2 - Cài đặt và cấu hình Zend Framework 2 - Bài 2
KhanhPham
 
Lập trình C# 2008 cơ bản_Nhất Nghệ
Lập trình C# 2008 cơ bản_Nhất NghệLập trình C# 2008 cơ bản_Nhất Nghệ
Lập trình C# 2008 cơ bản_Nhất NghệTrần Thiên Đại
 
Thêm sửa-xóa-combobox - c#
Thêm sửa-xóa-combobox - c#Thêm sửa-xóa-combobox - c#
Thêm sửa-xóa-combobox - c#Văn Dũng
 
Web301 slide 4
Web301   slide 4Web301   slide 4
Web301 slide 4
tuanduongcntt
 
Web3012 slide 8
Web3012   slide 8Web3012   slide 8
Web3012 slide 8
tuanduongcntt
 
Co ban ve_zend_framework 1
Co ban ve_zend_framework 1Co ban ve_zend_framework 1
Co ban ve_zend_framework 1
Ông Thông
 

What's hot (20)

Web201 slide 2
Web201   slide 2Web201   slide 2
Web201 slide 2
 
Bài 2 Làm quen với môi trường PHP và MySQL (phần 2) - Giáo trình FPT
Bài 2 Làm quen với môi trường PHP và MySQL (phần 2) - Giáo trình FPTBài 2 Làm quen với môi trường PHP và MySQL (phần 2) - Giáo trình FPT
Bài 2 Làm quen với môi trường PHP và MySQL (phần 2) - Giáo trình FPT
 
Cac giai phap_lap_trinh_c___final_[bookbooming.com]
Cac giai phap_lap_trinh_c___final_[bookbooming.com]Cac giai phap_lap_trinh_c___final_[bookbooming.com]
Cac giai phap_lap_trinh_c___final_[bookbooming.com]
 
Bài 1 Lập trình website theo mô hình MVC - Xây dựng ứng dụng web
Bài 1 Lập trình website theo mô hình MVC - Xây dựng ứng dụng webBài 1 Lập trình website theo mô hình MVC - Xây dựng ứng dụng web
Bài 1 Lập trình website theo mô hình MVC - Xây dựng ứng dụng web
 
tao module joomla 1.5
tao module  joomla 1.5tao module  joomla 1.5
tao module joomla 1.5
 
Web201 slide 7
Web201   slide 7Web201   slide 7
Web201 slide 7
 
Bai tap thuc hanh
Bai tap thuc hanhBai tap thuc hanh
Bai tap thuc hanh
 
Bài 4 Bảo mật cho website - Xây dựng ứng dụng web
Bài 4 Bảo mật cho website - Xây dựng ứng dụng webBài 4 Bảo mật cho website - Xây dựng ứng dụng web
Bài 4 Bảo mật cho website - Xây dựng ứng dụng web
 
Giao trinh PHP nang cao - Kỹ thuật đệ qui trong PHP (CH003 Bài 3)
Giao trinh PHP nang cao - Kỹ thuật đệ qui trong PHP (CH003 Bài 3)Giao trinh PHP nang cao - Kỹ thuật đệ qui trong PHP (CH003 Bài 3)
Giao trinh PHP nang cao - Kỹ thuật đệ qui trong PHP (CH003 Bài 3)
 
Bài 6 Lập trình PHP (phần 4) Làm việc với cookie và session - Giáo trình FPT
Bài 6 Lập trình PHP (phần 4) Làm việc với cookie và session - Giáo trình FPTBài 6 Lập trình PHP (phần 4) Làm việc với cookie và session - Giáo trình FPT
Bài 6 Lập trình PHP (phần 4) Làm việc với cookie và session - Giáo trình FPT
 
Web201 slide 6
Web201   slide 6Web201   slide 6
Web201 slide 6
 
Web201 slide 4
Web201   slide 4Web201   slide 4
Web201 slide 4
 
Web203 slide 5
Web203   slide 5Web203   slide 5
Web203 slide 5
 
Bài 4 Lập trình PHP (phần 2) - Giáo trình FPT
Bài 4 Lập trình PHP (phần 2) - Giáo trình FPTBài 4 Lập trình PHP (phần 2) - Giáo trình FPT
Bài 4 Lập trình PHP (phần 2) - Giáo trình FPT
 
Tài liệu Zend Framework 2 - Cài đặt và cấu hình Zend Framework 2 - Bài 2
Tài liệu Zend Framework 2 - Cài đặt và cấu hình Zend Framework 2 - Bài 2Tài liệu Zend Framework 2 - Cài đặt và cấu hình Zend Framework 2 - Bài 2
Tài liệu Zend Framework 2 - Cài đặt và cấu hình Zend Framework 2 - Bài 2
 
Lập trình C# 2008 cơ bản_Nhất Nghệ
Lập trình C# 2008 cơ bản_Nhất NghệLập trình C# 2008 cơ bản_Nhất Nghệ
Lập trình C# 2008 cơ bản_Nhất Nghệ
 
Thêm sửa-xóa-combobox - c#
Thêm sửa-xóa-combobox - c#Thêm sửa-xóa-combobox - c#
Thêm sửa-xóa-combobox - c#
 
Web301 slide 4
Web301   slide 4Web301   slide 4
Web301 slide 4
 
Web3012 slide 8
Web3012   slide 8Web3012   slide 8
Web3012 slide 8
 
Co ban ve_zend_framework 1
Co ban ve_zend_framework 1Co ban ve_zend_framework 1
Co ban ve_zend_framework 1
 

Viewers also liked

Nghiên cưú và phát triển Android OS
Nghiên cưú và phát triển Android OSNghiên cưú và phát triển Android OS
Nghiên cưú và phát triển Android OS
Nguyễn Anh
 
Lập trình Android cơ bản bằng tiếng Việt
Lập trình Android cơ bản bằng tiếng ViệtLập trình Android cơ bản bằng tiếng Việt
Lập trình Android cơ bản bằng tiếng Việt
laptrinhandroid
 
The Road To Technical Team Lead
The Road To Technical Team LeadThe Road To Technical Team Lead
The Road To Technical Team Lead
benwaine
 
Technical lead kpi
Technical lead kpiTechnical lead kpi
Technical lead kpi
tomjonhss
 
Bao cao-lap-trinh-android-final
Bao cao-lap-trinh-android-finalBao cao-lap-trinh-android-final
Bao cao-lap-trinh-android-final
le dan
 
Android
AndroidAndroid
Android
Tieu Vi Vi
 
Báo Cáo Đề Tài Xây Dựng Phần Mềm Quản Lí Khách Hàng Trên Android
Báo Cáo Đề Tài Xây Dựng Phần Mềm Quản Lí Khách Hàng Trên AndroidBáo Cáo Đề Tài Xây Dựng Phần Mềm Quản Lí Khách Hàng Trên Android
Báo Cáo Đề Tài Xây Dựng Phần Mềm Quản Lí Khách Hàng Trên Android
Dlinh Truong
 
Xây dựng ứng dụng hỗ trợ học tiếng anh trên thiết bị android
Xây dựng ứng dụng hỗ trợ học tiếng anh trên thiết bị androidXây dựng ứng dụng hỗ trợ học tiếng anh trên thiết bị android
Xây dựng ứng dụng hỗ trợ học tiếng anh trên thiết bị android
Trần Võ Khôi Nguyên
 
Tài liệu Lập trình Java Core
Tài liệu Lập trình Java CoreTài liệu Lập trình Java Core
Tài liệu Lập trình Java Core
ZendVN
 
Báo Cáo Đồ Án 2 : Thiết Kế Web Bán Đồng Hồ
Báo Cáo Đồ Án 2 : Thiết Kế Web Bán Đồng HồBáo Cáo Đồ Án 2 : Thiết Kế Web Bán Đồng Hồ
Báo Cáo Đồ Án 2 : Thiết Kế Web Bán Đồng HồzDollz Lovez
 

Viewers also liked (10)

Nghiên cưú và phát triển Android OS
Nghiên cưú và phát triển Android OSNghiên cưú và phát triển Android OS
Nghiên cưú và phát triển Android OS
 
Lập trình Android cơ bản bằng tiếng Việt
Lập trình Android cơ bản bằng tiếng ViệtLập trình Android cơ bản bằng tiếng Việt
Lập trình Android cơ bản bằng tiếng Việt
 
The Road To Technical Team Lead
The Road To Technical Team LeadThe Road To Technical Team Lead
The Road To Technical Team Lead
 
Technical lead kpi
Technical lead kpiTechnical lead kpi
Technical lead kpi
 
Bao cao-lap-trinh-android-final
Bao cao-lap-trinh-android-finalBao cao-lap-trinh-android-final
Bao cao-lap-trinh-android-final
 
Android
AndroidAndroid
Android
 
Báo Cáo Đề Tài Xây Dựng Phần Mềm Quản Lí Khách Hàng Trên Android
Báo Cáo Đề Tài Xây Dựng Phần Mềm Quản Lí Khách Hàng Trên AndroidBáo Cáo Đề Tài Xây Dựng Phần Mềm Quản Lí Khách Hàng Trên Android
Báo Cáo Đề Tài Xây Dựng Phần Mềm Quản Lí Khách Hàng Trên Android
 
Xây dựng ứng dụng hỗ trợ học tiếng anh trên thiết bị android
Xây dựng ứng dụng hỗ trợ học tiếng anh trên thiết bị androidXây dựng ứng dụng hỗ trợ học tiếng anh trên thiết bị android
Xây dựng ứng dụng hỗ trợ học tiếng anh trên thiết bị android
 
Tài liệu Lập trình Java Core
Tài liệu Lập trình Java CoreTài liệu Lập trình Java Core
Tài liệu Lập trình Java Core
 
Báo Cáo Đồ Án 2 : Thiết Kế Web Bán Đồng Hồ
Báo Cáo Đồ Án 2 : Thiết Kế Web Bán Đồng HồBáo Cáo Đồ Án 2 : Thiết Kế Web Bán Đồng Hồ
Báo Cáo Đồ Án 2 : Thiết Kế Web Bán Đồng Hồ
 

Similar to Tài liệu Lập trình Zend Framework 2.x

Lập trình hướng đối tượng Chương 6 Design Pattern.pptx
Lập trình hướng đối tượng Chương 6 Design Pattern.pptxLập trình hướng đối tượng Chương 6 Design Pattern.pptx
Lập trình hướng đối tượng Chương 6 Design Pattern.pptx
LmTrn286060
 
Lập trình hướng đối tượng Chương 6 Design Pattern.pptx
Lập trình hướng đối tượng Chương 6 Design Pattern.pptxLập trình hướng đối tượng Chương 6 Design Pattern.pptx
Lập trình hướng đối tượng Chương 6 Design Pattern.pptx
LmTrn286060
 
Programming
ProgrammingProgramming
Programming
Nguyên Thành Võ
 
Tai lieu-php-coding-standard
Tai lieu-php-coding-standardTai lieu-php-coding-standard
Tai lieu-php-coding-standardVu Minh
 
Nhuong dieuhocc#phaibiet
Nhuong dieuhocc#phaibietNhuong dieuhocc#phaibiet
Nhuong dieuhocc#phaibiet
Nguyễn Phi Phi
 
How to write good code
How to write good code How to write good code
How to write good code
Minh Hoang
 
Những thuật ngữ thường gặp trong Reverse Engineering .NET
Những thuật ngữ thường gặp trong Reverse Engineering .NETNhững thuật ngữ thường gặp trong Reverse Engineering .NET
Những thuật ngữ thường gặp trong Reverse Engineering .NET
Levis Nickaster
 
Giáo trình asp.net với c sharp
Giáo trình asp.net với c sharpGiáo trình asp.net với c sharp
Giáo trình asp.net với c sharp
Trần Văn Sáng Trần
 
Drupal framework xanh
Drupal framework xanhDrupal framework xanh
Drupal framework xanhXanh Nguyen
 
Hỏi tình hình bk tiny bktiny-hdsd
Hỏi tình hình bk tiny   bktiny-hdsdHỏi tình hình bk tiny   bktiny-hdsd
Hỏi tình hình bk tiny bktiny-hdsdVu Hung Nguyen
 
Slide 01-Web Application Overview (1).pdf
Slide 01-Web Application Overview (1).pdfSlide 01-Web Application Overview (1).pdf
Slide 01-Web Application Overview (1).pdf
HuyVnh4
 
Bao cao web cake php
Bao cao web cake phpBao cao web cake php
Bao cao web cake php
laonap166
 
Giới thiệu NukeViet 5 và Autoweb
Giới thiệu NukeViet 5 và AutowebGiới thiệu NukeViet 5 và Autoweb
Giới thiệu NukeViet 5 và Autoweb
vinades
 
LTJAVA_TV_Slides.ppt
LTJAVA_TV_Slides.pptLTJAVA_TV_Slides.ppt
LTJAVA_TV_Slides.ppt
ssuserf603dc1
 
Bai01 oop overview
Bai01 oop overviewBai01 oop overview
Bai01 oop overview
Nhuận Lê Văn
 
Sơ lược về Java
Sơ lược về JavaSơ lược về Java
Sơ lược về Java
Điệp Lê
 
[Cntt] bài giảng lập trình java bkhcm
[Cntt] bài giảng lập trình java   bkhcm[Cntt] bài giảng lập trình java   bkhcm
[Cntt] bài giảng lập trình java bkhcm
Hong Phuoc Nguyen
 
[Cntt] all java
[Cntt] all java[Cntt] all java
[Cntt] all java
Hong Phuoc Nguyen
 

Similar to Tài liệu Lập trình Zend Framework 2.x (20)

Lập trình hướng đối tượng Chương 6 Design Pattern.pptx
Lập trình hướng đối tượng Chương 6 Design Pattern.pptxLập trình hướng đối tượng Chương 6 Design Pattern.pptx
Lập trình hướng đối tượng Chương 6 Design Pattern.pptx
 
Lập trình hướng đối tượng Chương 6 Design Pattern.pptx
Lập trình hướng đối tượng Chương 6 Design Pattern.pptxLập trình hướng đối tượng Chương 6 Design Pattern.pptx
Lập trình hướng đối tượng Chương 6 Design Pattern.pptx
 
Programming
ProgrammingProgramming
Programming
 
Coding standard
Coding standardCoding standard
Coding standard
 
Tai lieu-php-coding-standard
Tai lieu-php-coding-standardTai lieu-php-coding-standard
Tai lieu-php-coding-standard
 
Nhuong dieuhocc#phaibiet
Nhuong dieuhocc#phaibietNhuong dieuhocc#phaibiet
Nhuong dieuhocc#phaibiet
 
How to write good code
How to write good code How to write good code
How to write good code
 
Những thuật ngữ thường gặp trong Reverse Engineering .NET
Những thuật ngữ thường gặp trong Reverse Engineering .NETNhững thuật ngữ thường gặp trong Reverse Engineering .NET
Những thuật ngữ thường gặp trong Reverse Engineering .NET
 
04 de cuong
04 de cuong04 de cuong
04 de cuong
 
Giáo trình asp.net với c sharp
Giáo trình asp.net với c sharpGiáo trình asp.net với c sharp
Giáo trình asp.net với c sharp
 
Drupal framework xanh
Drupal framework xanhDrupal framework xanh
Drupal framework xanh
 
Hỏi tình hình bk tiny bktiny-hdsd
Hỏi tình hình bk tiny   bktiny-hdsdHỏi tình hình bk tiny   bktiny-hdsd
Hỏi tình hình bk tiny bktiny-hdsd
 
Slide 01-Web Application Overview (1).pdf
Slide 01-Web Application Overview (1).pdfSlide 01-Web Application Overview (1).pdf
Slide 01-Web Application Overview (1).pdf
 
Bao cao web cake php
Bao cao web cake phpBao cao web cake php
Bao cao web cake php
 
Giới thiệu NukeViet 5 và Autoweb
Giới thiệu NukeViet 5 và AutowebGiới thiệu NukeViet 5 và Autoweb
Giới thiệu NukeViet 5 và Autoweb
 
LTJAVA_TV_Slides.ppt
LTJAVA_TV_Slides.pptLTJAVA_TV_Slides.ppt
LTJAVA_TV_Slides.ppt
 
Bai01 oop overview
Bai01 oop overviewBai01 oop overview
Bai01 oop overview
 
Sơ lược về Java
Sơ lược về JavaSơ lược về Java
Sơ lược về Java
 
[Cntt] bài giảng lập trình java bkhcm
[Cntt] bài giảng lập trình java   bkhcm[Cntt] bài giảng lập trình java   bkhcm
[Cntt] bài giảng lập trình java bkhcm
 
[Cntt] all java
[Cntt] all java[Cntt] all java
[Cntt] all java
 

More from ZendVN

Quản lý mã nguồn với GIT
Quản lý mã nguồn với GITQuản lý mã nguồn với GIT
Quản lý mã nguồn với GIT
ZendVN
 
Giải pháp toàn diện cho Multi Language
Giải pháp toàn diện cho Multi Language Giải pháp toàn diện cho Multi Language
Giải pháp toàn diện cho Multi Language
ZendVN
 
Giới thiệu PHP 7
Giới thiệu PHP 7Giới thiệu PHP 7
Giới thiệu PHP 7
ZendVN
 
Câu hỏi trắc nghiệm PHP
Câu hỏi trắc nghiệm PHPCâu hỏi trắc nghiệm PHP
Câu hỏi trắc nghiệm PHP
ZendVN
 
Tài liệu lập trình jQuery
Tài liệu lập trình jQueryTài liệu lập trình jQuery
Tài liệu lập trình jQuery
ZendVN
 
Xây dựng ứng dụng với Zend Framework 2.x
Xây dựng ứng dụng với Zend Framework 2.xXây dựng ứng dụng với Zend Framework 2.x
Xây dựng ứng dụng với Zend Framework 2.x
ZendVN
 
Hướng dẫn lập trình CMS Joomla 2.5
Hướng dẫn lập trình CMS Joomla 2.5 Hướng dẫn lập trình CMS Joomla 2.5
Hướng dẫn lập trình CMS Joomla 2.5
ZendVN
 

More from ZendVN (7)

Quản lý mã nguồn với GIT
Quản lý mã nguồn với GITQuản lý mã nguồn với GIT
Quản lý mã nguồn với GIT
 
Giải pháp toàn diện cho Multi Language
Giải pháp toàn diện cho Multi Language Giải pháp toàn diện cho Multi Language
Giải pháp toàn diện cho Multi Language
 
Giới thiệu PHP 7
Giới thiệu PHP 7Giới thiệu PHP 7
Giới thiệu PHP 7
 
Câu hỏi trắc nghiệm PHP
Câu hỏi trắc nghiệm PHPCâu hỏi trắc nghiệm PHP
Câu hỏi trắc nghiệm PHP
 
Tài liệu lập trình jQuery
Tài liệu lập trình jQueryTài liệu lập trình jQuery
Tài liệu lập trình jQuery
 
Xây dựng ứng dụng với Zend Framework 2.x
Xây dựng ứng dụng với Zend Framework 2.xXây dựng ứng dụng với Zend Framework 2.x
Xây dựng ứng dụng với Zend Framework 2.x
 
Hướng dẫn lập trình CMS Joomla 2.5
Hướng dẫn lập trình CMS Joomla 2.5 Hướng dẫn lập trình CMS Joomla 2.5
Hướng dẫn lập trình CMS Joomla 2.5
 

Recently uploaded

trắc nhiệm ký sinh.docxddddddddddddddddd
trắc nhiệm ký sinh.docxdddddddddddddddddtrắc nhiệm ký sinh.docxddddddddddddddddd
trắc nhiệm ký sinh.docxddddddddddddddddd
my21xn0084
 
bài dự thi chính luận 2024 đảng chọn lọc.docx
bài dự thi chính luận 2024 đảng chọn lọc.docxbài dự thi chính luận 2024 đảng chọn lọc.docx
bài dự thi chính luận 2024 đảng chọn lọc.docx
HiYnThTh
 
THONG BAO nop ho so xet tuyen TS6 24-25.pdf
THONG BAO nop ho so xet tuyen TS6 24-25.pdfTHONG BAO nop ho so xet tuyen TS6 24-25.pdf
THONG BAO nop ho so xet tuyen TS6 24-25.pdf
QucHHunhnh
 
Văn 7. Truyện ngụ ngôn Rùa và thỏ+ Viết PT nhân vật.docx
Văn 7. Truyện ngụ ngôn Rùa và thỏ+ Viết PT nhân vật.docxVăn 7. Truyện ngụ ngôn Rùa và thỏ+ Viết PT nhân vật.docx
Văn 7. Truyện ngụ ngôn Rùa và thỏ+ Viết PT nhân vật.docx
metamngoc123
 
BÁO CÁO CUỐI KỲ PHÂN TÍCH THIẾT KẾ HƯỚNG ĐỐI TƯỢNG - NHÓM 7.docx
BÁO CÁO CUỐI KỲ PHÂN TÍCH THIẾT KẾ HƯỚNG ĐỐI TƯỢNG - NHÓM 7.docxBÁO CÁO CUỐI KỲ PHÂN TÍCH THIẾT KẾ HƯỚNG ĐỐI TƯỢNG - NHÓM 7.docx
BÁO CÁO CUỐI KỲ PHÂN TÍCH THIẾT KẾ HƯỚNG ĐỐI TƯỢNG - NHÓM 7.docx
HngL891608
 
DANH SÁCH XÉT TUYỂN SỚM_NĂM 2023_học ba DPY.pdf
DANH SÁCH XÉT TUYỂN SỚM_NĂM 2023_học ba DPY.pdfDANH SÁCH XÉT TUYỂN SỚM_NĂM 2023_học ba DPY.pdf
DANH SÁCH XÉT TUYỂN SỚM_NĂM 2023_học ba DPY.pdf
thanhluan21
 
YHocData.com-bộ-câu-hỏi-mô-phôi.pdf đầy đủ
YHocData.com-bộ-câu-hỏi-mô-phôi.pdf đầy đủYHocData.com-bộ-câu-hỏi-mô-phôi.pdf đầy đủ
YHocData.com-bộ-câu-hỏi-mô-phôi.pdf đầy đủ
duyanh05052004
 
Smartbiz_He thong MES nganh may mac_2024june
Smartbiz_He thong MES nganh may mac_2024juneSmartbiz_He thong MES nganh may mac_2024june
Smartbiz_He thong MES nganh may mac_2024june
SmartBiz
 
[NBV]-CHUYÊN ĐỀ 3. GTLN-GTNN CỦA HÀM SỐ (CÓ ĐÁP ÁN CHI TIẾT).pdf
[NBV]-CHUYÊN ĐỀ 3. GTLN-GTNN CỦA HÀM SỐ (CÓ ĐÁP ÁN CHI TIẾT).pdf[NBV]-CHUYÊN ĐỀ 3. GTLN-GTNN CỦA HÀM SỐ (CÓ ĐÁP ÁN CHI TIẾT).pdf
[NBV]-CHUYÊN ĐỀ 3. GTLN-GTNN CỦA HÀM SỐ (CÓ ĐÁP ÁN CHI TIẾT).pdf
NamNguynHi23
 
Từ ngữ về con người và chiến tranh trong Nhật ký Đặng Thùy Trâm.pdf
Từ ngữ về con người và chiến tranh trong Nhật ký Đặng Thùy Trâm.pdfTừ ngữ về con người và chiến tranh trong Nhật ký Đặng Thùy Trâm.pdf
Từ ngữ về con người và chiến tranh trong Nhật ký Đặng Thùy Trâm.pdf
Man_Ebook
 
100 DẪN CHỨNG NGHỊ LUẬN XÃ HỘiI HAY.docx
100 DẪN CHỨNG NGHỊ LUẬN XÃ HỘiI HAY.docx100 DẪN CHỨNG NGHỊ LUẬN XÃ HỘiI HAY.docx
100 DẪN CHỨNG NGHỊ LUẬN XÃ HỘiI HAY.docx
khanhthy3000
 
PLĐC-chương 1 (1).ppt của trường ĐH Ngoại thương
PLĐC-chương 1 (1).ppt của trường  ĐH Ngoại thươngPLĐC-chương 1 (1).ppt của trường  ĐH Ngoại thương
PLĐC-chương 1 (1).ppt của trường ĐH Ngoại thương
hieutrinhvan27052005
 
BÀI TẬP DẠY THÊM HÓA HỌC LỚP 12 - CẢ NĂM - THEO FORM THI MỚI BGD 2025 (DÙNG C...
BÀI TẬP DẠY THÊM HÓA HỌC LỚP 12 - CẢ NĂM - THEO FORM THI MỚI BGD 2025 (DÙNG C...BÀI TẬP DẠY THÊM HÓA HỌC LỚP 12 - CẢ NĂM - THEO FORM THI MỚI BGD 2025 (DÙNG C...
BÀI TẬP DẠY THÊM HÓA HỌC LỚP 12 - CẢ NĂM - THEO FORM THI MỚI BGD 2025 (DÙNG C...
Nguyen Thanh Tu Collection
 
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 10 - SÁCH MỚI - FORM BÀI TẬP 2025 (DÙNG CHUNG ...
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 10 - SÁCH MỚI - FORM BÀI TẬP 2025 (DÙNG CHUNG ...CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 10 - SÁCH MỚI - FORM BÀI TẬP 2025 (DÙNG CHUNG ...
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 10 - SÁCH MỚI - FORM BÀI TẬP 2025 (DÙNG CHUNG ...
Nguyen Thanh Tu Collection
 
BÀI TẬP BỔ TRỢ TIẾNG ANH I-LEARN SMART WORLD 9 CẢ NĂM CÓ TEST THEO UNIT NĂM H...
BÀI TẬP BỔ TRỢ TIẾNG ANH I-LEARN SMART WORLD 9 CẢ NĂM CÓ TEST THEO UNIT NĂM H...BÀI TẬP BỔ TRỢ TIẾNG ANH I-LEARN SMART WORLD 9 CẢ NĂM CÓ TEST THEO UNIT NĂM H...
BÀI TẬP BỔ TRỢ TIẾNG ANH I-LEARN SMART WORLD 9 CẢ NĂM CÓ TEST THEO UNIT NĂM H...
Nguyen Thanh Tu Collection
 
Biểu tượng trăng và bầu trời trong tác phẩm của Nguyễn Quang Thiều
Biểu tượng trăng và bầu trời trong tác phẩm của Nguyễn Quang ThiềuBiểu tượng trăng và bầu trời trong tác phẩm của Nguyễn Quang Thiều
Biểu tượng trăng và bầu trời trong tác phẩm của Nguyễn Quang Thiều
lamluanvan.net Viết thuê luận văn
 
Halloween vocabulary for kids in primary school
Halloween vocabulary for kids in primary schoolHalloween vocabulary for kids in primary school
Halloween vocabulary for kids in primary school
AnhPhm265031
 

Recently uploaded (17)

trắc nhiệm ký sinh.docxddddddddddddddddd
trắc nhiệm ký sinh.docxdddddddddddddddddtrắc nhiệm ký sinh.docxddddddddddddddddd
trắc nhiệm ký sinh.docxddddddddddddddddd
 
bài dự thi chính luận 2024 đảng chọn lọc.docx
bài dự thi chính luận 2024 đảng chọn lọc.docxbài dự thi chính luận 2024 đảng chọn lọc.docx
bài dự thi chính luận 2024 đảng chọn lọc.docx
 
THONG BAO nop ho so xet tuyen TS6 24-25.pdf
THONG BAO nop ho so xet tuyen TS6 24-25.pdfTHONG BAO nop ho so xet tuyen TS6 24-25.pdf
THONG BAO nop ho so xet tuyen TS6 24-25.pdf
 
Văn 7. Truyện ngụ ngôn Rùa và thỏ+ Viết PT nhân vật.docx
Văn 7. Truyện ngụ ngôn Rùa và thỏ+ Viết PT nhân vật.docxVăn 7. Truyện ngụ ngôn Rùa và thỏ+ Viết PT nhân vật.docx
Văn 7. Truyện ngụ ngôn Rùa và thỏ+ Viết PT nhân vật.docx
 
BÁO CÁO CUỐI KỲ PHÂN TÍCH THIẾT KẾ HƯỚNG ĐỐI TƯỢNG - NHÓM 7.docx
BÁO CÁO CUỐI KỲ PHÂN TÍCH THIẾT KẾ HƯỚNG ĐỐI TƯỢNG - NHÓM 7.docxBÁO CÁO CUỐI KỲ PHÂN TÍCH THIẾT KẾ HƯỚNG ĐỐI TƯỢNG - NHÓM 7.docx
BÁO CÁO CUỐI KỲ PHÂN TÍCH THIẾT KẾ HƯỚNG ĐỐI TƯỢNG - NHÓM 7.docx
 
DANH SÁCH XÉT TUYỂN SỚM_NĂM 2023_học ba DPY.pdf
DANH SÁCH XÉT TUYỂN SỚM_NĂM 2023_học ba DPY.pdfDANH SÁCH XÉT TUYỂN SỚM_NĂM 2023_học ba DPY.pdf
DANH SÁCH XÉT TUYỂN SỚM_NĂM 2023_học ba DPY.pdf
 
YHocData.com-bộ-câu-hỏi-mô-phôi.pdf đầy đủ
YHocData.com-bộ-câu-hỏi-mô-phôi.pdf đầy đủYHocData.com-bộ-câu-hỏi-mô-phôi.pdf đầy đủ
YHocData.com-bộ-câu-hỏi-mô-phôi.pdf đầy đủ
 
Smartbiz_He thong MES nganh may mac_2024june
Smartbiz_He thong MES nganh may mac_2024juneSmartbiz_He thong MES nganh may mac_2024june
Smartbiz_He thong MES nganh may mac_2024june
 
[NBV]-CHUYÊN ĐỀ 3. GTLN-GTNN CỦA HÀM SỐ (CÓ ĐÁP ÁN CHI TIẾT).pdf
[NBV]-CHUYÊN ĐỀ 3. GTLN-GTNN CỦA HÀM SỐ (CÓ ĐÁP ÁN CHI TIẾT).pdf[NBV]-CHUYÊN ĐỀ 3. GTLN-GTNN CỦA HÀM SỐ (CÓ ĐÁP ÁN CHI TIẾT).pdf
[NBV]-CHUYÊN ĐỀ 3. GTLN-GTNN CỦA HÀM SỐ (CÓ ĐÁP ÁN CHI TIẾT).pdf
 
Từ ngữ về con người và chiến tranh trong Nhật ký Đặng Thùy Trâm.pdf
Từ ngữ về con người và chiến tranh trong Nhật ký Đặng Thùy Trâm.pdfTừ ngữ về con người và chiến tranh trong Nhật ký Đặng Thùy Trâm.pdf
Từ ngữ về con người và chiến tranh trong Nhật ký Đặng Thùy Trâm.pdf
 
100 DẪN CHỨNG NGHỊ LUẬN XÃ HỘiI HAY.docx
100 DẪN CHỨNG NGHỊ LUẬN XÃ HỘiI HAY.docx100 DẪN CHỨNG NGHỊ LUẬN XÃ HỘiI HAY.docx
100 DẪN CHỨNG NGHỊ LUẬN XÃ HỘiI HAY.docx
 
PLĐC-chương 1 (1).ppt của trường ĐH Ngoại thương
PLĐC-chương 1 (1).ppt của trường  ĐH Ngoại thươngPLĐC-chương 1 (1).ppt của trường  ĐH Ngoại thương
PLĐC-chương 1 (1).ppt của trường ĐH Ngoại thương
 
BÀI TẬP DẠY THÊM HÓA HỌC LỚP 12 - CẢ NĂM - THEO FORM THI MỚI BGD 2025 (DÙNG C...
BÀI TẬP DẠY THÊM HÓA HỌC LỚP 12 - CẢ NĂM - THEO FORM THI MỚI BGD 2025 (DÙNG C...BÀI TẬP DẠY THÊM HÓA HỌC LỚP 12 - CẢ NĂM - THEO FORM THI MỚI BGD 2025 (DÙNG C...
BÀI TẬP DẠY THÊM HÓA HỌC LỚP 12 - CẢ NĂM - THEO FORM THI MỚI BGD 2025 (DÙNG C...
 
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 10 - SÁCH MỚI - FORM BÀI TẬP 2025 (DÙNG CHUNG ...
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 10 - SÁCH MỚI - FORM BÀI TẬP 2025 (DÙNG CHUNG ...CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 10 - SÁCH MỚI - FORM BÀI TẬP 2025 (DÙNG CHUNG ...
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 10 - SÁCH MỚI - FORM BÀI TẬP 2025 (DÙNG CHUNG ...
 
BÀI TẬP BỔ TRỢ TIẾNG ANH I-LEARN SMART WORLD 9 CẢ NĂM CÓ TEST THEO UNIT NĂM H...
BÀI TẬP BỔ TRỢ TIẾNG ANH I-LEARN SMART WORLD 9 CẢ NĂM CÓ TEST THEO UNIT NĂM H...BÀI TẬP BỔ TRỢ TIẾNG ANH I-LEARN SMART WORLD 9 CẢ NĂM CÓ TEST THEO UNIT NĂM H...
BÀI TẬP BỔ TRỢ TIẾNG ANH I-LEARN SMART WORLD 9 CẢ NĂM CÓ TEST THEO UNIT NĂM H...
 
Biểu tượng trăng và bầu trời trong tác phẩm của Nguyễn Quang Thiều
Biểu tượng trăng và bầu trời trong tác phẩm của Nguyễn Quang ThiềuBiểu tượng trăng và bầu trời trong tác phẩm của Nguyễn Quang Thiều
Biểu tượng trăng và bầu trời trong tác phẩm của Nguyễn Quang Thiều
 
Halloween vocabulary for kids in primary school
Halloween vocabulary for kids in primary schoolHalloween vocabulary for kids in primary school
Halloween vocabulary for kids in primary school
 

Tài liệu Lập trình Zend Framework 2.x

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7. • .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
  • 8. 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 …
  • 9.
  • 10.
  • 11. • 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.
  • 12. • 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
  • 13. • 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
  • 14. • 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
  • 15. • 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ó
  • 16. • 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
  • 17. • 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ó
  • 18. • 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
  • 19. • 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.
  • 20. • 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
  • 21. • 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
  • 22. • 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
  • 23. • 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
  • 24. 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
  • 25. • Thay đổi hãng Taxi • Thay đổi hãng máy bay • Thay đổi hình thức đặt vé
  • 26. 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ý
  • 27.  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
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41. 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
  • 42. 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
  • 43.
  • 44. 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
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51. Filter Class Input Output ZendI18nFilterAlnum abc !@#$^&*( dec 12 ()*() 12 abcdec1212 ZendI18nFilterAlpha abc !@#$^&*( dec 12 ()*() 12 abcdec ZendFilterBaseName www.zend.vn/public/test.html test.html ZendFilterDir www.zend.vn/public/test.html www.zend.vn/public/ ZendFilterCallback Gọi các phương thức xử lý khác đã được xây dựng sẵn ZendFilterDigits Zend Framework 2.34 !@# 234 ZendFilterStringToLower Khóa học Zend Framework 2 khóa học zend framework 2 ZendFilterStringToUpper Khóa học Zend Framework 2 KHÓA HỌC ZEND FRAMEWORK 2
  • 52. Filter Class Input Output ZendFilterStringTrim Zend Framework 2 Zend Framework 2 ZendFilterStripTags <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 ZendFilterCompress Abc.txt Abc.zip ZendFilterDecompress Abc.zip Abc.txt ZendFilterPregReplace Sử dụng biểu thức chính quy trong Filter ZendFilterHtmlEntities This is a test " <> This is a test &quot; &lt;&gt;
  • 53. Filter Class Input Output ZendFilterWordCamelCaseToDash AbcDefGeh Abc-Def-Geh ZendFilterWordCamelCaseToSeparator AbcDefGeh Abc(x)Def(x)Geh ZendFilterWordCamelCaseToUnderscore AbcDefGeh Abc_Def_Geh ZendFilterWordDashToCamelCase Abc-Def-Geh AbcDefGeh ZendFilterWordDashToSeparator Abc-Def-Geh Abc(x)Def(x)Geh ZendFilterWordDashToUnderscore Abc-Def-Geh Abc_Def_Geh
  • 54. Filter Class Input Output ZendFilterWordSeparatorToCamelCase Abc(x)Def(x)Geh AbcDefGeh ZendFilterWordSeparatorToDash Abc(x)Def(x)Geh Abc-Def-Geh ZendFilterWordSeparatorToSeparator Abc(x)Def(x)Geh Abc(x)Def(x)Geh ZendFilterWordUnderscoreToCamelCase Abc_Def_Geh AbcDefGeh ZendFilterWordUnderscoreToSeparator Abc_Def_Geh Abc(x)Def(x)Geh ZendFilterWordUnderscoreToDash Abc_Def_Geh Abc-Def-Geh
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74. Thay đổi layout đang hiển thị
  • 75. ZendViewHelperBasePath <a href="<?php echo $this->basePath(); ?>">basePath</a> <link rel="stylesheet" type="text/css" href="<?php echo $this->basePath('css/base.css'); ?>" />
  • 76. ZendViewHelperCycle <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>
  • 79. ZendViewHelperGravatar $settings = array( 'img_size' => 40, 'default_img' => ZendViewHelperGravatar::DEFAULT_MM, 'secure' => null, ); $email = 'email@example.com'; echo $this->gravatar($email, $settings);
  • 82. ZendViewHelperHeadLink $renderer = $this->getServiceLocator()->get('ZendViewRendererPhpRenderer'); $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());
  • 83. ZendViewHelperHeadScript $renderer = $this->getServiceLocator()->get('ZendViewRendererPhpRenderer'); $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');
  • 84. ZendViewHelperInlineScript $viewhelpermanager = $this->getServiceLocator()->get('viewhelpermanager'); $script = $viewhelpermanager->get('inlineScript'); $script->appendScript( '$(document).ready(function() { alert("Hello"); });', 'text/javascript', array('noescape' => true)); // Disable CDATA comments
  • 88. ZendViewHelperPartial <?php echo $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' ) )); ?>
  • 90. ZendViewHelperPlaceholder $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') ?>
  • 94. ZendViewHelperServerUrl $serverURL = $this->serverUrl(); echo '<h3 style="color:red;">$serverURL: ' . $serverURL .'</h3>';
  • 95.
  • 96. 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' ),
  • 97. 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;
  • 99. Tìm hiểu các lớp router
  • 101. ZendMvcRouterHttpHostname $hostnameRoute = array( 'type' => 'hostname', 'options' => array( 'route' => 'zendskeleton.training.com', 'defaults' => array( '__NAMESPACE__' => 'MvcController', 'controller' => 'Index', 'action' => 'index' ) ) );
  • 102. ZendMvcRouterHttpLiteral $literalRoute = array( 'type' => 'Literal', 'options' => array( 'route' => '/contact', 'defaults' => array( '__NAMESPACE__' => 'MvcController', 'controller' => 'Index', 'action' => 'index' ), ), );
  • 103. ZendMvcRouterHttpScheme $schemeAccountRoute = array( 'type' => 'Scheme', 'options' => array( 'route' => '/account', 'scheme' => 'http', 'defaults' => array( '__NAMESPACE__ => 'MvcController', 'controller' => 'Index', 'action' => 'account', ), ), );
  • 104. ZendMvcRouterHttpSegment $segmentRoute = array( 'type' => 'Segment', 'options' => array( 'route' => '/:module[/]', 'constraints' => array( 'module' => 'm..', ), 'defaults' => array( '__NAMESPACE__ => 'MvcController', 'controller' => 'index', 'action' => 'segment', ), ), );
  • 105. ZendMvcRouterHttpRegex $regexRoute = array( 'type' => 'Regex', 'options' => array( 'regex' => '/course/(?<name>[a-zA-Z0-9-]+)-(?<id>[0- 9]+).(?<extension>(html|php|asp))', 'defaults' => array( '__NAMESPACE__' => 'MvcController', 'controller' => 'Router', 'action' => 'course', 'name' => 'zend-2x', 'id' => '100', 'extension' => 'phtml', ), 'spec' => '/course/%name%-%id%.%extension%', ), );
  • 107. 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]', ), ), ), ), );
  • 108.
  • 109. Tìm hiểu các controller plugins (ZendMvcControllerPlugin)
  • 110. ZendMvcControllerPluginForward 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; }
  • 112. ZendMvcControllerPluginParams $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
  • 113. ZendMvcControllerPluginRedirect $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
  • 114. ZendMvcControllerPluginUrl $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);
  • 115. ZendMvcControllerPluginFlashMessenger (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>'; } }
  • 116. ZendMvcControllerPluginFlashMessenger (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; }
  • 117. ZendMvcControllerPluginFlashMessenger (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; }
  • 118. ZendMvcControllerPluginFlashMessenger (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; }
  • 119. ZendMvcControllerPluginFlashMessenger (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>' ) )
  • 121. ZendMvcControllerPluginUrl $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);
  • 122. ZendMvcControllerPluginUrl $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);
  • 123. ZendMvcControllerPluginUrl $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);
  • 124. ZendMvcControllerPluginUrl $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);
  • 125. ZendMvcControllerPluginUrl $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);
  • 126.
  • 128. Các lớp Validator phổ biến
  • 129. Tùy biến thông báo lỗi $validator->setMessages(array( ZendValidatorStringLength::TOO_SHORT => "Giá trị đầu vào <b>%value%</b> phải lớn hơn %min% ký tự", ZendValidatorStringLength::TOO_LONG => "Giá trị đầu vào <b>%value%</b> phải nhỏ hơn %max% ký tự", )); $validator = new ZendVNValidatorStringLength(array( 'max' => 9, 'min' => 7 ));
  • 130. ValidatorChain $validatorChain = new ZendValidatorValidatorChain(); $validatorChain->attach(new ZendValidatorStringLength(array( 'min' => 6, 'max' => 12)), true) ->attach(new ZendValidatorEmailAddress());
  • 131. Xây dựng lớp Validate
  • 132. Quá trình upload tập tin
  • 133. Thao tác upload với một tập tin if($this->request->isPost()){ $upload = new ZendFileTransferAdapterHttp(); $fileInfo= $upload->getFileInfo(); $fileSize= $upload->getFileSize(); $fileName= $upload->getFileName(); $upload->setDestination(FILES_PATH . '/photo'); $upload->receive(); }
  • 134. Thao tác upload với nhiều tập tin if($this->request->isPost()){ $upload = new ZendFileTransferAdapterHttp(); // 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'); }
  • 135. Kiểm tra điều kiện upload tập tin if($this->request->isPost()){ $upload = new ZendFileTransferAdapterHttp(); $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); } } }
  • 136. Sử dụng Filter if($this->request->isPost()){ $upload = new ZendFileTransferAdapterHttp(); $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); } }
  • 138. Các thuộc tính mới trong thẻ <form>
  • 139. Các thuộc tính mới trong thẻ <input>
  • 143. Ràng buộc dữ liệu với InputFilter
  • 145. Tùy biến giao diện thông báo lỗi (Dạng 1)
  • 146. Tùy biến giao diện thông báo lỗi (Dạng 2)
  • 147. Tùy biến giao diện thông báo lỗi (Dạng 3)
  • 149. Sử dụng Ajax trong Zend Framework (Load content)
  • 150. Sử dụng Ajax trong Zend Framework (Selectbox)
  • 151.
  • 152. Kết nối cơ sở dữ liệu $adapter = new ZendDbAdapterAdapter(array( 'driver' => 'Pdo_Mysql', 'database' => 'bookstore', 'username' => 'root', 'password' => '', 'charset' => 'utf8', ));
  • 153. 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);
  • 154. Đăng ký Adapter qua Servicemanager 'service_manager'=> array( 'factories'=> array( 'ZendDbAdapterAdapter' => 'ZendDbAdapterAdapterServiceFactory', ), ) $adapter = $this->getServiceLocator()->get('ZendDbAdapterAdapter');
  • 156. Các trường hợp truy vấn cần thực hiện
  • 157. Các trường hợp truy vấn cần thực hiện
  • 158.
  • 159. Kiểm tra dữ liệu với ZendDbSqlPredicate trong mệnh đề WHERE
  • 160. Insert – Update – Delete
  • 161. Xây dựng class database kế thừa từ AbstractTableGateway
  • 162. Kiểm tra sự tồn tại của dữ liệu
  • 163. Bài tập tìm kiếm thông tin user theo địa chỉ email
  • 168.
  • 169. Các vấn đề cần tìm hiểu
  • 170. Các vấn đề cần tìm hiểu
  • 171. Các vấn đề cần tìm hiểu
  • 173. Tích hợp & Sử dụng module ZF2-AcMailer Alejandro Celaya acelaya Abdul Malik Ikhsan samsonasik
  • 174. Các vấn đề cần tìm hiểu
  • 175. Bài tập Page Login Page Logout Page User
  • 177.
  • 180.
  • 181. Xây dựng cấu trúc ứng dụng
  • 182.  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ả
  • 187. • 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
  • 191. Cập nhật phương thức getConfig trong tập tin Module.php Cấu trúc thư mục
  • 192. Cấu trúc thư mục Cập nhật phương thức getAutoloaderConfig trong tập tin Module.php
  • 193. Cấu trúc thư mục Thay đổi layout đối với tập tin view
  • 194. 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)
  • 195. 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
  • 196.
  • 197. Full document & source: https://github.com/zendframework/ZendDeveloperTools
  • 198.
  • 199. Xây dựng ứng dụng Bookstore (Backend)
  • 200.  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
  • 201.  Xây dựng header  Xây dựng breadcrumb  Xây dựng sidebar  Xây dựng dashboard
  • 202. 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
  • 203. 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)
  • 204. 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
  • 205.  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
  • 206.  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.
  • 207. 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
  • 208. 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
  • 209. 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ự
  • 210. Quản trị hệ thống menu (category) đa cấp
  • 211. 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
  • 212. Quản trị hệ thống menu (category) đa cấp
  • 213. • 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)
  • 214. 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
  • 215. Root0 7 B3 4 C5 6 New? ? A1 2 4 trường hợp thêm node vào cây
  • 216. Root0 7 B3 4 C5 6 New? ? A1 2 4 trường hợp thêm node vào cây left right before after
  • 217. Root0 9 B3 6 C7 8 New6 7 A1 2 4 trường hợp thêm node vào cây (right) right B14 5
  • 218. Root0 9 B3 6 C7 8 New6 7 A1 2 4 trường hợp thêm node vào cây (right) right 8 9 10 11 B14 5
  • 219. Root0 9 B3 6 C7 8 New6 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 = ParentRight Right = ParentRight + 1 Level = ParentLevel + 1 Parent = ParentID B14 5
  • 220. Root0 9 B3 6 C7 8 New6 7 A1 2 4 trường hợp thêm node vào cây (left) left B14 5
  • 221. Root0 9 B3 6 C7 8 New4 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
  • 222. Root0 9 B3 6 C7 8 New4 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 + 1 Right = ParentLeft + 2 Level = ParentLevel + 1 Parent = ParentID B14 5 6 7
  • 223. Root0 7 B3 4 C5 6 New3 4 A1 2 4 trường hợp thêm node vào cây (before) 8 before
  • 224. Root0 7 B3 4 C5 6 New3 4 A1 2 4 trường hợp thêm node vào cây (before) before 6 7 8 9 5
  • 225. Root0 7 B3 4 C5 6 New3 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 = BrotherLeft Right = BrotherLeft + 1 Level = BrotherLevel Parent = BrotherParent 5
  • 226. Root0 7 B3 4 C5 6 New5 6 A1 2 4 trường hợp thêm node vào cây (after) after
  • 227. Root0 7 B3 4 C5 6 New5 6 A1 2 4 trường hợp thêm node vào cây (after) after 7 8 9
  • 228. Root0 7 B3 4 C5 6 New5 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 + 1 Right = BrotherRight + 2 Level = BrotherLevel Parent = BrotherParent
  • 229. 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
  • 230. 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
  • 231. 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)/2 Left = 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
  • 232. 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
  • 233. 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
  • 234. 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
  • 235. 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 -1 D16 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)
  • 236. 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 -1 D16 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)
  • 237. 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 -1 D16 7 D28 9 left
  • 238. 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 -1 D16 7 D28 9 left 12 1310 11 14 15 16 17 6 7 9 8
  • 239. 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 -1 D16 7 D28 9 left 12 1310 11 14 15 16 17 6 7 9 8 Left = Left + totalNode*2 (left > ParentLeft & right > 0) Right = Right + totalNode*2 (right > ParentLeft)
  • 240. 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 -1 D16 7 D28 9 left 12 1310 11 14 15 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
  • 241. 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
  • 242. 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
  • 243. 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)
  • 244. 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
  • 245. 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
  • 246. 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
  • 247. 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 )
  • 248. 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)
  • 249. 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
  • 250. 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
  • 251. 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
  • 252. 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
  • 253. 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
  • 254. 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
  • 255. 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