Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос нашим менторам. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете
Ключевые аспекты веб-разработки на PHP

Шаблонизация

<?php

$app->get('/', function () {
    return 'Main Page';
});

В примере выше устанавливается обработчик, который на запрос главной страницы отдаст строчку Main Page. Такой пример хорошо подходит для демонстрации, но настоящие сайты отдают html. Причём, его размер может достигать килобайтов. Если мы попробуем создавать его так:

<?php

$app->get('/', function () {
    $title = 'My super site';
    return "<html><body><h1>{$title}</h1></body></html>";
});

то такой код очень быстро превратится в неподдерживаемое месиво. Для работы с html во фреймворках используют специальные библиотеки, называемые шаблонизаторами. Принцип работы заключается в том, что в отдельном файле описывается шаблон, обычно представляемый как html с вкраплениями кода на целевом языке или псевдоязыке (примеры не из php):

{% extends "email-html_base.tmpl" %}

{% block content %}
    <p>
        {{ msg }}
    </p>
    <p>
      <b>AFFECTED INSTANCES:</b>
    </p>
    <table class='noborder'>
      <tr>
    <th>UUID</th><th>IP Address</th><th>Host</th>
      </tr>
      {% for instance in instances -%}
        <tr>
          <td>{{ instance.id }}</td><td>{{ instance.accessIPv4 }}</td><td>{{ instance.name }}</td>
        </tr>
      {% endfor %}
    </table>
{% endblock %}

Некоторые виды шаблона не очень похожи на html и крайне популярны в других языках:

doctype html
html
  head
    title Slim Examples
    meta name="keywords" content="template language"
    meta name="author" content=author
    link rel="icon" type="image/png" href=file_path("favicon.png")
    javascript:
      alert('Slim supports embedded javascript!')

  body
    h1 Markup examples

    #content
      p This example shows you how a basic Slim file looks.

    == yield

    - if items.any?
      table#items
        - for item in items
          tr
            td.name = item.name
            td.price = item.price
    - else
      p No items found. Please add some inventory.
        Thank you!

    div id="footer"
      == render 'footer'
      | Copyright &copy; #{@year} #{@author}

А библиотека, в свою очередь, читает этот файл и подставляет необходимые переменные. Таким образом один шаблон может использоваться для разных данных. Например, на Хекслете множество уроков, но шаблон, который формирует html соответствующей страницы - один. Присмотритесь к шаблонам выше. Внутри них нередко используется свой язык с условными конструкциями, циклами и другими механизмами.

Возможно, вы уже догадались, что php сам является шаблонизатором. Ранее я неоднократно упоминал, что php-код может перемешиваться с html в одном файле. Посмотрите типичный пример:

<?php

$unique = uniqid();
$reference = function($lang) use ($unique) {
    return $lang . $unique;
};

?>

<div class="code-snippets">
    <ul class="nav nav-tabs">
        <?php $first = true; foreach($examples as $lang => $code): ?>
        <li role="presentation" class="<?php echo $reference($lang) . ($first ? ' active' : ''); $first = false ?>">
            <a href="#<?php echo $reference($lang) ?>" aria-controls="<?php echo $reference($lang) ?>" role="tab" data-toggle="tab">
                <?php echo $lang ?>
            </a>
        </li>
        <?php endforeach ?>
    </ul>
    <div class="tab-content">
        <?php $first = true; foreach($examples as $lang => $code): ?>
        <div role="tabpanel" class="tab-pane <?php echo ($first ? 'active' : ''); $first = false ?>" id="<?php echo $reference($lang) ?>">
            <pre><code><?php echo $code ?></code></pre>
        </div>
        <?php endforeach ?>
    </div>
</div>

Получается, что сам файл — это html-код, в котором есть вставки php. Обратите внимание на то, что привычные конструкции имеют немного другой вид. В отличие от обычного кода, в котором мы используем фигурные скобки, в таком варианте используются :, и ключевые слова. Такой подход выбран разработчиками языка исключительно для удобства.

Безопасность

Об этом редко говорят во время обучения, но безопасность крайне важна при работе с html формами и шаблонами в целом. Не понимая основ защиты, вы гарантированно сделаете ошибку, которая может привести к фатальным последствиям для проекта. Например, отсутствие экранирования пользовательских данных приведёт к тому, что появится возможность провести XSS атаку.

Самостоятельная работа

  1. Подключите к вашему проекту, созданному в предыдущем уроке, пакет PHP-View в соответствии с документацией(!). В начале файла public/index.php определите псевдоним для работы с пакетом:

        <?php
    
        use Slim\Views\PhpRenderer;
    
  2. Создайте директорию templates в корне проекта.

  3. Добавьте обработчик в файл public/index.php:

        <?php
    
        $app->get('/about', function ($request, $response) {
            $phpView = new PhpRenderer('../templates');
            return $phpView->render($response, 'about.phtml');
        });
    
  4. Создайте файл templates/about.phtml. Добавьте туда любой html-код.

  5. Запустите проект по аналогии как в предыдущем уроке, и откройте в браузере страницу http://localhost:5555/about.


<span class="translation_missing" title="translation missing: ru.web.courses.lessons.mentors.mentor_avatars">Mentor Avatars</span>

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят менторы из команды Хекслета или другие студенты.

Зарегистрироваться

или войти в аккаунт

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 115 курсов, 2000+ часов теории
  • 800 практических заданий в браузере
  • 250 000 студентов

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг».

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Rambler
Логотип компании Bookmate
Логотип компании Botmother

Есть вопрос или хотите участвовать в обсуждении?

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг».