UWAGA: Strona zawiera materiały archiwalne. Większość artykułów dotyczy Joomla! 1.0
Start arrow Programowanie arrow Moduły arrow Piszemy prosty moduł
Piszemy prosty moduł Drukuj Email

Gdzie zaczniemy?

Jako przykład, stworzymy moduł listujący pozycje zawierające takie same słowa kluczowe jak aktualnie wyświetlana pozycja.

Najpierw należy zdecydować o nazwie modułu. Nazwiemy go Related Items. Nazwą modułu będzie mod_relcontent. Wszystkie nazwy modułów muszą być poprzedzone prefixem mod_ natomiast relcontent jest w naszym przypadku skrótem od przydługawego related content.

Stwórz sobie gdzieś katalog nazwany mod_relcontent. W tym katalogu utwórz dwa puste pliki; jeden nazwany mod_relcontent.php i drugi mod_relcontent.xml.

Na początek zbudujemy plik XML. Tam zawarte są definicje dla MOS installer, głównie, jakie pliki są wymagane, oraz inne dane dlamodułu. Wklej do pliku XML poniższą treść:

<?xml version="1.0" ?>
<mosinstall type="module">
    <name>Related Items</name>
    <creationDate>19/Aug/2003</creationDate>
    <author>Andrew Eddie</author>
    <copyright>This template is released under the GNU/GPL License</copyright>
    <authore-mail>eddieajau @ users.sourceforge.net</authore-mail>
    <authorUrl></authorUrl>
    <version>1.0</version>
    <description>Shows related content items based on
        keywords in the meta key field</description>
     <files>
        <filename module="mod_relcontent">mod_relcontent.php</filename>
     </files>
</mosinstall>

Ważne tutaj są tagi:

  • name
    Nazwa używana w menu.
  • files
    Dla tego modułu jest tylko jeden wymagany plik

Zapisz plik XML i przejdźmy do pliku PHP. W wcześniejszych wersjach Joomla! moduły zawierały treść do wyświetlenia w zmiennej $content. Ta metoda jest nadal wspierana, jednak teraz mamy do dyspozycji także bezpośredne wyjście poprzez echo() czy wychodzenie z PHP i powrót dla wyświetlenia treści. Kompletny kod PHP znajduje się na końcu artykułu. Obejrzymy go sobie.

Pierwsza linia po komentarzach jest niezwykle ważna. Zapobiega bezpośredniemu wywołaniu pliku i przez to możliwości "namieszania" w Joomla!.

Następnie gromadzimy garść zmiennych z URL. Podczas pisania modułu nigdy nie zakładaj że potrzebne ci zmienne są już dostępne. To nie jest dobry nawyk programistyczny i często różne dane mogą nie być aktualnie dostępne z danego poziomu kodu. Dla przykładu, kod tego modułu jest wywoływany z poziomu funkcji, przez co wiele zmiennych globalnych nie jest w nim widzianych bezpośrednio. Jednakże, część zmiennych jest dostępnych od razu, jak np. $database.

Skrypt w dalszej kolejności sprawdza czy użytkownik ogląda jakąś pozycję. Jeśli tak, pobiera wartość `metakey` danej pozycji.

Klasa bazy danych

Na początek należy zainicjować nasze zapytanie. Głównym powodem jest to że takie zapytanie jest parsowane pod kątem hash-underscore-underscore (#__). Ten ciąg znaków jest zamieniany na prefix tabeli bazy danych z globalnej konfiguracji.

 
$database⇒setQuery( "SELECT metakey FROM #__content WHERE id='$id'" );

OK. Mamy nasze zapytanie. To zapytanie zwraca pojedyńczą wartość. To jest częsty przypadek, dlatego Joomla! posiada metodę nazwaną loadResult() do pobierania właśnie pojedyńczej wartości. Mając taką wartość po sprawdzeniu czy nie jest ona pusta, podzielimy ciąg znaków na przecinkach. Użyjemy tablicy aby pomóc sobie zbudować zapytanie do bazy danych. W pseudokodzie to wygląda tak "pobierz wszystkie id z tablicy content gdzie ich pole metakey jest jak *to* lub *tamto*".

Jak widzisz mamy następną typową sytuację, czyli pobieranie listy wyników zapytania. Tutaj użyjemy następnej metody klasy database nazwanej loadObjectList() zwracającej tablicę wyników gdzie każdy wynik jest przechowywany jako obiekt. Metoda zwraca False gdy nie znaleziono wyników bądź zaszły inne błędy.

Mając listę pasujących wyników, reszta to już prosta pętla poprzez tablicę i wypisywanie linków.

Kończenie

Mamy już jakiś kod, teraz jakoś trzeba to zainstalować w Joomla!. Instalator modułów wymaga pliku zip zawierającego plik php i xml w nadrzędnym katalogu archiwum (w tym przypadku będzie to nasze mod_relcontent). Zzipuj te dwa pliki a następnie w administratorze Joomla! wybierz Instaluj ⇒ Moduły [Installer ⇒ Modules] z menu. Na dole ekranu zobaczysz pole do uploadowania plików. Wskaż utworzone archiwum ZIP i uploaduj je. Brawo. Twój moduł został zainstalowany i jest gotowy do użycia.

Przejdź do Moduły ⇒ Moduły witryny [Modules ⇒ Site Modules], aby opublikować moduł i wybrać pozycję oraz strony, na których moduł ma się wyświetlać.

 
<?php
//Related Content//
/**
* Related Content Module
* @package Joomla!
* @Copyright (C) 2000 - 2003 Miro International Pty Ltd
* @ All rights reserved
* @ Joomla! is Free Software
* @ Released under GNU/GPL License : http://www.gnu.org/copyleft/gpl.html
* @version $Revision: 1.3 $
**/
 
defined( '_VALID_MOS' ) or die( 'Direct Access to this location is not allowed.' );
 
$option = trim( mosGetParam( $_REQUEST, 'option', null ) );
$task = trim( mosGetParam( $_REQUEST, 'task', null ) );
 
$id = intval( mosGetParam( $_REQUEST, 'id', null ) );
 
if ($option == 'content' && $task == 'view' && $id) {
 
 // select the meta keywords from the item
 $query = "SELECT metakey FROM mos_content WHERE id='$id'";
 $database ⇒ setQuery( $query );
 
  if ($metakey = trim( $database ⇒ loadResult() )) {
  // explode the meta keys on a comma
 
  $keys = explode( ',', $metakey );
  $likes = array();
 
  // assemble any non-blank word(s)
  foreach ($keys as $key) {
   $key = trim( $key );
   if ($key) {
 
    $likes[] = $key;
   }
  }
 
  if (count( $likes )) {
 
   // select other items based on the metakey field 'like' the keys found
   $query = "SELECT id, title"
    . " FROM mos_content"
    . " WHERE id<>$id AND state=1 AND access <=$my ⇒ gid AND (metakey LIKE '%";
   $query .= implode( "%' OR metakey LIKE '%", $likes );
   $query .= "%')";
 
 
   $database ⇒ setQuery( $query );
   if ($related = $database ⇒ loadObjectList()) {
 
    foreach ($related as $item) {
     echo '<a href="index.php?option=content&task=view&id='.$item ⇒ id.'">'
 
        .$item ⇒ title.'</a><br />';
    }
   }
   echo $database ⇒ getErrorMsg();
  }
 
 }
}
?>
Zmieniony ( 18.06.2007. )
 
następny artykuł »