PostManager
PostManager получает опубликованные записи одного типа, учитывает дату публикации и подготавливает данные для вывода в шаблоне.Поддерживает
- получение опубликованной записи по URL
- получение списка с сортировкой и ограничением
- получение записей по идентификаторам
- подсчёт опубликованных записей
- формирование локализованных URL записей
- создание краткого описания из содержимого
- выбор возвращаемых полей
- безопасную работу без произвольных SQL-фрагментов
Для каждого типа записей создаётся отдельный экземпляр менеджера.
Быстрый старт
$postManager = new PostManager('news');
$posts = $postManager->getPublishedList(
orderBy: 'publish_date',
limit: 10,
columns: [
'id',
'title',
'url',
'content',
]
);
foreach ($posts as $post) {
?>
<article>
<h2>
<a href="<?php echo $post['post_url']; ?>">
<?php echo $post['title']; ?>
</a>
</h2>
<p><?php echo $post['short_description']; ?></p>
</article>
<?php
}Поля post_url и short_description создаются менеджером на основе выбранных url и content.
Создание менеджера
__construct(string $postType, ?Database $db = null)
Первым параметром передаётся системное имя типа записей:
$postManager = new PostManager('news');Допустимы латинские буквы, цифры, _ и -.
Если имя имеет недопустимый формат, выбрасывается InvalidArgumentException.
Без второго аргумента используется основная база данных CMS. При необходимости можно передать другой экземпляр Database:
$postManager = new PostManager(
'news',
$database
);Получение записи по URL
getPublishedByUrl(string $url): ?array
Возвращает опубликованную запись по её URL:
$post = $postManager->getPublishedByUrl('release-notes');
if ($post === null) {
return;
}Начальные и конечные / удаляются. Вложенные сегменты не поддерживаются.
Метод возвращает null, если:
- URL пустой
- после удаления крайних
/URL содержит/ - запись не найдена
- запись не опубликована
- дата публикации ещё не наступила
- дата публикации имеет некорректный формат
Метод получает все поля записи и дополнительно подготавливает:
post_typeс системным именем типа записейpost_urlс локализованным публичным URLshort_descriptionс кратким текстом записи
Структурированные поля этого метода возвращаются в исходном формате базы данных.
Формирование URL
getUrl(string $slug): string
Формирует локализованный публичный URL записи:
$url = $postManager->getUrl('release-notes');Например, для типа записей с публичным URL blog результат может выглядеть так:
/ru/blog/release-notesНачальные и конечные / у идентификатора удаляются.
Метод использует публичный URL типа записей и текущий язык сайта.
Если идентификатор пустой или содержит вложенные сегменты, выбрасывается InvalidArgumentException.
Если для типа записей не настроен публичный URL, выбрасывается RuntimeException.
Получение списка
getPublishedList(string $orderBy = 'id', string $order = 'DESC', ?int $limit = null, int $offset = 0, array $columns = ...): array
Возвращает список опубликованных записей:
$posts = $postManager->getPublishedList(
orderBy: 'publish_date',
order: 'DESC',
limit: 10,
offset: 0
);Параметры
| Параметр | Тип | Описание |
|---|---|---|
$orderBy |
string |
Поле сортировки. По умолчанию id. |
$order |
string |
Направление ASC или DESC. |
$limit |
int|null |
Максимальное количество записей. |
$offset |
int |
Смещение. Используется только вместе с $limit. |
$columns |
array |
Список возвращаемых полей. |
Допустимые поля сортировки:
idtitledatepublish_dateviews
По умолчанию из базы данных выбираются:
idtitleurlimgauthordatepublish_dateviews
Каждый результат дополнительно получает поле post_type.
Если выбранное поле url содержит корректный идентификатор записи, результат также получает post_url.
Чтобы получить дополнительные поля, передайте их последним параметром:
$posts = $postManager->getPublishedList(
limit: 10,
columns: [
'id',
'title',
'url',
'content',
'meta',
]
);При выборе content менеджер добавляет поле short_description.
Если выбраны структурированные поля, они преобразуются в массивы:
metacategoryglobal_metaglobal_categorycommentseo
Получение записей по ID
getPublishedByIds(array $ids, array $columns = ...): array
Возвращает опубликованные записи по идентификаторам:
$posts = $postManager->getPublishedByIds([
15,
27,
42,
]);Идентификаторы приводятся к целым числам. Нулевые, отрицательные и повторяющиеся значения исключаются.
Результат сортируется по id по возрастанию.
Для выбора дополнительных полей передайте второй параметр:
$posts = $postManager->getPublishedByIds(
[15, 27],
[
'id',
'title',
'url',
'content',
'meta',
]
);Правила добавления post_url, short_description и преобразования структурированных полей совпадают с правилами списка.
Если после проверки не осталось допустимых идентификаторов, метод возвращает пустой массив.
Дополнительные поля
post_type
Добавляется к каждой записи и содержит системное имя типа:
$postType = $post['post_type'];post_url
Добавляется, если в результате присутствует поле url с непустым идентификатором без вложенных сегментов:
$url = $post['post_url'];URL учитывает публичный путь типа записей и текущий язык сайта.
short_description
Добавляется, если в результате присутствует поле content:
$description = $post['short_description'];При подготовке краткого описания:
- декодируются HTML-сущности
- удаляются HTML-теги
- удаляется содержимое
script,style,noscriptиtemplate - переносы и повторяющиеся пробелы заменяются одним пробелом
- текст сокращается примерно до
180символов - при сокращении текст по возможности завершается на границе слова
- к сокращённому тексту добавляется
...
Если текст короче установленного ограничения, многоточие не добавляется.
Подсчёт записей
countPublished(): int
Возвращает количество опубликованных записей выбранного типа:
$count = $postManager->countPublished();При подсчёте учитываются статус и дата публикации.
Правила публикации
Запись считается опубликованной, если:
- поле
statusсодержитpublish publish_dateне задана или не превышает текущее время
Эти правила используются при получении списков, записей по идентификаторам и подсчёте.
При получении одной записи по URL дополнительно проверяется корректность значения publish_date.
Исключения
| Исключение | Когда возникает |
|---|---|
InvalidArgumentException |
Тип записи содержит недопустимые символы. |
InvalidArgumentException |
Идентификатор для getUrl() пустой или содержит /. |
InvalidArgumentException |
Передано неподдерживаемое поле сортировки. |
InvalidArgumentException |
Направление сортировки отличается от ASC и DESC. |
InvalidArgumentException |
Лимит меньше 1. |
InvalidArgumentException |
Смещение отрицательное или передано без лимита. |
InvalidArgumentException |
Массив выбираемых полей пуст. |
RuntimeException |
Для типа записей не настроен публичный URL. |
RuntimeException также может возникнуть при получении записей с полем url, поскольку менеджер автоматически формирует для них post_url.
Важные замечания
- один экземпляр работает только с одним типом записей
- менеджер возвращает только опубликованные записи
- списки индексируются начиная с
0 - каждый результат получает поле
post_type post_urlдобавляется только при наличии корректного поляurlshort_descriptionдобавляется только при наличии поляcontent- произвольные SQL-условия не поддерживаются
- для данных записи текущего запроса используйте
PageData