|
Opis oprzemy o jeden z podstawowych integratorów - integratora do kontaktów (com_contact_bot) ze względu na jego prostotę.
W ogólnym znaczeniu zadaniem integratora jest zbadać link jaki został przypisamy w menu i zwrócić odpowiednie drzewo elementów. Dla opisywanego przypadku komponent można opublikować na dwa podstawowe sposoby: - jako kategorię kontaktów - w tym przypadku do menu zostaje przypisany link typu: index.php?option=com_contact&view=category&catid=5
- jako konkretny kontakt - w tym przypadku do menu zostaje przypisany link typu: index.php?option=com_contact&view=contact&id=1
Zatem musimy na początku zbadać parametry linku (w tym przypadku parametr view) i w zależności od wyniku zwrócić odpowiednie drzewo wyników (dla kategorii) lub nie zwracać nic, gdy został opublikowany bezpośrednio kontakt. Inaczej przedstawia się sytuacja w przypadku np. integratora do treści. Jeżeli link odnosi się do sekcji, w wyniku powinniśmy zwrócić drzewo składające się z kategorii i artykułów. Gdy link odnosie się do kategorii, zwracamy tylko listę artykułów, zaś gdy odniesie się do konkretnego artykułu nie zwracamy żadnego wyniku.
Integrator jest standardowym pluginem Joomla. Różni się od innych tym, że:
- powinien instalować się w folderze com_sefservicemap;
- w zależności od nazwy komponentu powinien nazywać się [nazwa komponentu]_bot. Odniesie się do do nazw plików: [nazwa komponentu]_bot.php i [nazwa komponentu]_bot.xml. Czyli dla komponentu kontaktów powinien zawierać przynajmniej dwa pliki: com_contact_bot.php oraz com_contact_bot.xml. Integrator do kontaktów zawiera jeszcze obrazek kontaktu, więc w całości składa się z trzech plików.
- plugin powinien w sobie zawierać procedurę o nazwie [nazwa komponentu]_bot. Oto przykładowe wywołanie procedury:
function com_contact_bot ( $level, $link, $Itemid, $params ) { ..... AddExtMenuitem ($element); ..... }
gdzie: $level - jest to poziom w drzewie mapy. Poziom 0 oznacza że jest to element nadrzędny. Każdy podpoziom będzie miał $level większy o 1. $link - to jest link, jaki w menu został przypisany do danej pozycji. $Itemid - to jest numer id przypisanego menu; $params - to jest obiekt JParameter wraz z przypisanymi parametrami do integratora (zwrócone na podstawie pliku XML danego integratora); Do dyspozycji dodatkowo mamy dwie dodatkowe funkcje: - AddExtMenuitem ( $element); - dodaje element do mapy; - smGetParam ( $link, $what, $default ); - pobiera prametry z linku; funkcja smGetParam WEJŚCIE: smGetParam ( $link, $what, $default ); jest odpowiednikiem JRequest. $what - to jest szukany przez nas parametr; $default - warość domyślna zwracana w przypadku, gdy wartości dla parameru nie odnaleziono;
WYJŚCIE: $value;
funkcja AddExtMenuitem WEJŚCIE: AddExtMenuitem ( $element ); $element = stdClass(); $element->name - nazwa elmentu (w tym przypadku nazwa kontaktu); $element->link - link do kontaktu w postaci 'index.php.....Itemid='.$Itemid Komponent sam automatycznie zamieni linki na postać SEF, gdy będzie to wymagane; $element->level - określa poziom na którym ma się wyswietalć element; $element->lastmod - okresla datę, kiedy był ostatnio modyfikowany element; $element->image - obrazek, jaki ma się wyświetlać przy danym elemencie; $element->icon_path - domyślnie '/plugins/com_sefservicemap/'. Ścieżka gdzie będzie poszukiwany obrazek. $element->priority oraz $element->changefreq - to dane zwracane do mapy XML zgodnie ze specyfikacją http://sitemaps.org
WYJŚCIE: null
Wymaganymi elementami są name oraz link. Jeżeli to możliwe, należy zwracać parametr lastmod - pozwoli to mapie na wykrycie, czy dany element uległ zmianie czy nie i na tej postawie wyłania dodania elementu do kolejki pingowania; Oto zatem cała zawartość integratora dla kontaktów: Oto Manifest XML wraz z określeniem parametrów integratora: <?xml version="1.0" encoding="iso-8859-1"?> <install version="1.5" type="plugin" group="com_sefservicemap"> <name>SEF SM Contacts Integrator for Joomla 1.5.x</name> <author>Radoslaw Kubera</author> <creationDate>November 2008</creationDate> <copyright>(C) Radoslaw Kubera</copyright> <license>http://www.gnu.org/copyleft/gpl.html GNU/GPL</license> <authorUrl>www.sefservicemap.com</authorUrl> <version>2.0</version> <description>This plugin require SEF Service Map Component</description> <files> <filename plugin="com_contact_bot">com_contact_bot.php</filename> <filename>contact_people.gif</filename> </files> <params> <param name="show_item_icons" type="radio" default="1" label="Show contact icon" description="Show contact icon" > <option value="1">Show</option> <option value="0">Hide</option> </param> <param name="priority" type ="list" default="" label="Priority" description="The priority of integrator URLs relative to other URLs on your site."> <option value="">Default</option> <option value="0.0">0.0</option> <option value="0.1">0.1</option> <option value="0.2">0.2</option> <option value="0.3">0.3</option> <option value="0.4">0.4</option> <option value="0.5">0.5</option> <option value="0.6">0.6</option> <option value="0.7">0.7</option> <option value="0.8">0.8</option> <option value="0.9">0.9</option> <option value="1.0">1.0</option> </param> <param name="changefreq" type ="list" default="" label="Change frequency" description="How frequently the pages are likely to change."> <option value="">Default</option> <option value="always">Always</option> <option value="hourly">Hourly</option> <option value="daily">Daily</option> <option value="weekly">Weekly</option> <option value="monthly">Monthly</option> <option value="yearly">Yearly</option> <option value="never">Never</option> </param> </params> </install>
A oto wygląd pliku php: <?php /* Zadaniem funkcji jest zwrócenie kontaktów z kategorii $id */ function Contact_items ($level, $id,$Itemid,$params) {
/* pobranie parametrów integratora */ $priority=$params->get( 'priority', '' ) ; $changefreq=$params->get( 'changefreq', '' ); $show_item_icons=intval($params->get( 'show_item_icons', '1' )) ;
$db = JFactory::getDBO(); $user = &JFactory::getUser(); $aid = (int) $user->get('aid', 0);
/* Zapytanie do bazy */ if ($id) $cat_sel = " and a.catid='".$id."'"; else $cat_sel=''; $db->setQuery("SELECT a.*, b.alias as 'catalias' FROM #__contact_details AS a LEFT JOIN #__categories AS b ON a.catid = b.id where a.published >='1'".$cat_sel." and a.access<='$aid' order by a.ordering"); $items=$db->loadObjectList();
/* przesunięcie o jeden poziom w dół */ $lev=$level+1;
if (count($items!=0)) { foreach ($items as $item) {
/* ustawienie parametrów elementu */ $link="index.php?option=com_contact&view=contact&id=".$item->id.":" .$item->alias."&catid=".$item->catid.";".$item->catalias."&Itemid=".$Itemid; $element->name = $item->name; $element->link = $link; $element->level = $lev; $element->priority = $priority; $element->changefreq= $changefreq; if ($show_item_icons) $element->image = 'contact_people.gif'; else $element->image='none'; $element->icon_path='/plugins/com_sefservicemap/';
/* dodanie elementu kontaktu do mapy serwisu */ AddExtMenuItem ($element); } } }
/* Start */ function com_contact_bot ($level,$link,$Itemid,$params) { $catid = smGetParam($link,'catid',0); $view = smGetParam($link,'view',''); if ($view=='category') Contact_items ($level,$catid,$Itemid,$params); } ?>
A oto kroki jakie wykonuje integrator: - jako pierwsza wykonywana jest procedura com_contact_bot
- prodesura określa, jakie drzewo ma wyświetlić (kontakt, kategoria);
- jeżeli kategorię, skacze do funkcji Contact_items(); jeżeli nie, kończy działanie;
- pobiera wartości parametrów integratora;
- pyta bazę danych o kontakty w danej kategorii;
- dla każdego z kontaktów w kategorii formatuje odpowiednio element i dodaje do mapy przy pomocy funkcji AddExtMenuItem().
W celach diagnostycznych zaleca się instalowanie pluginów przez interfejs Joomli a nie komponentu SEF Service Map a to ze względu na fakt, że SEF Service Map ma zubożoną listę komunikatów o błędach w przypadku niepowodzenia instalacji.
|