Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Шаблоны

Шаблон (вид) — файл с разметкой HTML, в которую подставляются данные. Контроллер готовит данные, шаблон отвечает только за то, как они выглядят. Шаблоны CodeIgniter — обычные файлы PHP в папке app/Views; отдельного языка шаблонов нет.

Первый шаблон

Команды для шаблонов нет — файл создают вручную. Создайте папку app/Views/posts и в ней файл index.php:

<!-- app/Views/posts/index.php -->
<h1>Статьи</h1>
<p>Здесь будет список статей.</p>

Выводит шаблон функция view() в контроллере:

// app/Controllers/Posts.php
public function index(): string
{
    return view('posts/index');
}

Откройте /posts — появится заголовок «Статьи». Имя шаблона пишут относительно app/Views и без расширения .php.

Передача данных

Второй аргумент view() — массив. Его ключи становятся переменными шаблона:

public function index(): string
{
    $posts = [
        ['id' => 1, 'title' => 'Первая статья'],
        ['id' => 2, 'title' => 'Вторая статья'],
    ];
 
    return view('posts/index', ['posts' => $posts]);
}

Пока статьи записаны прямо в коде; во второй главе они будут приходить из базы данных.

Вывод значений и циклы

Запись <?= ... ?> выводит значение. Для циклов и условий в шаблонах используют форму с двоеточием:

<!-- app/Views/posts/index.php -->
<h1>Статьи</h1>
 
<?php if ($posts === []): ?>
    <p>Статей пока нет.</p>
<?php else: ?>
    <ul>
        <?php foreach ($posts as $post): ?>
            <li>
                <a href="<?= url_to('posts.show', $post['id']) ?>"><?= esc($post['title']) ?></a>
            </li>
        <?php endforeach ?>
    </ul>
<?php endif ?>

На странице /posts появится список из двух ссылок. Адреса строит url_to() по имени маршрута posts.show из прошлых уроков.

Экранирование

Функция esc() превращает опасные символы в безопасный текст: угловые скобки тега станут видимыми знаками, а не разметкой. Вторым аргументом задают место, куда вставляется значение:

ВызовГде применять
esc($text)Текст между тегами
esc($text, 'attr')Значение атрибута
esc($text, 'js')Строка внутри JavaScript

Частая ошибка

Запись <?= $post['title'] ?> без esc() выводит значение как есть: тег script из заголовка выполнится в браузере посетителя. CodeIgniter не экранирует вывод автоматически — оборачивайте в esc() каждое значение, пришедшее от пользователя или из базы.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.