Development

Documentation/pl_PL/book/1.0/07-Inside-the-View-Layer

You must first sign up to be able to contribute.

Version 19 (modified by jagi, 8 years ago)
-

Oryginalny tekst: http://www.symfony-project.com/book/trunk/07-Inside-the-View-Layer [EN]

WERSJA ROBOCZA

Rozdział 7 - Wewnątrz Warstwy Widoku

Widok jest odpowiedzialny za prezentowanie danych zwracanych przez poszczególne akcje. W symfony widok składa się z oddzielnych części, z których każda jest zaprojektowana tak, aby mogła być łatwo modyfikowana przez osoby zajmujące się wyglądem witryn internetowych.

  • Webdesignerzy zazwyczaj pracują nad szablonami (prezentacją danych pochodzących z aktualnej akcji), a także nad wyglądem (layoutem zawierającym kod jednakowy dla wszystkich stron). Te pliki są napisane w języku HTML z niewielką domieszką kodu PHP, który najczęściej uruchamia pomocniki.
  • W celu umożliwienia wielokrotnego wykorzystania konkretnych elementów, deweloperzy najczęściej „wkładają” fragmenty kodu do komponentów. Używają slotów i komponentów, aby mieć wpływ na więcej niż jeden obszar layoutu. Webdesignerzy mogą pracować na fragmentach szablonów równie wydajnie.
  • Deweloperzy zwracają uwagę na YAML w plikach konfiguracyjnych (ustawienia odpowiedzi - response i innych elementów interfejsu) oraz na obiekt response. Podczas zawierania zmiennych w szablonach trzeba pominąć ryzyko ataku typu cross-site scripting, gdyż zasięg technik filtracyjnych obejmuje całkowicie dane pochodzące od użytkownika.

Jakakolwiek jest Twoja rola, znajdziesz użyteczne narzędzia przyspieszające nudne zadanie, jakim jest prezentowanie danych zwracanych przez akcję. Ten rozdział opisuje wszystkie z tych narzędzi.

Szablony

Listing 7-1 pokazuje typowy szablon symfony. Zawiera trochę kodu HTML i podstawowy kod PHP, który zazwyczaj wywołuje zmienne zdefiniowane w akcji (via $this->name = 'foo';) oraz pomocniki.

Listing 7-1 – Przykładowy szablon – indexSuccess.php

[php]

<h1>Witaj</h1>
<p>Witaj ponownie <?php echo $name ?>!</p>
<ul>Co chciałbyś zrobić?
  <li><?php echo link_to('Przeczytaj ostatni artykuł', 'article/read') ?></li>
  <li><?php echo link_to('Napisz nowy', 'article/write') ?></li>
</ul>

Jak zostało wyjaśnione w Rozdziale 4 alternatywa dla kodu PHP jest stworzona po to, aby uczynić szablon bardziej czytelnym dla osób, które nie są programistami PHP. Powinieneś ograniczyć użycie kodu PHP w szablonach do minimum od momentu, gdy pliki szablonów są używane do tworzenia interfejsu graficznego aplikacji (GUI) oraz czasami są tworzone oraz rozwijane przez inny zespół wyspecjalizowany w tworzeniu wizualnej części aplikacji, a nie w zajmowaniu się logiką jej działania. Przechowywanie logiki aplikacji wewnątrz akcji ułatwia także tworzenie oddzielnych szablonów dla pojedynczych akcji bez żadnego powielania kodu.

Pomocniki

Pomocniki, to funkcje PHP, które zwracają kod HTML i mogą być używane w szablonach. W Listingu 7-1 funkcja link_to() jest pomocnikiem. Czasem pomocniki są tylko elementami pozwalającymi zaoszczędzić czas i kawałkami kodu, który jest często używany w szablonach. Na przykład, możesz łatwo wyobrazić sobie definicję funkcji dla tego pomocnika:

[php]
<?php
echo input_tag('nickname') ?>
<input type="text" name="nickname" id="nickname" value="" />

Powinna ona wyglądać mniej więcej tak, jak w Listingu 7-2

Listing 7-2 – Przykładowa definicja pomocnika

[php]
function input_tag($name, $value = null)
{
  return '<input type="text" name="'.$name.'" id="'.$name.'"value="'.$value.'" />';
}

W rzeczywistości, funkcja input_tag(), która jest wbudowana w symfony jest trochę bardziej skomplikowana, ponieważ posiada ona trzeci parametr, który pozwala na dodanie innych atrybutów do tagu < input >. Możesz sprawdzić kompletny kod oraz opcje w dokumentacji API, która jest dostępna on-line ([http://www.symfony-project.com/api/symfony.html]). W większości przypadków, pomocniki są zaprojektowanie inteligentnie i pozwalają na wyeliminowanie długich linii kodu:

[php]
<?php
echo auto_link_text('Odwiedź naszą stronę www.example.com') ?>
Odwiedź naszą stronę <a href="http://www.example.com">www.example.com</a>

Pomocniki ułatwiają proces tworzenia szablonów i kreowania najlepszego kodu HTML zgodnego ze standardami kodowania oraz dostępności. Zawsze możesz użyć wyłącznie samego, czystego kodu HTML, ale pomocniki zazwyczaj można tworzyć znacznie szybciej, niż tradycyjny kod.

TIP Być może zastanawiałeś się, dlaczego nazewnictwo pomocników jest tworzone z wykorzystaniem podkreślenia zamiast standardu camelCase, który jest używany we wszystkich innych miejscach w symfony. Jest to robione dlatego, że wszystkie funkcje wchodzące w skład jądra PHP używają konwencji nazewniczej, w której wykorzystuje się podkreślenia.

Deklarowanie pomocników

Pliki symfony zawierające definicje pomocników nie są ładowane automatycznie (dopóki zawierają funkcje, a nie klasy). Pomocniki są grupowane wg swoich zadań. Na przykład, wszystkie pomocniki zajmujące się wykonywaniem operacji na tekście są zdefiniowane w pliku, który nazywa się TextHelper.php (pomocnik tekstu – przyp. Tłumacza), z którego z kolei są wywoływane pomocniki z grupy pomocników tekstu. Jeśli potrzebujesz użyć pomocnika w szablonie, musisz wcześniej załadować powiązaną z nim grupę pomocników deklarując ją za pomocą funkcji use_helper(). Listing 7-3 pokazuje szablon, który używa pomocnika w postaci funkcji auto_link_text(), który jest częścią grupy pomocników tekstu.

Listing 7-3 – Deklarowanie pomocnika

[php]
// Używanie specyficznej grupy pomocników w tym szablonie
<?php echo use_helper('Text') ?>
...
<h1>Opis</h1>
<p><?php echo auto_link_text($opis) ?></p>

TIP Jeśli masz potrzebę zdeklarowania więcej niż jednej grupy pomocników, dodaj więcej argumentów do wywołanej funkcji use_helper(). Na przykład, aby załadować w szablonie zarówno grupę pomocników tekstu (Text), jak i grupę pomocników Javascriptu (Javascript), wywołaj funkcję use_helper() następująco: <?php echo use_helper('Text', 'Javascript') ?>.

Kilka pomocników jest dostępnych standardowo w każdym szablonie i nie ma potrzeby deklarowania ich. Są to pomocniki z następujących grup:

  • Helper: Wymagany do włączania pomocników (funkcja use_helper() w zasadzie także jest pomocnikiem)
  • Tag: Podstawowy pomocnik etykiet, używany prawie przez wszystkie pomocniki
  • Url: Pomocniki umożliwiające zarządzanie adresami URL oraz linkami
  • Asset: Pomocniki rozpowszechnione w sekcji w kodzie HTML oraz dostarczające łatwe odwołania do zewnętrznych źródeł danych (obrazków, skryptów Javascript oraz arkuszy styli)
  • Partial: Pomocniki pozwalające na włączanie fragmentów szablonu
  • Cache: Manipulacja cache-owanymi fragmentami kodu
  • Form: Pomocniki umożliwiające tworzenie formularzy

Listę standardowych pomocników, które są ładowane domyślnie w każdym szablonie można konfigurować w pliku settings.yml. W związku z tym, jeśli wiesz, że nie będziesz używał pomocników z grupy Cache lub zawsze będziesz używał pomocników z grupy Text, zmodyfikuj odpowiednio standardowe ustawienia pomocników. Przyspieszy to nieco Twoją aplikację. Nie możesz usuwać pierwszych czterech grup pomocników z powyższej listy (Helper, Tag, Url oraz Asset), ponieważ ich włączenie jest konieczne do prawidłowego funkcjonowania silniku szablonów. Zatem wspomniane pomocniki nawet nie znajdują się na liście standardowych pomocników.

TIP Jeśli kiedykolwiek będziesz miał potrzebę użycia pomocnika poza szablonem, możesz załadować grupę pomocników skądkolwiek za pomocą następującej instrukcji: sfLoader::loadHelpers($helpers), gdzie zmienna $helpers jest nazwą grupy pomocników lub tablicą z nazwami grup pomocników. Na przykład, jeśli chcesz użyć funkcji auto_link_text() w akcji, musisz wywołać wcześniej grupę pomocników w sposób następujący: sfLoader::loadHelpers('Text').

Najczęściej używane pomocniki

O szczegółach niektórych pomocników wraz z ich cechami nauczysz się w następnych rozdziałach. Listing 7-4 prezentuje krótką listę często używanych defaultowych helperów wraz z kodem HTML, który zwracają.

Listing 7-4 – Często używane domyślne helpery

[php]
// Helper group
<?php use_helper('HelperName') ?>
<?php use_helper('HelperName1', 'HelperName2', 'HelperName3') ?>

// Tag group
<?php echo tag('input', array('name' => 'foo', 'type' => 'text')) ?>
<?php echo tag('input', 'name=foo type=text') ?>  // Alternative options syntax
 => <input name="foo" type="text" />
<?php echo content_tag('textarea', 'dummy content', 'name=foo') ?>
 => <textarea name="foo">dummy content</textarea>

// Url group
<?php echo link_to('click me', 'mymodule/myaction') ?>
=> <a href="/route/to/myaction">click me</a>  // Depends on the routing settings

// Asset group
<?php echo image_tag('myimage', 'alt=foo size=200x100') ?>
 => <img src="/images/myimage.png" alt="foo" width="200" height="100"/>
<?php echo javascript_include_tag('myscript') ?>
 => <script language="JavaScript" type="text/javascript" src="/js/myscript.js"></script>
<?php echo stylesheet_tag('style') ?>
 => <link href="/stylesheets/style.css" media="screen" rel="stylesheet"type="text/css" />

Jest jeszcze wiele innych helperów w Symfony i aby je wszystkie opisać trzebaby napisać książkę. Najlepszym ich opisem jest dokumentacja API online (http:// www.symfony-project.org/api/1_1/), gdzie wszystkie helpery, wraz z ich składnią i przykładami, są dobrze opisane.

Dodawanie własnych helperów

Symfony zawiera dużo helperów o różnym przeznaczeniu, ale jeśli nie znajdziesz tego czego potrzebujesz w dokumentacji API, prawdopodobnie będziesz chciał stworzyć nowy helper. Jest to bardzo łatwe.

Funkcje helperów (regularne funkcje PHP zwracające kod HTML) powinny być zapisywane w plikach FooBarHelper.php, gdzie FooBar jest nazwą grupy helpera.

Tak nazwany plik powinien być przechowywany w apps/frontend/lib/helper/ (albo w jakimś innym folderze lib/ Twojego projektu), dzięki czemu może być znaleziony automatycznie przez inkludowanie w use_helper(FooBar).

TIP

Ten system pozwala nawet na nadpisywanie istniejących w Symfony helperów. Na przykład, aby ponownie zdefiniować wszystkie helpery z grupy Text Helper, po prostu stwórz plik TextHelper.php w folderze apps/frontend/lib/helper/. Za każdym razem kiedy wywołasz use_helper('Text'), Symfony użyje Twojej grupy helperów zamiast swojej pierwotnej. Bądź ostrożny: ponieważ oryginalny plik w takiej sytuacji nie jest załadowany, musisz w swoim ponownie zdefiniować wszystkie funkcje grupy helperów aby je nadpisać; jeśli tego nie zrobisz, niektóre z oryginalnych helperów nie będą w ogóle dostępne. Dobrym rozwiązaniem będzie skopiowanie oryginalnego pliku grupy helperów do swojej aplikacji i zamiana lub dopisanie własnych funkcji bez kasowania tych których zmiana nie jest potrzebna chyba, że dobrze wiesz co robisz.

Układ strony