Zend Framework Tutorial


Zend_InputFilter

Ostatnim komponentem opisywanym w tutorialu jest Zend_InputFilter. Ta klasa zapewnia proste metody filtrujące dane. Tworzysz jej instancję przekazując w parametrze tablicę danych do przefiltrowania:

<?php

$filterPost = new Zend_InputFilter($_POST);

?>

To zmienia wartośc przekazanej tablicy ($_POST) na NULL, więc bezpośredni dostęp do niej nie jest już dostępny. Teraz klasa Zend_InputFilter zapewnia kolekcję metod które filtrują dane według określonych kryteriów. Na przykład, jeśli chcesz otrzymać jedynie litery ze zmiennej $_POST['name'], możesz użyć metody getAlpha():


<?php

/* $_POST{{'name'}} = 'John123Doe'; */

$filterPost = new Zend_InputFilter($_POST);

/* $_POST = NULL; */

$alphaName = $filterPost->getAlpha('name');

/* $alphaName = 'JohnDoe'; */

?>

Argument który przekazujesz do każdej filtrującej metody jest nazwą klucza elementu tablicy który chcesz przefiltrować.
Obiekt (w tym przypadku $filterPost) jest chroniony, a dostęp do jego składników jest kontrolowany. Dlatego zawsze powinieneś
używać klasy Zend_InputFilter gdy chcesz uzyskać dostęp do danych przychodzących od użytkownika.

Klasa Zend_Filter zapewnia statyczne metody które działają analogicznie do metod klasy Zend_InputFilter.

Budowa systemu zarządzania newsami

Opublikowana wersja frameworka posiada wiele innych komponentów (a wiele innych jest w trakcie tworzenia), jednak komponenty omówione do tej pory pozwalają na zbudowanie prostej aplikacji. Stworzenie tej prostej aplikacji powinno pomóć Ci w poznaniu struktury frameworka.

Każdy tworzy aplikacje w inny sposób, a Zend Framework próbuje zmniejszyć tą różnorodność.

Kiedy zaczynam tworzyć aplikację, zaczynam od interfejsu. To nie oznacza, że spędzam wiele godzin pracując nad kodem html, arkuszami stylów i grafiką, jednak podchodzę do problemu z perspektywy użytkownika. Patrzę na aplikację jak na kolekcję stron, z których każda ma unikalny adres URL. Ten system zarządzania newsami składa się z następujących adresów URL:

/
/add/news
/add/comment
/admin
/admin/approve
/view/{id}

Musisz zacząć myśleć o tych adresach URL w kontekście kontrolerów. IndexController wyświetla newsy, AddController umożliwia dodawanie newsów i komentarzy, a AdminController umożliwia czynności administracyjne takie jak np. akceptowanie newsów. ViewController umożliwia wyświetlenie konkretnego newsa wraz z odpowiadającymi mu komentarzami.

Zacznij od usunięcia pliku FooController.php jeśli jeszcze istnieje. Następnie zmodyfikuj IndexController.php aby dodać właściwe akcje, a w nich dodaj komentarze które zarezerwują miejsce na kod który dodamy później:


<?php

Zend::loadClass('Zend_Controller_Action');

class IndexController extends Zend_Controller_Action
{
    public function indexAction()
    {
        /* Wyświetla newsy. */
    }

    public function noRouteAction()
    {
        $this->_redirect('/');
    }
}

?>

Następnie utwórz AddController.php:


<?php

Zend::loadClass('Zend_Controller_Action');

class AddController extends Zend_Controller_Action
{
    function indexAction()
    {
        $this->_redirect('/');
    }

    function commentAction()
    {
        /* Dodajemy komentarz. */
    }

    function newsAction()
    {
        /* Dodajemy news. */
    }

    function __call($action, $arguments)
    {
        $this->_redirect('/');
    }
}

?>

Zwróć uwagę, że metoda indexAction() kontrolera AddController nie powinna nigdy być wywołana. To mogłoby się zdarzyć jedynie gdy zostanie wywołany adres /add. Ponieważ użytkownik może uzyskać taki adres wpisując adres URL ręcznie, możesz przekierować takiego użytkownika do strony głównej, wyświetlić błąd lub zrobić cokolwiek innego.

Następnie utwórz AdminController.php:


<?php

Zend::loadClass('Zend_Controller_Action');

class AdminController extends Zend_Controller_Action
{
    function indexAction()
    {
        /* Wyświetlamy interfejs administratora. */
    }

    function approveAction()
    {
        /* Akceptracja newsa. */
    }

    function __call($action, $arguments)
    {
        $this->_redirect('/');
    }
}

?>

I utwórz jeszcze ViewController.php:


<?php

Zend::loadClass('Zend_Controller_Action');

class ViewController extends Zend_Controller_Action
{
    function indexAction()
    {
        $this->_redirect('/');
    }

    function __call($id, $arguments)
    {
        /* Wyświetl news o numerze $id. */
    }
}

?>

Tak jak w AddController, metoda indexAction() nie powinna nigdy być wywołana, więc możesz w takim wypadku zrobić to co uznasz za stosowne. ViewController trochę się różni od innych kontrolerów, ponieważ nie dostajemy tu informacji o akcji. Aby mogły działać adresy takie jak /view/23, musisz obsługiwać dynamiczne akcje za pomocą __call().

Strony: 1 2 3 4 5 6

Informacje oraz linki


Inne artykuły
Polecane
Zend Studio - The premiere PHP IDE

Dodaj komentarz

Poświęć chwilę i wyraź swoją opinię. Możesz użyć niektórych znaczników HTML.

Komentarze czytelników

To miłe, że pofatygowałeś się z przetłumaczeniem tutoriala do Zend Framework. Czytanie tego rodzaju opracaowań jest bardziej przyjazne niż sucha lektura dokumentacji, a czytanie w rodzimym języku to wręcz luksus. Robisz fajną robotę ulatwiajac pierwszy kontakt z tym frameworkiem – mowie tu zarówno o powyższym tekscie, jak i o strone http://zf.naruniec.info/. Tak przy okazji czy to (http://framework.zend.com/developer/changeset/589) tlumaczenie tez jest Twojego autorstwa?

Ciesze się, że się podoba :) Mam nadzieję, że niedługo strona z przykładami się nieco rozwinie. Co do tłumaczenia manuala to jest także mojego autorstwa, jednak przetłumaczonych jest dopiero kilka rozdziałów. Myślę że w lipcu uda się zakończyć prace i możliwe, że wraz z wersją frameworka 0.1.5 ukaże się polski manual.

To by było miłe.

To by było super z tą dokumentacją. Co do arta to dzięki wielkie… jak napisał bigZbig – LUKSUS :D

Mógłbyś to gdzieś jeszcze opublikować, np. tu: http://www.secondrenesans.com/c18.html

Nice. Tylko jak najlepiej zabrać się za napisanie strony, która wyświetli jednocześnie generowane menu, skrót ostatnich wpisów z forum itp. oprócz newsów?

Gratuluję, świetny tutorial, naprawdę.

Dołączam się do pytania, które zadał Tuner. FrontControler ZF jest fajny do pisania prostych stron, ale jak przy jego pomocy zbudować aplikację modularną? Chodzi mi oczywiście o taką oraganizację kodu aby poszczególne moduły były w jak największym stopniu od siebie niezależne.

Generalnie to już MVC wymusza jakąś tam modułowość, jednak w aplikacji z tutoriala każda część modułu (model, widok i kontroler) są przechowywane w różnych katalogach.

Domyślam się, że chodzi o możliwość takiego napisania modułów aby wszystkie pliki danego modułu były ładnie wydzielone, np. tak:

moduł1
    models
    views
    controllers
moduł1
    models
    views
    controllers

itd.

Żeby to osiągnąć trzeba by pogrzebać przy kontrolerze frontowym i routerze. Dość wygodnie będzie można to zrobić w oparciu o nowy router (RewriteRouter), który ma pojawić się w dzisiejszej wersji 0.1.5.

Dodatkowo wtedy można do każdego modułu jakiś meta plik XML wrzucić z podstawowymi informacjami o module i działałoby to całkiem fajnie.

Co do pytania Tunera: napisanie takiej aplikacji nie różni się od każdej innej. Piszesz modele wyciągające dane menu i skrót wpisów z forum, w kontrolerze przekazujesz to do szablonu i gotowe. Jeśli np. menu ma być generowane dla wszystkich kontrolerów to wtedy najlepiej użyć plugina (Zend Framework Plugins), a jeśli tylko dla konkretnego kontrolera to najlepiej pobranie danych menu i przekazanie ich do widoku rozwiązać w konstruktorze kontrolera.

Wojciechu!

Skoro tak bardzo dobrze idzie Tobie tłumaczenie angielskich tekstów zwracam się do Ciebie w imieniu wielu początkujących w ZF.

Proszę przetłumacz artykuł Luke Dawson-a o Pluginach jak również gdybyś mógł napisać gdzie i jakie pliki trzeba umieścić i jak je ponazywać, żeby ten plugin zadziałał.

Myślę, że nie tylko ja będę Tobie wdzięczny!

Proszę bardzo :) Nie jest to tłumaczenie tylko luźna wariacja na temat, ale mam nadzieję, że się przyda.

A ja mam jedno pytanko: mam mianowicie sytuację:

Wszystkie pliki nie są umieszczone w głównym katalogu serwera (,że odwołuje sie do nich w sposób :www.strona.pl/controller/action) a w jakimś podkatalogu (np. http://www.strona.pl/podkatalog1/podkatalog2/controller/action). Niestety nie potrafię skonfigurować tak ModRewrita żeby mi to „chytał”.

Bardzo proszę o pomoc :-)

Użyj nowego RewriteRoutera, tam jest coś takiego jak RewriteBase.

Teraz pytanie za 100 pkt. Co zrobić żeby Zend_Db dobrze odsługiwał polskie znaki. Baza MySQL w UTF-8 a chce żeby znaki wyświetlał w iso-8859-2 czy w latin2, jak kto woli.

funkcja iconv(), nie działa, chyba że źle dobieram parametry.

Z góry wielkie dzięki za pomoc!

Dla potomnych, wystarczy to:

$db->query(‘SET NAMES latin2′);
$db->query(‘SET CHARACTER SET latin2′);

Dzięki za stworzenie tutoriali do ZF – bardzo mi pomogły :D

Piotrku, jeśli baza jest w UTF-8 to lepiej chyba już całą aplikację zrobić przy użyciu UTF-8 :)

Seba, małe sprostowanie – powyższy tutorial jest tylko tłumaczeniem, jego autorem jest Chris Shiflett.

Witajcie, mam następujący problem: w jaki sposób przy takiej konfiguracji jak ta w artykule powyżej można dostać się do parametru „c” w tak skonstruowanym adresie: adres.domena/a/b/c
Jak wiemy: a – to nazwa kontrolera, b – nazwa akcji, c – no właśnie?
Chodzi mi tu dokładnie o możliwość tworzenia akcji typu: adres.domena/admin/delete/5 (co możnaby porównać do aprove w powyższym tekście, jednakże chciałbym przekazywać id rekordu w aresie, a nie jak tutaj poprzez formularz, metodą POST).

To jeszcze raz ja ;) , poszukałem już i znalazłem – metoda Zend_Controller_Action::_getParam
pozdrawiam.

A propo’s umieszczania strony w podkatalogu serwera. Wystarczy zamiast Zend_Controler_Routera uzyc Zend_Controler_RewriteRoutera i plik .htaccess wrzucic do tego podkatalogu zamiast do katalogu glownego. RewriteRouter powinien sam rozpoznac sciezke, ale wrazie czego mozna ustawic recznie RewriteBase. RewriteRouter teoretycznie zostal stworzony w celu wyeliminowania koniecznosci stosowania mod_rewrite, ale nie znaczy to ze ta nowa wersja ZF Routera nie bedzie wspolpracowac z plikami .htaccess

przykład fajny, ale ja szukam już któryś dzień jak zrobić taką operację

if($sesja->zalogowany)
{
$frontController->dispatch();//idź gdzie sobie chcesz
}
else
{
// idź do strony z logowaniem
}

do tej pory nie wiem jak to wykonać – nie mam pojęcia nie znalazłem przykładów na to – nie wiem co zrobić
dzięki jednej osobie dotarłem do strony

http://www.nabble.com/Zend_Acl—Zend_Auth-example-scenario-tf3165728s16154.html

przykład rozbudowany – z rozbudowanym systemem, ale dalej nie rozumiem jak to wykonać

jest tam przykład

->setControllerDirectory(array(‘default’ => realpath(‘../application/controllers/default’),
‘admin’ => realpath(‘../application/controllers/admin’)))

i nie wiem, czy z tego wynika, że ja powinienem zrobić dwie ścieżki do kontrolera? jedną dla zalogowanych druga dla niezalogowanych

normalnie było prosto szybko i zwyczajnie
if(!$_SESSION[‘zalogowany’)
header(‘location:index.php?action=login’);

a przy ZF nad takim czymś męczę się prawie trzy dni i nie wiem jak to zrobić – na jakiej zasadzie ma się to oprzeć itp

Dzięki za tutorial ZF zaczyna mi się krystalizować w umyśle ;)

[...] Zend Framework Tutorial – Wojciech Naruniec [...]

Do ktorego zend-a to bylo pisane?

W 1.0.3 nie dziala od poczatku ten tutek, mimo ze zmienilem Zend::loadClass na Zend_Loader::loadClass? Moze jest jakis Tutorial do 1.0.3??

Dzieki

jaskooo, to rozwiązuje problem…
$controller=Zend_Controller_Front::getInstance()
->setControllerDirectory(‘../app/controllers’)
->setParam(‘noViewRenderer’,true) //recepta
->dispatch();

Pytanie: http://www.costam.pl/controller/action, jak zrobić tak że jak user zapoda w przeglądarce controller/action.html to wykona się ta sama akcja?

Gdy próbuję dostać się na drugą podstronę wyrzuca błąd iż jej nie ma..

jakaś awaria ? można znaleźć tutorial gdzieś indziej ?

Błąd w nawigacji po podstronach poprawiłem. Dodałem też informacje o tym, że tutorial jest nieaktualny.