Lekcja 2 - MVC - Controller [kontroler]

Kategoria: Kurs pisania komponentów dla Joomla 1.5 [MVC] Utworzono: niedziela, 20, kwiecień 2008 Opublikowano: niedziela, 20, kwiecień 2008 Wojciech Romanek Drukuj E-mail

W dzisiejszym artykule już można powiedzieć, że zabierzemy się za pisanie komponentu w takiej dość sprecyzowanej formie. Mianowicie, developerzy Joomla wymagają aby pisząc komponenty dla Joomla 1.5 używać wzorca projektowego MVC (model - view - controller). My dzisiaj zamiemy się kontrolerem. Który będzie odpowiedzialny za przetwarzanie zadań (ang. task) naszego komponentu.

Oczywiście odwołanie do naszego komponentu nie ulega żadnej zmianie Joomla nadal szuka katalogu com_nazwakomponentu a potem pliku nazwakomponentu.php. Teraz chcąc używać kontrolera musimy w pliku głównym (nazwakomponentu.php) poinformować Joomle o tym że będziemy komponentu używać. Najpierw umieszczę kod, a następnie opisze za co odpowiadają poszczególne linie (kod z poprzedniej lekcji kasujemy):

<?php
defined( '_JEXEC' ) or die( 'Restricted access' );
 
require_once( JPATH_COMPONENT.DS.'controller.php' );
 
if($controller == JREquest::getWord('controller'))
  {
    $path = JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php';
    if(file_exists($path)) 
    {
      require_once $path;
    } else 
    {
      $controller = '';
    }
  }
 
$classname = 'WitajController'.$controller;
$controller = new $classname();
 
$controller->execute( JRequest::getVar( 'task' ) );
 
$controller->redirect();
?>

Myślę, że jeśli juz jesteś po lekturze pierwszej lekcji to 2 linię kodu rozumiesz (ale przypomnę że jest to zabezpieczenie przed bezpośrednim dostępem do pliku). Linia 4 jest to funkcja PHP która słuzy do wczytania i wykonania kodu zawartego w pliku podanym jako parametr funkcji. (funkcji php nie będę tutaj omawiał ponieważ jest wiele stron na których zrobiono to lepiej, ja odsyłam do manuala). W tym artykule nas bardziej interesuje parametr jaki podajemy funkcji require_once() czyli: JPATH_COMPONENT.DS.'controller.php' pierwsze dwa ciągi znaków oddzielone kropkami i pisane dużymi literami to stałe ścieżek. JPATH_COMPONENT jest ścieżką do naszego komponentu czyli np. /components/com_witaj a DS jest separatorem czyli np. '/' separator jest zawarty w naszych stałych ponieważ jest on zależny od systemu na jakim jest postawiony serwer. Czyli widzimy teraz że require_once() wczytuje nam plik zawarty w naszym katalogu, plik nazywa się controller.php (utworzymy go za chwilę).

Wiersz 6 to sprawdzanie czy w żądaniu dostępu do komponentu nie została użyta nazwa jakiegoś innego kontrolera innego niż standardowego. Przykład takiego żądania:

http://localhost/joomla/index.php?option=com_witaj&controller=mojkontroler

W takim wypadku odwołania się do naszego komponentu wartośc sprawdzenia w wierszu 6 jest true i zmienna $controller przyjmuje wartość "mojkontroler". Co się dzieje dalej? Tak jak widać w kodzie wiersz 7 przypisanie do zmiennej $path ścieżki dostępu do naszego kontrolera. Mam nadzieję, że rozumiesz ten zapis, przetłumacz sobie te stałe w taki sposób w jaki zapisałem wcześniej. Jak to będzie wyglądać?

sciezka_do_mojego_komponentu/controllers/mojkontroler.php

Później w kodzie mamy następny warunek który sprawdza czy kontroler którego żądamy wogóle istnieje, jesli tak to go wczytuje, w przeciwnym wypadku do zmiennej $controller wpisuje wartość pustą. Następnie tworzymy nazwę klasy. Jeśli żądany kontroler został znaleziony to nazwa kontrolera będzie: WitajControllerMojkontroler jeśli nie to nazwa klasy będzie WitajController. To myślę że jest dość logiczne ponieważ są to podstawy php. Następnie tworzymy nowy obiekt kontrolera.

Dwa ostatnie wiersze już nie są czymś standardowym w PHP bo jest to używanie klas wbudowanych w Joomla. Zajmijmy się najpierw parametrem funkcji: $controller->execute( JRequest::getVar( 'task' ) ); czyli JRequest::getVar( 'task' ) . Klasa JRequest stosujemy do pobierania zmiennych z żądań np zmienne przekazywane przez get lub post. Do szczegółów zapraszam do dokumentacji Joomla. (Jeśli będe miał czas to postaram się trochę potłumaczyć) Używaliśmy tej klasy na początku aby sprawdzić czy nie jest żądany inny kontroler. Teraz zapomocą funkcji getVar('task'); sprawdzamy wartość zmiennej task. Task z angielskiego oznacza zadanie. Wartość zmiennej możemy przekazywać np tak:

index.php?option=com_witaj&task=wypisz

Teraz może nie będę starał się jakoś szczegółowo tego tłumaczyć aby zbytnio nie zamętlić Wam w głowie, ale nie przejmujcie się bardzo wszystko się powoli zacznie wyjaśniać przy omawianiu pliku kontrolera. Funkcja redirect() to przekierowanie. W tej chwili nie będę jej omawiał.

Teraz musimy utworzyć plik controller.php:

<?php
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport('joomla.application.component.controller');
 
class WitajController extends JController
{
  function __construct()
  {
    parent::__construct();
  }
 
  function wypisz()
  {
    echo 'Witaj świecie!';
  }
}
?>

Teraz opis, pierwsza linijka jak zwykle, następna: jimport('joomla.application.component.controller'); odpowiedzialna za importowanie bibliotek wbudowanych w joomla. Tym razem importujemy bibliotekę kontrolera. Po zimportowaniu biblioteki tworzymy naszą klasę (jak w php) nazwa klasy taka jak już pisałem o pliku głównym w którym sprawdzaliśmy czy żądany był inny kontroler. po nazwie klasy piszaemy słowo kluczowe extends JController czyli, że nasza klasa (połączenie tych dwóch słów nie ma nic wspólnego ze znanym portalem internetowym;P) dziedziczy po klasie JController. Teraz we wnętrzu klasy tworzymy metody. Pierwsza to constructor pozostawimy bez zmian wywołamy kontruktor z klasy rodzica (z którego dziedziczymy). Teraz następna funkcja czy ona Ci czegoś nie przypomina? Wypisz... pamiętasz przykład wywołania naszego komponentu z pewnym zadaniem? Przypomnę Ci to co pisałem wcześniej:

index.php?option=com_witaj&task=wypisz

oczywiście przed index.php wpisujemy adres naszej strony. Myślę, że więcej nie muszę tłumaczyć zpisz pliki i spróbuj wywołać komponent za pomocą tego adresu. I co? Działa! Nasz komponent staje się coraz ciekawszy i coraz bliższy standardowi i wzorcowi MVC.

Nie wspomniałem o tym w pierwszej lekcji ale wszystkie pliki które tworzysz po stronie widocznej dla zwykłych użytkowników (frontend) możesz również zrobić w ten sam sposób i ten sam kod wykorzystać po stronie backend. Wystarczy w katalogu administrator/components utworzyć katalog com_witaj i skopiować wszystkie nasze pliki. Musisz pamiętać tylko o jednej rzeczy! Musisz zmienić nazwę pliku witaj.php ma admin.witaj.php, I to chyba było by na tyle.

Póki co nie przejmuj się tym, że swój komponent musisz wywoływać przez adres w następnych artykułach opiszę jak zrobić instalator itd. Ale w najbliższym kontynuacja opisu MVC - tym razem będzie to model i może view.

Odsłony: 21400