|
04 Září 2009
Posted in
Dokumentace -
Komponenty
Ve druhém pokračování návodu na tvorbu komponent si napíšeme první řádky kódu naší komponenty, konkrétně si ukážeme první kroky administrace naší komponenty.
Vstup do komponenty
Vstupní soubor komponenty se musí v administraci jmenovat admin.jmenokomponenty.php a provádíme v něm jedinou akci, inicializujeme controller a spouštíme akci(task).
<?php $controller=JRequest::getCmd('controller'); $controllerName='SimpleForumController'.$controller; } else { } $class=new $controllerName(); $class->execute(JRequest::getCmd('task')); $class->redirect(); ?>
Jako první(na řádku 3) musíme zakázat přímý přístup do skriptu, abychom zbytečně neprozrazovali vnitřní strukturu aplikace, a taky jej nešlo načíst mimo kontext Joomly. Dále pokračujeme tím, že si zjistíme pomocí metody getCmd() třídy JRequest, která slouží k ošetřenému načítání dat z proměnných jako $_GET, $_POST(o verzi pro získání normálních proměnných si povíme v některém s příštích dílů), jméno controlleru, který chceme spustit a na 6 řádku jej převedeme do standardní podoby, která musí mít tvar NazevkomponentyControllerElement, přičemž pokud Element vynecháme, tak se bude jednat o výchozí controller, který využijeme spíše ve veřejné části, i když jej lze použít i v administraci Joomly. O výchozím controlleru si povíme za chvilku. Ve funkci require_once si můžete všimnout řetězce DS, je zkratkou z anglického directory separator, což česky znamená oddělovač adresářů. Je zavedený z důvodů kompatibility Joomly mezi platformami Windows a Linux.
Následuje podmínka, která posle toho jestli je v proměnné $controller nějaký element, tak načte buď controller pro daný element, nebo výchozí, který umísťuji přimo do kořenového adresáře komponenty. Zbytek kódu se stará o vytvoření instance controlleru a spuštění úlohy(metoda execute()). Jako poslední zavoláme metodu pro přesměrování na cílovou stránku.
Výchozí controller
<?php jimport('joomla.application.component.controller'); class SimpleForumController extends JController { parent::__construct($config); } function display() { JRequest::setVar('view',JRequest::getCmd('view','posts')); JRequest::setVar('layout',JRequest::getCmd('layout','default')); parent::display(); } } ?>
Výchozí controller opět začneme zakázáním přímého vstupu. Následovat musí vložení kostry controlleru pomocí funkce jimport(), která ošetří vložení kódu z jádra Joomly. Pro vkládání pomocí funkce jimport() se použuje jako hlavní adresář /libraries/ a místo oddělovače adresářů se používá .(tečka). Pokračujeme definici třídy controlleru, která musí rozšiřovat (extends) základní controller JController. Konstruktor musí obsahovat jeden parametr, typu pole, který je nutné také předat rodičovskému kontrolleru ve volání(parent::__construct()).
Funkce display() nám zastupuje výchozí akci(task), takže se skvěle hodí do výchozího controlleru, ve kterém ošetříme přístup přes proměnnou view v URL. Jedná se o druhý formát URL adresy Joomly, který využijeme hlavně ve veřejné části, ale nic nám nebrání použít jej i v administraci. Tento tvar vypadá následovně:
index.pnp?option=com_componenta&view=pohled&layout=zobrazeni
Právě tento tvar ošetřujeme v naší funkci display(). View je rozděleno do dvou úrovní. První nám říká, jméno pohledu a další úroveň nám určuje zobrazení. Standardně se v Joomle používají dva typy zobrazení - default pro listing(tabulku) a form pro zadávací formulář. Ve funkci display() udáváme, že pokud zadáme URL ve tvaru index.php?option=com_componenta, tak se jako výchozí pohled použije posts a jako výchozí zobrazení default, nebo-li tabulka. Toto určujeme metodou JRequest::setVar(), která příjímá dva parametry - jméno proměnné a její hodnotu, kterou získáváme naší známou funkcí JRequest::getCmd(). Zde vidíme, že tato metoda přijímá ještě druhý parametr, který určuje výchozí hodnotu. Na závěr této funkce musíme předat řízení Joomle pomocí parent::display().
Druhým tvarem URL, který v administraci využijeme hlavně se budeme zabývat v příští části tohoto návodu.
Objektově-relační mapování
Tento díl zakončíme podrobnostmi o objěktově-relačním mapováním, nebo-li přiřazení třídy k tabulce.
<?php class TablePosts extends JTable { var $id=null; var $title=null; var $description=null; var $section_id=null; var $checked_out=null; var $checked_out_time=null; function __construct($db) { parent::__construct('#__sf_posts','id',$db); } } ?>
Tyto soubory, se nacházejí, jak jsem zmínil minule, v administrační části komponenty v adresáři /tables/ a jméno souboru musí odpovídat názvu třídy bez části Table, takže v našem příkladu by jméno souboru vypadalo posts.php. Tato třída musí rozšiřovat základní třídu pro práci s tabulkami JTable. Zde ji ovšem nemusíme ručně vkládat, protože Joomla to za nás udělá automaticky. Následuje jednoduchá definice položek dané tabulky, kterým přiřazujeme jako výchozí hodnotu null. Zmínku si zaslouží pouze dvě speciální položky, checked_out a checked_out_time, které musí každá tabulka obsahovat a popořadě určují id uživatele z tabulky jos_users, který daný záznam právě edituje a dále datum a čas edtace(checked_out_time).
Do konstruktoru předáváme objekt třídy pro práci s databázi a voláme konstruktor předka, v jehož parametrech nalezneme jméno tabulky, primární klíč tabulky a objekt databáze. V názvu tabulky se nachází podivná kombinace znaků #__, která je klíčem k různým prefixům instalací Joomly, protože znaky #_ jsou při dotazu na databázi nahrazeny za prefix instalace Joomly, což je ve výchozím stavu jos.
Články


