Sztuczki w Symfony

Dzisiaj garść sztuczek, które wykorzystuje w mojej codziennej pracy z Symfony. Może okażą się komuś pomocne:

Pobierz wartość z konfiguracji

$wartosc = sfConfig::get("app_sekcja_zmienna");

Pobiera wartość z pliku /apps/current_appname/configs/app.yml, który winien wyglądać tak:

all:
  sekcja:
    zmienna: wartość

Istnieje możliwość dalszego zagłębiania sekcji, np.

all:
  sekcja:
    podsekcja:
      zmienna: wartość

Ale wówczas należy skorzystać:

$temp = sfConfig::get("app_sekcja_podsekcja);
$wartosc = $temp["zmienna"];

Logowanie do debuggera Symfony

W Symfony można logować dowolną wartość, która później wyświetla się w pasku debuggera -> logs. W kontrolerze można skorzystać z:

$this->logMessage("Twój debug");

W innym miejscu, np. w modelu można skorzystać z:

sfContext::getInstance()->getLogger()->log("Twój debug");

Stosowanie globalnych części szablonu (partials)

Normalnie używam

<?php include_partial('errors', array('form' => $form)) ?>

Wówczas Symfony szuka części w apps/current_app/modules/current_module/templates/_errors.php

Jeśli chcemy wskazać konkretny moduł:

<?php include_partial(nazwa_modulu/errors',
      array('form' => $form)) ?>

Wówczas Symfony szuka części w apps/current_app/modules/nazwa_modulu/templates/_errors.php

Gdy użyjemy:

<?php include_partial('global/errors', array('form' => $form)) ?>

Wówczas Symfony będzie szukało części w apps/current_app/templates/_errors.php. Wniosek nasuwa się sam, nie nalezy używać nazwy ‘global’ jako nazwy modułu :)

Wyświetlenie dowolnej zawartości

echo sfYamlInline::dump($dowolna_zmienna);

$dowolna_zmienna może być naprawdę dowolną zmienną, również obiektem i tablicą. Zmienna zostanie tak sformatowana aby była czytelna dla człowieka.

I18n

Przy wielojęzycznej stronie w szablonach korzystamy z

<?php echo __("Polski string") ; ?>

Po stronie kontrolera lub modelu:

 sfContext::getInstance()->getI18N()->__('Polski string');

Przydaje się szczególnie do określania etykiet dla formularzy po stronie modelu.

Symfony dla projektantów stron

Pierwszy wpis o tym jak programista Symfony chciałby współpracować z projektantem stron WWW. Zakładam, że jestem programistą Symfony i stworzyłem jedną aplikację o nazwie frontend przy pomocy Symfony i Doctrine. Wygląd aplikacji jest bardzo siermiężny a poniższa wiedza to to co próbuje przekazać projektantowi stron aby, już bez mojej pomocy, mógł samodzielnie zmodyfikować szablony wpływające na wygląd strony.

Struktura MVC

Symfony jest frameworkiem MVC. Model – View – Controller. Dla projektanta stron najistotniejsza jest oczywiście warstwa View, przy czym Symfony korzysta z systemu szablonów. Dla potrzeb szablonów ważne jest aby poznać wszystkie dostępne ścieżki (routes) które może realizować kontroler. Plik z definicjami ścieżek znajduje się w /apps/frontend/config/routing.yml a definicja jednej ścieżki w tym pliku wygląda:

obiekt_show:
      url:     /obiekt/pokaz/:slug
      param:   { module: obiekt,  action: pokaz }

Plik może mieć dowolną liczbę takich ścieżek. Kontroler otrzymuje  żądanie od użytkownika porównuje go do _url_ i jeśli pasuje, wywołuje odpowiedni _action_ (tutaj ‘pokaz’) w odpowiednim _module_ (tutaj ‘obiekt’). Dwukropek przed nazwą członu w _url_ oznacza zmienną, dlatego _url_ może wyglądać tak:

    /obiekt/pokaz/zielony-obiekt

lub tak:

    /obiekt/pokaz/zupelnie-inny-czerwony

_obiekt_show_ to nazwa ścieżki używana później do generowania url’i za pomocą url_for (patrz niżej).

Struktura szablonów

Filozofia Symfony odnośnie szablonów polega na wykorzystaniu zwykłych plików .php. Instrukcje wykorzystywane w szablonach to tagi php i są ograniczone do zestawu podobnego jaki używa się w innych systemach szablonów (np. Smarty).

Przyjmuje, że mamy tylko jedną aplikację i programista nazwał ją frontend. Każdy szablon dla konkretnego modułu znajduje się w katalogu /apps/frontend/nazwa_modulu/templates, szablony globalne znajdują się w katalogu /apps/frontend/templates

Do wyświetlenia wyniku działania akcji z przykładu powyżej kontroler używa szablonu zapisanego w pliku /apps/frontend/modules/obiekt/templates/pokazSuccess.php. “Dokleja” końcówkę `Success.php` do nazwy akcji. Każdy szablon jest natomiast ‘dekorowany’ layout’em znajdującym się w /apps/frontend/templates/layout.php.

Tworzenie szablonów

Czytaj dalej »