Zend Framework Tutorial


Zend_View

Zend_View jest klasą która pomaga zorganizować warstwę widoku w modelu MVC. Jest to bardzo prosty system szablonów. Nie używam w tym tutorialu innych systemów szablonów. Jednak w tej kwesti masz wolną rękę i jeśli chcesz możesz użyć innego systemu szablonów.

Miej na uwadze to, że wszystkie przychodzące żądania są obsługiwane przez kontroler frontowy. Struktura aplikacji już istnieje i przyszłe aktualizacje muszą jej odpowiadać. Aby w bardzo prosty sposób użyć klasy Zend_View, zmień kod klasy IndexController.php w taki sposób:


<?php

Zend::loadClass('Zend_Controller_Action');
Zend::loadClass('Zend_View');

class IndexController extends Zend_Controller_Action
{
    public function indexAction()
    {
        $view = new Zend_View();
        $view->setScriptPath('/path/to/views');
        echo $view->render('example.php');
    }

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

?>

Utwórz plik example.php w katalogu widoków:

<html>
<head>
    <title>This Is an Example</title>
</head>
<body>
    <p>This is an example.</p>
</body>
</html>

Teraz gdy wywołasz główną stronę witryny powinieneś zobaczyć zawartość pliku example.php. Nie jest jeszcze zbyt użyteczne, ale pamiętaj że tworzysz aplikację o bardzo zorganizowanej strukturze.

W celu uzyskania jaśniejszego przykładu użycia Zend_View, zmodyfikuj szablon (example.php) aby wyświetał dane:


<html>
<head>
    <title><?php echo $this->escape($this->title); ?></title>
</head>
<body>
    <?php echo $this->escape($this->body); ?>
</body>
</html> 

Zostały dodane dwie fukncjonalności. Metoda $this->escape() powinna być używana na każdych danych wychodzących. Nawet jeśli te dane tworzysz Ty (jak jest w powyższym przykładzie) powinieneś je filtrować pod kątem bezpieczeństwa. Jest to dobry nawyk, który pomaga zapobiegać atakom XSS.

Zmienne $this->title oraz $this->body istnieją w celu zademonstrowania dynamicznych danych. Powinny one być zdefiniowane w kontrolerze, więc zmodyfikuj IndexController.php aby przypisać im wartości:


<?php

Zend::loadClass('Zend_Controller_Action');
Zend::loadClass('Zend_View');

class IndexController extends Zend_Controller_Action
{
    public function indexAction()
    {
        $view = new Zend_View();
        $view->setScriptPath('/path/to/views');
        $view->title = 'Dynamic Title';
        $view->body = 'This is a dynamic body.';
        echo $view->render('example.php');
    }

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

?>

Teraz jeśli otworzysz stronę główną witryny powinieneś zobaczyć efekt użycia tych zmiennych w szablonie. Powodem użycia $this w szablonie jest to, że jest on wykonywany w przestrzeni instancji klasy Zend_View.

Pamiętaj, że plik example.php jest zwykłym skryptem PHP, więc możesz w nim zrobić co zechcesz. Jednak próbuj ograniczać użycie pliku szablonu jedynie do wyświetlania danych. Twój kontroler (lub moduł który kontroler uruchamia) powinien przekazywać dane z warstwy modelu do warstwy widoku.

Zanim kontynuujemy powinniśmy zrobić jeszcze jedną rzecz związaną z klasą Zend_View. Tworzenie instancji obiektu $view w każdej metodzie kontrolera wymaga napisania sporej ilości nadmiarowego kodu, a naszym założeniem jest napisanie aplikacji w sposób łatwy i szybki. Problemem jest także konieczność wywoływania metody setScriptPath() w każdej z akcji.

Na szczęście klasa Zend zapewnia obsługę rejestru który pomaga wyeliminować tę niedogodność. Możesz przechować obiekt $view w rejestrze używając metody register():


<?php

Zend::register('view', $view);

?>

Aby ją odebrać, użyj metody registry():


<?php

$view = Zend::registry('view');

?> 

Od tej pory będziemy w tutorialu używać rejestru.

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.