Jako przykład, stworzymy moduł listujący pozycje zawierające takie same słowa 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".
- 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 Mambo 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 Mambo.
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 Mambo 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 databasenazwanej 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 Mambo. 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 Mambo wybierz Modules->Install
(Moduły->Instaluj) 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 Modules->Manage Modules (Moduły->Zarządzaj modułami) aby opublikować moduł i wybrać pozycję oraz strony na których moduł ma się wyświetlać.
<?php
//Related Content//
/**
* Related Content Module
* @package Mambo
* @Copyright (C) 2000 - 2003 Miro International Pty Ltd
* @ All rights reserved
* @ Mambo 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();
}
}
}
?>
Tłumaczenie: Krzysztof Szatanik (Diabl0).
Źródło