PostManager


PostManager получает опубликованные записи одного типа, учитывает дату публикации и подготавливает данные для вывода в шаблоне.

Поддерживает

  • получение опубликованной записи по URL
  • получение списка с сортировкой и ограничением
  • получение записей по идентификаторам
  • подсчёт опубликованных записей
  • формирование локализованных URL записей
  • создание краткого описания из содержимого
  • выбор возвращаемых полей
  • безопасную работу без произвольных SQL-фрагментов

Для каждого типа записей создаётся отдельный экземпляр менеджера.

Быстрый старт

php
$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)

Первым параметром передаётся системное имя типа записей:

php
$postManager = new PostManager('news');

Допустимы латинские буквы, цифры, _ и -.

Если имя имеет недопустимый формат, выбрасывается InvalidArgumentException.

Без второго аргумента используется основная база данных CMS. При необходимости можно передать другой экземпляр Database:

php
$postManager = new PostManager(
    'news',
    $database
);

Получение записи по URL

getPublishedByUrl(string $url): ?array

Возвращает опубликованную запись по её URL:

php
$post = $postManager->getPublishedByUrl('release-notes');

if ($post === null) {
    return;
}

Начальные и конечные / удаляются. Вложенные сегменты не поддерживаются.

Метод возвращает null, если:

  • URL пустой
  • после удаления крайних / URL содержит /
  • запись не найдена
  • запись не опубликована
  • дата публикации ещё не наступила
  • дата публикации имеет некорректный формат

Метод получает все поля записи и дополнительно подготавливает:

  • post_type с системным именем типа записей
  • post_url с локализованным публичным URL
  • short_description с кратким текстом записи

Структурированные поля этого метода возвращаются в исходном формате базы данных.

Формирование URL

getUrl(string $slug): string

Формирует локализованный публичный URL записи:

php
$url = $postManager->getUrl('release-notes');

Например, для типа записей с публичным URL blog результат может выглядеть так:

text
/ru/blog/release-notes

Начальные и конечные / у идентификатора удаляются.

Метод использует публичный URL типа записей и текущий язык сайта.

Если идентификатор пустой или содержит вложенные сегменты, выбрасывается InvalidArgumentException.

Если для типа записей не настроен публичный URL, выбрасывается RuntimeException.

Получение списка

getPublishedList(string $orderBy = 'id', string $order = 'DESC', ?int $limit = null, int $offset = 0, array $columns = ...): array

Возвращает список опубликованных записей:

php
$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 Список возвращаемых полей.

Допустимые поля сортировки:

  • id
  • title
  • date
  • publish_date
  • views

По умолчанию из базы данных выбираются:

  • id
  • title
  • url
  • img
  • author
  • date
  • publish_date
  • views

Каждый результат дополнительно получает поле post_type.

Если выбранное поле url содержит корректный идентификатор записи, результат также получает post_url.

Чтобы получить дополнительные поля, передайте их последним параметром:

php
$posts = $postManager->getPublishedList(
    limit: 10,
    columns: [
        'id',
        'title',
        'url',
        'content',
        'meta',
    ]
);

При выборе content менеджер добавляет поле short_description.

Если выбраны структурированные поля, они преобразуются в массивы:

  • meta
  • category
  • global_meta
  • global_category
  • comment
  • seo

Получение записей по ID

getPublishedByIds(array $ids, array $columns = ...): array

Возвращает опубликованные записи по идентификаторам:

php
$posts = $postManager->getPublishedByIds([
    15,
    27,
    42,
]);

Идентификаторы приводятся к целым числам. Нулевые, отрицательные и повторяющиеся значения исключаются.

Результат сортируется по id по возрастанию.

Для выбора дополнительных полей передайте второй параметр:

php
$posts = $postManager->getPublishedByIds(
    [15, 27],
    [
        'id',
        'title',
        'url',
        'content',
        'meta',
    ]
);

Правила добавления post_url, short_description и преобразования структурированных полей совпадают с правилами списка.

Если после проверки не осталось допустимых идентификаторов, метод возвращает пустой массив.

Дополнительные поля

post_type

Добавляется к каждой записи и содержит системное имя типа:

php
$postType = $post['post_type'];

post_url

Добавляется, если в результате присутствует поле url с непустым идентификатором без вложенных сегментов:

php
$url = $post['post_url'];

URL учитывает публичный путь типа записей и текущий язык сайта.

short_description

Добавляется, если в результате присутствует поле content:

php
$description = $post['short_description'];

При подготовке краткого описания:

  • декодируются HTML-сущности
  • удаляются HTML-теги
  • удаляется содержимое script, style, noscript и template
  • переносы и повторяющиеся пробелы заменяются одним пробелом
  • текст сокращается примерно до 180 символов
  • при сокращении текст по возможности завершается на границе слова
  • к сокращённому тексту добавляется ...

Если текст короче установленного ограничения, многоточие не добавляется.

Подсчёт записей

countPublished(): int

Возвращает количество опубликованных записей выбранного типа:

php
$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 добавляется только при наличии корректного поля url
  • short_description добавляется только при наличии поля content
  • произвольные SQL-условия не поддерживаются
  • для данных записи текущего запроса используйте PageData