twig - niezłe widoki dla php

Post on 11-Jul-2015

2.882 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

TWIG

Niezłe widoki dla PHP

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

Po co widoki

● Żeby odseparować wygląd od logiki

● Dla innych osób niż programiści

● Dla bezpieczeństwa

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

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

● Twig pozwala na tworzenie struktur w ramach szablonów

● Twig jest szybki i bezpieczny Fabien Potencier

Twig jako język szablonów

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 naprzenoś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}{u->getLastName}

</div><div class=”location”>

{u->getLocation.city}{u->getLocation.street}

</div>{/foreach}

→ dla obiektów. dla tablic asocjacyjnych

Bonus – Twig

{% for u in users %}<div class=”name”>

{{ u.firstName }}{{ u.lastName }}

</div><div class=”location”>

{{ u.location.city }}{{ u.location.street }}

</div>{% endfor %}

{{…..}} wyświetlanie{%..%} logika, tagi

Do przejścia od ogółu do szczegółu zawsze używamy kropki, a zatem bez zmiany w szablonach, możemy zmienić implementację zmiennych przekazywanych do szablonu(np. dodać lazy-metody zamiast prepopulowanych arrayów)

Ułatwia to też prototypowanie:można stworzyć szablony i wypełnić je przykładowymi danymi (jako arraye), a potem wymienić kod na taki, który pobiera prawdziwe dane z bazy(jako metody)

top related