SlideShare a Scribd company logo
1 of 24
Download to read offline
Twig in symfony
План
1. Призначення шаблонізатора twig
2. Основи twig (демонстрація standalone twig)
a. Основи розмітки засобами twig
b. поняття блоків, extend, include, render (in symfony)
c. поняття хелперу та функції в twig
d. Оператори розгалуження та циклів у twig
3. Викристання twig в symfony2 (демонстрація)
4. Розробка власної функції та фільтра в twig
5. Приклад використання twig_js
Two Step View pattern
Transform View
model data -> logical presentation
no specific formatting, may be html, xml, json, arrays, etc
Template View
logical presentation -> Physical representation
html layout
Призначення шаблонізатора twig
<!DOCTYPE html>
<html>
<head>
<title>My Webpage</title>
</head>
<body>
<ul id="navigation">
{% for item in navigation %}
<li><a href="{{ item.href }}">{{ item.caption }}</a></li>
{% endfor %}
</ul>
<h1>My Webpage</h1>
{{ a_variable }}
</body>
</html>
1. розділення верстки та коду
2. перетворення масивів даних у html-текст
3. повторне використання фрагментів
(шаблонів) html-коду
4. виведення форм
Основи розмітки засобами twig
виведення:
<a href="{{ url }}">{{ text }}</a>
обчислення та логіка:
{% set foo = 'foo' %}
{% set flag = false %}
{% if flag == true %}
<h3>Sometext</h3>
{% endif %}
{# Коментарі #}
План демонстрації standalone twig (github link)
- встановлення twig через composer
- Ініціалізація і конфігурація
- Створення cache, конфігурація, відключення
- Скачування готового шаблона
- корекція посилань на ассети (img, css, js)
- layout.html.twig розмітка на блоки
- index.html.twig заміна блоку content
- приклад циклу (відображення масиву даних)
- приклад include іншого шаблону в циклі
Поняття блоків twig
http://twig.sensiolabs.org/doc/functions/block.html
<title>{% block title %}{% endblock %}</title>
<h1>{{ block('title') }}</h1>
{% block body %}
{% endblock %}
Поняття блоків (перезавантаження)
{% extends "base.html" %}
{% block title %}new title{% endblock %}
{% block content %}
new content
{% endblock %}
Поняття блоків
http://twig.sensiolabs.org/doc/functions/block.
html
http://twig.sensiolabs.org/doc/tags/extends.html
http://twig.sensiolabs.org/doc/tags/use.html
http://twig.sensiolabs.org/doc/functions/parent.
html
Поняття фільтрів та функцій
filters:
{{ users|length }}
functions:
{{ date(user.created_at) }}
Огляд деяких функцій та фільтрів
abs {{ number|abs }}
capitalize {{ 'my first car'|capitalize }}
date_modify {{ post.published_at|date_modify("+1 day")|date("m/d/Y") }}
format {{ "I like %s and %s."|format(foo, "bar") }}
lower {{ 'WELCOME'|lower }}
upper {{ 'welcome'|upper }} {# outputs 'WELCOME' #}
title {{ 'my first car'|title }} {# outputs 'My First Car' #}
template_from_string {{ include(template_from_string("Hello {{ name }}")) }}
Огляд деяких функцій (масиви)
join {{ [1, 2, 3]|join('|') }}
slice {{ '12345'|slice(1, 2) }} {# outputs 23 #}
slice {{ '12345'[:2] }} {# will display "12" #}
{{ '12345'[2:] }} {# will display "345" #}
range
{% for i in range(0, 3) %}
{{ i }},
{% endfor %}
max, min {{ max(1, 3, 2) }}
Оператори розгалуження if
defined: {% if foo is defined %} … {% endif %}
empty: {% if foo is empty %} … {% endif %}
odd: {{ var is odd }} even: {{ var is even }}
null: {{ var is null }}
sameas
{% if foo.attribute is same as(false) %}
<h2>someoutput</h2>
{% endif %}
Оператор циклу for
{% for user in users %}
<li>{{ user.username|e }}</li>
{% endfor %} {# e - shortcut to escape a variable #}
корисні “змінні”:
loop.index - # of iterations from the beginning (1 indexed)
loop.index0 - # of iterations from the beginning (0 indexed)
loop.revindex - # of iterations from the end (1 indexed)
loop.revindex0 - # of iterations from the end (0 indexed)
loop.first - true if first iteration
loop.last - true if last iteration
loop.length - # of iterations
only array keys:
{% for key in users|keys %}
<li>{{ key }}</li>
{% endfor %}
keys and values:
{% for key, user in users %}
<li>{{ key }}: {{ user.username|e }}</li>
{% endfor %}
Особливості використання twig в
symfony docs
Розміщення шаблонів:
app/Resources/views/
path/to/bundle/Resources/views/
імена шаблонів:
AcmeBlogBundle:Blog:index.html.twig
План демонстрації symfony (gh link)
- розмістити той же index з шаблона у
layout.html.twig, ассети - у відпов. папки
- пофіксити посилання на ассети (css, js,
images)
- створити декілька раутів (використовуючи
існуючий контролер), додати ссилки у
менюшку, змінити урл в конфігурації,
@Template annotations
- sub-render для квартир
- власний twig-фільтр dotdotdot
підключення ассетів (+app/config.yml)
{% stylesheets 'bundles/app/css/*' filter='cssrewrite' %}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
{% javascripts
'@AppBundle/Resources/public/js/*'
'@AcmeBarBundle/Resources/public/js/form.js'
'@AcmeBarBundle/Resources/public/js/calendar.js' %}
<script src="{{ asset_url }}"></script>
{% endjavascripts %}
{% image '@AppBundle/Resources/public/images/example.jpg' %}
<img src="{{ asset_url }}" alt="Example" />
{% endimage %}
app.security - The security context.
app.user - The current user object.
app.request - The request object.
app.session - The session object.
app.environment - The current environment (dev, prod, etc).
app.debug - True if in debug mode. False otherwise.
Використання routing в twig
- створити новий раут
- додати відповідний action до контролеру
- створити шаблон
- додавати посилання path("_routename")
sub-render
- створити повноцінний action в контролері
- рендер цього action’а можна викликати в шаблоні:
<div id="sidebar">
{{ render(controller(
'AcmeDemoBundle:Welcome:view',
{ 'max': 3 }
)) }}
</div>
Створення власного фільтра
доки: standalone twig extension symfony twig extension
- розробка src/Acme/DemoBundle/Twig/Extension/DotDotDotExtension.php
- реєстрація
# app/config/services.xml
<parameters>
<parameter key="twig.extension.acme.dotdotdot.class"
>AcmeDemoBundleTwigExtensionDotDotDotExtension</parameter>
</parameters>
<services>
<service id="twig.extension.acme.dotdotdot" class="%twig.extension.acme.
dotdotdot.class%" public="false">
<tag name="twig.extension" />
<argument type="service" id="twig.loader" />
</service>
</services>
twig_js docs twigJsBundle
1. Підключити залежність JmsTwigJSBundle, зареєструвати в AppKernel...
2. Підключити ассет:
{% javascripts "%kernel.root_dir%/../vendor/jms/twig-js/twig.js" %}
<script language="javascript" src="{{ asset_url }}"></script>
{% endjavascripts %}
{% javascripts "@AcmeDemoBundle/Resources/views/Welcome/roomjs.html.twig"
filter="twig_js, ?yui_js" %}
<script language="javascript" src="{{ asset_url }}"></script>
{% endjavascripts %}
3. юзати в JavaScript:
var roomobj = {'price': 111, 'caption': 'some caption' ,'description': 'some
descr', 'size': 445, 'img': 'property_1.jpg' };
var content = Twig.render(roomjs.html, {room : roomobj})
$('.properties_list' ).html(content);
Дякую за увагу!
Питання?
mailto: dchabanenko@malkosua.com
callto: d_chabanenko.malkos

More Related Content

Viewers also liked

Импакт - программа для производителей упаковки и штанцформ
Импакт - программа для производителей упаковки и штанцформИмпакт - программа для производителей упаковки и штанцформ
Импакт - программа для производителей упаковки и штанцформAleksey Shibaev
 
Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1Dmitry Chabanenko
 
Impact для разработки штанцформ
Impact для разработки штанцформImpact для разработки штанцформ
Impact для разработки штанцформAleksey Shibaev
 
Trend Report (5.08 - 12.08.16)
Trend Report (5.08 - 12.08.16)Trend Report (5.08 - 12.08.16)
Trend Report (5.08 - 12.08.16)SKORPA MEDIA
 
малый бизнес в россии, сентябрь 2014
малый бизнес в россии, сентябрь 2014малый бизнес в россии, сентябрь 2014
малый бизнес в россии, сентябрь 2014SEMonline .Ru
 
Финансовая грамотность
Финансовая грамотностьФинансовая грамотность
Финансовая грамотностьRodin-kontent
 
Вводная лекция
Вводная лекцияВводная лекция
Вводная лекцияUMIS
 
Fibonachi theory
Fibonachi theoryFibonachi theory
Fibonachi theoryUMIS
 
Indicators
IndicatorsIndicators
IndicatorsUMIS
 
Presentation
PresentationPresentation
PresentationUMIS
 
Figures of continue tendency
Figures of continue tendencyFigures of continue tendency
Figures of continue tendencyUMIS
 
Trends
TrendsTrends
TrendsUMIS
 
Power levels
Power levelsPower levels
Power levelsUMIS
 
Elliot theory
Elliot theoryElliot theory
Elliot theoryUMIS
 
TA "Introductory part"
TA "Introductory part"TA "Introductory part"
TA "Introductory part"UMIS
 

Viewers also liked (19)

Импакт - программа для производителей упаковки и штанцформ
Импакт - программа для производителей упаковки и штанцформИмпакт - программа для производителей упаковки и штанцформ
Импакт - программа для производителей упаковки и штанцформ
 
Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1
 
Impact для разработки штанцформ
Impact для разработки штанцформImpact для разработки штанцформ
Impact для разработки штанцформ
 
Обзор рынка
Обзор рынкаОбзор рынка
Обзор рынка
 
Дивергенция - секреты разворотов рынка
Дивергенция - секреты разворотов рынкаДивергенция - секреты разворотов рынка
Дивергенция - секреты разворотов рынка
 
Принципы построения торговой системы
Принципы построения торговой системыПринципы построения торговой системы
Принципы построения торговой системы
 
Price action простые свечные паттерны
Price action простые свечные паттерныPrice action простые свечные паттерны
Price action простые свечные паттерны
 
Trend Report (5.08 - 12.08.16)
Trend Report (5.08 - 12.08.16)Trend Report (5.08 - 12.08.16)
Trend Report (5.08 - 12.08.16)
 
малый бизнес в россии, сентябрь 2014
малый бизнес в россии, сентябрь 2014малый бизнес в россии, сентябрь 2014
малый бизнес в россии, сентябрь 2014
 
Финансовая грамотность
Финансовая грамотностьФинансовая грамотность
Финансовая грамотность
 
Вводная лекция
Вводная лекцияВводная лекция
Вводная лекция
 
Fibonachi theory
Fibonachi theoryFibonachi theory
Fibonachi theory
 
Indicators
IndicatorsIndicators
Indicators
 
Presentation
PresentationPresentation
Presentation
 
Figures of continue tendency
Figures of continue tendencyFigures of continue tendency
Figures of continue tendency
 
Trends
TrendsTrends
Trends
 
Power levels
Power levelsPower levels
Power levels
 
Elliot theory
Elliot theoryElliot theory
Elliot theory
 
TA "Introductory part"
TA "Introductory part"TA "Introductory part"
TA "Introductory part"
 

Similar to Twig in symfony

Joomla 3. Що нового для розробників у новій версії - Віталій Маренков
Joomla 3. Що нового для розробників у новій версії - Віталій МаренковJoomla 3. Що нового для розробників у новій версії - Віталій Маренков
Joomla 3. Що нового для розробників у новій версії - Віталій МаренковIgor Bronovskyy
 
Layouts vs Templates - Sergey Borodylin
Layouts vs Templates - Sergey BorodylinLayouts vs Templates - Sergey Borodylin
Layouts vs Templates - Sergey BorodylinDrupalCamp Kyiv
 
DrupalTour.Chernivtsi — Як написати якісний модуль для Drupal 7 (Taras Tsuper...
DrupalTour.Chernivtsi — Як написати якісний модуль для Drupal 7 (Taras Tsuper...DrupalTour.Chernivtsi — Як написати якісний модуль для Drupal 7 (Taras Tsuper...
DrupalTour.Chernivtsi — Як написати якісний модуль для Drupal 7 (Taras Tsuper...Drupaltour
 
07 - vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...
07 -  vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...07 -  vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...
07 - vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...Igor Bronovskyy
 
Uml+Patterns2
Uml+Patterns2Uml+Patterns2
Uml+Patterns2apofig
 
10 asp.net
10 asp.net 10 asp.net
10 asp.net eleksdev
 
O.Posyniak - UI Components
O.Posyniak - UI ComponentsO.Posyniak - UI Components
O.Posyniak - UI ComponentsOleg Posyniak
 
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua", Maksym KindritskyiFwdays
 
Lec12 користувацькi елементи керування ed
Lec12 користувацькi елементи керування edLec12 користувацькi елементи керування ed
Lec12 користувацькi елементи керування edcit-cit
 
01 Incapsulation
01 Incapsulation01 Incapsulation
01 Incapsulationolegapster
 
JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in production
JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in productionJS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in production
JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in productionJSFestUA
 
Роман Савіцький, "Webcomponents & lit-element in production."
Роман Савіцький, "Webcomponents & lit-element in production."Роман Савіцький, "Webcomponents & lit-element in production."
Роман Савіцький, "Webcomponents & lit-element in production."Sigma Software
 
Using Metatags in Flex Developing
Using Metatags in Flex DevelopingUsing Metatags in Flex Developing
Using Metatags in Flex DevelopingRoman Shuper
 

Similar to Twig in symfony (20)

Joomla 3. Що нового для розробників у новій версії - Віталій Маренков
Joomla 3. Що нового для розробників у новій версії - Віталій МаренковJoomla 3. Що нового для розробників у новій версії - Віталій Маренков
Joomla 3. Що нового для розробників у новій версії - Віталій Маренков
 
ASP.Net MVC
ASP.Net MVCASP.Net MVC
ASP.Net MVC
 
Layouts vs Templates - Sergey Borodylin
Layouts vs Templates - Sergey BorodylinLayouts vs Templates - Sergey Borodylin
Layouts vs Templates - Sergey Borodylin
 
DrupalTour.Chernivtsi — Як написати якісний модуль для Drupal 7 (Taras Tsuper...
DrupalTour.Chernivtsi — Як написати якісний модуль для Drupal 7 (Taras Tsuper...DrupalTour.Chernivtsi — Як написати якісний модуль для Drupal 7 (Taras Tsuper...
DrupalTour.Chernivtsi — Як написати якісний модуль для Drupal 7 (Taras Tsuper...
 
07 - vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...
07 -  vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...07 -  vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...
07 - vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...
 
Uml+Patterns2
Uml+Patterns2Uml+Patterns2
Uml+Patterns2
 
Theme24-jQuery
Theme24-jQueryTheme24-jQuery
Theme24-jQuery
 
ASP.Net basics
ASP.Net basics ASP.Net basics
ASP.Net basics
 
10 asp.net
10 asp.net 10 asp.net
10 asp.net
 
CSS по БЕМ
 CSS по БЕМ CSS по БЕМ
CSS по БЕМ
 
O.Posyniak - UI Components
O.Posyniak - UI ComponentsO.Posyniak - UI Components
O.Posyniak - UI Components
 
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
 
Lec12 користувацькi елементи керування ed
Lec12 користувацькi елементи керування edLec12 користувацькi елементи керування ed
Lec12 користувацькi елементи керування ed
 
Design patterns part 2
Design patterns part 2Design patterns part 2
Design patterns part 2
 
01 Incapsulation
01 Incapsulation01 Incapsulation
01 Incapsulation
 
JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in production
JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in productionJS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in production
JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in production
 
Роман Савіцький, "Webcomponents & lit-element in production."
Роман Савіцький, "Webcomponents & lit-element in production."Роман Савіцький, "Webcomponents & lit-element in production."
Роман Савіцький, "Webcomponents & lit-element in production."
 
08 Templates
08 Templates08 Templates
08 Templates
 
Using Metatags in Flex Developing
Using Metatags in Flex DevelopingUsing Metatags in Flex Developing
Using Metatags in Flex Developing
 
cpp-2013 #20 Best practices
cpp-2013 #20 Best practicescpp-2013 #20 Best practices
cpp-2013 #20 Best practices
 

More from Dmitry Chabanenko

KussiyCherkassy 2013 3 (updated)
KussiyCherkassy 2013 3 (updated)KussiyCherkassy 2013 3 (updated)
KussiyCherkassy 2013 3 (updated)Dmitry Chabanenko
 
KussiyCherkassy 2013 2 (updated)
KussiyCherkassy 2013 2 (updated)KussiyCherkassy 2013 2 (updated)
KussiyCherkassy 2013 2 (updated)Dmitry Chabanenko
 
куссыйчеркассы 2013 1 (updated)
куссыйчеркассы 2013 1 (updated)куссыйчеркассы 2013 1 (updated)
куссыйчеркассы 2013 1 (updated)Dmitry Chabanenko
 
індекс фрактальності як міра складності фондового ринку
індекс фрактальності як міра складності фондового ринкуіндекс фрактальності як міра складності фондового ринку
індекс фрактальності як міра складності фондового ринкуDmitry Chabanenko
 
куссыйчеркассы 2013 3
куссыйчеркассы 2013 3куссыйчеркассы 2013 3
куссыйчеркассы 2013 3Dmitry Chabanenko
 
куссыйчеркассы 2013 2
куссыйчеркассы 2013 2куссыйчеркассы 2013 2
куссыйчеркассы 2013 2Dmitry Chabanenko
 
куссыйчеркассы 2013
куссыйчеркассы 2013куссыйчеркассы 2013
куссыйчеркассы 2013Dmitry Chabanenko
 
робастна стійкість
робастна стійкістьробастна стійкість
робастна стійкістьDmitry Chabanenko
 
Soloviev cherkassy (vladimir soloviev's conflicted copy 2013 07-08)
Soloviev cherkassy (vladimir soloviev's conflicted copy 2013 07-08)Soloviev cherkassy (vladimir soloviev's conflicted copy 2013 07-08)
Soloviev cherkassy (vladimir soloviev's conflicted copy 2013 07-08)Dmitry Chabanenko
 
Принципы работы интернет.
Принципы работы интернет. Принципы работы интернет.
Принципы работы интернет. Dmitry Chabanenko
 
об’єднання експертів фінансових ринків 3
об’єднання експертів фінансових ринків 3об’єднання експертів фінансових ринків 3
об’єднання експертів фінансових ринків 3Dmitry Chabanenko
 
обєднання експертів фінансових ринків
обєднання експертів фінансових ринківобєднання експертів фінансових ринків
обєднання експертів фінансових ринківDmitry Chabanenko
 

More from Dmitry Chabanenko (20)

06 02 алгоритмы
06 02 алгоритмы06 02 алгоритмы
06 02 алгоритмы
 
KussiyCherkassy 2013 3 (updated)
KussiyCherkassy 2013 3 (updated)KussiyCherkassy 2013 3 (updated)
KussiyCherkassy 2013 3 (updated)
 
KussiyCherkassy 2013 2 (updated)
KussiyCherkassy 2013 2 (updated)KussiyCherkassy 2013 2 (updated)
KussiyCherkassy 2013 2 (updated)
 
куссыйчеркассы 2013 1 (updated)
куссыйчеркассы 2013 1 (updated)куссыйчеркассы 2013 1 (updated)
куссыйчеркассы 2013 1 (updated)
 
індекс фрактальності як міра складності фондового ринку
індекс фрактальності як міра складності фондового ринкуіндекс фрактальності як міра складності фондового ринку
індекс фрактальності як міра складності фондового ринку
 
Chab
ChabChab
Chab
 
куссыйчеркассы 2013 3
куссыйчеркассы 2013 3куссыйчеркассы 2013 3
куссыйчеркассы 2013 3
 
куссыйчеркассы 2013 2
куссыйчеркассы 2013 2куссыйчеркассы 2013 2
куссыйчеркассы 2013 2
 
а.с.лукьянчук
а.с.лукьянчука.с.лукьянчук
а.с.лукьянчук
 
куссыйчеркассы 2013
куссыйчеркассы 2013куссыйчеркассы 2013
куссыйчеркассы 2013
 
робастна стійкість
робастна стійкістьробастна стійкість
робастна стійкість
 
проект енигма
проект енигмапроект енигма
проект енигма
 
графы
графыграфы
графы
 
Soloviev cherkassy (vladimir soloviev's conflicted copy 2013 07-08)
Soloviev cherkassy (vladimir soloviev's conflicted copy 2013 07-08)Soloviev cherkassy (vladimir soloviev's conflicted copy 2013 07-08)
Soloviev cherkassy (vladimir soloviev's conflicted copy 2013 07-08)
 
Chabanenko seminar20121226
Chabanenko seminar20121226Chabanenko seminar20121226
Chabanenko seminar20121226
 
Принципы работы интернет.
Принципы работы интернет. Принципы работы интернет.
Принципы работы интернет.
 
об’єднання експертів фінансових ринків 3
об’єднання експертів фінансових ринків 3об’єднання експертів фінансових ринків 3
об’єднання експертів фінансових ринків 3
 
ПСЕП лекція 2
ПСЕП лекція 2ПСЕП лекція 2
ПСЕП лекція 2
 
ПСЕП лекція 1
ПСЕП лекція 1ПСЕП лекція 1
ПСЕП лекція 1
 
обєднання експертів фінансових ринків
обєднання експертів фінансових ринківобєднання експертів фінансових ринків
обєднання експертів фінансових ринків
 

Twig in symfony

  • 2. План 1. Призначення шаблонізатора twig 2. Основи twig (демонстрація standalone twig) a. Основи розмітки засобами twig b. поняття блоків, extend, include, render (in symfony) c. поняття хелперу та функції в twig d. Оператори розгалуження та циклів у twig 3. Викристання twig в symfony2 (демонстрація) 4. Розробка власної функції та фільтра в twig 5. Приклад використання twig_js
  • 3. Two Step View pattern Transform View model data -> logical presentation no specific formatting, may be html, xml, json, arrays, etc Template View logical presentation -> Physical representation html layout
  • 4. Призначення шаблонізатора twig <!DOCTYPE html> <html> <head> <title>My Webpage</title> </head> <body> <ul id="navigation"> {% for item in navigation %} <li><a href="{{ item.href }}">{{ item.caption }}</a></li> {% endfor %} </ul> <h1>My Webpage</h1> {{ a_variable }} </body> </html> 1. розділення верстки та коду 2. перетворення масивів даних у html-текст 3. повторне використання фрагментів (шаблонів) html-коду 4. виведення форм
  • 5. Основи розмітки засобами twig виведення: <a href="{{ url }}">{{ text }}</a> обчислення та логіка: {% set foo = 'foo' %} {% set flag = false %} {% if flag == true %} <h3>Sometext</h3> {% endif %} {# Коментарі #}
  • 6. План демонстрації standalone twig (github link) - встановлення twig через composer - Ініціалізація і конфігурація - Створення cache, конфігурація, відключення - Скачування готового шаблона - корекція посилань на ассети (img, css, js) - layout.html.twig розмітка на блоки - index.html.twig заміна блоку content - приклад циклу (відображення масиву даних) - приклад include іншого шаблону в циклі
  • 7. Поняття блоків twig http://twig.sensiolabs.org/doc/functions/block.html <title>{% block title %}{% endblock %}</title> <h1>{{ block('title') }}</h1> {% block body %} {% endblock %}
  • 8. Поняття блоків (перезавантаження) {% extends "base.html" %} {% block title %}new title{% endblock %} {% block content %} new content {% endblock %}
  • 10. Поняття фільтрів та функцій filters: {{ users|length }} functions: {{ date(user.created_at) }}
  • 11. Огляд деяких функцій та фільтрів abs {{ number|abs }} capitalize {{ 'my first car'|capitalize }} date_modify {{ post.published_at|date_modify("+1 day")|date("m/d/Y") }} format {{ "I like %s and %s."|format(foo, "bar") }} lower {{ 'WELCOME'|lower }} upper {{ 'welcome'|upper }} {# outputs 'WELCOME' #} title {{ 'my first car'|title }} {# outputs 'My First Car' #} template_from_string {{ include(template_from_string("Hello {{ name }}")) }}
  • 12. Огляд деяких функцій (масиви) join {{ [1, 2, 3]|join('|') }} slice {{ '12345'|slice(1, 2) }} {# outputs 23 #} slice {{ '12345'[:2] }} {# will display "12" #} {{ '12345'[2:] }} {# will display "345" #} range {% for i in range(0, 3) %} {{ i }}, {% endfor %} max, min {{ max(1, 3, 2) }}
  • 13. Оператори розгалуження if defined: {% if foo is defined %} … {% endif %} empty: {% if foo is empty %} … {% endif %} odd: {{ var is odd }} even: {{ var is even }} null: {{ var is null }} sameas {% if foo.attribute is same as(false) %} <h2>someoutput</h2> {% endif %}
  • 14. Оператор циклу for {% for user in users %} <li>{{ user.username|e }}</li> {% endfor %} {# e - shortcut to escape a variable #} корисні “змінні”: loop.index - # of iterations from the beginning (1 indexed) loop.index0 - # of iterations from the beginning (0 indexed) loop.revindex - # of iterations from the end (1 indexed) loop.revindex0 - # of iterations from the end (0 indexed) loop.first - true if first iteration loop.last - true if last iteration loop.length - # of iterations
  • 15. only array keys: {% for key in users|keys %} <li>{{ key }}</li> {% endfor %} keys and values: {% for key, user in users %} <li>{{ key }}: {{ user.username|e }}</li> {% endfor %}
  • 16. Особливості використання twig в symfony docs Розміщення шаблонів: app/Resources/views/ path/to/bundle/Resources/views/ імена шаблонів: AcmeBlogBundle:Blog:index.html.twig
  • 17. План демонстрації symfony (gh link) - розмістити той же index з шаблона у layout.html.twig, ассети - у відпов. папки - пофіксити посилання на ассети (css, js, images) - створити декілька раутів (використовуючи існуючий контролер), додати ссилки у менюшку, змінити урл в конфігурації, @Template annotations - sub-render для квартир - власний twig-фільтр dotdotdot
  • 18. підключення ассетів (+app/config.yml) {% stylesheets 'bundles/app/css/*' filter='cssrewrite' %} <link rel="stylesheet" href="{{ asset_url }}" /> {% endstylesheets %} {% javascripts '@AppBundle/Resources/public/js/*' '@AcmeBarBundle/Resources/public/js/form.js' '@AcmeBarBundle/Resources/public/js/calendar.js' %} <script src="{{ asset_url }}"></script> {% endjavascripts %} {% image '@AppBundle/Resources/public/images/example.jpg' %} <img src="{{ asset_url }}" alt="Example" /> {% endimage %}
  • 19. app.security - The security context. app.user - The current user object. app.request - The request object. app.session - The session object. app.environment - The current environment (dev, prod, etc). app.debug - True if in debug mode. False otherwise.
  • 20. Використання routing в twig - створити новий раут - додати відповідний action до контролеру - створити шаблон - додавати посилання path("_routename")
  • 21. sub-render - створити повноцінний action в контролері - рендер цього action’а можна викликати в шаблоні: <div id="sidebar"> {{ render(controller( 'AcmeDemoBundle:Welcome:view', { 'max': 3 } )) }} </div>
  • 22. Створення власного фільтра доки: standalone twig extension symfony twig extension - розробка src/Acme/DemoBundle/Twig/Extension/DotDotDotExtension.php - реєстрація # app/config/services.xml <parameters> <parameter key="twig.extension.acme.dotdotdot.class" >AcmeDemoBundleTwigExtensionDotDotDotExtension</parameter> </parameters> <services> <service id="twig.extension.acme.dotdotdot" class="%twig.extension.acme. dotdotdot.class%" public="false"> <tag name="twig.extension" /> <argument type="service" id="twig.loader" /> </service> </services>
  • 23. twig_js docs twigJsBundle 1. Підключити залежність JmsTwigJSBundle, зареєструвати в AppKernel... 2. Підключити ассет: {% javascripts "%kernel.root_dir%/../vendor/jms/twig-js/twig.js" %} <script language="javascript" src="{{ asset_url }}"></script> {% endjavascripts %} {% javascripts "@AcmeDemoBundle/Resources/views/Welcome/roomjs.html.twig" filter="twig_js, ?yui_js" %} <script language="javascript" src="{{ asset_url }}"></script> {% endjavascripts %} 3. юзати в JavaScript: var roomobj = {'price': 111, 'caption': 'some caption' ,'description': 'some descr', 'size': 445, 'img': 'property_1.jpg' }; var content = Twig.render(roomjs.html, {room : roomobj}) $('.properties_list' ).html(content);
  • 24. Дякую за увагу! Питання? mailto: dchabanenko@malkosua.com callto: d_chabanenko.malkos