Tài liệu hướng dẫn xây dựng component trong Joomla! 1.5
Copyleft by Đoàn Thanh Tám
Trang 4/41
Email: tamdt_a9tth@yahoo.com
/**
* @package Joomla.Tutorials
* @subpackage Components
* components/com_hello/hello.php
* @link http://dev.joomla.org/component/option,com_jd-
wiki/Itemid,31/id,tutorials:modules/
* @license GNU/GPL
*/
// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );
// Require the base controller
require_once( JPATH_COMPONENT.DS.'controller.php' );
// Require specific controller if requested
if($controller = JRequest::getWord('controller')) {
$path = JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php';
if (file_exists($path)) {
require_once $path;
} else {
$controller = '';
}
}
// Create the controller
$classname = 'HelloController'.$controller;
$controller = new $classname( );
// Perform the Request task
$controller->execute( JRequest::getVar( 'task' ) );
// Redirect if set by the controller
$controller->redirect();
?>
Câu lệnh đầu tiên là câu lệnh kiểm tra bảo mật.
JPATH_COMPONENT là đường dẫn tuyệt đối tới component hiện tại, trong trường
hợp của chúng ta là components/com_hello. Nếu bạn cần xác định site component hoặc
admin component thì bạn có thể sử dụng JPATH_COMPONENT và
JPATH_COMPONENT_ADMINISTRATOR.
DS là dấu phân cách thư mục trong hệ thống của bạn: có thể là “\” hoặc “/”. Điều này
được thiết lập tự động bởi frameword, vì thế developer không phải quan tâm đến việc
phát triển các phiên bản khác nhau cho các hệ điều hành khác nhau. DS sẽ luôn được sử
dụng khi tham chiếu đến các file trên máy chủ cục bộ.
Tài liệu hướng dẫn xây dựng component trong Joomla! 1.5
Copyleft by Đoàn Thanh Tám
Trang 5/41
Email: tamdt_a9tth@yahoo.com
Sau khi tải controler cơ bản, chúng ta sẽ kiểm tra một controler cụ thể cần đến. Trong
component này, controler cơ bản chỉ là một controler nhưng chúng ta đề cập đến điều này
cho các công việc trong tương lai.
<classname>JRequest</classname>:getVar() tìm một biến trong URL hoặc POST dữ
liệu. Bởi vậy nếu URL của chúng ta là:
index.php?option=com_hello>controller=controller_name
thì chúng ta có thể nhận được tên controler của chúng ta trong component bằng sử
dụng câu lệnh sau: echo <classname>JRequest</classname>::getVar(’controller’);
Bây giờ chúng ta đã có controler cơ sở ‘<classname>HelloController</classname>’
trong com_hello/controller.php, và nếu cần thiết bổ sung thêm các controler dạng như:
‘<classname>HelloControllerController1</classname>’ trong
com_hello/controllers/controller1.php. Sự sắp xếp theo hệ thống này sẽ tạo ra thuận lợi
về sau: ‘{Componentname}{Controller}{Controllername}’.
Sau khi controler được tạo ra, chúng ta cho controler chạy nhiệm vụ như được chỉ ra
trong URL: index.php?option=com_hello&task=sometask. Nếu không có nhiệm vụ nào
được thiết lập thì nhiệm vụ mặc định ‘display’ sẽ được giả định. Khi ‘display’ được sử
dụng, biến ‘view’ sẽ quyết định cái gì sẽ được hiển thị. Các nhiệm vụ khác như ‘save’,
‘edit’, ‘new’, …
Controler có thể quyết định redirect the page (thực hiện tải lại một trang), thông
thường là sau khi một nhiệm vụ như ‘save’ được hoàn thành. Câu lệnh cuối cùng thực
hiện việc này.
Điểm vào chính (hello.php) về bản chất đã thông qua việc điều khiển controler thực
hiện các nhiệm vụ được đặt ra trong request.
5.2. Tạo controler
Component của chúng ta chỉ có một nhiệm vụ - greet the world (thể hiện lời chào).
Bởi vậy controler sẽ rất đơn giản. Không cần đến việc tính toán trên dữ liệu. Tất cả
những gì cần thiết phải làm là tải view thích hợp. Chúng ta sẽ chỉ có một phương thức
trong controler là display(). Hầu hết các hàm cần thiết được xây dựng trong lớp
JControler, bởi vậy tất cả những gì chúng ta cần là gọi phương thức JControler::display();
Code của controler cơ sở như sau:
<?php
/**
* @package Joomla.Tutorials
* @subpackage Components
* @link http://dev.joomla.org/component/option,com_jd-
wiki/Itemid,31/id,tutorials:modules/
* @license GNU/GPL
*/
// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport('joomla.application.component.controller');
/**
Tài liệu hướng dẫn xây dựng component trong Joomla! 1.5
Copyleft by Đoàn Thanh Tám
Trang 6/41
Email: tamdt_a9tth@yahoo.com
* Hello World Component Controller
*
* @package Joomla.Tutorials
* @subpackage Components
*/
class HelloController extends JController
{
/**
* Method to display the view
*
* @access public
*/
function display()
{
parent::display();
}
}
?>
Việc khởi tạo của <classname>JController</classname> sẽ luôn luôn đăng ký một
nhiệm vụ display() khi không có nhiệm vụ cụ thể nào được chỉ ra (bằng việc sử dụng
phương thức registerDefaultTask()), nó sẽ được thiết lập như một nhiệm vụ mặc định.
Phương thức display() này thật sự không cần thiết bởi vì tất cả những gì nó làm là gọi
hàm khởi tạo của cha nó. Tuy nhiên, đó là một cơ sở khá tốt để chỉ ra điều gì cần phải
làm trong controler.
Phương thức <classname>JController</classname>::display() sẽ xác định view và
layout từ request, tải view đó và thiết lập layout. Khi bạn tạo ra một menu item cho
component của bạn, menu manager sẽ cho phép admin lựa chọn view mà họ thích để thể
hiện và trên layout cụ thể. Một view thông thường được xem như một cách hiển thị của
một tập các dữ liệu nào đó (ví dụ, danh sách các car, danh sách các event, một car đơn,
một event đơn, …). Một layout là một cách tổ chức view.
Trong component của chúng ta chúng ta sẽ có một view đơn được gọi là hello, và một
layout đơn (default).
5.3. Tạo view
Nhiệm vụ của view là rất đơn giản: nó nhận dữ liệu được thể hiện và đặt nó lên
template. Dữ liệu được đặt lên template sử dụng phương thức
<classname>JView</classname>::assignRef. Đoạn mã của view như sau:
<?php
/**
Tài liệu hướng dẫn xây dựng component trong Joomla! 1.5
Copyleft by Đoàn Thanh Tám
Trang 7/41
Email: tamdt_a9tth@yahoo.com
* @package Joomla.Tutorials
* @subpackage Components
* @link http://dev.joomla.org/component/option,com_jd-
wiki/Itemid,31/id,tutorials:modules/
* @license GNU/GPL
*/
// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport( 'joomla.application.component.view');
/**
* HTML View class for the HelloWorld Component
*
* @package HelloWorld
*/
class HelloViewHello extends JView
{
function display($tpl = null)
{
$greeting = "Hello World!";
$this->assignRef( 'greeting', $greeting );
parent::display($tpl);
}
}
?>
5.4. Tạo template
Joomla template/ layout là các file PHP thông thường, được sử dụng để bố trí, xếp
đặt dữ liệu từ view theo một cách cụ thể nào đó. Các biến được gán bởi phương thức
JView::assignRef có thể được truy cập từ template sử dụng $this→{propertyname} (xem
mã template bên dưới như một ví dụ).
Template của chúng ta rất đơn giản, chúng ta chỉ muốn thể hiện một lời chào hợp quy
cách từ view.
<?php // no direct access
defined('_JEXEC') or die('Restricted access'); ?>
<h1><?php echo $this->greeting; ?></h1>
5.5. Đóng gói tất cả - Tạo ra file hello.xml
Tài liệu hướng dẫn xây dựng component trong Joomla! 1.5
Copyleft by Đoàn Thanh Tám
Trang 8/41
Email: tamdt_a9tth@yahoo.com
Có thể cài đặt thủ công một component bằng cách copy tất cả các file bằng FPT client
và hiệu chỉnh CSDL. Nhưng sẽ hiệu quả hơn nếu tạo ra một file được đóng gói để
Joomla! Installer thực hiện điều này cho bạn. File đóng gói này sẽ chứa nhiều dạng thông
tin khác nhau như:
• Các miêu tả chi tiết cơ bản về component của bạn (ví dụ như tên), và tùy ý
một số mô tả thông tin về bản quyền ….
• Một danh sách các file cần copy.
• Một file PHP thực hiện bổ sung các thao tác cài đặt và gỡ bỏ (file này là
không bắt buộc).
• Một file SQL có chứa các câu truy vấn dữ liệu mà sẽ được thực hiện vào lúc
cài đặt hoặc gỡ bỏ (file này là không bắt buộc).
Định dạng của file XML như dưới đây:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/component-
install.dtd">
<install type="component" version="1.5.0">
<name>Hello</name>
<! The following elements are optional and free of formatting
conttraints >
<creationDate>2007 02 22</creationDate>
<author>John Doe</author>
<authorEmail>john.doe@example.org</authorEmail>
<authorUrl>http://www.example.org</authorUrl>
<copyright>Copyright Info</copyright>
<license>License Info</license>
<! The version string is recorded in the components table >
<version>Component Version String</version>
<! The description is optional and defaults to the name >
<description>Description of the component </description>
<! Site Main File Copy Section >
<! Note the folder attribute: This attribute describes the folder
to copy FROM in the package to install therefore files copied
in this section are copied from /site/ in the package >
<files folder="site">
<filename>index.html</filename>
<filename>hello.php</filename>
<filename>controller.php</filename>
<filename>views/index.html</filename>
<filename>views/hello/index.html</filename>
Tài liệu hướng dẫn xây dựng component trong Joomla! 1.5
Copyleft by Đoàn Thanh Tám
Trang 9/41
Email: tamdt_a9tth@yahoo.com
<filename>views/hello/view.html.php</filename>
<filename>views/hello/tmpl/index.html</filename>
<filename>views/hello/tmpl/default.php</filename>
</files>
<administration>
<! Administration Menu Section >
<menu>Hello World!</menu>
<! Administration Main File Copy Section >
<files folder="admin">
<filename>index.html</filename>
<filename>admin.hello.php</filename>
</files>
</administration>
</install>
Nếu bạn đã xem xét file này một cách cẩn thận bạn sẽ nhận thấy rằng có một vài file
sẽ được copy mà chúng ta chưa đề cập ở trên. Chúng là các file index.html. Một file
index.html được đặt trong mỗi thư mục để ngăn cản những người dùng tò mò trong việc
liệt kê một danh sách thư mục. Nếu không có file index.html một vài máy chủ web sẽ liệt
kê danh sách nội dung của thư mục. Điều này thường gây rắc rối. Các file này có một
dòng đơn như sau: (Nó đơn giản là thể hiện một trang trống)
<html><body bgcolor="#FFFFFF"></body></html>
File khác là admin.hello.php, đây là điểm vào cho section quản trị trong component
của chúng ta. Bởi vì chúng ta chưa có section quản trị trong component vào thời điểm
này nên nó sẽ có nội dung tương tự như file index.html.
6. Những người viết và địa chỉ download ví dụ
Những người tham gia viết bài hướng dẫn này:
•
mjaz
•
staalanden
Component có thể được download tại:
http://dev.joomla.org/components/com_jd-wiki/data/media/components/com_hello1.zip
Tài liệu hướng dẫn xây dựng component trong Joomla! 1.5
Copyleft by Đoàn Thanh Tám
Trang 10/41
Email: tamdt_a9tth@yahoo.com
PHẦN 2. BỔ SUNG MODEL VÀO COMPONENT MVC.
(Phần hướng dẫn này được dịch từ trang web:
http://dev.joomla.org/component/option,com_jd-wiki/Itemid,/id,components:hello_world_mvc2/).
1. Giới thiệu
Trong bài hướng dẫn đầu tiên (ở phần 1), chúng ta đã mô tả việc tạo thành một
component view-controler đơn giản sử dụng Joomla! Frameword.
Trong bài đầu tiên, lời chào mừng đã được code cố định vào trong view. Điều này
không tuân theo mẫu MVC một cách chính xác bởi vì view chỉ được hiển thị dữ liệu chứ
không chứa nó.
Trong phần thứ hai này, chúng ta sẽ mô tả làm thế nào để chuyển dữ liệu ra khỏi view
và đưa nó vào một model. Trong các bài hướng dẫn tiếp theo chúng ta sẽ mô tả khả năng
và sự mềm dẻo mà mẫu thiết kế cung cấp.
2. Tạo ra một model
Khái niệm model được gọi tên như thế bởi vì lớp này được mong đợi sẽ mô hình hóa
cho một vài thực thể nào đó. Trong trường hợp của chúng ta, model đầu tiên sẽ đưa ra
một lời chào mừng. Điều này phù hợp với thiết kế hiện tại, bởi vì chúng ta đã có một
view ‘hello’, view đó thể hiện một câu chào mừng tới người dùng.
Cách thông thường để đặt tên cho các model trong Joomla! Frameword là tên lớp bắt
đầu bằng tên của component (trong trường hợp của chúng ta là ‘hello’), tiếp theo là
‘model’, và cuối cùng là là tên của model. Bởi thế lớp model của chúng ta được gọi là
HelloModelHello.
Ở thời điểm này chúng ta chỉ mô hình hóa cách xử lý của model hello, và nó sẽ trả lại
một lời chào. Chúng ta sẽ có một phương thức được gọi là getGreeting(). Phương thức
này đơn giản là trả lại chuỗi “Hello, World”. Dưới đây là code cho model của chúng ta:
<?php
/**
* Hello Model for Hello World Component
*
* @package Joomla.Tutorials
* @subpackage Components
* @link http://dev.joomla.org/component/option,com_jd-
wiki/Itemid,31/id,tutorials:modules/
* @license GNU/GPL
*/
// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die();
jimport( 'joomla.application.component.model' );
/**
* Hello Model
Tài liệu hướng dẫn xây dựng component trong Joomla! 1.5
Copyleft by Đoàn Thanh Tám
Trang 11/41
Email: tamdt_a9tth@yahoo.com
*
* @package Joomla.Tutorials
* @subpackage Components
*/
class HelloModelHello extends JModel
{
/**
* Gets the greeting
* @return string The greeting to be displayed to the user
*/
function getGreeting()
{
return 'Hello, World!';
}
}
Trong đoạn code trên, chú ý dòng bắt đầu là lệnh jimport. Hàm jimport được sử dụng
để tải các file từ Joomla! frameword cần thiết cho component của chúng ta. Cụ thể câu
lệnh trên sẽ tải file /libraries/joomla/application/component/model.php. Các dấu chấm ‘.’
được sử dụng như các dấu phân cách thư mục, và phần cuối cùng là tên file cần tải. Tất
cả các file được tải từ thư mục libraries. File trong trường hợp trên có chứa định nghĩa
của lớp JModel, điều này là cần thiết vì lớp của chúng ta được kế thừa từ lớp này.
Bây giờ chúng ta đã tạo ra model của mình. Tiếp theo chúng ta sẽ phải hiệu chính
view để nó có thể lấy được lời chào.
3. Sử dụng model
Joomla! Frameword được thiết lập theo cách controler sẽ tự động tải model có tên
trùng với view và đặt nó vào trong view. Vì view của chúng ta được đặt là ‘hello’, nên
model ‘hello’ của chúng ta sẽ tự động được tải và được đặt vào trong view. Bởi vậy
chúng ta sẽ dễ dàng nhận được một tham chiếu đến model của chúng ta sử dụng phương
thức JView::getModel(). Đoạn mã cho view trước của chúng ta có chứa dòng:
$greeting = "Hello World!";
Để sử dụng model, chúng ta chuyển đổi dòng trên thành:
$model =& $this->getModel();
$greeting = $model->getGreeting();
Bây giờ, code của view sẽ như sau:
Tài liệu hướng dẫn xây dựng component trong Joomla! 1.5
Copyleft by Đoàn Thanh Tám
Trang 12/41
Email: tamdt_a9tth@yahoo.com
<?php
/**
* Hello View for Hello World Component
*
* @package Joomla.Tutorials
* @subpackage Components
* @link http://dev.joomla.org/component/option,com_jd-
wiki/Itemid,31/id,tutorials:modules/
* @license GNU/GPL
*/
// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport( 'joomla.application.component.view');
/**
* HTML View class for the HelloWorld Component
*
* @package Joomla.Tutorials
* @subpackage Components
*/
class HelloViewHello extends JView
{
function display($tpl = null)
{
$model =& $this->getModel();
$greeting = $model->getGreeting();
$this->assignRef( 'greeting', $greeting );
parent::display($tpl);
}
}
?>
4. Bổ sung file vào package
Tất cả những gì còn lại cần phải làm là bổ sung một entry vào file XML để model
mới của chúng ta được copy. Joomla! Frameword sẽ tìm kiếm model của chúng ta trong
thư mục models. Bởi vậy entry cho file này trông như sau:
<filename>models/hello.php</filename>
File hello.xml mới của chúng ta sẽ như sau:
Tài liệu hướng dẫn xây dựng component trong Joomla! 1.5
Copyleft by Đoàn Thanh Tám
Trang 13/41
Email: tamdt_a9tth@yahoo.com
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/component-
install.dtd">
<install type="component" version="1.5.0">
<name>Hello</name>
<! The following elements are optional and free of formatting
conttraints >
<creationDate>2007 02 22</creationDate>
<author>John Doe</author>
<authorEmail>john.doe@example.org</authorEmail>
<authorUrl>http://www.example.org</authorUrl>
<copyright>Copyright Info</copyright>
<license>License Info</license>
<! The version string is recorded in the components table >
<version>Component Version String</version>
<! The description is optional and defaults to the name >
<description>Description of the component </description>
<! Site Main File Copy Section >
<files folder="site">
<filename>index.html</filename>
<filename>hello.php</filename>
<filename>controller.php</filename>
<filename>views/index.html</filename>
<filename>views/hello/index.html</filename>
<filename>views/hello/view.html.php</filename>
<filename>views/hello/tmpl/index.html</filename>
<filename>views/hello/tmpl/default.php</filename>
<filename>models/index.html</filename>
<filename>models/hello.php</filename>
</files>
<administration>
<! Administration Menu Section >
<menu>Hello World!</menu>
<! Administration Main File Copy Section >
<! Note the folder attribute: This attribute describes the
folder
Không có nhận xét nào:
Đăng nhận xét