Support Forum  

Trở lại   Support Forum > PHP Framework > Nội dung môn học

Trả lời
 
Công cụ bài viết Kiểu hiển thị
  #1  
Cũ 11-05-2009, 12:04 AM
Kenny Kenny đang ẩn
Administrator
 
Tham gia ngày: May 2008
Đến từ: HCMC
Bài gửi: 487
Gửi tin nhắn qua Yahoo! tới Kenny
Thumbs up Zend Framework cho người mới bắt đầu

Bữa nay đêm buồn không có gì làm. Nên viết 1 bài hưỡng dẫn các bạn làm quen với zend Framework. Cũng nên tìm hiểu vì sắp sửa học ở lớp PHP Framework rồi phải không nào.

Bài viết này được lấy 1 phần từ giáo trình mà tôi đã soạn cho khóa PHP Framework.

A- Tìm hiểu cách làm việc ZF:

ZF được xem là một trong những framework phổ biến và có sức mạnh rất lớn so với mặt bằng chung các Framework đang có mặt hiện nay. Tuy nhiên, để sử dụng thành thạo được ZF. Người sử dụng phải có những hiểu biết nhất định về các khái niệm mô hình ba lớp M-V-C, kiến thức PHP 5.x thuần và một số kinh nghiệm xử lý tình huống khi tiếp cận lỗi thực tế.

Trong bài này, chúng ta sẽ nói về những định nghĩa, kiến trúc của ZF như thế nào và làm cách nào để sử dụng Zend Application cấu hình thư mục tùy biến trên website của chúng ta.

ZF được xây dựng với một thư viên rất đồ sộ. Nên việc nghiên cứu và đọc hết tài liệu ZF là điều không đơn giản. Tuy nhiên, bạn cũng cần tìm hiểu những nguyên tắc hoạt động của ZF như thế nào.

1- Cách làm việc và xây dựng lớp trên ZF:

Chúng ta vẫn thấy ZF đưa ra tên các thư viện Zend_application hay Zend_Application_Bootstrap_Bootstrapper. Vậy làm với cách viết này, ZF hoạt động ra sao ?.

Trên thực tế, ZF dựa vào thư viện để đọc và làm việc trên các lớp một cách rất cụ thể. Bởi đường dẫn chi tiết của chúng đã được thể hiện rõ nét ngay trên tên của chúng.

Như vậy khi ZF đặt tên Zend_Application. Điều đó có nghĩa là nó gọi tới file Application trong thư mục zend.

Có nghĩa là: library/Zend/Application.php
Hay với tên: Zend_Application_Bootstrap_Bootstrapper
Có nghĩa là: library/Zend/Application/Bootstrap/Bootstrapper.php

Thật đơn giản phải không nào ?. Tuy nhiên, để can thiệp vào các thư viện này. Đòi hỏi bạn phải rất vững và hiểu thật rõ ZF, nếu không thư viện và ứng dụng của ZF sẽ bị hỏng khi các bạn sử dụng các thư viện.

2- Cài đặt Zend Framework và ứng dụng đầu tiên:

Đầu tiên, bạn cần tải toàn bộ source zend framework tại đây:
http://framework.zend.com/releases/Z....5-minimal.zip

Ở đây, chúng ta sẽ sử dụng bản ZF mới nhất là 1.9.5

Xây dựng mô hình các thư mục như sau:
www/zfexam/application
www/zfexam/public/
www/zfexam/library

Tại thư mục library, bạn chỉ việc copy và thư viện zend, phiên bản mới nhất vào đây.

Thư mục pubic: bạn lần lượt tạo 2 file mới là: index.php và .htaccess
File index với nội dung như sau:

PHP Code:
<?php
defined
('APPLICATION_PATH'
    || 
define('APPLICATION_PATH'
              
realpath(dirname(__FILE__) . '/../application')); 
defined('APPLICATION_ENV'
    || 
define('APPLICATION_ENV'
              (
getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV'
                                         : 
'production')); 
set_include_path(implode(PATH_SEPARATOR, array( 
    
dirname(dirname(__FILE__)) . '/library'
    
get_include_path(), 
))); 

require_once 
'Zend/Application.php' ;

$application = new Zend_Application
    
APPLICATION_ENV
    
APPLICATION_PATH '/configs/application.ini' 
); 

$application->bootstrap()->run();
Chúng ta chưa cần quan tâm đến mã nguồn như thế nào, bởi vì ỏ phần dưới chúng ta sẽ đi vào chi tiết từng dòng lệnh.
Trong file .htaccess lại tiếp tục copy và past đoạn code sau:

Mã:
RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [NC,L] 
RewriteRule ^.*$ index.php [NC,L]
Thư mục application bạn lại tạo một số thư mục:
www/zfexam/application/controllers
www/zfexam/application/views
www/zfexam/application/models
www/zfexam/application/configs
Tại thư mục controllers tạo file:
www/zfexam/application/controllers/IndexController.php
www/zfexam/application/controllers/ErrorController.php
tại file IndexController.php copy nội dung sau:
PHP Code:
<?php 
class IndexController extends Zend_Controller_Action 

    public function 
indexAction() 
    { 
    } 
}
?>
Tại thư mục views tại thư mục:
www/zfexam/application/views/scripts/index/index.phtml
www/zfexam/application/views/scripts/error/index.html
File index/index.phtml có nội dung như sau:

Mã:
<h1>hello Zend Framework</h1>
Tại thư mục configs tạo file application.ini:
www/zfexam/application/configs/application.ini
Với nội dung:

Mã:
[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
Và tiếp tục tạo file bootstrap.php ở thư mục application
www/zfexam/application/bootstrap.php
Với nội dung:
PHP Code:
<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
}
Và cuối cùng chúng ta cùng chạy:
http://localhost/zfexam/public/
Như vậy, bạn đã viết ứng dụng đầu tiên bằng ZF rồi đấy.
__________________
Bạn nên :

+ Nên sử dụng Tag [Help] khi bạn đặt câu hỏi.
+ Tìm kiếm trước khi hỏi một vấn đề nào đó.
+ Khi có vấn đề về code, hãy lập chủ đề và đưa code của bạn lên forum.
+ Nên viết có dấu khi tiến hành gửi bài viết trên diễn đàn.

Tình trạng: Lên núi bế quan ^^

Đang Nghiên cứu: PHP & Flex, Web Application for Mobil, Action script 3.0

Sách đang đọc: Ai che lưng cho bạn, Nghệ thuật thuyết phục nhân sự.
Trả lời với trích dẫn
  #2  
Cũ 11-05-2009, 12:10 AM
Kenny Kenny đang ẩn
Administrator
 
Tham gia ngày: May 2008
Đến từ: HCMC
Bài gửi: 487
Gửi tin nhắn qua Yahoo! tới Kenny
Mặc định

3- Nguyên tắc MVC trên ZF:
Cũng như bao framework khác, ZF cũng hoạt động trên mô hình MVC.
Ví dụ xét liên kết:
http://qhonline.info/book/viewbook/
Như vậy book được xem là một controller và viewbook được xem là một action của controller đó. Tới đây chắc hẳn bạn đã tìm ra những điểm chung của ZF và CI mà chúng ta đã từng nghiên cứu rồi phải không nào.
Khi hoạt động, trong controller bạn sẽ khởi tạo những action một cách cụ thể, thông qua việc thiết lập phương thức một cách cụ thể.
PHP Code:
<?php 
class IndexController extends Zend_Controller_Action 

    public function 
indexAction() 
    { 
    } 
}
?>
Như vậy IndexController cho ta Controller mang tên index và indexAction cho ta action là index.
Khi đó bạn bắt buộc phải khởi tạo trong view một thư mục ứng với controller là index trong scripts. Và file index.phml ứng với action là index. Để chúng hiểu được mô hình một cách cụ thể hơn.
Xét ví dụ khác:

PHP Code:
<?
class BookController extends Zend_Controller_Action 
{
    public function 
indexAction()
    {
    }
    public function 
viewbookAction()    
{
    }    
}
?>
Ở ví dụ này cho ta biết Controller là Book, 2 action là index và viewbook.
Như vậy, để chạy được ứng dụng. Bạn cần tạo thư mục Book trong view và file index.phtml, viewbook.phtml.
Cụ thể:
application/controller/BookController.php
application/views/scripts/Book/index.phtml
application/views/scripts/Book/viewbook.phtml
__________________
Bạn nên :

+ Nên sử dụng Tag [Help] khi bạn đặt câu hỏi.
+ Tìm kiếm trước khi hỏi một vấn đề nào đó.
+ Khi có vấn đề về code, hãy lập chủ đề và đưa code của bạn lên forum.
+ Nên viết có dấu khi tiến hành gửi bài viết trên diễn đàn.

Tình trạng: Lên núi bế quan ^^

Đang Nghiên cứu: PHP & Flex, Web Application for Mobil, Action script 3.0

Sách đang đọc: Ai che lưng cho bạn, Nghệ thuật thuyết phục nhân sự.
Trả lời với trích dẫn
  #3  
Cũ 11-05-2009, 12:14 AM
Kenny Kenny đang ẩn
Administrator
 
Tham gia ngày: May 2008
Đến từ: HCMC
Bài gửi: 487
Gửi tin nhắn qua Yahoo! tới Kenny
Mặc định

B- Zend View:

Ở bài trước, chúng ta đã làm việc sơ qua đối với mô hình view trong MVC. Tuy nhiên, những gì mà chúng ta thao tác chỉ là một phần cấu trúc của zend view. Để ứng dụng linh hoạt những thế mạnh của zend view, chúng ta cần tìm hiểu phương thức mà Zend View đang hoạt động như thế nào.
Trong ZF để xây thực thi và truyền tham số chúng ta cần sử dụng:
$this->view->tên_biến;
Và tại các thư mục view chúng ta chỉ cần sử dụng cú pháp: $this->view để lấy giá trị mà chúng ta đang truyền từ controller.
Ví dụ:
Trong controller index ta tạo action index với nội dung:
PHP Code:
<?php 
class IndexController extends Zend_Controller_Action 

    public function 
indexAction() 
    { 
    
$this->view->string"hello Zend FrameWork";
    } 
    
}
Trong thư mục view/scripts/index/index.phtml ta lại viết đoạn code sau:
PHP Code:
<?
echo "<h1>".$this->string."</h1>";
?>
Như vậy trong controller, ta truyền biến string thông qua mô hình view của ZF. Và gán nó với giá trị mình mong muốn. Tiếp tục, ở phần view chúng ta lại sử dụng biến khởi tạo ở controller. Bằng $this->tên_biến.

Bạn cũng có thể sử dụng một mảng lưu thông tin và sử dụng view để gởi thông tin của mảng ấy:

PHP Code:
<?php 
class IndexController extends Zend_Controller_Action 

    public function 
indexAction() 
    { 
    
$data= array(
        
'title' => 'Zend Framework',
        
'author'=> 'Kenny',
        
'date'     => '20-11-2009',
        
'rating'=> 'very Hard'
    
);
    
$this->view->info =$data;
    } 
}
Và trang view nhận giá trị của mảng này:

PHP Code:
<?
foreach($this->info as $k => $v)
{
    echo 
"<b>$k</b>: $v<br />";
}
?>
__________________
Bạn nên :

+ Nên sử dụng Tag [Help] khi bạn đặt câu hỏi.
+ Tìm kiếm trước khi hỏi một vấn đề nào đó.
+ Khi có vấn đề về code, hãy lập chủ đề và đưa code của bạn lên forum.
+ Nên viết có dấu khi tiến hành gửi bài viết trên diễn đàn.

Tình trạng: Lên núi bế quan ^^

Đang Nghiên cứu: PHP & Flex, Web Application for Mobil, Action script 3.0

Sách đang đọc: Ai che lưng cho bạn, Nghệ thuật thuyết phục nhân sự.
Trả lời với trích dẫn
  #4  
Cũ 11-05-2009, 12:18 AM
Kenny Kenny đang ẩn
Administrator
 
Tham gia ngày: May 2008
Đến từ: HCMC
Bài gửi: 487
Gửi tin nhắn qua Yahoo! tới Kenny
Mặc định

C- Zend Layout:

ZF hỗ trợ người sử dụng bằng một số phương thức đặc biệt. Nó cho phép người sử dụng dễ dàng thay đổi thông tin hoặc giao diện của layout hoặc có thể khởi tạo cùng lúc nhiều giao diện trong hệ thống ZF.
Để sử dụng zend layout. Bạn cần cấu hình trong file application.ini thông số sau:
Trong phân đoạn [production] chúng ta thêm đoạn code sau:
Mã:
resources.layout.layout = "layout"
resources.layout.layoutPath = APPLICATION_PATH  "layouts/scripts"
Hai dòng này cho ZF biết thông tin về layout của chúng ta. Như vị trí đặt layout ở đâu và tên của file layout là gì.
Như vậy, ta có thể tạo thư mục layout trong thư mục application để giải quyết bài toán này.
Tại trang application/layouts/scripts/layout.phtml .bạn có thể cấu hình các thông tin như:
PHP Code:
<?php echo $this->doctype() ?> 
<html> 
<head> 
    <?php echo $this->headTitle() ?> 
    <?php echo $this->headLink() ?> 
    <?php echo $this->headStyle() ?> 
    <?php echo $this->headScript() ?> 
</head> 
<body> 
    <?php echo $this->layout()->content ?> 
</body> 
</html>
Thông tin ở trên dùng để cấu hình các thông số như DOCTYPE, TITLE, LINK CSS,….của một tài liệu HTML.
Phần $this->layout()->content là phần hiển thị view trong mỗi action của chúng ta.
Như vậy trong controller, chúng ta sẽ chuyển nội dung file CSS đến layout thông qua zend view. Và đặt chúng trong hàm init(). Hàm init() là hàm đặc biệt trong cấu trúc ZF, nó sẽ được ZF ưu tiên gọi đầu tiên khi chúng viếng thăm bất cứ controller nào có mặt hàm init.
Như vậy ta có cách xây dựng như sau:

PHP Code:
<?php 
class BlogController extends Zend_Controller_Action 

    function 
init(){
    
$dir=$this->_request->getBaseUrl ();
    
$this->view->headLink()->appendStylesheet($dir.'/public/css/style.css');
    
$this->view->headLink()->offsetSetStylesheet(1$dir.'/public/css/style.css''all');
    
$this->view->headLink()->prependStylesheet($dir.'/public/css/style.css''screen''lte IE 8');
}
    public function 
indexAction() 
    { 
    } 
}
Chú ý dòng :

PHP Code:
$dir=$this->_request->getBaseUrl (); 
Việc truyền tham số CSS, javascript,…., chúng ta phải sử dụng đường dẫn tương đối. Nghĩa là lấy ra đường dẫn hiện tại của người sử dụng rồi mới tiến hành truy cập vào đường dẫn thư mục của chúng. Trong trường hộp này tôi đặt file CSS trong thư mục public. Vậy một lần nữa ta có thể lấy được nội dung file css từ nó.

Như vậy, khi người dùng truy cập vào bất kỳ action nào của controller blog, chúng đều triệu gọi layout này giúp bạn rất rõ ràng.

Tuy nhiên, trong một số trường hợp chúng ta sẽ không thể lấy được thông tin từ getBaseUrl(). Nhất là với trường hợp cấu hình website phá vỡ kiến trúc chuẩn của Zend. Và lúc này bạn cần phải sử dụng controller để cấu hình điều hướng chính.

Lúc này trong file bootstrap.php, chúng ta phải viết phương thức _initControllers(). Đây là phương thức cho phép chúng ta triệu gọi đầu tiên, thường được dùng để cấu hình controller.

Như vậy ta cấu hình thông tin hàm như sau:

PHP Code:
<?
protected function _initControllers()
    {
          
$frontController Zend_Controller_Front::getInstance();

        
$frontController->setBaseUrl('/projects/myapp');
    }
?>
Trong ví dụ này, chúng ta setBaseUrl mặc định sẽ là thư mục /project/myapp.


D- Zend Model:
Để sử dụng model trong ZF với kiến trúc ban đầu, trước hết bạn cần thiết lập ở file bootstrap.php với tham số sau:
PHP Code:
 protected function _initAutoload()
{
$autoloader = new Zend_Application_Module_Autoloader(array(
'namespace' => '',
'basePath' => dirname(__FILE__),
));
return 
$autoloader;

protected function 
_initDB()
{
$db Zend_Db::factory('Pdo_Mysql', array ('host' => 'localhost''username' => 'root'
'password' => 'root'
'dbname' => 'zfexam'));
$db->setFetchMode(Zend_Db::FETCH_BOTH);
Zend_Db_Table::setDefaultAdapter($db);
return 
$db;

Hàm _initAutoload() có trách nhiệm sẽ chỉ cho ZF hiểu rằng bạn đang muốn load với namespace nào và đường dẫn thư mục ra sao. Trong trường hợp này, tôi gọi namespace= "". Vì cấu trúc mà tôi đang cấu hình trong ZF chính là cấu trúc mặc định chưa có module.
Hàm _initDB() là hàm dùng khai báo thông tin CSDL của bạn. Với định dạng là PDO (Hãy kiểm tra xem bạn đã bật PDO chưa nhé).

Tiếp tục trong models bạn chỉ cần khởi tạo class như sau:
PHP Code:
<?php
class Model_Info extends Zend_Db_Table_Abstract
protected 
$_name 'test'
protected 
$_primary 'id'
public function 
listinfo()
{
$data=$this->fetchall();
return 
$data;
}

}
Việc khai báo tên class cũng trở nên đơn giản hơn bao giờ hết. Lúc này, vì namespace ta để rỗng. Nên không cần gọi module ở đầu cho việc khai báo trong class.
Dựa vào tên class ta có thể hiểu: Models/Info.php.
Lưu ý: mặc dù thư mục trong cấu trúc của chúng ta là Models, nhưng khi triển khai trong ZF thì ta phải sử dụng là Model.
Trước khi sử dụng, ta cần khai báo cho ZF biết tên mà bảng chúng ta cần thao tác ở đây là gì. Cụ thể là bảng test, và với khóa chính là id.

Tiếp tục, tại controller ta chỉ cần khởi tạo action và gọi chúng như sau:
PHP Code:
public function infoAction()
{
$model= new Model_Info();
$this->view->data =$model->listinfo();

__________________
Bạn nên :

+ Nên sử dụng Tag [Help] khi bạn đặt câu hỏi.
+ Tìm kiếm trước khi hỏi một vấn đề nào đó.
+ Khi có vấn đề về code, hãy lập chủ đề và đưa code của bạn lên forum.
+ Nên viết có dấu khi tiến hành gửi bài viết trên diễn đàn.

Tình trạng: Lên núi bế quan ^^

Đang Nghiên cứu: PHP & Flex, Web Application for Mobil, Action script 3.0

Sách đang đọc: Ai che lưng cho bạn, Nghệ thuật thuyết phục nhân sự.
Trả lời với trích dẫn
  #5  
Cũ 11-05-2009, 09:04 AM
Avatar của minhdiep
minhdiep minhdiep đang ẩn
PHP Nâng Cao
 
Tham gia ngày: May 2009
Học Viên: Hoàng Văn Điệp
Bài gửi: 279
Gửi tin nhắn qua Yahoo! tới minhdiep
Mặc định

Cảm ơn Thầy, những kiến thức rất cơ bản về Zend thật bổ ích này.
Trả lời với trích dẫn
  #6  
Cũ 11-06-2009, 12:02 AM
squall squall đang ẩn
PHP Nâng Cao
 
Tham gia ngày: Dec 2008
Bài gửi: 29
Mặc định

wow, bài viết hay quá thầy ơi, trước giờ em đọc ebook cũng không hiểu rõ như bây giờ. Đúng là thầy viết tutorial thì có khác thật.
Trả lời với trích dẫn
  #7  
Cũ 11-15-2009, 09:35 AM
nguyenviettram24h nguyenviettram24h đang ẩn
PHP Framework
 
Tham gia ngày: May 2009
Học Viên: Nguyễn Viết Trâm
Bài gửi: 55
Mặc định

thầy và các bạn ơi , mình bị lỗi này , ai biết sữa dùm mình với: Thanks nha
chạy trang : http://localhost/zfexam/public
-----------------------------------------

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, nguyenviettram24h@yahoo.com.vn and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.
Apache/2.2.8 (Win32) PHP/5.2.6 Server at localhost Port 80
Trả lời với trích dẫn
  #8  
Cũ 11-15-2009, 10:41 AM
Kenny Kenny đang ẩn
Administrator
 
Tham gia ngày: May 2008
Đến từ: HCMC
Bài gửi: 487
Gửi tin nhắn qua Yahoo! tới Kenny
Mặc định

máy em đã bật mod rewrite lên chưa ?.
Vì khi cài đặt ZF em phải chạy file .htaccess. Nên nếu không bật mod này lên thì hệ thống sẽ báo lỗi như trên.
__________________
Bạn nên :

+ Nên sử dụng Tag [Help] khi bạn đặt câu hỏi.
+ Tìm kiếm trước khi hỏi một vấn đề nào đó.
+ Khi có vấn đề về code, hãy lập chủ đề và đưa code của bạn lên forum.
+ Nên viết có dấu khi tiến hành gửi bài viết trên diễn đàn.

Tình trạng: Lên núi bế quan ^^

Đang Nghiên cứu: PHP & Flex, Web Application for Mobil, Action script 3.0

Sách đang đọc: Ai che lưng cho bạn, Nghệ thuật thuyết phục nhân sự.
Trả lời với trích dẫn
  #9  
Cũ 11-25-2009, 08:54 PM
huytatnguyen huytatnguyen đang ẩn
Junior Member
 
Tham gia ngày: Nov 2009
Bài gửi: 3
Mặc định

Chào thầy
khi chưa bật mod_rewrite thì báo lỗi
nhưng bật mod_rewrite thì chỉ thấy chuỗi

bootstrap()->run();

sao nó không xuất ra chuỗi "hello Zend Framework" vậy thầy ?
Trả lời với trích dẫn
  #10  
Cũ 11-25-2009, 10:01 PM
Kenny Kenny đang ẩn
Administrator
 
Tham gia ngày: May 2008
Đến từ: HCMC
Bài gửi: 487
Gửi tin nhắn qua Yahoo! tới Kenny
Mặc định

Bật mod rewrite thì kết quả xuất ra bình thường mà bạn.
Bạn có làm đúng hết các bước như đã hưỡng dẫn ở trên không ???.
__________________
Bạn nên :

+ Nên sử dụng Tag [Help] khi bạn đặt câu hỏi.
+ Tìm kiếm trước khi hỏi một vấn đề nào đó.
+ Khi có vấn đề về code, hãy lập chủ đề và đưa code của bạn lên forum.
+ Nên viết có dấu khi tiến hành gửi bài viết trên diễn đàn.

Tình trạng: Lên núi bế quan ^^

Đang Nghiên cứu: PHP & Flex, Web Application for Mobil, Action script 3.0

Sách đang đọc: Ai che lưng cho bạn, Nghệ thuật thuyết phục nhân sự.
Trả lời với trích dẫn
Trả lời

Tags
zend framework, zend framework example

Công cụ bài viết
Kiểu hiển thị

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

BB code đang Mở
Mặt cười đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT +7. Hiện tại là 12:42 AM

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Bản quyền thuộc về QHOnline Support - Phát triển bởi các học viên.