Flesz-Fakty
Wprawia w zdumienie!
Mambo wprawia w zdumienie. Nie musisz być informatykiem, aby korzystać z najnowszych technologii! Stworzysz dynamiczną witrynę!

 
Mamboserver.com [forum pl]

Tworzenie prostego modułu PDF Drukuj E-mail

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

Gdzie zaczniemy?

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. a początek zbudujemy plik XML. Tam zawarte są definicje dla MOS installer, głównie jakie pliki są wymagane, oraz inne dane meda moduł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>
    <authorEmail></authorEmail>

    <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 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


Zmieniony ( środa, 13 kwietnia 2005 )