Tài liệu xây dựng component
trong Joomla! 1.5
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 1/41
Email:
TÀI LIỆU HƯỚNG DẪN XÂY DỰNG
COMPONENT TRONG JOOMLA! 1.5
Thực hiện bởi Đoàn Thanh Tám
(email: )
[Người dịch] Tài liệu này bao gồm 4 phần hướng dẫn bạn từng bước xây dựng một
component trong joomla 1.5. Phần sau sẽ bổ sung thêm các đặc điểm mới vào phần trước
để hoàn thiện dần component của bạn. Khi kết thúc mỗi phần bạn đều có thể cài đặt ngay
các ví dụ để thấy được các kết quả của phần đó. Tài liệu hướng dẫn này được dịch chủ
yếu từ trang web:
Tuy nhiên, đây không phải là bản dịch hoàn thiện, có một số đoạn chỉ dịch theo ý, có một
số đoạn dịch hơi “chuối” do đó tài liệu này chỉ mang tính chất tham khảo. Nếu bạn muốn
có thêm thông tin chi tiết và chính xác xin vui lòng xem bản gốc tiếng Anh trên các trang
web tương ứng) [Người dịch]
MỞ ĐẦU
Một component là một trong những thành phần mở rộng lớn nhất và phức tạp nhất.
Copyleft by Đoàn Thanh Tám
Trang 2/41
Email:
PHẦN 1. PHÁT TRIỂN MỘT COMPONENT MVC.
(Phần hướng dẫn này được dịch từ trang web:
/>
1. Giới thiệu
Frameword mới trong joomla 1.5 đã mang lại những thuận lợi rất lớn cho các nhà
phát triển. Các đoạn code đã hoàn toàn được kiểm tra và khá rõ ràng. Bài hướng dẫn này
sẽ giúp bạn đi qua các bước trong quá trình phát triển nhằm tạo ra một component để có
thể sử dụng frameword mới này.
Phạm vi của bài này là phát triển một component Hello World đơn giản. Trong các
bài hướng dẫn tiếp theo, frameword đơn giản này sẽ được bổ sung, để thể hiện một cách
đầy đủ khả năng và tính linh hoạt của mẫu thiết kế MVC trong joomla.
2. Yêu cầu
Bạn cần có joomla 1.5 hoặc các phiên bản mới hơn để thực hành bài hướng dẫn này.
3. Giới thiệu về MVC (Model-View-Controler)
Trong khi ý tưởng phía sau một component dường như là khá đơn giản thì, các đoạn
code có thể nhanh chóng trở lên rất phức tạp khi các đặc điểm bổ sung được thêm vào
hoặc giao diện được tùy biến.
Model-View-Controler (gọi tắt là MVC) là một mẫu thiết kế phần mềm được dùng để
tổ chức các đoạn mã theo cách mà việc xử lý dữ liệu (business logic) và việc biểu diễn dữ
liệu là tách rời nhau. Tiền đề nằm sau hướng tiếp cận này là nếu bussiness logic được
nhóm vào trong một section thì giao diện và tương tác người dùng bao quanh dữ liệu có
thể định dạng và tùy biến lại mà không có ảnh hưởng đến việc phải lập trình lại bussiness
3.3. Controler
Controler chịu trách nhiệm phản hồi các hành động của người dùng. Trong các ứng
dụng web, một hành động của người dùng thông thường là một yêu cầu tải trang.
Controler sẽ xác định yêu cầu gì được đưa ra bởi người sử dụng và phản hồi thích hợp
bằng việc yêu cầu model tính toán dữ liệu phù hợp và chuyển từ model vào view.
Controler không thể hiện dữ liệu từ model, nó kích hoạt các phương thức trong model để
hiệu chỉnh dữ liệu và sau đó chuyển từ model sang view để hiển thị dữ liệu.
4. Cài đặt Joomla! MVC
Trong joomla mẫu MVC được thực hiện sử dụng 3 lớp:
<classname>JModel</classname>, <classname>JView</classname> và
<classname>JController</classname>. Thông tin chi tiết về các lớp này vui lòng xem
trong tài liệu hướng dẫn API ((WIP).
5. Tạo một component
Đối với component cơ sở của chúng ta, chúng ta chỉ cần 5 file:
• hello.php - đây là điểm vào cho component của chúng ta (this is the entry
point to our component)
• controller.php – file này có chứa controler cơ bản (this file contains our base
controller)
• views/hello/view.html.php – file này nhận các dữ liệu cần thiết và đặt nó lên
template (this file retrieves the necessary data and pushes it into the template)
• views/hello/tmpl/default.php – file này là temple cho đầu ra (this is the
template for our output)
• hello.xml – đây là một file XML nói cho joomla biết cách cài đặt component
của chúng ta như thế nào (this is an XML file that tells Joomla! how to install
our component).
5.1. Tạo entry point
} 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:
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.
/**
* @package Joomla.Tutorials
* @subpackage Components
* @link />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:
* Hello World Component Controller
*
* @package Joomla.Tutorials
* @subpackage Components
*/
class HelloController extends JController
{
/**
* Method to display the view
*
* @access public
*/
function display()
{
parent::display();
Email:
* @package Joomla.Tutorials
* @subpackage Components
* @link />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
<name>Hello</name>
<!-- The following elements are optional and free of formatting
conttraints -->
<creationDate>2007 02 22</creationDate>
<author>John Doe</author>
<authorEmail></authorEmail>
<authorUrl></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:
<filename>views/hello/view.html.php</filename>
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: 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:
PHẦN 2. BỔ SUNG MODEL VÀO COMPONENT MVC.
(Phần hướng dẫn này được dịch từ trang web:
/>
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.
Trang 11/41
Email:
*
* @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
/**
* 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
<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
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 14/41
Email:
to copy FROM in the package to install therefore files
copied
in this section are copied from /admin/ in the package -->
<files folder="admin">
<!-- Site Main File Copy Section -->
<filename>index.html</filename>
<filename>admin.hello.php</filename>
</files>
</administration>
</install>5. Kết luận
Chúng ta đã có một component MVC đơn giản. Mỗi phần tử là rất đơn giản vào thời
Để làm những điều này thú vị hơn, chúng ta sẽ lấy câu chào từ bảng cơ sở dữ liệu.
Trong phần sau, chúng ta sẽ mô tả làm cách nào để tạo ra một file SQL và bổ sung các
đoạn mã phù hợp vào file XML để tạo ra bảng và bổ sung dữ liệu mẫu vào bảng khi
component được cài đặt. Bây giờ, chúng ta chỉ đơn giản thay thế câu lệnh trả về trong
hàm getGreeting bằng đoạn code lấy lời chào mừng từ CSDL và trả lại lời chào mừng đó.
Đầu tiên, chúng ta cần lấy được một tham chiếu đến đối tượng CSDL. Vì joomla sử
dụng CSDL cho các thao tác thông thường của nó, nên nó đã có một kết nối tới CSDL
tồn tại, bởi thế không cần thiết phải tạo ra một kết nối CSDL riêng. Có thể lấy được một
tham chiếu tới kết nối bằng cách sử dụng câu lệnh:
$db =& JFactory::getDBO();
JFactory là một lớp static được sử dụng để nhận tham chiếu đến nhiều đối tượng hệ
thống khác nhau. Các thông tin thêm về lớp này có thể tham khảo trong tài liệu về API.
Tên hàm getDBO là viết tắt cho get DataBase Object, có thể nhớ một cách dễ dàng và
rất quan trọng.
Bây giờ chúng ta đã có một tham chiếu đến đối tượng CSDL, Chúng ta có thể lấy dữ
liệu. Điều này được thực qua hai bước:
• Lưu trữ câu truy vấn của vào đối tượng CSDL
• Tải kết quả về
Code của phương thức getGreeting() bây giờ sẽ như sau:
function getGreeting()
{
$db =& JFactory::getDBO();
$query = 'SELECT greeting FROM #__hello';
$db->setQuery( $query );