|
10 Červenec 2010
Posted in
Dokumentace -
Komponenty
Tímto pokračováním seriálu začínáme práce na veřejné části naší komponenty. V tomto dílu si nejprve povíme některé novinky, které nám veřejná část přináší a ty si pak prakticky ukážeme na zobrazení sekcí našeho fóra.
Novinky veřejné části
Hlavní novinky se týkají zobrazení výstupu naší komponenty. V administraci jsme měli všechno předdefinované, nebo určené podle pravidel vzhledu administrace. Nic z toho ve veřejné části neplatí. Ve veřejné části máme naprosto volnou ruku, přesto se ale vyplatí dát si pozor na některé věci.
Na prvním místě se nachází zcela jistě autentifikace. V administraci všechno dělal správce, který mohl téměř vše. To ve veřejné části neplatí. Zde mají přístup obyčejní uživatelé stránek. Takže například při úpravě příspěvku jeho autorem je nutné ověřit zda-li uživatel skutečně je jeho autorem. Jako přijdou na řadu parametry položky menu, jako je titulek stránky, jestli se má zobrazovat záhlaví a také css přípona třídy záhlaví. Mimo těchto základních parametrů si můžeme vytvářet také vlastní. Veřejná část také obsahuje modul pro tzv. drobečkovou navigaci, která přesně určujde, kde se návšěvník na našich stránkách nachází. Také nesmíme zapomenout na SEF URL, na které využijeme asi některé z rozšíření Joomly, ale pro jednodušší případy lze využít i to, které je součástí Joomly.
V administraci rovněž nesměl chybět ovladač pro každou část komponenty. Ve veřejné části jej potřebujeme pouze v případě, že voláme nějakou akci. Pro získání dat totiž používáme výchozí ovladač společně s příslušným pohledem.
Vstupujeme do veřejné části
Naopak stejný jako v administraci je vstupní soubor do komponenty, pouze se nejmenuje admin.komponenta.php, ale pouze komponenta.php. Jak soubory admin.komponenta.php, tak controller.php můžeme skopírovat z administrace, pouze u prvně jmenovaného nezapomeneme na jeho přejmenování. Ve výchozím ovladačí stačí přejmenovat výchozí pohled na sections. Struktura komponenty zůstane také stejná - tedy adresáře controllers, models, views a languages. Adresář tables zde samozřejmě tvořit nebudeme - definice tabulek nám stačí jedna. V případě, že plánujeme nějaké soubory(např.: css třídy komponenty), které využijeme ve více pohledech můžeme vytvořit adresář se jménem třeba assets a do něj tyto soubory umísťovat.
Zobrazujeme sekce
Sekce si zobrazíme jako seznam titulků a každá sekce bude mít jako potomky seznam jejich kategorií. Data si uvaříme jako obvykle v modelu:
jimport('joomla.application.component.model'); class SimpleForumModelSections extends JModel { function __construct() { parent::__construct(); } function getData() { $query="SELECT id, title \n"; $query.="FROM ".$this->getTable('section')->getTableName()." \n"; $query.="ORDER BY ordering \n"; $this->_db->setQuery($query); return $this->_db->loadObjectList(); } function getCategories() { $query="SELECT id, title, section_id \n"; $query.="FROM ".$this->getTable('category')->getTableName()." \n"; $query.="ORDER BY ordering \n"; $this->_db->setQuery($query); $categories_ol=$this->_db->loadObjectList(); for($i=0;$i<count($categories_ol);$i ) { $data[$categories_ol[$i]->section_id][]=$categories_ol[$i]; } return $data; } }
Abychom měli jednodušší zobrazení kategorií, připravíme si je do pole, jehož prvním indexem bude ID sekce, do které daná kategorie patří. Pokud se podíváte do dokumentace API Joomly zjistíte, že by to mohlo jít udělat i jednodušeji prostřednictvím parametru 'section_id' předaného do metody loadObjectList() databáze. Realita je ale jiná. Tento zápis lze použít pouze pokud je daná položka jedinečná, protože Joomla v tomto případě vytvoří jednorozměrné pole, nikoliv dvourozměrné.
Hlavní změnu najdeme ve třídě pro přípravu pohledu:
jimport('joomla.application.component.view'); class SimpleForumViewSections extends JView { function display($tpl=null) { $this->assignRef('data',$this->get('data')); $this->assignRef('categories',$this->get('categories')); $menu=JFactory::getApplication()->getMenu()->getActive(); $params=new JParameter($menu->params); $this->assignRef('params',$params); JFactory::getDocument()->setTitle($params->get('page_title')); $nav=JFactory::getApplication()->getPathway(); $nav->addItem($params->get('page_title')); parent::display($tpl); } }
Na začátku si předáme data do pohledu. Ve druhé části získáváme menu(getMenu()) a z něj právě vybranou pložku - getActive(). Z něj musíme zpracovat atribut params, zastupující parametry, pomocí třídy JParameter. Následuje přiřazení výchozího titulku stránky pro případ, že dané zobrazení voláme jinak než z menu. Toto provádíme metodou def() se dvěma parametry a to názvem parametru menu a jeho výchozí hodnotou. Jelikož tyto parametry využijeme také v samotném zobrazení, tak si je do něj předáme. Titulek stránky potřebujeme zadat také do titulku HTML dokumentu, který získáme jak již od minula víme pomocí metody getDocument(). Samotné přiřazení titulku provedeme metodou setTitle(), Posledním úkolem je získání drobečkové navigace metodou getPathway() a přidání názvu aktuální stránky metodou addItem().
Ještě nám zbývá samotný pohled:
<?php if($this->params->def('show_page_title',1)) { ?> <div class="componentheading"> </div> <?php } ?> <ul class="sf_sections"> <?php for($i=0;$i<count($this->data);$i ) { ?> <ul> <?php for($j=0;$j<count($this->categories[$this->data[$i]->id]);$j ) { ?> <?php } ?> </ul> <?php } ?> </ul>
Pohled lze rozdělit do dvou částí - záhlaví a těla. V záhlaví se podle parametru show_page_title(Zobrazit titulek stránky) rozhodujeme jestli zobrazit titulek stránky, který je obvyklé umístit do divu s css třídou componentheading, ke kterému přidáváme obsah toho co jsme v administraci zadali do políčka Připona třídy stránky, neboli parametr pageclass_sfx. V samotném těle pohledu si vypisujeme do odrážkového seznamu jednotlivé sekce a kategorie. Tady se zaměříme na metodu JRoute::_(), konkrétně na samotnou URL adresu. Pokud chceme využít základního SEFu co je v Joomle, tak je nutné mít id položek v odkazech ve tvaru id=id_polozky:nazev_polozky, kde nazev_polozky je nutné mít ve tvaru vhodném pro URL adresy tedy bez háčků a čárek a podobných znaků. To zajistíme tím, že titulek ošetříme metodou stringURLSafe() třídy JFilterOutput.
Příště
Příště si ukážeme mimo jiné jak si vytvořit vlastní parametry menu a jak s nimi pracovat. Toto si ukážeme na výpisu kategoríí a příspěvků v jednotlivých kategoriích. Aktuální stav komponenty naleznete zde.
Články


