Helló, világ! komponens készítése 1. rész

A JoomlaWiki wikiből

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

Bevezetés a Modell-Nézet-Vezérlőbe

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.

  • Modell (model): A modell a komponensnek az a része, amely egységbe foglalja az alkalmazás adatait. Gyakran használ rutinokat az adatok kezeléséhez és módosításához. A mi esetünkben a modell metódusokat fog tartalmazni az üdvözlő üzenet adatbázishoz adásához, eltávolításához és módosításához. Tartalmazni fog még egy metódust, amely az üdvözlő üzenetek listáját kéri le az adatbázisból. Általánosságban, az alapul szolgáló adatok eléréhez szükséges kódot tartalmazza a modell. Abban az esetben, ha megváltoztatunk egy alkalmazást, amely egy egyszerű fájlt használ az adatok tárolására úgy, hogy az adatbázist használja helyette, akkor a modell lesz az egyetlen olyan elem, amelyet meg kell változtatni.
  • Nézet (view): A nézet a komponensnek az a része, amely átveszi a modelltől az adatokat. Egy webes alkalmazás esetében a nézet egy HTML oldal, amely megjeleníti az adatokat. A nézet adatokat vesz a modellből (amely a vezérlőtől kapja azokat) és egy sablon formájában hozza létre a felhasználó által látott formátumot. A nézet nem módosítja az adatokat, csak megjeleníti azokat.
  • Vezérlő (controller): A vezérlő felelős a felhasználói folyamatok kezeléséért. Egy webes alkalmazás esetén a felhasználói folyamat általánosságban egy oldalkérés. A vezérlő ismeri fel, hogy milyen kérést hajtott végre a felhasználó és reagálva erre meghívja a modellt az adat megfelelő kezeléséhez, majd a modell eljuttatja az adatokat a nézetnek. A vezérlő nem jeleníti meg az adatokat a modellben, csak meghívja a modell metódusait, majd átadja a modellt a nézetnek, amely megjeleníti az adatokat.

Az MVC beépítése a Joomlába

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.

A komponens elkészítése

Az alap komponensünkhöz mindössze öt fájl szükséges:

  • site/hello.php: ez a belépési pont a komponensünkhöz
  • site/controller.php: ez a fájl tartalmazza az alap vezérlőt
  • site/views/hello/view.html.php: ez a fájl kapja meg a szükséges adatokat és építi be a sablonba
  • site/views/hello/tmpl/default.php: ez a sablon a kimenethez
  • hello.xml: egy XML fájl, amely a Joomla!-nak ad információt a komponens telepítéséről

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.

Belépési pont létrehozása

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:

  1. 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.

  1. <?php
  2. /**
  3.  * @package    Joomla.Tutorials
  4.  * @subpackage Components
  5.  * components/com_hello/hello.php
  6.  * @link       http://docs.joomla.org/Category:Development
  7.  * @license    GNU/GPL
  8.  */
  9.  
  10. // no direct access
  11.  
  12. defined( '_JEXEC' ) or die( 'Restricted access' );
  13.  
  14. // Require the base controller
  15.  
  16. require_once( JPATH_COMPONENT.DS.'controller.php' );
  17.  
  18. // Require specific controller if requested
  19. if($controller = JRequest::getWord('controller')) {
  20.     $path = JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php';
  21.     if (file_exists($path)) {
  22.         require_once $path;
  23.     } else {
  24.         $controller = '';
  25.     }
  26. }
  27.  
  28. // Create the controller
  29. $classname    = 'HelloController'.$controller;
  30. $controller   = new $classname( );
  31.  
  32. // Perform the Request task
  33. $controller->execute( JRequest::getVar( 'task' ) );
  34.  
  35. // Redirect if set by the controller
  36. $controller->redirect();
  37.  
  38. ?>

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:

  1. 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 vezérlő (controller) elkészítése

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:

  1. <?php
  2. /**
  3.  * @package    Joomla.Tutorials
  4.  * @subpackage Components
  5.  * @license    GNU/GPL
  6.  */
  7.  
  8. // no direct access
  9.  
  10. defined( '_JEXEC' ) or die( 'Restricted access' );
  11.  
  12. jimport('joomla.application.component.controller');
  13.  
  14. /**
  15.  * Hello World Component Controller
  16.  *
  17.  * @package    Joomla.Tutorials
  18.  * @subpackage Components
  19.  */
  20. class HelloController extends JController
  21. {
  22.     /**
  23.      * Method to display the view
  24.      *
  25.      * @access    public
  26.      */
  27.     function display()
  28.     {
  29.         parent::display();
  30.     }
  31. }
  32. ?>

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 (view) elkészítése

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:

  1. <?php
  2. /**
  3.  * @package    Joomla.Tutorials
  4.  * @subpackage Components
  5.  * @license    GNU/GPL
  6.  */
  7.  
  8. // no direct access
  9.  
  10. defined( '_JEXEC' ) or die( 'Restricted access' );
  11.  
  12. jimport( 'joomla.application.component.view');
  13.  
  14. /**
  15.  * HTML View class for the HelloWorld Component
  16.  *
  17.  * @package    HelloWorld
  18.  */
  19.  
  20. class HelloViewHello extends JView
  21. {
  22.     function display($tpl = null)
  23.     {
  24.         $greeting = "Hello World!";
  25.         $this->assignRef( 'greeting', $greeting );
  26.  
  27.         parent::display($tpl);
  28.     }
  29. }
  30. ?>

A sablon elkészítése

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:

  1. <?php // no direct access
  2. defined('_JEXEC') or die('Restricted access'); ?>
  3. <h1><?php echo $this->greeting; ?></h1>

A hello.xml fájl elkészítése

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:

  • Rövid leírás a komponensről (pl. név), és opcinális információk, mint pl. a szerzői jog, licenc stb.
  • A másolandó fájlok listája
  • Szükségszerűen egy PHP fájl, amely további telepítési vagy eltávolítási feladatokat hajt végre
  • Szükségszerűen egy SQL fájl, amely a telepítés vagy eltávolítás során adatbázis kéréseket hajt végre

Az XML fájl formátuma:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE install SYSTEM "http://www.joomla.org/xml/dtd/1.5/component-install.dtd">
  3. <install type="component" version="1.5.0">
  4.  <name>Hello</name>
  5.  <!-- The following elements are optional and free of formatting conttraints -->
  6.  <creationDate>2007 02 22</creationDate>
  7.  <author>John Doe</author>
  8.  <authorEmail>john.doe@example.org</authorEmail>
  9.  <authorUrl>http://www.example.org</authorUrl>
  10.  <copyright>Copyright Info</copyright>
  11.  <license>License Info</license>
  12.  <!--  The version string is recorded in the components table -->
  13.  <version>Component Version String</version>
  14.  <!-- The description is optional and defaults to the name -->
  15.  <description>Description of the component ...</description>
  16.  
  17.  <!-- Site Main File Copy Section -->
  18.  <!-- Note the folder attribute: This attribute describes the folder
  19.       to copy FROM in the package to install therefore files copied
  20.       in this section are copied from /site/ in the package -->
  21.  <files folder="site">
  22.   <filename>index.html</filename>
  23.   <filename>hello.php</filename>
  24.   <filename>controller.php</filename>
  25.   <filename>views/index.html</filename>
  26.   <filename>views/hello/index.html</filename>
  27.   <filename>views/hello/view.html.php</filename>
  28.   <filename>views/hello/tmpl/index.html</filename>
  29.   <filename>views/hello/tmpl/default.php</filename>
  30.  </files>
  31.  
  32.  <administration>
  33.   <!-- Administration Menu Section -->
  34.   <menu>Hello World!</menu>
  35.  
  36.   <!-- Administration Main File Copy Section -->
  37.   <files folder="admin">
  38.    <filename>index.html</filename>
  39.    <filename>admin.hello.php</filename>
  40.   </files>  
  41.  </administration>
  42. </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:

  1. <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