Создание пользовательского интерфейса (Symfony Docs)
Теперь всё готово для создания первой версии пользовательского интерфейса сайта. Пока мы не будем акцентировать внимание на красивом внешнем виде, а лишь сделаем его просто функциональным.
Помните экранирование, которое нам пришлось добавить в контроллере для пасхального яйца, чтобы избежать проблем с безопасностью? По этой причине мы не будем использовать PHP в наших шаблонах. Вместо него мы воспользуемся Twig. Помимо экранирования вывода, Twig предоставляет много полезных возможностей, которые мы будем использовать (например, наследование шаблонов).
Все страницы сайта будут использовать один и тот же макет. При установке Twig автоматически была создана директория templates/
, вместе с примером макета в файле base.html.twig
.
templates/base.html.twig
Макет может определять элементы block
Создадим шаблон для домашней страницы проекта в файле templates/conference/index.html.twig
:
templates/conference/index.html.twig
Шаблон наследует base.html.twig
и переопределяет блоки title
и body
.
Разделитель {% %}
в шаблоне указывает на действия и структуру .
Разделитель {{ }}
используется для отображения чего-либо. Например,
выведет строковое представление конференции (результат вызова метода __toString
в объекте Conference
).
Обновите контроллер, чтобы отрисовать шаблон Twig:
Здесь много всего интересного.
Для отрисовки шаблона, нам необходим объект Twig — Environment
(главная точка входа Twig). Обратите внимание, для того чтобы получить экземпляр Twig, достаточно всего лишь указать его тип (так называемый type-hint) в аргументах метода контроллера. Гибкость Symfony позволяет автоматически внедрить зависимость нужного типа.
Нам также нужен репозиторий для конференций, чтобы получить все конференции из базы данных.
Метод render()
в коде контроллера передаёт массив переменных в шаблон и отрисовывает его. В нашем примере мы передаём список объектов Conference
в переменной conferences
.
Контроллер — это обычный PHP-класс. Чтобы использовать зависимости совершенно необязательно наследовать класс AbstractController
. Вы можете удалить его (но всё же не делайте этого, так как в следующих шагах мы будем использовать некоторые его методы для упрощения).
У каждой конференции должна быть собственная страница с комментариями. Добавление новой страницы включает в себя создание контроллера, определение маршрута (route) и создание соответствующего шаблона.
Добавьте метод show()
в контроллер src/Controller/ConferenceController. php
:
Данный метод работает несколько иначе, чем остальные, которые мы встречали ранее. Мы указываем, что экземпляр Conference
должен быть внедрён в метод. Однако в базе данных могут быть несколько конференций и Symfony может определить, какую из них вы хотите получить по идентификатору
, переданному в строке запроса (id
— это первичный ключ в таблице conference
базы данных).
Получить комментарии конкретной конференции можно с помощью метода findBy()
, который в качестве первого аргумента принимает критерий (criteria), то есть условие, по которому нужно получить интересующие нас данные.
Последним шагом будет создание файла templates/conference/show.html.twig
:
templates/conference/show.html.twig
Для вызова |
, который изменяет значение исходной переменной. Например, comments|length
отображает количество комментариев, а comment.createdAt|format_datetime('medium', 'short')
форматирует дату в понятное для чтения представление.
Попробуйте посетить страницу «первой» конференции по пути /conference/1
и обратите внимание на следующую ошибку:
Эта ошибка из-за использования фильтра format_datetime
, которого нет в ядре Twig. Подобное сообщение об ошибке подскажет вам, какой пакет должен быть установлен для исправления проблемы:
Теперь страница работает правильно.
Остался последний шаг, чтобы закончить первую версию интерфейса — создать ссылки на страницы конференций с главной страницы:
Но жёстко заданный путь — плохая идея по ряду причин. Самая главная из них состоит в том, что если вы измените путь (например, с /conference/{id}
на /conferences/{id}
), потребуется также изменить и все ссылки вручную.
Вместо этого используйте Twig-функцию path()
Функция path()
генерирует путь к странице, исходя из названия переданного маршрута. Значения параметров маршрута передаются в виде массива.
При тысячах посетителей мы получим довольно много комментариев. Если мы будем отображать все комментарии на одной странице, она станет слишком большой.
В репозитории комментариев создайте метод getCommentPaginator()
, который будет возвращать объект Paginator, в зависимости от конференции и смещении (начальной позиции):
Для облегчения тестирования показываем не более 2 комментариев на каждой странице.
Чтобы управлять постраничной навигацией в шаблоне Twig, передайте объект Doctrine Paginator вместо Doctrine Collection:
Контроллер получает параметр offset
из строки запроса ($request->query
) в виде целого числа (getInt()
), который по умолчанию равен 0, если он отсутствует.
Вычисления смещения previous
и next
производятся на основе информации из объекта Paginator.
Наконец, обновите шаблон, чтобы добавить ссылки на следующую и предыдущую страницы:
Теперь вы сможете перемещаться по комментариям с помощью ссылок «Previous» и «Next»:
Вероятно, вы заметили, что оба метода в контроллере ConferenceController
используют окружение Twig в качестве аргумента. Однако вместо того чтобы внедрять эту зависимость в каждый метод, мы будем использовать вспомогательный метод render()
из родительского класса:
This work, including the code samples, is licensed under a Creative Commons BY-NC-SA 4.0 license.
Versionphp — как добавить пагинацию в htaccess
спросил
Изменено 12 дней назад
Просмотрено 3к раз
привет, я хочу добавить разбиение на страницы с помощью htaccess. /.]*)$ /index.php?sitename=$1&owner=$2 [NC,L,QSA]
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google Зарегистрироваться через Facebook Зарегистрируйтесь, используя адрес электронной почты и парольОпубликовать как гость
Электронная почтаТребуется, но не отображается
Опубликовать как гость
Электронная почтаТребуется, но не отображается
Техники PHP: Онлайн-класс по разбивке на страницы
- Все темы
- Технологии
- Разработка программного обеспечения
- Языки программирования
С Кевином Скоглундом Нравится 53 пользователям
Продолжительность: 1ч 11м Уровень мастерства: средний Дата выпуска: 15. 06.2021
Начать бесплатную пробную версию на 1 месяц
Детали курса
Узнайте, как разбить список элементов или записей базы данных на страницы с помощью PHP. В этом курсе Кевин Скоглунд рассматривает основы нумерации страниц — полезного шаблона проектирования для разбиения больших наборов данных на более мелкие, более управляемые разделы. Он предоставляет варианты использования и показывает, как написать фактический PHP-код для поиска записей и отображения определенного количества на странице. Затем он показывает, как разбивать записи из базы данных SQL на страницы, добавлять ссылки на страницы и использовать объектно-ориентированное программирование для определения функций разбиения на страницы внутри одного класса и создания ссылок между страницами. Каждая глава содержит практические уроки программирования, которые помогут вам улучшить свои навыки работы с PHP.