Tài liệu hướng dẫn xây dựng component trong Joomla! 1.5

pdf 41 trang hapham 1560
Bạn đang xem 20 trang mẫu của tài liệu "Tài liệu hướng dẫn xây dựng component trong Joomla! 1.5", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdftai_lieu_huong_dan_xay_dung_component_trong_joomla_1_5.pdf

Nội dung text: Tài liệu hướng dẫn xây dựng component trong Joomla! 1.5

  1. Tài li u h ng d n 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 Th c hi n b i oàn Thanh Tám (email: tamdt_a9tth@yahoo.com) [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 im 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 yu t trang web: Tuy nhiên, ây không ph i là b n d ch hoàn thi n, có mt s on ch d ch theo ý, có m t s on 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 Mt 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. Các component có th xem nh ư các ng d ng mini. Mt cách tr c quan chúng ta có th hình dung joomla là m t h iu hành và t t c các component là các ng d ng desktop. Mi trang (page) trong joomla s g i n m t component t i v các n i dung chính (page body) c a trang ó. Ví d component n i dung (com_content) là m t ng d ng mini x lý t t c các v n v n i dung ưc tr l i, t ươ ng t nh ư th component ng ký là m t ng d ng mini nh m x lý vi c ng ký c a ng ưi dùng. M t componet có hai ph n chính: ph n qu n tr và ph n trên site. Ph n trên site là ph n ưc s d ng t i v các trang khi ưc tri u g i trong quá trình v n hành site thông th ưng. Ph n qu n tr cung c p giao di n c u hình, qu n lý các khía c nh khác nhau c a component và ưc truy c p thông qua ng d ng qu n tr c a joomla. Ph n h ưng d n d ưi ây s cung c p cho các b n m t vài ví d h u ích giúp b n làm th nào t o ra m t component. While we have gone to great lengths to make Joomla easy for content providers to use, we have equally spent a lot of time developing a flexible framework for developers to extend the capabilities of Joomla without having to touch the Core code. How-To's (ph n b n d ch c a MVC 1-4 phía d ưi) • Hello World MVC 1 Component - The frame • Hello World MVC 2 Component - The model • Hello World MVC 3 Component - The table • Hello World MVC 4 Component - The admin interface Copyleft by oàn Thanh Tám Trang 1/41 Email: tamdt_a9tth@yahoo.com
  2. Tài li u h ng d n xây d ng component trong Joomla! 1.5 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 on 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 Bn 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 on code có th nhanh chóng tr lên r t ph c t p khi các c im 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 on 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 lp trình l i bussiness logic. (ngh a là hình th c và n i dung là tách r i nhau, do ó khi thay i hình th c th hi n thì không nh h ưng n n i dung). Có ba ph n chính trong m t MVC component (ba ph n này bao g m Model, View và Controler). Chúng ưc mô t m t cách v n t t d ưi ây. N u b n c n nhi u thông tin y h ơn xin vui lòng tham kh o thêm trong các ưng d n ưc cung c p cu i bài hưng d n này. 3.1. Model Mt model là thành ph n c a component óng gói d li u c a ng d ng. Nó th ưng cung cp các th t c qu n lý và thao tác d li u này theo m t cách nào ó, trong ó có b sung thêm các th t c ly d li u t model. Trong tr ưng h p c a chúng ta model s ch a các ph ươ ng th c nh ư b sung, lo i b và c p nh t thông tin v nh ng l i chào mng trong c ơ s d li u. Nó còn ch a ph ươ ng th c ly danh sách các l i chào trong CSDL. Nói m t cách t ng quát, vi c truy c p vào CSDL l p d ưi s ưc óng gói trong model. Theo cách này, n u m t ng d ng chuy n i sang vi c s d ng m t file bình th ưng l ưu tr thông tin c a nó thay vì s d ng CSDL, thì ch có thành ph n model là thay i, các thành ph n view và controler là không i. 3.2. View Copyleft by oàn Thanh Tám Trang 2/41 Email: tamdt_a9tth@yahoo.com
  3. Tài li u h ng d n xây d ng component trong Joomla! 1.5 View là m t thành ph n c a component ưc s d ng tr l i d li u t model theo cách phù h p v i t ươ ng tác. i v i các ng d ng web, view thông th ưng là các trang HTML tr l i d li u. View l y d li u t model (d li u này ưc chuy n qua nó ti controler). Và ư a d li u vào trong template (d li u s hi n th v i ng ưi dùng). View không làm thay i d li u. Nó ch hi n th d li u l y t model. 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 dng 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 bng 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: JModel , JView và JController . 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. To 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à im 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 ca chúng ta nh ư th nào (this is an XML file that tells Joomla! how to install our component). 5.1. To entry point Joomla luôn luôn ưc truy c p thông qua m t im vào ơ n: index.php cho các ng dng site và administrator/index.php cho ng d ng qu n tr . Sau ó ng d ng s t i các component c n thi t d a trên giá tr ch n l a trong URL ho c trong d li u POST. i vi component c a chúng ta URL s nh ư sau: index.php?option=com_hello&view=hello . Vi c này s t i file chính c a chúng ta và có th ưc xem nh ư m t im vào ơ n cho component c a chúng ta: components/com_hello/hello.php. on mã này th c s là c th tùy theo các component. <?php Copyleft by oàn Thanh Tám Trang 3/41 Email: tamdt_a9tth@yahoo.com
  4. Tài li u h ng d n xây d ng component trong Joomla! 1.5 / * @package Joomla.Tutorials * @subpackage Components * components/com_hello/hello.php * @link 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 hp 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 “/”. iu 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 iu hành khác nhau. DS s luôn ưc s dng khi tham chi u n các file trên máy ch c c b . Copyleft by oàn Thanh Tám Trang 4/41 Email: tamdt_a9tth@yahoo.com
  5. Tài li u h ng d n xây d ng component trong Joomla! 1.5 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à mt controler nh ưng chúng ta c p n iu này cho các công vi c trong t ươ ng lai. JRequest :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 dng câu l nh sau: echo JRequest ::getVar(’controller’); Bây gi chúng ta ã có controler c ơ s ‘ HelloController ’ trong com_hello/controller.php, và n u c n thi t b sung thêm các controler d ng nh ư: ‘ HelloControllerController1 ’ 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 dng, 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. im vào chính (hello.php) v b n ch t ã thông qua vi c iu khi n controler th c hi n các nhi m v ưc t ra trong request. 5.2. To controler Component c a chúng ta ch có m t nhi m v - greet the world (th hi n l i chào). Bi 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. Tt c nh ng gì c n thi t ph i làm là ti view thích h p. Chúng ta s ch có m t ph ươ ng thc 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 wiki/Itemid,31/id,tutorials:modules/ * @license GNU/GPL */ // no direct access defined( '_JEXEC' ) or die( 'Restricted access' ); jimport('joomla.application.component.controller'); / Copyleft by oàn Thanh Tám Trang 5/41 Email: tamdt_a9tth@yahoo.com
  6. Tài li u h ng d n xây d ng component trong Joomla! 1.5 * 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 khi t o c a JController 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 (bng 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 iu gì c n ph i làm trong controler. Ph ươ ng th c JController ::display() s xác nh view và layout t request, ti 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 mt 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, mt 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. To 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 JView ::assignRef. on mã c a view nh ư sau: <?php / Copyleft by oàn Thanh Tám Trang 6/41 Email: tamdt_a9tth@yahoo.com
  7. Tài li u h ng d n xây d ng component trong Joomla! 1.5 * @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. To 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. greeting; ?> 5.5. óng gói t t c - T o ra file hello.xml Copyleft by oàn Thanh Tám Trang 7/41 Email: tamdt_a9tth@yahoo.com
  8. Tài li u h ng d n xây d ng component trong Joomla! 1.5 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 iu 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 ý mt s mô t thông tin v b n quy n . • Mt danh sách các file c n copy. • Mt 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). • Mt 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: Hello 2007 02 22 John Doe john.doe@example.org Copyright Info License Info Component Version String Description of the component index.html hello.php controller.php views/index.html views/hello/index.html Copyleft by oàn Thanh Tám Trang 8/41 Email: tamdt_a9tth@yahoo.com
  9. Tài li u h ng d n xây d ng component trong Joomla! 1.5 views/hello/view.html.php views/hello/tmpl/index.html views/hello/tmpl/default.php Hello World! index.html admin.hello.php Nu 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. iu 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) File khác là admin.hello.php, ây là im vào cho section qu n tr trong component ca chúng ta. Bi vì chúng ta ch ưa có section qu n tr trong component vào th i im 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: Copyleft by oàn Thanh Tám Trang 9/41 Email: tamdt_a9tth@yahoo.com
  10. Tài li u h ng d n xây d ng component trong Joomla! 1.5 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. iu 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. To 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 mt l i chào m ng. iu 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 im 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 mt 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 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 Copyleft by oàn Thanh Tám Trang 10/41 Email: tamdt_a9tth@yahoo.com
  11. Tài li u h ng d n xây d ng component trong Joomla! 1.5 * * @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 on 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 lnh 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 ca l p JModel, iu 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(). on 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: Copyleft by oàn Thanh Tám Trang 11/41 Email: tamdt_a9tth@yahoo.com
  12. Tài li u h ng d n xây d ng component trong Joomla! 1.5 getModel(); $greeting = $model->getGreeting(); $this->assignRef( 'greeting', $greeting ); parent::display($tpl); } } ?> 4. B sung file vào package Tt 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 mi 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: models/hello.php File hello.xml m i c a chúng ta s nh ư sau: Copyleft by oàn Thanh Tám Trang 12/41 Email: tamdt_a9tth@yahoo.com
  13. Tài li u h ng d n xây d ng component trong Joomla! 1.5 Hello 2007 02 22 John Doe john.doe@example.org Copyright Info License Info Component Version String Description of the component index.html hello.php controller.php views/index.html views/hello/index.html views/hello/view.html.php views/hello/tmpl/index.html views/hello/tmpl/default.php models/index.html models/hello.php Hello World! <! Note the folder attribute: This attribute describes the folder Copyleft by oàn Thanh Tám Trang 13/41 Email: tamdt_a9tth@yahoo.com
  14. Tài li u h ng d n xây d ng component trong Joomla! 1.5 to copy FROM in the package to install therefore files copied in this section are copied from /admin/ in the package > index.html admin.hello.php 5. Kt 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 im này, nh ưng nó cung c p m t kh n ng và s linh ho t r t l n. 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: • staalanden Component có th ưc download t i: Copyleft by oàn Thanh Tám Trang 14/41 Email: tamdt_a9tth@yahoo.com
  15. Tài li u h ng d n xây d ng component trong Joomla! 1.5 PH N 3. S D NG CSDL TRONG COMPONENT MVC. (Ph n h ưng d n này ưc d ch t trang web: 1. Gi i thi u Trong hai bài h ưng d n u tiên (ph n 1 và ph n 2) chúng tôi ã h ưng d n các b n làm th nào xây d ng m t component MVC ơn gi n. Chúng ta ã có m t view l y d li u t model (trong bài h ưng d n th 2). Trong bài này chúng ta s làm vi c v i model. Thay vì vi c d li u ưc code tr c ti p trong model, thì model s l y d li u t m t bng trong CSDL. 2. Ly d li u Model hi n t i c a chúng ta có m t ph ươ ng th c getGreeting(). Ph ươ ng th c này r t ơ n gi n, t t c nh ng gì nó làm là tr v m t câu chào ưc code c nh. làm nh ng iu 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 on mã phù h p vào file XML t o ra bng 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 bng on 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 mt tham chi u n i t ưng CSDL. Vì joomla s dng 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 tn 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 tt cho get DataBase Object, có th nh m t cách d dàng và rt 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. iu 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 • Ti 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 ); Copyleft by oàn Thanh Tám Trang 15/41 Email: tamdt_a9tth@yahoo.com
  16. Tài li u h ng d n xây d ng component trong Joomla! 1.5 $greeting = $db->loadResult(); return $greeting; } Trong on mã trên ‘hello’ là tên c a b ng trong CSDL mà chúng ta s t o ra trong ph n sau. Và ‘greeting’ là tên c a tr ưng l ưu tr câu chào m ng. N u b n ch ưa quen v i SQL, s r t h u ích n u b n l y m t bài h ưng d n xem xét l i. Nh ng bài h ưng d n nh ư th b n có th tìm th y w3schools . Ph ươ ng th c $db loadResult() s ch y câu l nh truy v n CSDL ã ưc l ưu tr và tr v tr ưng u tiên c a dòng u tiên trong k t qu . Xem JDatabase API reference có các thông tin nhi u h ơn v các ph ươ ng th c khác trong l p JDatabase. 3. To ra file SQL trong quá trình cài t và g b component Joomla! installer có xây d ng s n vi c h tr i v i vi c ch y các câu truy v n trong quá trình cài t component. T t c các câu truy v n này ưc l ưu tr trong m t file text chu n. Chúng ta s có 3 câu truy v n trong file cài t: vi c u tiên s th c hi n xóa b ng trong tr ưng h p nó ã t n t i, ti p theo th c hi n vi c t o ra b ng v i các tr ưng phù hp, và cu i cùng là chèn d li u vào b ng v a t o. Dưi ây là các câu truy v n c a chúng ta: DROP TABLE IF EXISTS `#__hello`; CREATE TABLE `#__hello` ( `id` int(11) NOT NULL auto_increment, `greeting` varchar(25) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT DEFAULT CHARSET=utf8; INSERT INTO `#__hello` (`greeting`) VALUES ('Hello, World!'), ('Bonjour, Monde!'), ('Ciao, Mondo!'); Bn có th th y ti n t trong các tên b ng h i k c c. Tuy nhiên, Joomla! s thay th các ti n t này b i ti n t ã ưc xác nh trong quá trình cài t. i v i h u h t các bn cài t, b ng này s tr thành jos_hello. iu này cho phép nhi u b n cài t joomla có th s d ng chung CSDL, và ng n ch n các xung t v i các ng d ng khác s d ng cùng tên b ng (ví d , hai ng d ng có th chia s chung m t CSDL, nh ưng c hai u c n mt b ng ‘user’, vi cách này v n s ưc gi i quy t). Chúng ta ã xác nh hai tr ưng trong CSDL. Tr ưng u tiên là ‘id’ óng vai trò là khóa chính. Khóa chính trong m t b ng c a CSDL là tr ưng dùng xác nh duy nh t Copyleft by oàn Thanh Tám Trang 16/41 Email: tamdt_a9tth@yahoo.com
  17. Tài li u h ng d n xây d ng component trong Joomla! 1.5 mt b n ghi trong b ng. Nó th ưng ưc s d ng tìm ki m các hàng trong CSDL. Tr ưng còn l i là ‘greeting’. ây là tr ưng l ưu câu chào m ng ưc tr l i b i truy v n mà chúng ta ã s d ng trên. Các câu truy v n c a chúng ta s ưc l ưu trong file install.utf.sql. To ra file SQL g b cài t Mc dù chúng ta luôn mong mu n ng ưi dùng s không bao gi mu n g b component c a chúng ta, tuy nhiên có m t iu quan tr ng là n u h th c hi n vi c ó chúng ta không ưc l i b t c th gì sau khi g b . Joomla! s qu n lý vi c xóa các file và các th ư m c ưc t o ra trong quá trình cài t, nh ưng b n ph i b sung th công các câu truy v n s lo i b các b ng ã ưc thêm vào CSDL. Trong ví d , chúng ta ch to m t b ng, nên chúng ta ch c n m t câu truy v n xóa nó. DROP TABLE IF EXISTS `#__hello`; Câu truy v n này s ưc l ưu tr trong file uninstall.utf.sql. 4. Cp nh t file cài t Chúng ta c n ph i thay i m t vài th trong file cài t XML. u tiên, chúng ta c n b sung hai file m i vào danh sách các file. File cài t SQL s ph i ưa vào trong th ư mc admin. Th hai, chúng ta c n ph i báo cho trình cài t ch y các câu truy v n trong các file c a chúng ta trong quá trình cài t và quá trình g b . File XML m i c a chúng ta s nh ư sau: Hello 2007 02 22 John Doe john.doe@example.org Copyright Info License Info Component Version String Description of the component Copyleft by oàn Thanh Tám Trang 17/41 Email: tamdt_a9tth@yahoo.com
  18. Tài li u h ng d n xây d ng component trong Joomla! 1.5 index.html hello.php controller.php views/index.html views/hello/index.html views/hello/view.html.php views/hello/tmpl/index.html views/hello/tmpl/default.php models/hello.php install.sql uninstall.sql Hello World! index.html admin.hello.php install.sql uninstall.sql Copyleft by oàn Thanh Tám Trang 18/41 Email: tamdt_a9tth@yahoo.com
  19. Tài li u h ng d n xây d ng component trong Joomla! 1.5 Chú ý n hai thu c tính xu t hi n trong các th n m trong các ph n và : charset và driver. Charset là ki u charset ưc s d ng. Ch có charset hp l là utf8. N u b n mu n t o ra các file cài t cho CSDL không ph i là utf8 b n s b qua thu c tính này. Thu c tính driver xác nh CSDL nào các câu truy v n ưc vi t cho. Hi n t i, thu c tính này ch có th là mysql, nh ưng các phiên b n joomla trong t ươ ng lai có th có nhi u d ng CSDL h ơn. 5. Kt lu n Cho n bây gi chúng ta có mt component tn d ng ưc các thu n l i c a c các lp Joomla! MVC framework và l p JDatabase. Bây gi b n ã có kh n ng vi t các component MVC t ươ ng tác v i CSDL và có th s d ng Joomla! Installer t o và thao tác trên các b ng CSDL. 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: • staalanden Component có th ưc download t i: Copyleft by oàn Thanh Tám Trang 19/41 Email: tamdt_a9tth@yahoo.com
  20. Tài li u h ng d n xây d ng component trong Joomla! 1.5 PH N 4. TO GIAO DI N QU N TR TRONG MVC. (Ph n h ưng d n này ưc d ch t trang web: 1. Gi i thi u Trong ba bài h ưng d n tr ưc (ph n 1, 2 và 3) chúng ta ã phát tri n m t component MVC l y d li u t m t b ng trong CSDL. Cho n th i im hin t i component c a chúng ta ch ưa có cách nào b sung thêm d li u t i CSDL, ngo i tr vi c th c hi n iu này m t cách th công b ng m t công c khác. Trong ph n này chúng ta s phát tri n m t section qu n tr cho component, có kh n ng qu n lý các entry trong CSDL. 2. To ra frameword c ơ s Frameword c ơ s c a panel qu n tr c ng t ươ ng t nh ư ph n site. im vào chính cho ph n qu n tr là file admin.hello.php. File này gi ng y h t file hello.php ưc s d ng trong ph n site ngo i tr tên c a controler mà nó t i s ưc thay i thành HellosController. Ngoài ra, controler m c nh ưc g i là controller.php và file này gi ng y h t controler m c nh trong ph n site, ngo i tr tên c a controler ưc g i là HellosController thay vì HelloController. S thay i này JControler theo m c nh s ti hellos view, view này s hi n th m t danh sách các câu chào m ng. Dưi ây là code c a admin.hello.php <?php / * @package Joomla.Tutorials * @subpackage Components * @link wiki/Itemid,31/id,tutorials:components/ * @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 = ''; } Copyleft by oàn Thanh Tám Trang 20/41 Email: tamdt_a9tth@yahoo.com
  21. Tài li u h ng d n xây d ng component trong Joomla! 1.5 } // Create the controller $classname = 'HellosController'.$controller; $controller = new $classname( ); // Perform the Request task $controller->execute( JRequest::getVar( 'task' ) ); // Redirect if set by the controller $controller->redirect(); ?> Chúng s b t u v i view hellos và model hellos. u tiên là model hellos. 2.1. Model Hellos Model Hellos s r t ơn gi n. Hi n t i, công vi c mà chúng ta c n ch là truy v n nh n ưc m t danh sách c a các câu chào m ng t CSDL. Công vi c này s ưc th c hi n b ng cách g i ph ươ ng th c getData(). Lp JModel có m t ph ươ ng th c protected ưc xây d ng s n _getList(). Ph ươ ng th c này có th ưc s d ng ơn gi n hóa tác v truy v n nh n ưc m t danh sách các b n ghi t CSDL. ơ n gi n là chúng ta c n truy n cho nó câu truy v n và nó s tr l i danh sách các b n ghi. Trong t ươ ng lai, có th chúng ta l i mu n s d ng câu truy v n trong m t ph ươ ng th c khác. Vì v y, ây chúng ta s t o ra m t ph ươ ng th c private _buildQuery() s tr li câu truy v n s ưc truy n vào ph ươ ng th c _getList(). iu này s t o ra kh n ng thay i câu truy v n khi nó ưc t trong m t tình hu ng khác. Do ó trong l p c a chúng ta s có hai ph ươ ng th c: getData() và _buildQuery(). Ph ươ ng th c _buidQuery ơn gi n là tr v câu truy v n. Code c a nó nh ư sau: / * Returns the query * @return string The query to be used to retrieve the rows from the database */ function _buildQuery() { $query = ' SELECT * ' . ' FROM #__hello ' ; return $query; } Copyleft by oàn Thanh Tám Trang 21/41 Email: tamdt_a9tth@yahoo.com
  22. Tài li u h ng d n xây d ng component trong Joomla! 1.5 Phươ ng th c getData() nh n câu truy v n và tr l i danh sách các b n ghi t CSDL. Bây gi có th x y ra tình hu ng là chúng ta c n nh n ưc danh sách này 2 l n trong vi c t i m t trang. Th t là lãng phí khi truy v n CSDL 2 l n. B i v y chúng ta s ph i làm cho ph ươ ng th c này l ưu tr d li u trong m t thu c tính protected trong các yêu cu ti p theo, nó ch ơn gi n là tr v d li u mà nó ã l y ưc. Thu c tính này s ưc gi là _data. Dưi ây là code c a ph ươ ng th c getData() / * Retrieves the hello data * @return array Array of objects containing the data from the database */ function getData() { // Lets load the data if it doesn't already exist if (empty( $this->_data )) { $query = $this->_buildQuery(); $this->_data = $this->_getList( $query ); } return $this->_data; } Code y c a model sau khi hoàn thành nh ư sau: <?php / * Hellos Model for Hello World Component * * @package Joomla.Tutorials * @subpackage Components * @link wiki/Itemid,31/id,tutorials:components/ * @license GNU/GPL */ // Check to ensure this file is included in Joomla! defined('_JEXEC') or die(); jimport( 'joomla.application.component.model' ); / * Hello Model * Copyleft by oàn Thanh Tám Trang 22/41 Email: tamdt_a9tth@yahoo.com
  23. Tài li u h ng d n xây d ng component trong Joomla! 1.5 * @package Joomla.Tutorials * @subpackage Components */ class HellosModelHellos extends JModel { / * Hellos data array * * @var array */ var $_data; / * Returns the query * @return string The query to be used to retrieve the rows from the database */ function _buildQuery() { $query = ' SELECT * ' . ' FROM #__hello ' ; return $query; } / * Retrieves the hello data * @return array Array of objects containing the data from the database */ function getData() { // Lets load the data if it doesn't already exist if (empty( $this->_data )) { $query = $this->_buildQuery(); $this->_data = $this->_getList( $query ); } return $this->_data; } Copyleft by oàn Thanh Tám Trang 23/41 Email: tamdt_a9tth@yahoo.com
  24. Tài li u h ng d n xây d ng component trong Joomla! 1.5 } File này ưc l ưu l i thành models/hellos.php. 2.2. View hellos Bây gi chúng ta ã có m t model nh n d li u, chúng ta c n hi n th nó. View hellos này s khá gi ng v i view trong ph n site. Model c a chúng ta ưc t ng cài t trên site, b i v y nó n m trong ph n qu n tr . Các ph ươ ng th c bt u b ng ‘get’ trong model có th ưc truy c p bng vi c s d ng ph ươ ng th c get() c a l p JView. Bi v y view c a chúng ta s có 3 dòng. Mt l y d li u t model, m t y d li u lên template, và m t g i ph ươ ng th c display hi n th . B i v y chúng ta có code nh ư sau: <?php / * Hellos View for Hello World Component * * @package Joomla.Tutorials * @subpackage Components * @link wiki/Itemid,31/id,tutorials:components/ * @license GNU/GPL */ // Check to ensure this file is included in Joomla! defined('_JEXEC') or die(); jimport( 'joomla.application.component.view' ); / * Hellos View * * @package Joomla.Tutorials * @subpackage Components */ class HellosViewHellos extends JView { / * Hellos view display method * @return void / function display($tpl = null) { Copyleft by oàn Thanh Tám Trang 24/41 Email: tamdt_a9tth@yahoo.com
  25. Tài li u h ng d n xây d ng component trong Joomla! 1.5 JToolBarHelper::title( JText::_( 'Hello Manager' ), 'generic.png' ); JToolBarHelper::deleteList(); JToolBarHelper::editListX(); JToolBarHelper::addNewX(); // Get data from the model $items =& $this->get( 'Data'); $this->assignRef( 'items', $items ); parent::display($tpl); } } File này ưc l ưu thành views/hellos/view.html.php. 2.3. Template hellos Template s l y d li u ưc ưa n t view và ư a d li u ó ra u ra hi n th . Chúng ta s hi n th kt qu u ra trong m t b ng ơn gi n. Trong khi template ph n site là r t ơn gi n, thì trong trang qu n tr chúng ta s c n m r ng m t chút x lý vòng l p thông qua d li u. Dưi ây là code trong template c a chúng ta: items ); $i < $n; $i++) { Copyleft by oàn Thanh Tám Trang 25/41 Email: tamdt_a9tth@yahoo.com
  26. Tài li u h ng d n xây d ng component trong Joomla! 1.5 $row =& $this->items[$i]; ?> "> id; ?> greeting; ?> Template này ưc l ưu thành views/hellos/tmpl/default.php. Chú ý r ng template c a chúng ta ưc gói trong m t form. M c dù iu này là không c n thi t vào th i im hi n t i, nh ưng trong t ươ ng lai nó s c n. Bây gi chúng ta ã hoàn thànhm ph n c ơ b n c a view u tiên. Chúng ta ã b sung thêm 5 file vào ph n qu n tr trong component: • admin.hello.php • controller.php • models/hellos.php • views/hellos/view.html.php • views/hellos/tmpl/default.php Bây gi b n có th b sung các file này vào file cài t XML. Và th l i. 3. B sung thêm ch c n ng Section qu n tr c a chúng ta cho n th i im hi n t i ch ưa th c hi n nhi u tác v . Nó th c s ch ưa làm iu gì. Nh ng gì nó th c s làm là hi n th nh ng entry mà chúng Copyleft by oàn Thanh Tám Trang 26/41 Email: tamdt_a9tth@yahoo.com
  27. Tài li u h ng d n xây d ng component trong Joomla! 1.5 ta có trong CSDL. làm nó h u d ng h ơn chúng ta c n b sung thêm các button và các ưng link. 3.1. Toolbar Chúng ta có th th y toolbar xu t hi n phía trên các panel khác trong component qu n tr c a joomla. Component c a chúng ta c ng c n m t th t ươ ng t nh ư th . Chúng ta s b sung thêm các nút xóa b n ghi, hi u ch nh b n ghi, thêm b n ghi m i. Ngoài ra chúng ta s còn b sung thêm m t title th hi n trên toolbar. iu này ưc th c hi n b ng cách b sung thêm code vào view. b sung thêm các button chúng ta s d ng các ph ươ ng th c t nh t l p JToolbarHepper trong joomla. Code s trông nh ư sau: JToolBarHelper::title( JText::_( 'Hello Manager' ), 'generic.png' ); JToolBarHelper::deleteList(); JToolBarHelper::editListX(); JToolBarHelper::addNewX(); Ba ph ươ ng th c này s t o ra các button phù h p. Ph ươ ng th c deleteList() có th tùy ch n l y ba tham s : Tham s u tiên là m t chu i hi n th n ng ưi dùng yêu c u h xác nh n vi c xóa b n ghi. Tham s th hai là nhi m v s ưc g i v i câu truy v n (m c nh là ‘remove’). Và tham s th 3 là on text s ưc th hi n d ưi button. Các ph ươ ng th c editLisstX() và addNewX() có th tùy ch n hai tham s : Tham s u tiên là nhi m v (theo m c nh l n l ưt là edit và add), và tham s th 2 là on text s ưc th hi n d ưi button. Chú ý rng cách s d ng ph ươ ng th c JText::_ trong template tr ưc ây và ây là tươ ng t nhau. ây là ch c n ng giúp cho component có th chuy n i mt cách rt d dàng. Ph ươ ng th c JText::_ s tìm ki m xâu trong file ngôn ng ca component và tr li chu i ã ưc chuy n i. N u không có s chuy n i nào ưc tìm th y nó s tr l i chính chu i ã truy n vào cho nó. Nu chúng ta mu n chuy n i component sang m t ngôn ng khác, t t c nh ng gì ph i làm là t o ra m t file ngôn ng ánh x xâu trong du trích d n vi xâu ã ưc chuy n i t ươ ng ng. [Ví d : n u trong file ngôn ng chúng ta có m t c p ‘Greeting’ – ‘Hello world’ thì ph ươ ng th c JText::_(‘Greeting’) s tr l i chu i ‘Hello World’. Khi chúng ta c n chuy n qua ti ng Vi t, trong file ngôn ng chúng ta ch c n có mt c p ‘Greeting’ – ‘Xin chào!’ lúc này ph ươ ng th c JText::_(‘Greeting’) s tr l i chu i ‘Xin chào!’.] 3.2. Checkbox và link Bây gi chúng ta ã có hai button. Hai button này thao tác trên các bn ghi ã t n t i. Nh ưng làm th nào chúng ta bi t chúng ta ang thao tác trên b n ghi nào? Chúng ta ph i yêu c u ng ưi dùng nói cho chúng ta bi t iu ó. làm iu này chúng ta c n b sung thêm các checkbox vào b ng hi n th trên template ng ưi dùng có th l a ch n các b n ghi th c s . b sung thêm các chekbox chúng ta c n b sung thêm m t c t vào b ng. Chúng ta s b sung c t này vào gi a hai c t ã có trên. Copyleft by oàn Thanh Tám Trang 27/41 Email: tamdt_a9tth@yahoo.com
  28. Tài li u h ng d n xây d ng component trong Joomla! 1.5 Trong ph n u c a c t, chúng ta s thêm m t checkbox có th l a ch n t t c các checkbox d ưi nó thành on ho c off. items ); ?>);" /> ây, hàm checkAll trong Javascript là m t hàm ưc xây d ng trong Joomla! da trên gói Javascript s cung c p nh ng ch c n ng mà chúng ta mu n. Bây gi chúng ta c n b sung các checkbox vào các t ng hàng. L p JHTML c a Joomla có môt ph ươ ng th c JHTML::_() t o ra checkbox. Chúng ta s b sung dòng code d ưi ây vào vòng l p. $checked = JHTML::_( 'grid.id', $i, $row->id ); Ngay phía sau dòng: $row =& $this->items[$i]; Sau ó chúng ta s thêm các cell c a c t checkbox n m gi a hai ct ã có (c t id và ct greeting): n lúc này, hi u ch nh m t b n ghi, chúng ta c n ph i check vào box t ươ ng ng vi b n ghi ó, sau ó click vào nút edit. Vi c này có v h ơi r ưm rà. B i th chúng ta s b sung m t ưng link i tr c ti p n form hi u ch nh câu chào m ng. B sung thêm dòng d ưi ây sau khi g i ph ươ ng th c JHTML::_() t o ra link HTML. $link = JRoute::_( 'index.php?option=com_hello>controller=hello>task=edit>cid[]='. $row- >id ); Sau ó ư a ưng link vào trong cell ch a câu chào m ng: Copyleft by oàn Thanh Tám Trang 28/41 Email: tamdt_a9tth@yahoo.com
  29. Tài li u h ng d n xây d ng component trong Joomla! 1.5 Chú ý r ng ưng link này ch n controler hello. Controler này s x lý vi c thao tác trên d li u. N u xem l i code trong ph n template b n s th y chúng ta s có 4 tr ưng hidden input phía d ưi form. Tr ưng u tiên có là ‘option’, trưng này c n thi t xác nh chúng ta ang trong component com_hello. Tr ưng th hai là nhi m v c n th c hi n, tr ưng này s l y các thi t l p khi m t trong s các nút trên toolbar ưc click, N u tr ưng này b b tr ng thì chúng ta s báo l i và các button s ưc disable. Tr ưng hidden input th ba là tr ưng boxchecked, trưng này s gi s l ưng box ưc check. Các button edit và delete s ki m tra ch c ch n r ng s này là l n hơn 0, và chúng s không cho phép form ưc submit n u iu ki n trên không th a mãn. Tr ưng th 4 là tr ưng controler, trưng này ưc s d ng xác nh r ng các nhi m v ưc t o ra t form này s ưc x lý b i controler hello. ây là code y c a file default.php: items ); $i items[$i]; ?> "> id; ?> Copyleft by oàn Thanh Tám Trang 29/41 Email: tamdt_a9tth@yahoo.com
  30. Tài li u h ng d n xây d ng component trong Joomla! 1.5 greeting; ?> View hellos c a chúng ta ã hoàn thành. B n có th th các k t qu c a component này ngay bây gi . Component có th download t i: 4. Getting Down and Dirty: Doing the Real Work Cho n bây gi view hellos ã làm vi c t t. Chúng ta s chuy n sang model và view hello. ây là n ơi thao tác th c s nh ư add, edit, s ưc th c hi n. 4.1. Hello Controler Our default controller just isn’t going to cut it when it comes to doing work - all it is capable of doing is displaying views [t m d ch Controler m c nh s không ng t gi a ch ng khi nó khi nó ang làm vi c- t t c ch là kh n ng làm hi n th các view]. Chúng ta c n x lý các nhi m v mà chúng ta ã có view hellos: ‘add’, ‘edit’ và ‘remove’. ‘Add’ và ‘edit’ v b n ch t là hai tác v t ươ ng t nhau. C hai u th hi n m t form n ng ưi dùng cho phép hi u ch nh m t câu chào m ng. Ch có s khác nhau là ‘add’ s hi n th m t form tr ng, còn ‘edit’ s hi n th m t form ã có d li u c a nó trong ó. Bi vì các tác v gi ng nhau nên chúng ta s ánh x tác v ‘add’ vào trong tác v ‘edit’. iu này ưc th c hi n trong hàm kh i t o: / * constructor (registers additional tasks to methods) * @return void Copyleft by oàn Thanh Tám Trang 30/41 Email: tamdt_a9tth@yahoo.com
  31. Tài li u h ng d n xây d ng component trong Joomla! 1.5 */ function __construct() { parent::__construct(); // Register Extra tasks $this->registerTask( 'add' , 'edit' ); } Tham s u tiên c a JControler::registerTask là tác v c n ánh x và tham s th hai là ph ươ ng th c mà nó s ánh x n. Chúng ta s b t u x lý tác v ‘edit’. Công vi c c a controler là khá ơ n gi n i vi tác v ‘edit’. T t c nh ng gì mà nó ph i làm là xác nh view và form layout c n t i (hello view và form layout). Ngoài ra, chúng ta s nói v i joomla disable main menu trong khi chúng ta hi u ch nh câu chào m ng. iu này s ng n ng ưi dùng kh i vi c thoát mà quên không l ưu các b n ghi ang m . Code cho tác v ‘edit’ c a chúng ta s nh ư sau: / * display the edit form * @return void */ function edit() { JRequest::setVar( 'view', 'hello' ); JRequest::setVar( 'layout', 'form' ); JRequest::setVar('hidemainmenu', 1); parent::display(); } 4.2. Hello View Hello view s hi n th m t form cho phép ng ưi dùng hi u ch nh câu chào m ng. Ph ươ ng th c display c a view ph i th c hi n m t s tác v ơn gi n sau: • Nhn d li u t model (retrieve the data from the model) • To toolbar (create the toolbar) • Chuy n d li u vào template (pass the data into the template) • Gi ph ươ ng th c display tr l i template (invoke the display() method to render the template) Vi c th c hi n các tác v trên có m t chút ph c t p, vì m t view s x lý c hai nhi m v ‘edit’ và ‘task’. Trong toolbar chúng ta mu n ng ưi dùng bi t h ang ‘add’ hay ‘edit’, b i th chúng ta c n ph i xác nh tác v nào ưc to ra. Copyleft by oàn Thanh Tám Trang 31/41 Email: tamdt_a9tth@yahoo.com
  32. Tài li u h ng d n xây d ng component trong Joomla! 1.5 Vì chúng ta ã nh n l i các b n ghi mu n hi n th t model, nên chúng ta có th s dng d li u này xác nh tác v nào ưc ưa ra. N u tác v là ‘edit’ thì tr ưng ‘id’ s ưc thi t l p, n u nhi m v là ‘add’ thì nó s không ưc thi t l p. iu này có th ưc s d ng xác nh xem chúng ta có m t b n ghi m i hay m t b n ghi ã t n t i. Chúng ta s b sung thêm 2 button vào toolbar: ‘save’ và ‘cancel’. Tuy các ch c n ng là gi ng nhau, nh ưng chúng ta mu n vi c hi n th c a các nút ph i khác nhau, ph thu c vào nó là m t b n ghi m i hay m t b n ghi ã t n t i. Nu nó là b n ghi mi, chúng ta s th hi n nút ‘cacel’, n u nó là b n ghi ã t n t i, chúng ta s th hi n nút ‘close’. Vì v y ph ươ ng th c c a chúng ta s nh ư sau: / * display method of Hello view * @return void / function display($tpl = null) { //get the hello $hello =& $this->get('Data'); $isNew = ($hello->id [ ' . $text.' ] ' ); JToolBarHelper::save(); if ($isNew) { JToolBarHelper::cancel(); } else { // for existing items the button is renamed `close` JToolBarHelper::cancel( 'cancel', 'Close' ); } $this->assignRef('hello', $hello); parent::display($tpl); } 4.3. Hello Model View c a chúng ta c n ph i có d li u. Vì v y chúng ta ph i t o ra m t model to ra m t câu chào m ng. Model c a chúng ta s có 2 thu c tính: _id và _data. _id s gi ‘id’ c a câu chào mng và _data s ch a d li u. Chúng ta s b t u v i m t hàm kh i t o h ưng t i vi c nh n ‘id’ t truy v n: Copyleft by oàn Thanh Tám Trang 32/41 Email: tamdt_a9tth@yahoo.com
  33. Tài li u h ng d n xây d ng component trong Joomla! 1.5 / * Constructor that retrieves the ID from the request * * @access public * @return void */ function __construct() { parent::__construct(); $array = JRequest::getVar('cid', 0, '', 'array'); $this->setId((int)$array[0]); } Ph ươ ng th c JRequest::getVar() ưc s d ng nh n d li u t request. Tham s u tiên là tên c a bi n form. Tham s th hai là giá tr m c nh s ưc gán n u không có giá tr nào ưc tìm th y. Tham s th 3 là tên c a hash nh n d li u t (get, post, vv) và giá tr cu i cùng là ki u d li u c a giá tr . Hàm khi t o c a chúng ta s l y giá tr u tiên t m ng ‘cid’ và gán nó cho ‘id’. Ph ươ ng th c setId() ưc s d ng thi t l p ‘id’. Vi c thay i ‘id’ mà model c a chúng ta tr t i có ngh a là d li u mà ‘id’ tr t i s không còn úng n a. Do ó, khi chúng ta thi t l p ‘id’ chúng ta c n clear thu c tính data. / * Method to set the hello identifier * * @access public * @param int Hello identifier * @return void */ function setId($id) { // Set id and wipe data $this->_id = $id; $this->_data = null; } Cu i cùng, chúng ta c n m t ph ươ ng th c nh n d li u: getData(). Copyleft by oàn Thanh Tám Trang 33/41 Email: tamdt_a9tth@yahoo.com
  34. Tài li u h ng d n xây d ng component trong Joomla! 1.5 Ph ươ ng th c getData s kim tra xem thu c tính data ã ưc thi t l p hay ch ưa. N u nó ã ưc thi t l p thì getData s tr l i nó, n u không getData s t i d li u t CSDL. * Method to get a hello * @return object with data */ function &getData() { // Load the data if (empty( $this->_data )) { $query = ' SELECT * FROM #__hello '. ' WHERE id = '.$this->_id; $this->_db->setQuery( $query ); $this->_data = $this->_db->loadObject(); } if (!$this->_data) { $this->_data = new stdClass(); $this->_data->id = 0; $this->_data->greeting = null; } return $this->_data; } 4.4. The form Bây gi , công vi c còn l i là to ra form ưa d li u vào. Vì chúng ta ã xác nh layout c a chúng ta nh ư m t form. Form s ưc trong m t file trong th ư m c tmp c a hello view g i là form.php: Copyleft by oàn Thanh Tám Trang 34/41 Email: tamdt_a9tth@yahoo.com
  35. Tài li u h ng d n xây d ng component trong Joomla! 1.5 : hello- >greeting;?>" /> hello->id; ?>" /> Chú ý r ng trong vi c b sung tr ưng input, có m t tr ưng hidden input cho ‘id’. Ng ưi dùng s không c n hi u ch nh ‘id’, nên chúng ta s không th hi n nó trên form. 4.5. Cài t các ch c n ng Cho n lúc này controler c a chúng ta ch th c thi hai nhi m v : edit và new. Tuy nhiên chúng ta còn có các nút ‘save’, ‘delete’, và ‘cancel’ các b n ghi. Chúng ta c n vi t các hàm x lý và th c hi n các tác v này. 4.5.1. Lu b n ghi Bưc ti p theo là cài t ch c n ng l ưu b n ghi. Thông th ưng, cn ph i có m t vài s thay i x lý các tr ưng h p khác nhau, nh ư s khác nhau gi a vi c t o b n ghi m i (câu l nh INSERT) và c p nh t b n ghi ã t n t i (câu l nh UPDATE). Ngoài ra rt ph c t p có th l y d li u t form và ư a nó vào câu truy v n. Tuy nhiên, Joomla! Framework ã chu n b vi c này khá c n th n cho b n. L p JTable giúp vi c thao tác d dàng trên các b n ghi trên CSDL mà không ph i lo l ng v vi c vi t các l nh SQL n m bên d ưi. Nó còn giúp vi c chuy n d li u t HTML vào CSDL ưc d dàng. a) To l p table Lp table là m t l p tr u t ưng t ó b n có th t o ra các l p con làm vi c v i các b ng c th . th c hi n iu ó ơn gi n là chúng ta t o ra m t l p k th a l p Copyleft by oàn Thanh Tám Trang 35/41 Email: tamdt_a9tth@yahoo.com
  36. Tài li u h ng d n xây d ng component trong Joomla! 1.5 JTable, b sung các tr ưng d li u nh ư các thu c tính và ghi è hàm kh i t o xác nh tên c a b ng và khóa chính. Dưi ây là l p JTable c a chúng ta: <?php / * Hello World table class * @package Joomla.Tutorials * @subpackage Components * @link wiki/Itemid,31/id,tutorials:components/ * @license GNU/GPL */ // no direct access defined('_JEXEC') or die('Restricted access'); / * Hello Table class * * @package Joomla.Tutorials * @subpackage Components */ class TableHello extends JTable { / * Primary Key * * @var int */ var $id = null; / * @var string */ var $greeting = null; / * Constructor * * @param object Database connector object */ function TableHello( &$db ) { Copyleft by oàn Thanh Tám Trang 36/41 Email: tamdt_a9tth@yahoo.com
  37. Tài li u h ng d n xây d ng component trong Joomla! 1.5 parent::__construct('#__hello', 'id', $db); } } ?> ây b n s th y, chúng ta ã nh ngh a hai tr ưng: tr ưng ‘id’ và tr ưng ‘greeting’. Sau ó chúng ta nh ngh a m t hàm kh i t o, nó s g i hàm kh i t o c a l p cha và truy n vào ó tên c a b ng (hello), tên c a tr ưng là khóa chính (id) và i t ưng kt n i CSDL. File này s ưc g i hello.php và nó s nm trong thư m c table trong ph n qu n tr ca component. b) Cài t ch c n ng trong model Bây gi chúng ta ã s n sàng b sung ph ươ ng th c vào model nó l ưu l i b n ghi. Chúng ta s g i ph ươ ng th c này l ưu tr . Ph ươ ng th c store() s th c hi n 3 vi c: kt kh i d li u t form vào i t ưng TableHello, ki m tra ch c ch n r ng b n ghi ưc nh d ng úng, và l ưu d li u vào CSDL. Ph ươ ng th c c a chúng ta nh ư sau: / * Method to store a record * * @access public * @return boolean True on success */ function store() { $row =& $this->getTable(); $data = JRequest::get( 'post' ); // Bind the form fields to the hello table if (!$row->bind($data)) { $this->setError($this->_db->getErrorMsg()); return false; } // Make sure the hello record is valid if (!$row->check()) { $this->setError($this->_db->getErrorMsg()); return false; } Copyleft by oàn Thanh Tám Trang 37/41 Email: tamdt_a9tth@yahoo.com
  38. Tài li u h ng d n xây d ng component trong Joomla! 1.5 // Store the web link table to the database if (!$row->store()) { $this->setError($this->_db->getErrorMsg()); return false; } return true; } Ph ươ ng th c này ưc b sung vào model hello. Ph ươ ng th c s có m t tham s . Nó là m t m ng liên k t d li u mà chúng ta mu n lưu tr vào CSDL. iu này có th ưc th c hi n d dàng t câu truy v n s ưc xem xét trong ph n sau Chúng ta th y r ng dòng u tiên tr li m t tham chi u n i t ưng JTable. N u chúng ta t tên table chính xác chúng ta s không ph i xác nh tên c a nó - l p JModel s bi t t tìm nó âu. Nhc l i r ng lp table c a chúng ta ưc g i là TableHello và t trong file hello.php n m trong th ư m c tables. N u b n tuân theo quy lu t này l p JModel có th t o ra i t ưng c a b n m t cách t ng. Dòng th hai s nh n l i d li u t form. L p JRequest s th c hi n iu này r t d dàng. Trong tr ưng h p này chúng ta s nh n l i t t c các bi n mà chúng ta submit s dng ph ươ ng th c POST. iu này s tr l i m t m ng liên k t. Ph n còn l i là r t d dàng. Chúng ta gán d li u, ki m tra và l ưu tr . Ph ươ ng th c bind() s copy d li u t m ng vào thu c tính t ươ ng ng c a i t ưng table. Trong tr ưng h p này, ph ươ ng th c bind() s l y giá tr c a ‘id’ và ‘greeting’ sau ó copy chúng vào các thu c tính c a i t ưng table. Ph ươ ng th c store() l y d li u t i t ưng và l ưu nó vào CSDL. N u id =0 nó s to ra m t b n ghi m i (câu l nh insert), n u không nó s c p nh t b n ghi ã có (câu lnh update). c) B sung tác v vào controler Bây gi chúng ta s b sung tác v vào controler. Vì tác v mà chúng ta ang thuwcj hi n là ‘save’, nên chúng ta ph i g i ph ươ ng th c save: / * save a record (and redirect to main page) * @return void */ function save() { $model = $this->getModel('hello'); if ($model->store()) { Copyleft by oàn Thanh Tám Trang 38/41 Email: tamdt_a9tth@yahoo.com
  39. Tài li u h ng d n xây d ng component trong Joomla! 1.5 $msg = JText::_( 'Greeting Saved!' ); } else { $msg = JText::_( 'Error Saving Greeting' ); } // Check the table in so it can be edited we are done with it anyway $link = 'index.php?option=com_hello'; $this->setRedirect($link, $msg); } Tt c nh ng gì chúng ta làm là l y model và g i ph ươ ng th c store. Sau ó chúng ta s d ng ph ươ ng th c setRedirect() redirect tr l i danh sách các câu chào m ng. Ngoài ra chúng ta còn truy n cho nó m t message, message này s ưc hi n th phía trên u ca trang. 4.5.2. Xóa m t b n ghi a) Cài t ch c n ng trong Model Trong model chúng ta s nh n l i m t danh sách các ‘id’ c n xóa và g i l p JTable xóa chúng. / * Method to delete record(s) * @access public * @return boolean True on success */ function delete() { $cids = JRequest::getVar( 'cid', array(0), 'post', 'array' ); $row =& $this->getTable(); foreach($cids as $cid) { if (!$row->delete( $cid )) { $this->setError( $row->getErrorMsg() ); return false; } } return true; } Copyleft by oàn Thanh Tám Trang 39/41 Email: tamdt_a9tth@yahoo.com
  40. Tài li u h ng d n xây d ng component trong Joomla! 1.5 Chúng ta g i ph ươ ng th c JRequest::getVar() l y d li u t request sau ó g i ph ươ ng th c $row delete() xóa m i dòng. Bng vi c l ưu tr các l i trong model chúng ta s có th nh n l i chúng sau ó n u chúng ta mu n. b) X lý tác v remove trong controler Tươ ng t nh ư ph ươ ng th c save() trong vi c x lý tác v l ưu tr . * remove record(s) * @return void */ function remove() { $model = $this->getModel('hello'); if(!$model->delete()) { $msg = JText::_( 'Error: One or More Greetings Could not be Deleted' ); } else { $msg = JText::_( 'Greeting(s) Deleted' ); } $this->setRedirect( 'index.php?option=com_hello', $msg ); } 4.5.3. Hy b quá trình hi u ch nh h y b vi c ‘edit’, t t c nh ng gì chúng ta c n làm là redirect l i main view. / * cancel editing a record * @return void */ function cancel() { $msg = JText::_( 'Operation Cancelled' ); $this->setRedirect( 'index.php?option=com_hello', $msg ); } 5. Kt lu n We have now implemented a basic backend to our component. We are now able to edit the entries that are viewed in the frontend. We have demonstrated the interaction Copyleft by oàn Thanh Tám Trang 40/41 Email: tamdt_a9tth@yahoo.com
  41. Tài li u h ng d n xây d ng component trong Joomla! 1.5 between models, views and controllers. We have shown how the JTable class can be extended to provide easy access to tables in the database. It can also be seen how the JToolBarHelper class can be used to create button bars in components to present a standardized look between components. ☺. 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: • staalanden Component có th ưc download t i: Copyleft by oàn Thanh Tám Trang 41/41 Email: tamdt_a9tth@yahoo.com