1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- EN-Revision: 21826 -->
4 <sect1 id="learning.quickstart.create-project">
5 <title>Utworzenie projektu</title>
8 Aby utworzyć nowy projekt należy wcześniej pobrać i rozpakować Zend Framework.
11 <sect2 id="learning.quickstart.create-project.install-zf">
12 <title>Instalacja Zend Framework</title>
15 Najprostszym sposobem pobrania Zend Framework razem z całym środowiskiem
16 <acronym>PHP</acronym> jest zainstalowanie
17 <ulink url="http://www.zend.com/en/products/server-ce/downloads">Zend Server</ulink>.
18 Zend Server zawiera instalatory dla Mac OS X, Windows, Fedora Core oraz Ubuntu.
19 Oprócz tego dostępna jest uniwersalna paczka instalacyjna kompatybilna z większością
24 Po zainstalowaniu Zend Server, pliki frameworka są dostępne w katalogu
25 <filename>/usr/local/zend/share/ZendFramework</filename> dla Mac OS X oraz Linux,
26 lub <filename>C:\Program Files\Zend\ZendServer\share\ZendFramework</filename> dla
27 Windows. Zmienna <constant>include_path</constant> będzie automatycznie ustawiona
28 tak aby obejmowała Zend Framework.
32 Alternatywnie można <ulink url="http://framework.zend.com/download/latest">pobrać
33 najnowszą wersję Zend Framework</ulink> i rozpakować zawartość do dowolnego katalogu;
34 należy zapamiętać wybraną lokalizację instalacji.
38 Opcjonalnie w pliku <filename>php.ini</filename> można umieścić w
39 zmiennej <constant>include_path</constant> ścieżkę do
40 podkatalogu <filename>library/</filename> znajdującego się w pobranym archiwum.
44 Instalacja zakończona! Zend Framework jest zainstalowany i gotowy do użycia.
48 <sect2 id="learning.quickstart.create-project.create-project">
49 <title>Tworzenie projektu</title>
52 <title>Narzędzie wiersza poleceń zf</title>
55 W katalogu instalacji Zend Framework znajduje się podkatalog
56 <filename>bin/</filename>.
57 Zawiera on skrypty <filename>zf.sh</filename> oraz <filename>zf.bat</filename>
58 odpowiednio dla użytkowników Unix oraz Windows. Należy zapamiętać ścieżkę dostępu
63 Jeśli w dokumentacji pojawią się odniesienia do komendy <command>zf</command>,
64 proszę pamiętać o zastąpieniu ich pełną ścieżką dostępu do odpowiedniego skryptu.
65 Dla systemów Unix można skorzystać z polecenia alias:
66 <command>alias zf.sh=path/to/ZendFramework/bin/zf.sh</command>.
70 W przypadku problemów z konfiguracją narzędzia wiersza poleceń proszę zapoznać się
71 z <link linkend="zend.tool.framework.clitool.setup-general">jego instrukcją</link>.
76 Aby utworzyć nowy projekt należy otworzyć terminal (dla Windows - wiersz polecenia
77 <command>Start -> Run</command> i polecenie <command>cmd</command>). Należy przejść do
78 katalogu nowego projektu. Następnie, używając ścieżki do odpowiedniego skryptu, należy
79 wywołać następujące polecenie:
82 <programlisting language="shell"><![CDATA[
83 % zf create project quickstart
87 Wywołanie tego polecenia spowoduje utworzenie podstawowej struktury katalogów, razem
88 z początkowymi kontrolerami i widokami. Drzewo katalogów powinno wyglądać podobnie do
92 <programlisting language="text"><![CDATA[
97 | | `-- application.ini
99 | | |-- ErrorController.php
100 | | `-- IndexController.php
122 W tym momencie, jeśli Zend Framework nie jest umieszczony w zmiennej
123 <constant>include_path</constant>, zaleca się skopiowanie lub umieszczenie
124 linku symbolicznego do podkatalogu <filename>library/</filename> projektu.
125 Najistotniejsze jest aby zawartość katalogu <filename>library/Zend/</filename>
126 instalacji Zend Framework była dostępna w katalogu <filename>library/</filename>
127 projektu. Na systemach Unix można tego dokonać za pomocą następujących poleceń:
130 <programlisting language="shell"><![CDATA[
132 % cd library; ln -s path/to/ZendFramework/library/Zend .
135 % cd library; cp -r path/to/ZendFramework/library/Zend .
139 W systemach Windows najprostszym rozwiązaniem będzie wykonanie tego z poziomu Explorera.
143 Teraz, kiedy nowy projekt jest utworzony należy zapoznać się z podstawowymi założeniami:
144 bootstrapem, konfiguracją, kontrolerami oraz widokami.
148 <sect2 id="learning.quickstart.create-project.bootstrap">
149 <title>Bootstrap</title>
152 Klasa <classname>Bootstrap</classname> definiuje zasoby i komponenty do inicjalizacji.
153 Domyślnie uruchamiany jest <link linkend="zend.controller.front">kontroler frontowy</link>
154 ze standardowym katalogiem w którym szukane są kontrolery akcji (o których mowa później)
155 ustawionym na <filename>application/controllers/</filename>. Klasa przedstawia się
159 <programlisting language="php"><![CDATA[
160 // application/Bootstrap.php
162 class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
168 Jak widać, na początek wymagane jest niewiele.
172 <sect2 id="learning.quickstart.create-project.configuration">
173 <title>Konfiguracja</title>
176 Sam Zend Framework nie wymaga konfiguracji ale tworzona aplikacja - najczęściej tak.
177 Standardowo plik konfiguracyjny umieszczony jest w
178 <filename>application/configs/application.ini</filename>. Zawiera on podstawowe
179 instrukcje ustawienia środowiska <acronym>PHP</acronym>
180 (np. włączanie/wyłączanie raportowania błędów),
181 wskazanie ścieżki i klasy <classname>Bootstrap</classname> oraz ścieżkę do katalogu
182 kontrolerów akcji. Domyślny plik wygląda następująco:
185 <programlisting language="ini"><![CDATA[
186 ; application/configs/application.ini
189 phpSettings.display_startup_errors = 0
190 phpSettings.display_errors = 0
191 includePaths.library = APPLICATION_PATH "/../library"
192 bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
193 bootstrap.class = "Bootstrap"
194 appnamespace = "Application"
195 resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
196 resources.frontController.params.displayExceptions = 0
198 [staging : production]
200 [testing : production]
201 phpSettings.display_startup_errors = 1
202 phpSettings.display_errors = 1
204 [development : production]
205 phpSettings.display_startup_errors = 1
206 phpSettings.display_errors = 1
210 Należy zwrócić uwagę na kilka cech tego pliku. Po pierwsze, używając konfiguracji
211 w pliku <acronym>INI</acronym>, można bezpośrednio używać stałych;
212 <constant>APPLICATION_PATH</constant> to stała PHP (opisana później).
213 Dodatkowo, zdefiniowane zostały oddzielne sekcje:
214 production, staging, testing oraz development. Ostatnie trzy dziedziczą ustawienia ze
215 środowiska produkcyjnego (production). Podany sposób stanowi użyteczny przykład
216 organizacji konfiguracji, dzięki której odpowiednie ustawienia są dostępne w
217 odpowiednim momencie cyklu rozwoju oprogramowania.
221 <sect2 id="learning.quickstart.create-project.action-controllers">
222 <title>Kontrolery akcji (action controllers)</title>
225 Zawarte w aplikacji <emphasis>kontrolery akcji</emphasis> przechowują ścieżki
226 działania programu i odwzorowują żądania na odpowiednie modele i widoki.
230 Kontroler akcji powinien posiadać co najmniej jedną metodę o nazwie zakończonej na
231 "Action". Te metody stają się dostępne dla użytkowników. Domyślnie URLe w Zend
232 Framework stosują schemat <constant>/kontroler/akcja</constant>, gdzie
233 "kontroler" jest odwzorowany na nazwę kontrolera akcji
234 (z pominięciem sufiksu "Controller")
235 a "akcja" jest odwzorowana na metodę w tym kontrolerze
236 (z pominięciem sufiksu "Action").
240 W typowym projekcie niezbędny jest kontroler <classname>IndexController</classname>,
241 który jest początkowym punktem odniesienia i stanowi stronę początkową aplikacji,
242 oraz <classname>ErrorController</classname> czyli kontroler obsługujący błędy
243 <acronym>HTTP</acronym> 404 (brak kontrolera i/lub akcji) lub
244 <acronym>HTTP</acronym> 500 (błąd aplikacji).
248 Domyślnie <classname>IndexController</classname> wygląda następująco:
251 <programlisting language="php"><![CDATA[
252 // application/controllers/IndexController.php
254 class IndexController extends Zend_Controller_Action
257 public function init()
259 /* Inicjalizacja kontrolera akcji */
262 public function indexAction()
270 Domyślny <classname>ErrorController</classname> przedstawia się jak poniżej:
273 <programlisting language="php"><![CDATA[
274 // application/controllers/ErrorController.php
276 class ErrorController extends Zend_Controller_Action
279 public function errorAction()
281 $errors = $this->_getParam('error_handler');
283 switch ($errors->type) {
284 case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
285 case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
286 case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
288 // błąd 404 -- brak kontrolera i/lub akcji
289 $this->getResponse()->setHttpResponseCode(404);
290 $this->view->message = 'Page not found';
294 $this->getResponse()->setHttpResponseCode(500);
295 $this->view->message = 'Application error';
299 $this->view->exception = $errors->exception;
300 $this->view->request = $errors->request;
306 Należy zwrócić uwagę, iż <classname>IndexController</classname> nie zawiera żadnego
307 kodu oraz <classname>ErrorController</classname> odnosi się do właściwości "view". To
308 prowadzi do następnego tematu.
312 <sect2 id="learning.quickstart.create-project.views">
313 <title>Widoki (views)</title>
316 Widoki (view scripts) w Zend Framework są napisane w starym dobrym
317 <acronym>PHP</acronym>. Domyślnie
318 znajdują się w <filename>application/views/scripts/</filename>, gdzie są w dalszym
319 stopniu dzielone wg kontrolerów do których należą. W obecnym przypadku istnieją
320 dwa kontrolery: <classname>IndexController</classname> oraz
321 <classname>ErrorController</classname>. Oznacza to, że w katalogu widoków powinny się
322 znaleźć dwa podkatalogi: <filename>index/</filename> oraz <filename>error/</filename>.
323 W nich należy umieścić skrypty widoków odpowiednie dla każdej z akcji danego kontrolera.
324 Domyślnie tworzone są skrypty <filename>index/index.phtml</filename> oraz
325 <filename>error/error.phtml</filename>.
329 Skrypty widoków mogą zawierać dowolny kod <acronym>HTML</acronym>
330 i używać <code><?php</code> jako tagów
331 otwarcia i <code>?></code> jako tagów zamknięcia dla poleceń <acronym>PHP</acronym>.
335 Domyślnie skrypt <filename>index/index.phtml</filename> zawiera następującą zawartość:
338 <programlisting language="php"><![CDATA[
339 <!-- application/views/scripts/index/index.phtml -->
356 background-image: url(http://framework.zend.com/images/bkg_header.jpg);
359 border: 2px solid #444444;
366 background-image: url(http://framework.zend.com/images/bkg_body-bottom.gif);
372 <h1>Welcome to the <span id="zf-name">Zend Framework!</span><h1 />
373 <h3>This is your project's main page<h3 />
374 <div id="more-information">
376 <img src="http://framework.zend.com/images/PoweredBy_ZF_4LightBG.png" />
380 Helpful Links: <br />
381 <a href="http://framework.zend.com/">Zend Framework Website</a> |
382 <a href="http://framework.zend.com/manual/en/">Zend Framework
390 Skrypt <filename>error/error.phtml</filename> jest nieco bardziej interesujący - używa
391 instrukcji warunkowych <acronym>PHP</acronym>:
394 <programlisting language="php"><![CDATA[
395 <!-- application/views/scripts/error/error.phtml -->
396 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN";
397 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd>
398 <html xmlns="http://www.w3.org/1999/xhtml">
400 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
401 <title>Zend Framework Default Application</title>
404 <h1>An error occurred</h1>
405 <h2><?php echo $this->message ?></h2>
407 <?php if ('development' == $this->env): ?>
409 <h3>Exception information:</h3>
411 <b>Message:</b> <?php echo $this->exception->getMessage() ?>
414 <h3>Stack trace:</h3>
415 <pre><?php echo $this->exception->getTraceAsString() ?>
418 <h3>Request Parameters:</h3>
419 <pre><?php echo var_export($this->request->getParams(), 1) ?>
428 <sect2 id="learning.quickstart.create-project.vhost">
429 <title>Utworzenie wirtualnego hosta</title>
432 Na potrzeby tego wprowadzenia, założono użycie <ulink url="http://httpd.apache.org/">
433 web serwera Apache</ulink>. Zend Framework działa równie dobrze z innymi
434 serwerami - włączając Microsoft Internet Information Services, lighttpd, nginx i
435 wiele innych. Większość programistów jednak jest najbardziej zaznajomiona z Apache, który
436 ułatwia zrozumienie struktury katalogów Zend Framework i posiada szerokie możliwości
437 przepisywania linków (mod_rewrite).
441 Aby utworzyć wirtualnego hosta należy odnaleźć plik <filename>httpd.conf</filename> oraz
442 ewentualne pozostałe pliki konfiguracyjne serwera. Popularne katalogi:
448 <filename>/etc/httpd/httpd.conf</filename> (Fedora, RHEL i inne)
454 <filename>/etc/apache2/httpd.conf</filename> (Debian, Ubuntu i inne)
460 <filename>/usr/local/zend/etc/httpd.conf</filename> (Zend Server
467 <filename>C:\Program Files\Zend\Apache2\conf</filename> (Zend Server
468 na maszynach Windows)
474 W pliku <filename>httpd.conf</filename> (lub <filename>httpd-vhosts.conf</filename>
475 dla niektórych systemów) należy dokonać dwóch zmian. Po pierwsze - upewnić się, że
476 jest zainicjowana zmienna <varname>NameVirtualHost</varname>; Typowe ustawienie to
477 "*:80". Po drugie - zdefiniować wirtualnego hosta:
480 <programlisting language="apache"><![CDATA[
482 ServerName quickstart.local
483 DocumentRoot /sciezka/do/quickstart/public
485 SetEnv APPLICATION_ENV "development"
487 <Directory /sciezka/do/quickstart/public>
488 DirectoryIndex index.php
497 Należy zwrócić uwagę na kilka szczegółów. Po pierwsze, <varname>DocumentRoot</varname>
498 wskazuje na podkatalog projektu o nazwie <filename>public</filename>. To oznacza, że
499 jedynie pliki znajdujące się w tym podkatalogu mogą być zwracane przez serwer
500 bezpośrednio. Po drugie, instrukcje <varname>AllowOverride</varname>,
501 <varname>Order</varname> oraz <varname>Allow</varname> umożliwiają stosowanie plików
502 <filename>htacess</filename> w projekcie. W środowisku programistycznym (development)
503 jest to uznawane za dobrą praktykę ponieważ eliminuje potrzebę resetowania
504 serwera po każdej zmianie instrukcji konfiguracyjnych. Jednak w środowisku produkcyjnym
505 (production), zalecane jest przeniesienie zawartości pliku <filename>htaccess</filename>
506 do głównego pliku konfiguracyjnego serwera oraz wyłączenie obsługi
507 <filename>htaccess</filename>. Po trzecie, instrukcja
508 <varname>SetEnv</varname> pozwala zainicjować zmienną środowiskową oraz
509 przekazać ją do PHP i <filename>index.php</filename>.
510 Dzięki temu stanie się ona podstawą stałej
511 <constant>APPLICATION_ENV</constant> aplikacji Zend Framework.
512 W środowisku produkcyjnym można ją ustawić na "production" lub zrezygnować
513 z tej instrukcji ("production" jest domyślną wartością stałej
514 <constant>APPLICATION_ENV</constant>).
518 Na koniec należy dodać wpis w pliku <filename>hosts</filename> odnoszący się do wartości
519 <varname>ServerName</varname>. Na systemach *nix jest to zazwyczaj
520 <filename>/etc/hosts</filename>. Na maszynach Windows typową lokalizacją jest
521 <filename>C:\WINDOWS\system32\drivers\etc</filename>. Wpis powinien być podobny do:
524 <programlisting language="text"><![CDATA[
525 127.0.0.1 quickstart.local
529 Po uruchomieniu webserwera (lub restarcie) projekt powinien być gotowy do użytku.
533 <sect2 id="learning.quickstart.create-project.checkpoint">
534 <title>Punkt kontrolny</title>
537 W tym momencie aplikacja Zend Framework jest gotowa do uruchomienia. Po wpisaniu
538 w przeglądarce nazwy serwera (ustalonej w poprzednim punkcie) powinna się pojawić