SlideShare uma empresa Scribd logo
1 de 25
Baixar para ler offline
TWIG


    Niezłe widoki dla PHP



{meet}.php #5, Poznań 2012   Piotr Gabryjeluk
Po co widoki



●   Żeby odseparować wygląd od logiki

●   Dla innych osób niż programiści

●   Dla bezpieczeństwa
Twig jako język szablonów


●   Twig jest językiem szablonów,
    a nie językiem programowania

●   Twig pozwala na dostęp do
    z góry określonych metod

●   Twig pozwala na tworzenie
    struktur w ramach szablonów
                                    Fabien Potencier
●   Twig jest szybki i bezpieczny
Instalacja


●   git clone lub git submodule add

      git://github.com/fabpot/Twig.git

●   PEAR
      $ pear channel-discover pear.twig-project.org
      $ pear install twig/Twig
Bootstrap → twig.php
<?php

require_once 'lib/Twig/Autoloader.php';
Twig_Autoloader::register();

$twig = new Twig_Environment(

     /* loader */
     new Twig_Loader_Filesystem('/app/templates'),

     /* opts */
     array('cache' => '/tmp/twig-cache')

);
Użycie → meeting.php

<?php

require_once 'lib/twig.php';

$context = array(
    'imie' => 'Gabryś',
    'miasto' => 'Poznań',
    'miejsce' => 'Coworking ZOO',
    'spotkanie' => '{meet}.php',
    'numer' => 5,
);

$twig->render('meeting.html', $context);
Użycie → meeting.html

 <html>
 <head><title>Spotkanie</title></head>
 <body>
   <h1>{{ spotkanie }} #{{ numer }}</h1>
   <p>Miejsce: {{ miejsce }}, {{ miasto }}</p>
   <p>Uczestnik: {{ imie }}</p>
 </body>
 </html>
Język szablonów Twiga

●   Wyświetlenie zmiennej
     {{ zmienna }}

●   Filtr raw
       {{ zmienna | raw }}

●   Spaceless
      {% spaceless %}
      kod HTML
      {% endspaceless %}
Mały wielki operator




                .
Mały wielki operator

 Multioperator „kropka”: {{ a.bar }}
 ●   $a['bar']

 ●   $a->bar

 ●   $a->bar()

 ●   $a->getBar()

 ●   $a->isBar()
                      Kot pod wrażeniem operatora „kropki”
Filtry


 {{ zmienna | filtr }}
  ●   title, capitalize, upper, lower, striptags, nl2br

  ●   format, replace

  ●   join(', '), length

  ●   number_format(2, ','), url_encode, json_encode
Warunki



●   {% if warunek %} … {% endif %}
    ●   operatory logiczne: or, and, not, ()

    ●   testy: is odd, is even, is empty, is constant
Pętle

 {% for u in uczestnicy %}

   <p>{{ loop.index }}</p>
   <p>{{ u.imie }} {{ u.nazwisko }}</p>
   <p>{{ u.miasto }}</p>

   {% if u.organizator %}
     <p class=”role”>organizator</p>
   {% endif %}

 {% endfor %}                             Przykładowa pętla
Range



 {% for i in range(1, gwiazdki) %}
   <img src=”/img/star.png” alt=”*”>
 {% endfor %}

 Uwaga na range(1, 0)!
Budowanie klocków


●   Makra

●   Include'y

●   Własne tagi
    (uwaga na
    przenośność)
Szablony → layout.html

 <head>
   <title>{% block tytul %}{% endblock %}</title>
 </head>
 <body>
   {% block tresc %}{% endblock %}
   <div class=”footer”>
     {% block stopka %}
        <p>© 2012, Poznań</p>
     {% endblock %}
   </div>
 </body>
Szablony → meeting.html

 {% extend 'layout.html' %}

 {% block tytul %}
   {{ spotkanie }} #{{ numer }}
 {% endblock %}

 {% block tresc %}
   <p>Miejsce: {{ miejsce }}, {{ miasto }}</p>
   <p>Uczestnik: {{ imie }}</p>
 {% endblock %}
Integracja

●   Zend Framework: zwig

●   Zend Framework 2: ZFTwig

●   Symfony: out of the box

●   Code Igniter: tak

●   Twój framework: już wiesz jak to zrobić
Dla innych środowisk



●   Python: DTL (Django), Jinja

●   JavaScript: JinJS, Swig, Node-T, Templ8

●   Ruby: Djerb, Liquid
Źródło




●   http://twig.sensiolabs.org/
Dziękuję za uwagę
Bonus – PHP vs Twig vs Smarty
<?php

// Przykładowa klasa użytkownika

class User {

    public function __construct($firstName, $lastName, $location) ...
    public function getFirstName() …
    public function getLastName() …
    public function getLocation() … // zwraca array

}

// Kontekst przekazywany do szablonu

$context->add('users', array(
    new User('Piotr', 'Gabryjeluk', array('city' => 'Poznań', 'street' => 'Św. Marcin')),
    new User('Jan', 'Kowalski', array('city' => 'Tomyśl', 'street' => 'Towarowa')),
    new User('Mariusz', 'Kolonko', array('city' => 'Nowy Jork', 'street' => 'Wall Street')),
));
Bonus – PHP (Zend View style)

 <? foreach ($this->users as $u): ?>
   <div class=”name”>
      <?= $u->getFirstName() ?>
      <?= $u->getLastName() ?>
   </div>
   <div class=”location”>
      <?= $u->getLocation()['city'] ?>
      <?= $u->getLocation()['street'] ?>
   </div>
 <? endforeach; ?>
                               Tylko w PHP 5.4!


                                                  A htmlspecialchars?
Bonus – Smarty

 {foreach $users as $u}
    <div class=”name”>
      {u->getFirstName}         →   dla obiektów
                                .   dla tablic asocjacyjnych
      {u->getLastName}
    </div>
    <div class=”location”>
      {u->getLocation.city}
      {u->getLocation.street}
    </div>
 {/foreach}
Bonus – Twig

 {% for u in users %}          {{…..}} wyświetlanie
                               {%..%} logika, tagi
   <div class=”name”>
                               Do przejścia od ogółu do szczegółu
     {{ u.firstName }}         zawsze używamy kropki, a zatem bez
                               zmiany w szablonach, możemy
     {{ u.lastName }}          zmienić implementację zmiennych
   </div>                      przekazywanych do szablonu
                               (np. dodać lazy-metody zamiast
   <div class=”location”>      prepopulowanych arrayów)

     {{ u.location.city }}     Ułatwia to też prototypowanie:
                               można stworzyć szablony i wypełnić je
     {{ u.location.street }}   przykładowymi danymi (jako arraye),
                               a potem wymienić kod na taki, który
   </div>                      pobiera prawdziwe dane z bazy
 {% endfor %}                  (jako metody)

Mais conteúdo relacionado

Semelhante a TWIG - niezłe widoki dla PHP

Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarkaThymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarkaMaciej Ziarko
 
Jarorcon Sp
Jarorcon SpJarorcon Sp
Jarorcon Spjarorcon
 
Angular 4 pragmatycznie
Angular 4 pragmatycznieAngular 4 pragmatycznie
Angular 4 pragmatycznieSages
 
Testy API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciTesty API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciThe Software House
 
Modularny JavaScript - meet.js
Modularny JavaScript - meet.jsModularny JavaScript - meet.js
Modularny JavaScript - meet.jsPatryk Jar
 
Angular restmod – wygodny sposób na komunikację z API
Angular restmod – wygodny sposób na komunikację z APIAngular restmod – wygodny sposób na komunikację z API
Angular restmod – wygodny sposób na komunikację z APIThe Software House
 
Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPAutomatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPLaravel Poland MeetUp
 
Metaprogramowanie w JS
Metaprogramowanie w JSMetaprogramowanie w JS
Metaprogramowanie w JSDawid Rusnak
 
Patronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 WarsztatyPatronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 Warsztatyintive
 
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)Codesushi.co (CODESUSHI LLC)
 
WordUp Trójmiasto - Sage 9 w praktyce
WordUp Trójmiasto - Sage 9 w praktyceWordUp Trójmiasto - Sage 9 w praktyce
WordUp Trójmiasto - Sage 9 w praktyceDawid Urbański
 
AngularJS - podstawy
AngularJS - podstawyAngularJS - podstawy
AngularJS - podstawyApptension
 
Laravel Poznań Meetup #2 - Tworzenie chatbotów z BotMan
Laravel Poznań Meetup #2 - Tworzenie chatbotów z BotManLaravel Poznań Meetup #2 - Tworzenie chatbotów z BotMan
Laravel Poznań Meetup #2 - Tworzenie chatbotów z BotManHighSolutions Sp. z o.o.
 
Tworzenie Chatbotów z wykorzystaniem BotMan'a
Tworzenie Chatbotów z wykorzystaniem BotMan'aTworzenie Chatbotów z wykorzystaniem BotMan'a
Tworzenie Chatbotów z wykorzystaniem BotMan'aLaravel Poland MeetUp
 
Sieciowe serwery danych
Sieciowe serwery danychSieciowe serwery danych
Sieciowe serwery danychWGUG
 
Budowa elementów GUI za pomocą biblioteki React - szybki start
Budowa elementów GUI za pomocą biblioteki React - szybki startBudowa elementów GUI za pomocą biblioteki React - szybki start
Budowa elementów GUI za pomocą biblioteki React - szybki startSages
 

Semelhante a TWIG - niezłe widoki dla PHP (20)

Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarkaThymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
 
Jarorcon Sp
Jarorcon SpJarorcon Sp
Jarorcon Sp
 
Angular 4 pragmatycznie
Angular 4 pragmatycznieAngular 4 pragmatycznie
Angular 4 pragmatycznie
 
Testy API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciTesty API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięci
 
Modularny JavaScript - meet.js
Modularny JavaScript - meet.jsModularny JavaScript - meet.js
Modularny JavaScript - meet.js
 
Angular restmod – wygodny sposób na komunikację z API
Angular restmod – wygodny sposób na komunikację z APIAngular restmod – wygodny sposób na komunikację z API
Angular restmod – wygodny sposób na komunikację z API
 
Angular Restmod
Angular RestmodAngular Restmod
Angular Restmod
 
Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPAutomatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHP
 
Metaprogramowanie w JS
Metaprogramowanie w JSMetaprogramowanie w JS
Metaprogramowanie w JS
 
Patronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 WarsztatyPatronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 Warsztaty
 
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
 
WordUp Trójmiasto - Sage 9 w praktyce
WordUp Trójmiasto - Sage 9 w praktyceWordUp Trójmiasto - Sage 9 w praktyce
WordUp Trójmiasto - Sage 9 w praktyce
 
AngularJS - podstawy
AngularJS - podstawyAngularJS - podstawy
AngularJS - podstawy
 
Laravel Poznań Meetup #2 - Tworzenie chatbotów z BotMan
Laravel Poznań Meetup #2 - Tworzenie chatbotów z BotManLaravel Poznań Meetup #2 - Tworzenie chatbotów z BotMan
Laravel Poznań Meetup #2 - Tworzenie chatbotów z BotMan
 
react-pl.pdf
react-pl.pdfreact-pl.pdf
react-pl.pdf
 
Tworzenie Chatbotów z wykorzystaniem BotMan'a
Tworzenie Chatbotów z wykorzystaniem BotMan'aTworzenie Chatbotów z wykorzystaniem BotMan'a
Tworzenie Chatbotów z wykorzystaniem BotMan'a
 
JavaScript, Moduły
JavaScript, ModułyJavaScript, Moduły
JavaScript, Moduły
 
Sieciowe serwery danych
Sieciowe serwery danychSieciowe serwery danych
Sieciowe serwery danych
 
Mongodb with Rails
Mongodb with RailsMongodb with Rails
Mongodb with Rails
 
Budowa elementów GUI za pomocą biblioteki React - szybki start
Budowa elementów GUI za pomocą biblioteki React - szybki startBudowa elementów GUI za pomocą biblioteki React - szybki start
Budowa elementów GUI za pomocą biblioteki React - szybki start
 

TWIG - niezłe widoki dla PHP

  • 1. TWIG Niezłe widoki dla PHP {meet}.php #5, Poznań 2012 Piotr Gabryjeluk
  • 2. Po co widoki ● Żeby odseparować wygląd od logiki ● Dla innych osób niż programiści ● Dla bezpieczeństwa
  • 3. Twig jako język szablonów ● Twig jest językiem szablonów, a nie językiem programowania ● Twig pozwala na dostęp do z góry określonych metod ● Twig pozwala na tworzenie struktur w ramach szablonów Fabien Potencier ● Twig jest szybki i bezpieczny
  • 4. Instalacja ● git clone lub git submodule add git://github.com/fabpot/Twig.git ● PEAR $ pear channel-discover pear.twig-project.org $ pear install twig/Twig
  • 5. Bootstrap → twig.php <?php require_once 'lib/Twig/Autoloader.php'; Twig_Autoloader::register(); $twig = new Twig_Environment( /* loader */ new Twig_Loader_Filesystem('/app/templates'), /* opts */ array('cache' => '/tmp/twig-cache') );
  • 6. Użycie → meeting.php <?php require_once 'lib/twig.php'; $context = array( 'imie' => 'Gabryś', 'miasto' => 'Poznań', 'miejsce' => 'Coworking ZOO', 'spotkanie' => '{meet}.php', 'numer' => 5, ); $twig->render('meeting.html', $context);
  • 7. Użycie → meeting.html <html> <head><title>Spotkanie</title></head> <body> <h1>{{ spotkanie }} #{{ numer }}</h1> <p>Miejsce: {{ miejsce }}, {{ miasto }}</p> <p>Uczestnik: {{ imie }}</p> </body> </html>
  • 8. Język szablonów Twiga ● Wyświetlenie zmiennej {{ zmienna }} ● Filtr raw {{ zmienna | raw }} ● Spaceless {% spaceless %} kod HTML {% endspaceless %}
  • 10. Mały wielki operator Multioperator „kropka”: {{ a.bar }} ● $a['bar'] ● $a->bar ● $a->bar() ● $a->getBar() ● $a->isBar() Kot pod wrażeniem operatora „kropki”
  • 11. Filtry {{ zmienna | filtr }} ● title, capitalize, upper, lower, striptags, nl2br ● format, replace ● join(', '), length ● number_format(2, ','), url_encode, json_encode
  • 12. Warunki ● {% if warunek %} … {% endif %} ● operatory logiczne: or, and, not, () ● testy: is odd, is even, is empty, is constant
  • 13. Pętle {% for u in uczestnicy %} <p>{{ loop.index }}</p> <p>{{ u.imie }} {{ u.nazwisko }}</p> <p>{{ u.miasto }}</p> {% if u.organizator %} <p class=”role”>organizator</p> {% endif %} {% endfor %} Przykładowa pętla
  • 14. Range {% for i in range(1, gwiazdki) %} <img src=”/img/star.png” alt=”*”> {% endfor %} Uwaga na range(1, 0)!
  • 15. Budowanie klocków ● Makra ● Include'y ● Własne tagi (uwaga na przenośność)
  • 16. Szablony → layout.html <head> <title>{% block tytul %}{% endblock %}</title> </head> <body> {% block tresc %}{% endblock %} <div class=”footer”> {% block stopka %} <p>© 2012, Poznań</p> {% endblock %} </div> </body>
  • 17. Szablony → meeting.html {% extend 'layout.html' %} {% block tytul %} {{ spotkanie }} #{{ numer }} {% endblock %} {% block tresc %} <p>Miejsce: {{ miejsce }}, {{ miasto }}</p> <p>Uczestnik: {{ imie }}</p> {% endblock %}
  • 18. Integracja ● Zend Framework: zwig ● Zend Framework 2: ZFTwig ● Symfony: out of the box ● Code Igniter: tak ● Twój framework: już wiesz jak to zrobić
  • 19. Dla innych środowisk ● Python: DTL (Django), Jinja ● JavaScript: JinJS, Swig, Node-T, Templ8 ● Ruby: Djerb, Liquid
  • 20. Źródło ● http://twig.sensiolabs.org/
  • 22. Bonus – PHP vs Twig vs Smarty <?php // Przykładowa klasa użytkownika class User { public function __construct($firstName, $lastName, $location) ... public function getFirstName() … public function getLastName() … public function getLocation() … // zwraca array } // Kontekst przekazywany do szablonu $context->add('users', array( new User('Piotr', 'Gabryjeluk', array('city' => 'Poznań', 'street' => 'Św. Marcin')), new User('Jan', 'Kowalski', array('city' => 'Tomyśl', 'street' => 'Towarowa')), new User('Mariusz', 'Kolonko', array('city' => 'Nowy Jork', 'street' => 'Wall Street')), ));
  • 23. Bonus – PHP (Zend View style) <? foreach ($this->users as $u): ?> <div class=”name”> <?= $u->getFirstName() ?> <?= $u->getLastName() ?> </div> <div class=”location”> <?= $u->getLocation()['city'] ?> <?= $u->getLocation()['street'] ?> </div> <? endforeach; ?> Tylko w PHP 5.4! A htmlspecialchars?
  • 24. Bonus – Smarty {foreach $users as $u} <div class=”name”> {u->getFirstName} → dla obiektów . dla tablic asocjacyjnych {u->getLastName} </div> <div class=”location”> {u->getLocation.city} {u->getLocation.street} </div> {/foreach}
  • 25. Bonus – Twig {% for u in users %} {{…..}} wyświetlanie {%..%} logika, tagi <div class=”name”> Do przejścia od ogółu do szczegółu {{ u.firstName }} zawsze używamy kropki, a zatem bez zmiany w szablonach, możemy {{ u.lastName }} zmienić implementację zmiennych </div> przekazywanych do szablonu (np. dodać lazy-metody zamiast <div class=”location”> prepopulowanych arrayów) {{ u.location.city }} Ułatwia to też prototypowanie: można stworzyć szablony i wypełnić je {{ u.location.street }} przykładowymi danymi (jako arraye), a potem wymienić kod na taki, który </div> pobiera prawdziwe dane z bazy {% endfor %} (jako metody)