Development

Documentation/pl_PL/04-Podstawy-tworzenia-stron/trunk (diff)

You must first sign up to be able to contribute.

Changes from Version 1 of Documentation/pl_PL/04-Podstawy-tworzenia-stron/trunk

Show
Ignore:
Author:
Dominik.Sokal (IP: 83.12.50.138)
Timestamp:
07/11/07 23:20:15 (10 years ago)
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Documentation/pl_PL/04-Podstawy-tworzenia-stron/trunk

    v0 v1  
     1Ciekawe, pierwszą rzeczą jaką robią programiści podczas nauki nowego języka albo frameworka jest wyświetlanie na ekranie napisu "Witaj świecie!". Dziwnie jest myśleć, że komputer jest czymś co może witać cały świat. Ale Symfony nie jest takie głupie jak inne programy i Ty masz dowód! Możesz stworzyć stronę z napisem "Witaj, <Twoje imię tutaj>"! 
     2Ten rozdział nauczy Cię jak stworzyć moduł, który jest strukturalnym elementem grupującym strony. Dowiesz się także jak stworzyć stronę, która dzieli się na akcję i szablon, czego wymaga wzorzec MVC. Linki i formularze to podstawowe formy interakcji na www. Zobaczysz jak umieścić je w szablonie i operować nimi w akcji. 
     3 
     4'''Tworzenie szkieletu modułu''' 
     5Jak wyjaśnił rozdział nr 2, Symfony grupuje strony w moduły. Przed stworzeniem strony, musisz stworzyć moduł, który jest początkowo pustą skorupką ze strukturą plików. 
     6Linia komend Symfony automatyzuje tworzenie modułów. Musisz tylko wywołać zadanie ''inti-module'' z nazwą aplikacji i nazwą modułu jako argumentami. W poprzednim rozdziale stworzyłeś aplikację o nazwie ''myapp''. Aby dodać moduł ''mymodule'' do aplikacji, wprowadź następujące komendy: 
     7 
     8#!html 
     9<pre class="command-line"> 
     10{{{ 
     11> cd ~/myproject 
     12> symfony init-module myapp mymodule 
     13 
     14>> dir+      ~/myproject/apps/myapp/modules/mymodule 
     15>> dir+      ~/myproject/apps/myapp/modules/mymodule/actions 
     16>> file+     ~/myproject/apps/myapp/modules/mymodule/actions/actions.class.php 
     17>> dir+      ~/myproject/apps/myapp/modules/mymodule/config 
     18>> dir+      ~/myproject/apps/myapp/modules/mymodule/lib 
     19>> dir+      ~/myproject/apps/myapp/modules/mymodule/templates 
     20>> file+     ~/myproject/apps/myapp/modules/mymodule/templates/indexSuccess.php 
     21>> dir+      ~/myproject/apps/myapp/modules/mymodule/validate 
     22>> file+     ~/myproject/test/functional/myapp/mymoduleActionsTest.php 
     23>> tokens    ~/myproject/test/functional/myapp/mymoduleActionsTest.php 
     24>> tokens    ~/myproject/apps/myapp/modules/mymodule/actions/actions.class.php 
     25>> tokens    ~/myproject/apps/myapp/modules/mymodule/templates/indexSuccess.php 
     26}}} 
     27#!html 
     28</pre> 
     29 
     30 
     31To polecenie tworzy tylko trzy pliki. Jeden w folderze ''test/'' jest związany z testami, nie musisz się nim przejmować przed rozdziałem nr 15. Plik ''actions.class.php'' (pokazany na listingu 4-1) wysyła do podstawowego modułu stronę gratulacyjną. Plik ''templates/indexSuccess.php'' jest na razie pusty. 
     32''Listing 4-1 - Domyślna wygenerowana akcja, plik actions/actions.class.php'' 
     33{{{ 
     34<?php 
     35  
     36class mymoduleActions extends sfActions 
     37{ 
     38  public function executeIndex() 
     39  { 
     40    $this->forward('default', 'module'); 
     41  } 
     42} 
     43}}} 
     44#!html 
     45<blockquote class="note"><p> 
     46Jeżeli patrzysz na aktualny plik ''actions.class.php'', możesz znaleźć w nim kilka innych linii, zawierająch komentarze. Symfony zachęca używania komentarzy do dokumentowania Twoich projektów i przygotowywania każdego pliku z klasą do kompatybilności z narzędziem ''phpDocumentator'' ([http://www.phpdoc.org/ http://www.phpdoc.org/]) 
     47#!html 
     48</p></blockquote> 
     49 
     50Dla każdego nowego modułu, Symfony tworzy podstawową akcję - ''index''. Jest ona wkomponowana jako metoda o nazwie ''executeIndex''. Natomiast plik z szablonem nosi nazwę ''indexSuccess.php''. Znaczenie prefixu ''execute'' i suffixu ''Success'' zostanie wytłumaczone w Rozdziałach nr 6 i 7. Teraz możesz zwrócić uwagę, że nazywanie jest pewną konwencją. Możesz zobaczyć tę stronę (pokazaną na obrazie 4-1) pod adresem URL: 
     51{{{ 
     52http://localhost/myapp_dev.php/mymodule/index 
     53}}} 
     54Domyślna akcja ''index'' nie będzie używana w tym rozdziale, więc możesz usunąć metodę ''executeIndex()'' z pliku ''actions.class.php'' oraz usunąć plik ''indexSuccess.php'' z folderu ''templates/'' 
     55#!html 
     56<blockquote class="note"><p> 
     57Symfony oferuje inne drogi do inicjacji modułów niż z lini poleceń. Jedna z nich to stworzenie folderów i plików samodzielnie. W wielu przypadkach, akcje i szablony modułu manipulują danymi z tabel. Konieczne jest tworzenie, odczytywanie, aktualizowanie i usuwanie rekordów z tabel, w większości przypadków operacje są takie same. Symfony dostarcza Ci mechanizm zwany ''scaffolding'', który wygeneruje ten kod za Ciebie! Odsyłam do rozdziału nr 14 po więcej informacji o tej technologi. 
     58#!html 
     59</p></blockquote> 
     60''Obraz 4-1 - Domyślna wygenerowana strona (index)'' 
     61#!html 
     62<p><img src="/images/book/trunk/F0401.jpg" alt="The default generated index page" title="The default generated index page" /></p> 
     63 
     64'''Dodawanie strony''' 
     65W Symfony, logika strony jest umieszczona w akcjach, a warstwa prezentacyjna w szablonach. Strony bez logiki (wciąż) wymagają pustej akcji. 
     66'''Dodawanie akcji''' 
     67Strona typu "Witaj świecie!" będzie dostępna przez akcję ''myAction''. Aby ją stworzyć, po prostu dodaj metodę ''executeMyAction'' w klasie ''mymoduleAction'', tak jak pokazano na listingu 4-2. 
     68''Listing 4-2 - Dodawanie akcji jest dodawaniem metody do klasy akcji'' 
     69{{{ 
     70<?php 
     71  
     72class mymoduleActions extends sfActions 
     73{ 
     74  public function executeMyAction() 
     75  { 
     76  } 
     77} 
     78}}} 
     79Nazwa akcji wygląda zawsze tak: ''execute``Xxx``()'', gdzie druga część nazwy jest nazwą akcji z pierwszą '''dużą''' literą. 
     80Teraz, jeżeli przejdziesz pod adres: 
     81{{{ 
     82http://localhost/myapp_dev.php/mymodule/myAction 
     83}}} 
     84Symfony ostrzeże Cię, że brakuje szablonu ''myActionSuccess.php''. To jest normalne, w Symfony strona jest '''zawsze''' tworzona z akcji i szablonu. 
     85#!html 
     86<blockquote class="note"><p> 
     87Uwaga! Adresy (nie nazwy domen) są bardzo wrażliwe na litery, więc Symfony też jest (nawet jeżeli nazwy metod są niewłaściwe w kodzie PHP). To oznacza, że jeśli dodasz metodę executemyaction(), albo executeMyaction(), i spróbujesz wywołać akcję myAction z przeglądarki, Symfony zwróci błąd 404 (brak strony). 
     88#!html 
     89</p></blockquote> 
     90#!html 
     91<blockquote class="sidebar"><p class="title">Adresy są częścią rządania</p> 
     92Symfony zawiera sytem routingu, który umożliwia separację pomiędzy aktualną nazwą akcji a formą adresu potrzebną do jej wywołania. Umożliwia to dowolne formatowanie adresu. Nie jesteś ograniczany przez strukturę plików czy parametrów. Adres URL może wyglądać tak jak Ty chcesz! Dla przkładu, wywołujesz akcję ''index'' z modułu zwanego ''article'', może to wyglądać tak: 
     93{{{ 
     94http://localhost/myapp_dev.php/article/index?id=123 
     95}}} 
     96URL wyszukuje artykuł z bazy danych. W tym przykładzie, wyszukuje on artykuł (z parametrem id=123) w sekcji Europejskiej, który jest specyficzny dla finansów we Francji. Ale adres URL może być zapisany zupełnie inaczej, dzięki małej zmianie w pliku konfiguracyjnym ''routing.yml'': 
     97{{{ 
     98http://localhost/articles/europe/france/finance.html 
     99}}} 
     100URL nie jest wtedy tylko przyjacielski dla wyszukiwarek, ale jest to też ułatwienie dla użytkownika, który może używać paska adresu jako pseudo linii komend do tworzenia zapytań, jak w następującym URL-u: 
     101{{{ 
     102http://localhost/articles/tagged/finance+france+euro 
     103}}} 
     104Symfony wie jak parsować i generować URL-e dla użytkownika. System routingu automatycznie pobiera parametry z adresu i udostępnia je w akcji. Formatuje on również odnośniki zawarte w rządanium, dlatego wyglądają one elegancko. Dowiesz się o tym więcej w rozdziale nr 9. 
     105W sumie, oznacza to, że droga jaką nazwiesz akcje w swojej aplikacji nie powinna mieć wpływu na drogę URL-i używanych do wywoływania ich. Nazwy metod wyjaśniają co aktualnie robią i jest to najczęściej czasownik w bezokoliczniku. Nazwy akcji mogą być w ogóle nie widoczne dla użytkownika końcowego, więc nie wachaj się używania wyraźnych nazw (jak pokazPoNazwie albo pokazZKomentarzami). Zaoszczędzisz na komentarzach w kodzie, aby wyjaśnić co dana funkcja robi. Ponadto Twój kod będzie prostszy do zrozumienia. 
     106#!html 
     107</blockquote> 
     108'''Dodawanie szablonu''' 
     109Akcja wymaga szablonu aby się wyświetlić. Szablon jest plikiem ulokowanym w folderze ''templates/'' w module. Nazwany jako akcja i terminator akcji. Domyślny terminator to ''success'', więc szablon potrzebny akcji ''myAction'' nazywa się ''myActionSuccess.php''. 
     110Szablony są potrzebny tylko do prezentacji danych więc umieszczaj w nich jak najmniej kodu PHP. Szablon strona wyświetlająca napis "Witaj świecie!" może wyglądać tak prosto jak to przedstawiono na listingu 4-3. 
     111''Listing 4-3 - Szablon mymodule/templates/myActionSuccess.php'' 
     112{{{ 
     113<p>Witaj świecie!</p> 
     114}}} 
     115Jeżeli musisz wykonać jakiś kod PHP w szablonie, powinieneś unikać zwykłej składni PHP (takiej jak pokazano na listingu 4-4), aby kod był zrozumiały dla programistów nie znających PHP. Niektóre funkcje sterujące mają alternatywną składnie, zaprezentowano ją na listingu 4-5. 
     116''Listing 4-4 - Zwykła składnia PHP, dobra dla akcja, ale zła dla szablonów'' 
     117{{{ 
     118<p>Witaj świecie!</p> 
     119<?php 
     120if ($test) 
     121{ 
     122  echo "<p>".time()."</p>"; 
     123} 
     124?> 
     125}}} 
     126''Listing 4-5 - Alternatywna składnia PHP, dobra dla szablonów'' 
     127{{{ 
     128<p>Witaj świecie!</p> 
     129<?php if ($test): ?> 
     130<p><?php echo time(); ?></p> 
     131<?php endif; ?> 
     132}}} 
     133#!html 
     134<blockquote class="note"><p> 
     135Dobrym zwyczajem jest nie mieszanie kodu PHP z HTML. Nie powinieneś wyświetlać znaczników HTML w PHP. Jeżeli też otwierasz w jednej lini znacznik <?php, powinieneś w tej samiej lini zamknąć! 
     136#!html 
     137</p></blockquote> 
     138'''Przesyłanie informacji z akcji do szablonu''' 
     139Zadaniem akcji jest wykonywanie obliczeń, odzyskiwanie danych, test, ustawianie zmiennych do szablonów, aby były wyświetlone albo przetestowane. Symfony udostępnia właściwości klasy akcji (dostęp przez $this->nazwaZmiennej w akcji) w szablonie (dostępne przez $nazwaZmiennej). Listingi 4-6 i 4-7 pokazują jak przesłać dane z akcji do szablonu 
     140''Listing 4-6 - Ustawienie właściwości akcji i uczynienie ich dostępnymi w szablonie'' 
     141{{{ 
     142<?php 
     143  
     144class mymoduleActions extends sfActions 
     145{ 
     146  public function executeMyAction() 
     147  { 
     148    $dzisiaj = getdate(); 
     149    $this->godzina = $dzisiaj['hours']; 
     150  } 
     151} 
     152}}} 
     153''Listing 4-7 - Szablon ma bezpośredni dostęp do właściwości akcji'' 
     154{{{ 
     155<p>Witaj świecie!</p> 
     156<?php if ($godzina >= 18): ?> 
     157<p>A może powinienem powiedzieć dobry wieczór? Jest już <?php echo $godzina; ?>.</p> 
     158<?php endif; ?> 
     159}}} 
     160#!html 
     161<blockquote class="note"><p> 
     162Szablony od razu mają dostęp do kilku właściwości. W każdym szablonie można się odwoływać do następujących obiektów: [i]$sf_context[/i], [i]$sf_request[/i], [i]$sf_params[/i] i [i]$sf_user[/i]. Niedługo zobaczysz jak ich używać. 
     163#!html 
     164</p></blockquote> 
     165'''Gromadzenie informacji od użytkownika (formularze)''' 
     166Formularze są dobrym sposoben na uzyskanie danych od użytkownika. Pisanie formularzy w HTML może być czasem niewygodne. W Symfony możesz umieszczać formularze w tradycyjny sposób, albo użyć pomocnika dostarczanego przez Symfony. Dzięki niemu pisanie formularzy staje się prostsze. Na listingu 4-8 pokazano jak umieszczać formularze w tradycyjny sposob. 
     167''Listing 4-8 - Szablony mogą zawierać zwykły kod HTML formularzy'' 
     168{{{ 
     169<p>Witaj świecie!</p> 
     170<?php if ($godzina >= 18): ?> 
     171<p>A może powinienem powiedzieć dobry wieczór? Jest już <?php echo $godzina; ?>.</p> 
     172<?php endif; ?> 
     173<form method="post" target="/myapp_dev.php/mymodule/anotherAction"> 
     174  <label for="name">What is your name?</label> 
     175  <input type="text" name="name" id="name" value="" /> 
     176  <input type="submit" value="Ok" /> 
     177</form> 
     178}}} 
     179Pomocnik to funkcja napisana w PHP. Wyświetla ona kod HTML. Jest to szybsza metoda. Używając pomocników Symfony możesz uzyskać taki sam efekt jak na listingu 4-8. Sposób ten przedstawiony jest na listingu 4-9. 
     180''Listing 4-9 - Używanie pomocników jest szybsze i prostsze, niż pisanie tagów HTML'' 
     181{{{ 
     182<p>Witaj świecie!</p> 
     183<?php if ($godzina >= 18): ?> 
     184<p>A może powinienem powiedzieć dobry wieczór? Jest już <?php echo $godzina; ?>.</p> 
     185<?php endif; ?> 
     186<?php echo form_tag('mymodule/anotherAction') ?> 
     187  <?php echo label_for('name', 'Jak się nazywasz?') ?> 
     188  <?php echo input_tag('name') ?> 
     189  <?php echo submit_tag('Ok') ?> 
     190</form> 
     191}}} 
     192#!html 
     193<blockquote class="sidebar"><p class="title">Szablony są po to aby Ci pomóc</p> 
     194Jeżeli przyglądając się przykładowi na listingu 4-9 nadal myślisz, że wersja zawierająca pomocniki nie jest naprawdę szybka to zobacz następny przykład: 
     195{{{ 
     196<?php 
     197        $card_list = array( 
     198                                                'VISA' => 'Visa', 
     199                                                'MAST' => 'MasterCard', 
     200                                                'AMEX' => 'American Express', 
     201                                                'DISC' => 'Discover'); 
     202        echo select_tag('cc_type', options_for_select($card_list, 'AMEX')); 
     203?> 
     204}}} 
     205To samo, tyle, że w HTML: 
     206{{{ 
     207<select name="cc_type" id="cc_type"> 
     208  <option value="VISA">Visa</option> 
     209  <option value="MAST">MasterCard</option> 
     210  <option value="AMEX" selected="selected">American Express</option> 
     211  <option value="DISC">Discover</option> 
     212</select> 
     213}}} 
     214Korzyści z używania pomocników w szablonach są następujące: szybkość kodowania, przejrzystość kodu. Jedyna cena jaką się płaci to czas poświęcony na nauczenie się ich. 
     215#!html 
     216</blockquote> 
     217Używanie skróconych tagów (<?, zamiast <?php) nie jest polecane. Nie działają ona na domyślnej konfiguracji PHP. Ponadto podczas deklaracj XML może wystąpić tak zwany ''parse error''. 
     218Więcej o pomocnikach dowiesz się z rozdziału nr 10. 
     219'''Linki do innych akcji''' 
     220Już wiesz, że jest pewna różnica między nazwą akcji a URL-em do wywołania jej. Więc jeżeli stworzysz link do akcji ''anotherAction'' w szablonie tak jak pokazano na listingu 4-10, to zadziała on tylko na domyślnie ustawionym routingu. Jeżeli się później zdecydujesz na zmienę wyglądu URL-a, będziesz musiał przerobić wszystkie linki w szablonach. 
     221''Listing 4-10 - Hiperłącza, zwykły HTML'' 
     222{{{ 
     223<a href="/myapp_dev.php/mymodule/anotherAction?name=anonymous"> 
     224  Nigdy nie ujawniłem swojego imienia 
     225</a> 
     226}}} 
     227Aby uniknąć tego typu sytuacji, powinieneś zawsze używać pomocnika ''link_to()'', który sam stworzy hiperłącze do akcji. Listing 4-11 przedstawia użycie tego pomocnika. 
     228''Listing 4-11 - Pomocnik link_to()'' 
     229{{{ 
     230<p>Witaj świecie!</p> 
     231<?php if ($godzina >= 18): ?> 
     232<p>A może powinienem powiedzieć dobry wieczór? Jest już <?php echo $godzina; ?>.</p> 
     233<?php endif; ?> 
     234<?php echo form_tag('mymodule/anotherAction') ?> 
     235  <?php echo label_for('name', 'Jak się nazywasz?') ?> 
     236  <?php echo input_tag('name') ?> 
     237  <?php echo submit_tag('Ok') ?> 
     238  <?php echo link_to('Nigdy nie ujawniłem swojego imienia','mymodule/anotherAction?name=anonymous') ?> 
     239</form> 
     240}}} 
     241Rezultat HTML będzie taki sam jak poprzednio, z tą różnicą, że po zmianie reguł routingu nie będziesz musiał poprawiać URL-i. 
     242Pomocnik ''link_to()'', jak i inne pomocniki, przyjmuje inne opcjonalne parametry. Listing 4-12 pokazuje przykład użycia opcjonalnych argumentów. 
     243''Listing 4-12 - link_to() - opcjonalne argumenty'' 
     244{{{ 
     245<?php  
     246// Opcje jako tablica asocjacyjna 
     247echo link_to('Nigdy nie ujawniłem swojego imienia', 'mymodule/anotherAction?name=anonymous', 
     248  array( 
     249    'class'    => 'special_link', 
     250    'confirm'  => 'Jesteś pewien?', 
     251    'absolute' => true 
     252)) ?> 
     253  
     254// Argumenty jako string 
     255<?php echo link_to('Nigdy nie ujawniłem swojego imienia', 'mymodule/anotherAction?name=anonymous', 
     256  'class=special_link confirm=Jesteś pewien? absolute=true') ?> 
     257  
     258// Obydwa rozwiązania zwrócą taki sam wynik 
     259 => <a class="special_link" onclick="return confirm('Jesteś pewien?');" 
     260    href="http://localhost/myapp_dev.php/mymodule/anotherAction/name/anonymous"> 
     261    Nigdy nie ujawniłem swojego imienia</a> 
     262}}} 
     263Ilekroć użyjesz pomocnika Symfony generującego kod HTML, możesz zawsze dodać opcjonalne atrybuty (jak atrybut ''class'' w przykładzie na listingu 4-12). Pomocniki Symfony zawsze generują poprawny kod xHTML. 
     264#!html 
     265<blockquote class="note"><p> 
     266Ponieważ składnia string wymaga dodatkowego parsowania, jest ona trochę wolniejsza od składni tablicowej. 
     267#!html 
     268</p></blockquote> 
     269W rozdziale nr 9 poznasz dodatkowe opcje pomocników. 
     270'''Pobieranie informacji z rządań''' 
     271Jeżeli użytkownik przesłał jakieś informacje przez formularz (rządanie POST) czy przez adres URL (rządanie GET) zawsze możesz pobrać te informacje dzięki metodzie ''getRequestParameter('') z obiektu klasy sfActions. Listing 4-13 pokazuje jak w akcji ''anotherAction'' pobrać wartość ''name''. 
     272''Listing 4-13 - Pobieranie danych z danych rządania'' 
     273{{{ 
     274<?php 
     275  
     276class mymoduleActions extends sfActions 
     277{ 
     278  ... 
     279  
     280  public function executeAnotherAction() 
     281  { 
     282    $this->name = $this->getRequestParameter('name'); 
     283  } 
     284} 
     285}}} 
     286Jeżeli działania na danych z rządania są proste, nie musisz używać do tego akcji w kontrolerze. W szablonie masz dostęp do obiektu ''$sf_params'', który oferuje metodę ''get()'' do pobierania danych rządania. 
     287Jeżeli akcja ''executeAnotherAction()'' jest pusta, listing 4-14 pokazuje jak w szablonie pobieramy te same parametry. 
     288''Listing 4-14 - Pobieranie Danych bezpośrednio w szablonie'' 
     289{{{ 
     290<p>Witaj, <?php echo $sf_params->get('name') ?>!</p> 
     291}}} 
     292#!html 
     293<blockquote class="note"><p> 
     294Dlaczego nie używać tablic $_POST, $_GET czy $_REQUEST ? Ponieważ, gdy URL przyjmuje inną postać niż oryginalna (np. http://localhost/articles/europe/france/finance.html) nie ma możliwości pobrania danych bezpośrednio, tylko system routingu może to zrobić. Ponadto jesteś automatycznie chroniony przed tzn. ''wstrzyknięciami kodu''. 
     295#!html 
     296</p></blockquote> 
     297Obiekt $sf_params jest bardziej pomocny w pobieraniu danych niż metoda ''getRequestParameter()''. Dla przykładu jeżeli chcesz sprawdzić istnienie parametru rządania, możesz w prosty sposób użyć metody $sf_params->has(), a później pobrać go za pomocą metody get(), tak jak pokazano na listingu 4-15. 
     298''Listing 4-15 - Testowanie czy parametr rządania istnieje w szablonie'' 
     299{{{ 
     300<?php if ($sf_params->has('name')): ?> 
     301  <p>Witaj, <?php echo $sf_params->get('name') ?>!</p> 
     302<?php else: ?> 
     303  <p>Witaj, Janie Kowalski!</p> 
     304<?php endif; ?> 
     305}}} 
     306Możesz zrobić to w prostszy sposób, podająć metodzie get() drugi parametr.  
     307{{{ 
     308<p>Witaj, <?php echo $sf_params->get('name', 'Janie Kowalski') ?>!</p> 
     309}}} 
     310'''Podsumowanie''' 
     311W Symfony, strony są skomponowane jako akcje (metoda w pliku ''actions/actions.class.php'' z prefixem ''execute'') i szablon (plik w folderze ''templates/'', najczęściej zakończony ''Success.php''). Są one pogrupowane w moduły, zależnie od ich funkcji w aplikacji. Pisanie szablonów ułatwiają pomocniki, które są funkcjami zwracającymi kod HTML.  
     312Możesz już napisać całą aplikację z Symfony. Ale zajmie Ci jednak to dużo czasu, nie poznałeś jeszcze wszystkich możliwości Symfony. Dlatego nie przestawaj czytać tej ksiązki.