--=REKLAMA=--

Projektowanie komponentu według wzorca Model-Widok-Kontroler - Część 1

Z Joomla!WikiPL

Wprowadzenie

Framework jest podstawą komponentu, która może być używana przez deweloperów. Framework w Joomla! 1.5 jest przeznaczony do rozbudowy. Ten poradnik przeprowadzi Cię przez proces tworzenia komponentu za pomocą frameworka. Zakres tego projektu będzie opracowanie prostego komponentu Hello World!. W przyszłości ten prosty schemat zostanie rozbudowany, aby pokazać pełną moc i wszechstronność wzorca projektowego MVC projektowania w Joomla!

Wymagania

Joomla! 1,5 lub wyższy dla tego poradnika.

Wprowadzenie do Model-View-Controller

Podstawowy MVC.png

Choć idea może wydawać się części bardzo prosta, kod może szybko stać się bardzo skomplikowany dodatkowe funkcje lub interfejs jest dostosowany.

Model-Widok-Kontroler [Model-View-Controller], zwany dalej MVC, jest wzorcem projektowania, które może być wykorzystywane do porządkowania kodu w taki sposób, aby logikę biznesową oddzielić od prezentacji danych. Przesłanką tego podejścia jest to, że jeśli logika biznesowa jest zgrupowana w jednej sekcji, a następnie interfejs i interakcja z użytkownikiem, dane mogą być zmienione i dostosowane bez konieczności przeprogramowywania logiki biznesowej. MVC został pierwotnie opracowany na mapie tradycyjną metodą, przetwarzania, zadań wyjścia do logicznej architektury GUI.

Te trzy główne role są podstawą do Joomlowego MVC. Są one tutaj opisane w skrócie, ale na dokładniejsze wyjaśnienie, patrz linki na końcu tego przewodnika.

Model

Model jest częścią komponentu, który łączy w sobie dane aplikacji. Zapewnia zarządzanie procedurami i za przetwarzanie danych w znaczący sposób oprócz procedur, które pobiera z modelu. W naszym przypadku model zawiera metody do dodawania, usuwania i aktualizacji informacji o zapytania w bazie danych. Będzie również zawierać metody pobierania listy zapytania z bazy danych. Ogólnie rzecz biorąc, podstawowe techniki dostępu do danych powinny być uwidocznione w modelu. W ten sposób, jeżeli aplikacja ma być przeniesiona z systemu, który nie korzysta z bazy danych do przechowywania informacji do systemu, który korzysta z bazy danych, model to jedyny element, który należy zmienić, a nie widok [view] lub kontroler [controller].

Widok [View]

Widok jest częścią komponentu, który jest używany do wyświetlania danych z modelu w sposób, który nadaje się do interakcji. W przypadku aplikacji internetowych, widok będzie na ogół jako strona HTML. Pobiera dane z modelu (który przekazywany jest do niego przez kontroler) i przesyła dane do szablonu, który odpowiada za prezentacje danych użytkownikowi. W widoku dane nie powinny być w żaden sposób modyfikowane, tylko wyświetlane pobrane z modelu.

Kontroler [Controller]

Kontroler jest odpowiedzialny za reagowanie na akcje użytkownika. W przypadku aplikacji internetowych, działania użytkownika (na ogół) w oparciu o wartość opcji w adresie URL lub danych POST. Kontroler określa żądanie, jakie jest dokonywane przez użytkownika i odpowiednio reaguje, wywołując odpowiedni model do manipulowania danymi przekazuje model do widoku. Kontroler nie wyświetla danych w modelu, tylko wywołuje metody w modelu, które modyfikują dane, a następnie przekazuje model do widoku, który wyświetla dane.

MVC relacje

Joomla MVC.png

Uproszczony schemat po prawej przedstawia relacje podstawowych składników, które są wykorzystywane w ramach Joomla!. Oprócz modelu, widoku i kontrolera, został dodany punkt wejścia, który jest przedstawiony jako mały okrąg, oraz szablon, który jest powiązany z widokiem. Wiedząc o tych pięciu elementach powinieneś być w stanie zrozumieć ten poradnik na temat podstaw tworzenia komponentu MVC dla Joomla!.

Część 1 przewodnika skupia się tylko na kontrolerze i widoku ( z wykorzystaniem szablonu ), są one oznaczone niebieskim kolorem na ilustracji. Część 2 dodaje a część 3 rozszerza funkcjonalność modelu o warstwę manipulacji danymi oznaczoną kolorem zielonym.

Należy pamiętać, że ten uproszczony obraz odnosi się tylko do witryny (tj. front-end). Identyczny obraz ma zastosowanie do zaplecza (tj. back-end). Część administracyjna komponentu jest opisana w rozdziałach 4 do 6 niniejszego poradnika. Zarówno strona oraz zaplecze są utrzymywane i konfigurowane na podstawie pliku instalacyjnego bazującego na XML ( zazwyczaj określane jako plik manifestu ).

Joomlowa implementacja MVC

W Joomla!, wzorzec MVC jest implementowany przez użycie trzech klas:
JModel, JView oraz JController.
Więcej informacji o tych trzech klasach można uzyskać w dokumentacji API (WIP).

Dodanie do Twojej strony w Joomla! środowiska debugera, może być przydatne do debugowania i nauki, a szczególnie podczas rozwijania komponentu-samouczka. Dobrym przykładem jest projekt społeczności J!Dump , który ma tę zaletę, że zachowuje widok wyjściowy niezmieniony. J!Dump pozwala na podgląd nie tylko właściwości, ale także metod.

Tworzenie komponentu

Podstawowy komponent, składa się z pięciu plików:

  • site/hello.php - główny plik komponentu.
  • site/controller.php - główny kontroler.
  • site/views/hello/view.html.php - plik ten pobiera odpowiednie dane i przekazuje je do szablonu.
  • site/views/hello/tmpl/default.php - szablon odpowiada za wygląd naszej aplikacji.
  • hello.xml - zawiera informacje dla Joomla dotyczące instalacji.

Pamiętaj że główny plik komponentu musi mieć taką samą nazwę, jak komponent. Na przykład, jeśli w pliku hello.xml w sekcji (name) podasz nazwę "Bardzo Skomplikowana Nazwa Komponentu", po instalacji komponentu Joomla! utworzy folder com_bardzoskomplikowananazwakomponentu, dlatego też musisz główny plik komponentu nazwać bardzoskomplikowananazwakomponentu.php inaczej nie będzie działać. Należy pamiętać, że korzystanie z niektórych znaków specjalnych, np. podkreślenia '_', może mieć szczególne znaczenie w Joomla i należy ich unikać w nazwach plików.

Katalog site jest tutaj jest przeznaczony na części komponentu, która są instalowane w witrynie.

Konwencje nazewnicze

W tym momencie ważne jest, aby powiedzieć, że niektóre słowa są zastrzeżone do stosowania w części nazwy klasy, a naruszenie ich doprowadza do trudnego debugowania błędu. Przykład użycia class w widoku (class HelloViewMojwidok extends JView{}) i kontrolerze (class HelloControllerMojcontroller extends JController{}), pierwsze słowo w klasach View i Controller to nazwa componentu(slowo "Mojwidok" jest unikatowe, ale żeby zachować konwencję, nazwa powinna być nazwą foldera z tym widokiem np. /views/mojwidok/view.html.php, slowo "Mojcontroller" tyczy się dodatkowego kontrolera, którego nazwa to nazwa pliku com_hello/controller/mojcontroller.php ).

Wszystkie nazwy plików i folderów models, views i controllers muszą być z małych liter, aby mogły działać również na systemach Unix/Linux-systems.

Tworzenie głównego pliku

Joomla! jest dostępna z jednego punktu index.php na stronie (front-end) administrator/index.php (zapleczu). Aplikacja zostanie załadowana z wymaganego składnika, w oparciu o wartość opcji "w adresie URL lub w danych POST. Dla komponentu, adres URL będzie:

index.php?option=com_hello&view=hello

Spowoduje to załadowanie naszego głównego pliku, który może być postrzegany jako pojedynczy punkt wejścia do naszego komponentu: components/com_hello/hello.php.

Kod do tego pliku.

site/hello.php:

<?php
/**
 * @package    Joomla.Tutorials
 * @subpackage Components
 * components/com_hello/hello.php
 * @link http://docs.joomla.org/Developing_a_Model-View-Controller_Component_-_Part_1
 * @license    GNU/GPL
*/
 
// No direct access
defined( '_JEXEC' ) or die( 'Restricted access' );
 
// Require the base controller
 
require_once( JPATH_COMPONENT.DS.'controller.php' );
 
/**  index.php?option=com_hello&view=hello&controller=innycontroler
Jesli w request jest przypisany inny controler i plik controllers/innycontroler.php istnieje
require_once $path; == require_once Root/components/com_hello/controllers/innycontroler.php;
*/
if($controller = JRequest::getWord('controller')) {
    $path = JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php';
    if (file_exists($path)) {
        require_once $path;
    } else {
        $controller = '';
    }
}
 
//  Tworzymy nazwe class'y
$classname    = 'HelloController'.$controller;
//  Tworzymy nowy obiekt np. new HelloController(); if empty $controller else HelloControllerinnycontroler();
$controller   = new $classname( );
 
/** if url = index.php?option=com_hello&task=zamknij
Wywoluje funkcje zamknij w com_helo/controller.php */
 
$controller->execute( JRequest::getWord( 'task' ) );
 
// Redirect if set by the controller
$controller->redirect();

Kontrola bezpieczeństwa.

JPATH_COMPONENT jest absolutną ścieżką do aktualnego komponentu, w naszym przypadku RootDirectory/components/com_hello.

JPATH_COMPONENT_SITE = RootDirectory/joomla/components/com_hello JPATH_COMPONENT_ADMINISTRATOR = RootDirectory/joomla/administrator/components/com_hello.

DS separator katalogu systemu: albo '/' lub '\'. Jest automatycznie ustawiany więc programista nie musi martwić się o rozwój różnych wersji dla różnych systemów operacyjnych serwera. "DS " powinien być zawsze stosowany, odnosząc się do plików na serwerze lokalnym.

Po załadowaniu sterownika bazowego, sprawdzamy, czy dany sterownik jest potrzebny. W tej części, kontroler podstawowy jest tylko kontroler, ale pozostawimy to warunkowego wyboru "w miejsce" na przyszłość.

JRequest:getWord() znajduje wyraz w zmiennej URL lub danych POST. Więc jeśli nasz adres jest index.php?option=com_hello&controller=controller_name, możemy pobrać nazwę controllera za pomocą: echo JRequest:: getWord ("controller");?

Teraz nasz Główny controller to HelloController w com_hello/controller.php oraz, w razie potrzeby, dodatkowe kontrolery takie jak "HelloControllerController1 w com_hello/controllers/controller1.php. Korzystamy z tego systemu nazewnictwa: '{Componentname}{Controller}{Controllername}'

Gdy kontroler jest tworzony, instruujemy kontroler do wykonania zadania(task=sometask), określonego w URL:? index.php?option=com_hello&task=sometask. Jeśli nie ma zadania(task), zostaje przejęte zadanie default 'display'. Kiedy używany jest szablon, 'view' zadecyduje co będzie wyświetlane. Inne wspólne zadania save, edit, new...

W kontrolerze możemy podjąć decyzję o przekierowaniu strony, zazwyczaj po zakonczeniu zadania(task=save) "save" przekierowujemy na inna stronę z odpowiednim komunikatem.

Główny punkt wejścia (hello.php) zasadniczo przekazuje kontrolę do kontrolera, który obsługuje wykonywanie zadań, które zostały podane w adresie URL lub w danych POST.

Ikona informacja.png
 Informacja

 Pamiętaj, że nie używamy php zamknięcia tego pliku: ?>. Powodem tego jest to, że nie ma żadnych niechcianych białych znaków w kodzie wyjściowym. To jest domyślna praktyka, ponieważ Joomla! 1.5 i nowsze będą używać php-only dla wszystkich plików.


Tworzenie kontrolera

Nasz komponent ma tylko jedno zadanie wyświetlić - greet the world . Dlatego, kontroler będzie bardzo prosty. Wszystko co należy zrobić to właściwie załadować widok. Będziemy mieli tylko jedną metodę(function) w naszym kontrolerze: display(). Większość funkcjonalności jest wbudowana w klasie JController, więc wszystko, co musisz zrobić, to powołać się na JController::display().

Kod dla głównego kontrolera site/controller.php wygląda:

<?php
/**
 * @package    Joomla.Tutorials
 * @subpackage Components
 * @link http://docs.joomla.org/Developing_a_Model-View-Controller_Component_-_Part_1
 * @license    GNU/GPL
 */
 
// No direct access
 
defined( '_JEXEC' ) or die( 'Restricted access' );
 
jimport('joomla.application.component.controller');
 
/**
 * Hello World Component Controller
 *
 * @package    Joomla.Tutorials
 * @subpackage Components
 */
class HelloController extends JController
{
    /**
     * Method to display the view
     *
     * @access    public
     */
    function display()
    {
        parent::display(); //parent:: , odnosi się do nazwy klasy bazowej(JController)
    }
 
}

JController zawsze rejestruje zadanie display() jako domyślne, chyba że określono inaczej (za pomocą funkcji registerDefaultTask()).

Wywołanie metody display() nie jest naprawdę konieczne, ponieważ metoda jest w Konstruktorze klasy bazowej. Jednak jest to dobry wizualny klucz do wskazania, co dzieje się w kontrolerze.


JController::display() Metoda ta określa nazwę widoku i nazwę szblonu, dostępnego w danym widoku. Podczas tworzenia menu dla komponentu, menedżer menu pozwala administratorowi wybrać widok, że chcielibyśmy, aby wyświetlić menu link określić układ(szablon). Zobacz zazwyczaj odnosi się to do celu określonego zestawu danych (np. lista samochodów, listę wydarzeń, jeden samochód, pojedyncze zdarzenie). Układ widoków określa, że pogląd ten jest organizowany.

W naszym com_hello, będziemy mieli jeden widok o nazwie hello, i jeden szablon (default).

Tworzenie widoku

Zadanie widoku jest bardzo proste: pobiera dane do wyświetlenia i przekazuje je do szablonu. Dane są przekazywane do szablonu za pomocą JView::assignRef. (Uwaga: Pierwszy znak przekazywany do metody assignRef nie może być poprzedzony znakiem podkreślenia czyli $this->assignRef('_greeting',$greeting). Spowodowałoby to błąd w metodzie assignRef. zmienne nie zostałyby przekazane do szablonu.)

Kod dla view w site/views/hello/view.html.php:

<?php
/**
 * @package    Joomla.Tutorials
 * @subpackage Components
 * @link http://docs.joomla.org/Developing_a_Model-View-Controller_Component_-_Part_1
 * @license    GNU/GPL
*/
 
// no direct access
 
defined( '_JEXEC' ) or die( 'Restricted access' );
 
jimport( 'joomla.application.component.view');
 
/**
 * HTML View class for the HelloWorld Component
 *
 * @package    HelloWorld
 */
 
class HelloViewHello extends JView
{
    function display($tpl = null)
    {
        $greeting = "Hello World!";
        $this->assignRef( 'greeting', $greeting );
 
        parent::display($tpl);
    }
}

Tworzenie szablonu

Joomla! templates/layouts są to zwykłe pliki PHP, które są wykorzystywane do układu danych z widoku w szczególny sposób. Zmienne przypisane przez metodę JView::assignRef można uzyskać w szablonie za pomocą $this->{nazwa zmiennej}(patrz kod szablonu poniżej przykład).

Nasz szablon jest bardzo prosty: chcemy wyświetlić powitanie, które zostało ustawione w widoku.
site/views/hello/tmpl/default.php:

<?php
 
// No direct access
 
defined('_JEXEC') or die('Restricted access'); ?>
 
<h1><?php echo $this->greeting; ?></h1>

Tworzenie pliku hello.xml

Możliwe jest zainstalowanie komponentu ręcznie, kopiując pliki za pomocą klienta FTP i modyfikacji tabel bazy danych. Bardziej wydajne, jest aby utworzyć plik pakietu, który pozwoli na użycie Instalatora Joomla! który zrobi to za Ciebie. Plik ten pakiet zawiera wiele różnych informacji:

  • Podstawowe szczegółowe dane opisowe o części (tj. imię i nazwisko) i ewentualnie opis, prawach autorskich i licencji.
  • listę plików, które muszą być kopiowane.
  • opcjonalnie plik PHP, który wykonuje dodatkowe operacje instalacji i deinstalacji.
  • opcjonalnie, który zawiera plik SQL zapytania do bazy danych, które powinny być wykonywane po instalacji / deinstalacji

Format pliku XML w hello.xml wygląda następująco:

<?xml version="1.0" encoding="utf-8"?>
<install type="component" version="1.5.0">
 <name>Hello</name>
 <!-- Następujące elementy są opcjonalne i bez ograniczeń formatowania -->
 <creationDate>2007-02-22</creationDate>
 <author>John Doe</author>
 <authorEmail>john.doe@example.org</authorEmail>
 <authorUrl>http://www.example.org</authorUrl>
 <copyright>Copyright Info</copyright>
 <license>License Info</license>
 <!--  Ciąg version jest rejestrowane w tabeli -->
 <version>1.01</version>
 <!-- Opis jest opcjonalny i domyślnie nazwa -->
 <description>Description of the component ...</description>
 
 <!-- Strona główna lista plików -->
 <!-- Uwaga atrybut folder:site
       Pliki zostana przeniesione do components/com_hello/  -->
 <files folder="site">
  <filename>controller.php</filename>
  <filename>hello.php</filename>
  <filename>index.html</filename>
  <filename>views/index.html</filename>
  <filename>views/hello/index.html</filename>
  <filename>views/hello/view.html.php</filename>
  <filename>views/hello/tmpl/default.php</filename>
  <filename>views/hello/tmpl/index.html</filename>
 </files>
 
 <administration>
  <!-- Administration Menu Section -->
  <menu>Hello World!</menu>
 
  <!-- Administrator lista plików -->
	 <!-- Uwaga atrybut folder:admin
       Pliki zostaną przeniesione do administrator/components/com_hello/  -->
  <files folder="admin">
   <filename>hello.php</filename>
   <filename>index.html</filename>
  </files>
 
 </administration>
</install>
Ikona informacja.png
 Informacja

  Umieść ten plik xml, w katalogu głównym pakietu (ponieważ instalator zajmie jego ścieżki jako ścieżki katalogu głównego dla wszystkich innych plików). Nie uwzględnia się go pod <files>...


Można zauważyć wyżej że o niektórych wymienionych plików nie rozmawialiśmy. Są to pliki index.html. plik index.html znajduje się w każdym katalogu, aby uniemożliwić ciekawskim użytkownikom zdobycie listy katalogów. Jeśli nie ma pliku index.html, niektóre serwery wyświetlają zawartość katalogu. Często jest to niepożądane. Pliki te mają prostą budowę:

<html><body bgcolor="#FFFFFF"></body></html>

Po prostu wyświetla się pusta strona.

Plik hello.php w folderze admin jest głównym plikiem do naszego komponentu administracyjnego. Ponieważ nasz komponent nie ma administratora(jeszcze), ten plik będzie miał tę samą treść, co pliki index.html.

Jeżeli skończyłeś, możesz odwiedzić URL index.php?option=com_hello, by zobaczyć twoją pracę.

Artykuły z tej serii

Autorzy

  • mjaz
  • staalanden
  • dannystaple
  • Stilgar
© Ten materiał jest dokładnym albo swobodnym tłumaczeniem artykułu http://docs.joomla.org/Developing_a_Model-View-Controller_Component_-_Part_1 udostępnionego na licencji JEDL na witrynie: Joomla! Official Documentation Wiki

Dziękujemy za wkład

» Stefan Wajda [zwiastun],