|
@@ -16,7 +16,7 @@ GET / HTTP/1.1
|
|
Host: example.com
|
|
Host: example.com
|
|
Accept: text/html
|
|
Accept: text/html
|
|
|
|
|
|
-<пустая строка>
|
|
|
|
|
|
+
|
|
```
|
|
```
|
|
|
|
|
|
Ответ:
|
|
Ответ:
|
|
@@ -62,7 +62,7 @@ Set-Cookie: key=LongAndWeirdRandomSecureCharset
|
|
</html>
|
|
</html>
|
|
```
|
|
```
|
|
|
|
|
|
- Обратите внимание на заголовок **Set-Cookie**. Именно он в себе хранит уникальный ключ, который будет запомнен браузером
|
|
|
|
|
|
+Обратите внимание на заголовок **Set-Cookie**. Именно он в себе хранит уникальный ключ, который будет запомнен браузером
|
|
- Браузер при каждом запросе к серверу отсылает ему этот ключ, подтверждая таким образом, что данное соединение - от конкретного пользователя.
|
|
- Браузер при каждом запросе к серверу отсылает ему этот ключ, подтверждая таким образом, что данное соединение - от конкретного пользователя.
|
|
|
|
|
|
```
|
|
```
|
|
@@ -117,7 +117,7 @@ echo $_SESSION['counter'];
|
|
|
|
|
|
## Шаблонизация, PHP, MVC, и Формы
|
|
## Шаблонизация, PHP, MVC, и Формы
|
|
|
|
|
|
-**PHP** изначально создавался как более продвинутый механизм для реализации **SSI** - **Server-Side-Include**, то есть вставка тех или иных динамических данных в статичный (по изначальной задумке) **HTML**. В старых
|
|
|
|
|
|
+**PHP** изначально создавался как более продвинутый механизм для реализации **SSI** - **Server Side Include**, то есть вставка тех или иных динамических данных в статичный (по изначальной задумке) **HTML**. В старых
|
|
версиях **PHP** синтаксис подобных вставок был более минималистичен и удобен, чем в современных версиях.
|
|
версиях **PHP** синтаксис подобных вставок был более минималистичен и удобен, чем в современных версиях.
|
|
|
|
|
|
### Исторический экскурс
|
|
### Исторический экскурс
|
|
@@ -131,8 +131,8 @@ echo $_SESSION['counter'];
|
|
|
|
|
|
### Шаблонно-ориентированные управляющие конструкции
|
|
### Шаблонно-ориентированные управляющие конструкции
|
|
|
|
|
|
-Отыскивать парные фигурные скобки не очень удобно в коде с преобладанием **HTML**, поэтому **PHP** имеет не только обычный Си-образный синтаксис для *if*, *while*, *for*, *foreach* и *switch*.
|
|
|
|
-В каждом случае основной формой альтернативного синтаксиса является изменение открывающей фигурной скобки на двоеточие (:), а закрывающей скобки на *endif;*, *endwhile;*, *endfor;*, *endforeach;* или *endswitch;* соответственно.
|
|
|
|
|
|
+Отыскивать парные фигурные скобки не очень удобно в коде с преобладанием **HTML**, поэтому **PHP** имеет не только обычный Си-образный синтаксис для `if`, `while`, `for`, `foreach` и `switch`.
|
|
|
|
+В каждом случае основной формой альтернативного синтаксиса является изменение открывающей фигурной скобки на двоеточие (:), а закрывающей скобки на `endif;`, `endwhile;`, `endfor;`, `endforeach;` или `endswitch;` соответственно.
|
|
|
|
|
|
```php
|
|
```php
|
|
<?php if ($a == 5): ?>
|
|
<?php if ($a == 5): ?>
|
|
@@ -216,23 +216,71 @@ $twig = new Twig_Environment($loader, array(
|
|
'cache' => '/path/to/compilation_cache',
|
|
'cache' => '/path/to/compilation_cache',
|
|
));
|
|
));
|
|
|
|
|
|
-echo $twig->render('index', array('name' => 'Vasiliy'));
|
|
|
|
|
|
+echo $twig->render('index.tpl', array('url' => 'http://google.com',
|
|
|
|
+ 'urlText' => 'Гугл'));
|
|
```
|
|
```
|
|
|
|
|
|
или
|
|
или
|
|
|
|
|
|
```php
|
|
```php
|
|
-require_once '/path/to/lib/Twig/Autoloader.php';
|
|
|
|
|
|
+require_once '/usr/share/php/Twig/Autoloader.php';
|
|
Twig_Autoloader::register();
|
|
Twig_Autoloader::register();
|
|
-$loader = new Twig_Loader_Filesystem('/path/to/templates');
|
|
|
|
|
|
+$loader = new Twig_Loader_Filesystem('templates/');
|
|
$twig = new Twig_Environment($loader, array(
|
|
$twig = new Twig_Environment($loader, array(
|
|
- 'cache' => '/path/to/compilation_cache',
|
|
|
|
-));
|
|
|
|
-echo $twig->render('index.html', array('name' => 'Fabien'));
|
|
|
|
|
|
+ 'cache' => '/tmp/',
|
|
|
|
+ ));
|
|
|
|
+
|
|
|
|
+echo $twig->render('index.tpl', array('url' => 'http://google.com',
|
|
|
|
+ 'urlText' => 'Гугл'));
|
|
```
|
|
```
|
|
|
|
|
|
### Переменные
|
|
### Переменные
|
|
|
|
|
|
|
|
+Переменные в шаблонах заключаются в двойные фигурные скобки.
|
|
|
|
+
|
|
|
|
+```jinja
|
|
|
|
+<html>
|
|
|
|
+<a href="{{ url }}">{{ urlText }}</a>
|
|
|
|
+</html>
|
|
|
|
+```
|
|
|
|
+
|
|
|
|
+Не имеет значения, как обращаться к полям ассоциативных массивов:
|
|
```jinja
|
|
```jinja
|
|
-<a href="{{ url }}">{{ urlText}}</a>
|
|
|
|
|
|
+<html>
|
|
|
|
+<a href="{{ url['href'] }}">{{ url.title }}</a>
|
|
|
|
+</html>
|
|
```
|
|
```
|
|
|
|
+
|
|
|
|
+Можно обратиться полю с помощью функции attribute:
|
|
|
|
+
|
|
|
|
+```jinja
|
|
|
|
+{# equivalent to the non-working foo.data-foo #}
|
|
|
|
+{# Комментарии заключаются в фигурную скобки и решетки #}
|
|
|
|
+{{ attribute(foo, 'data-foo') }}
|
|
|
|
+```
|
|
|
|
+
|
|
|
|
+### Управляющие конструкции
|
|
|
|
+
|
|
|
|
+Управляющие конструкции заключаются в {% и %}:
|
|
|
|
+```jinja
|
|
|
|
+<h2>Время логинoв:</h2>
|
|
|
|
+<ul>
|
|
|
|
+ {% for time in times %}
|
|
|
|
+ <li>{{ time|date('d/m/Y H:i') }}</li>
|
|
|
|
+ {% endfor %}
|
|
|
|
+</ul>
|
|
|
|
+```
|
|
|
|
+
|
|
|
|
+В данном примере происходит циклический вывод массива врёмен логинов. `date` - фильтр, который используется для форматирования строки с датой и временем.
|
|
|
|
+
|
|
|
|
+```jinja
|
|
|
|
+{% if not logged %}
|
|
|
|
+ <div class='error'>Вы не залогинены!</div>
|
|
|
|
+{% else %}
|
|
|
|
+ <div class='info'>Добро пожаловать, {{ username }}!</div>
|
|
|
|
+{% endif %}
|
|
|
|
+```
|
|
|
|
+
|
|
|
|
+Больше информации о [Twig](http://twig.sensiolabs.org/documentation)
|
|
|
|
+
|
|
|
|
+## Домашнее задание
|