A Joomla! 1.5 új keretrendszere számtalan új lehetőséget nyújt a fejlesztők számára. A kódot alaposan átvizsgálták, kijavították és megtisztították. Ez a leírás bemutatja, hogyan készíthetünk az új kretrendszerben egy komponenst.
A leírásban egy Helló, világ! komponens fejlesztését mutatjuk be. A későbbi leírásokban továbbfejlesztjük ezt, hogy megmutatjuk az MVC sokoldalúságát a Joomla!-ban.
Tartalomjegyzék |
Annak ellenére, hogy egy komponens ötlete nagyon egyszerűnek tűnhet, a mögötte lévő kód sokkal bonyolultabb lehet további funkciók hozzáadásával és a kezelőfelület megváltoztatásával.
A Modell-Nézet-Vezérlő (későbbiekben MVC) egy szoftvertervezési sablon, amely a kód rendszerezésére szolgál: különválasztja az adatfeldolgozást és a megjelenítést. Ennek az az előnye, hogy ha egy csoportba soroljuk az adatfeldolgozást, akkor anélkül módosíthatjuk a megjelenítést, hogy újraírnánk az adatfeldolgozást.
Három fő része van egy MVC komponensnek, melyek röviden ismertetésre kerülnek.
A Joomla!-ban az MVC-t három osztállyal tudjuk beépíteni: JModel, JView és JController. Bővebb információt az osztályokról az API-ban találunk.
Az alap komponensünkhöz mindössze öt fájl szükséges:
Fontos megjegyezni, hogy a belépési pont fájlnevének meg kell egyeznie a komponens nevével. Tehát például ha a komponensünk neve "Nagyon bonyolult nevű komponens", akkor a telepítés során (lásd később a hello.xml szekciót) a Joomla! egy com_nagyonbonyolultnevukomponens elnevezésű könyvtárat fog létrehozni, és a belépési pont fejlnevének nagyonbonyolultnevukomponens.php-nak kell lennie, különben nem fog működni. Kerüljük a speciális karakterek használatát, például az aláhúzás "_" jelnek különleges jelentése lehet a Joomlában, így használata kerülendő a fájl és könyvtárnevekben. A "site" nevű könyvtár a komponens felhasználó oldali részeit tartalmazza.
A Joomla! mindig az index.php fájlt használja belépési pontként az felhasználó oldali alkalmazásokhoz, és az administrator/index.php fájlt az adminisztrációs alkalmazásokhoz. Az alkalmazás ezután betölti a szükséges komponenst az 'option' értékének megfelelően, amely az URL-ben található, vagy POST adat formájában kerül átadásra. A mi koponensünk esetében az URL így néz ki:
index.php?option=com_hello&view=hello
Ez betölti a fő fájlt, amely a mi komponensünknél a components/com_hello/hello.php. Ez a kód jellemző nagyjából a legtöbb komponensre.
<?php/** * @package Joomla.Tutorials * @subpackage Components * components/com_hello/hello.php * @link http://docs.joomla.org/Category:Development * @license GNU/GPL */// no direct accessdefined( '_JEXEC' ) or die( 'Restricted access' );
// Require the base controllerrequire_once( JPATH_COMPONENT.DS.'controller.php' );
// Require specific controller if requestedif($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();
?>Az első sor egy biztonsági ellenőrzés.
A JPATH_COMPONENT az adott komponens abszolút elérési útja, a mi esetünkben components/com_hello. Ha szükségünk van külön a felhasználóoldali és az adminisztrációs komponens elérési útjára, akkor használhatjuk a JPATH_COMPONENT_SITE-ot és JPATH_COMPONENT_ADMINISTRATOR-t.
A DS a könyvtárelválasztó a rendszeren: '/' vagy '\'. Ezt a keretrendszer automatikusan meghatározza, tehát a fejlsztőnek nem kell erre figyelnie, ha különböző operációs rendszerrel rendelkező szerverekre fejleszt. A DS-t akkor kell használnunk, ha a lokális szerveren hivatkozunk egy fájlra.
Az alap vezérlő betöltése után megvizsgáljuk, hogy szükséges-e egy speciális vezérlő betöltése. Ebben a komponensben az alap vezérlő az egyetlen, de a kódot meghagyjuk a későbbi változtatások miatt.
A JRequest::getVar() keres meg egy változót az URL-ben vagy a POST adatban. Tehát, ha a mi URL-ünk index.php?option=com_hello&controller=controller_name, akkor a vezérlő nevét így kapjuk meg:
echo JRequest::getVar('controller');
Most már megvan az alap vezérlő 'HelloController' a com_hello/controller.php fájl, és ha szükséges, további vezérlőket hívhatunk meg, mint például 'HelloControllerController1', ami a com_hello/controllers/controller1.php fájl. Ez az elnevezési szabály egyszerűsíti a munkánkat: ‘{Componentname}{Controller}{Controllername}’.
A vezérlő elkészülte után utasítjuk a feladat végrehajtására, amely szintén az URL-ben található: index.php?option=com_hello&task=sometask. Ha nincs meghatározva a feladat, akkor alapértelmezésként a 'display' feladat hajtódik végre. A display használatakor a 'view' változó határozza meg, hogy mi jelenjen meg. További általános feladatok például a save, edit és a new.
A vezérlő átirányíthatja az oldalt, általában a 'save' feladat végrehajtása után. Az utolsó sor hajtja végre ezt az átirányítást.
A belépési pont (hello.php) átadja a vezérlést a vezérlőnek, amely végrehajtja a kérésben meghatározott feladatot.
A komponensünknek csak egy feladata van: köszönteni a világot. Ezért a vezérlő nagyon egyszerű lesz. Nincs szükség adatok módosítására. Amire szükségünk van, az a nézet betöltése. Csak egy metódusunk lesz a vezérlőben: display(). A legtöbb szükséges funkció be van építve a JController osztályba, tehát amit tennünk kell, az a JController::display() metódus meghívása.
Az alap vezérlő kódja:
<?php/** * @package Joomla.Tutorials * @subpackage Components * @license GNU/GPL */// no direct accessdefined( '_JEXEC' ) or die( 'Restricted access' );
jimport('joomla.application.component.controller');
/** * Hello World Component Controller * * @package Joomla.Tutorials * @subpackage Components */class HelloController extends JController
{ /** * Method to display the view * * @access public */function display()
{parent::display();
}}?>A JController konstruktor mindig regisztrál egy display() feladatot és amíg mást meg nem adunk (a registerDefaultTask() metódussal), addig ez lesz az alapértelmezett.
A display() metódus nem igazán szükséges, hiszen csak a szülő konstruktort hívja meg. Mindenesetre jól szemlélteti, hogy mi történik a komponensben.
A JController::display() metódus határozza meg a kérésből a nézet és az elrendezés nevét, továbbá betölti a nézetet és az elrendezést. Amikor menüpontot készítünk a komponensünknek, a menükezelő lehetőséget biztosít a nézet és az elrendezés kiválasztására. A nézet általában egy adatcsoportra irányul (például autók listája, események listája, egy autó, egy esemény stb.), míg az elrendezés a nézet megjelenítésének lehetőségeit tartalmazza.
A mi komponensünkben egy egyszerű hello hívás és egy elrendezés lesz.
A nézet feladata nagyon egyszerű: visszaadja a megjelenítendő adatokat és beépíti őket a sablonba a JView::assignRef metódussal.
A nézet kódja:
<?php/** * @package Joomla.Tutorials * @subpackage Components * @license GNU/GPL */// no direct accessdefined( '_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);
}}?>A Joomla! sablonjai és elrendezései szabályos PHP fájlok, amelyek a nézet által kapott adatokat jelenítik meg. A JView::assignRef metódus által átadott változókat a $this->{tulajdonsagneve} kóddal érhetjük el (példaként nézzük meg az alábbi sablon kódot).
A sablonunk nagyon egyszerű: csak a köszöntést akarjuk megjeleníteni:
<?php // no direct access
defined('_JEXEC') or die('Restricted access'); ?>
<h1><?php echo $this->greeting; ?></h1>
Komponenst manuálisan is telepíthetünk a fájlok FTP-n keresztüli másolásával és az adatbázis módosításával. Sokkal hatékonyabb viszont egy csomag készítése, amelyet a Joomla! telepítője segítségével telepíhetünk. A csomag különböző információkat tartalmaz:
Az XML fájl formátuma:
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE install SYSTEM "http://www.joomla.org/xml/dtd/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>
<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>Megfigyelhetjük, hogy néhány további fájl is szerepel az xml fájlban amelyet nem említettünk: az index.html fájlok. Ezek arra szolgálnak, hogy ne lehessen a könyvtárat böngészni. Ha egy támadás erre a könyvtárra irányulna, akkor az index.html fájl jelenne meg. Ezek a fájlok lehetnek üresek, vagy ezt az egyszerű sort tartalmazhatják:
<html><body bgcolor="#FFFFFF"></body></html>A másik fájl az admin.hello.php fájl. Ez az adminisztrátor oldali komponens belépési pontja. Mivel még nincs adminisztrációs része a komponensünknek, most ugyanaz lesz a tartalma, mint az index.html fájlnak.
A leírásban szereplő com_hello komponens letöltése
A cikk forrása: Joomla! Documentation