PageData


PageData предоставляет данные страницы или записи текущего HTTP-запроса.

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

  • получение содержимого текущей страницы или записи
  • получение данных маршрута и шаблона
  • работу с обычными и составными метаполями
  • получение категорий, связанных страниц и записей
  • формирование SEO-тегов, Open Graph, Twitter Cards и Schema.org
  • получение комментариев
  • получение языковых вариантов страниц и записей с формированием hreflang
  • временную подмену данных текущего запроса

CMS автоматически предоставляет данные текущего запроса через PageData. Создавать экземпляр класса вручную не нужно.

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

php
$title = PageData::getTitle();
$content = PageData::getContent();
$image = PageData::getImage();

Получение метаполя:

php
$subtitle = PageData::getMeta('subtitle');

Основные данные

Метод Возвращает Описание
getId() int Идентификатор страницы или записи.
getTitle() string Заголовок с экранированными HTML-символами; подходит для вывода в HTML.
getRawTitle() string Исходный заголовок без HTML-экранирования.
getPostName() string Название типа записи.
getContent() string Основное содержимое.
getImage() string Путь к изображению.
getAuthorId() int Идентификатор автора.
getCreateDate() string Дата создания.
getPublishDate() string Дата публикации.
getModifiedDate() string Дата последнего изменения.
getViews() int Количество просмотров.
getMore() string Дополнительное содержимое записи.

Для обычного вывода заголовка в HTML используйте getTitle():

php
echo '<h1>' . PageData::getTitle() . '</h1>';

getRawTitle() нужен, когда требуется исходный текст, например для собственной обработки. Перед выводом такого значения в HTML его необходимо экранировать с учётом места вывода. Повторно экранировать результат getTitle() не нужно.

Если значение отсутствует, строковые методы возвращают пустую строку, а числовые методы возвращают 0.

getImage(bool $domain = false): string

Без аргумента возвращает сохранённый путь:

php
$image = PageData::getImage();

Для получения полного URL передайте true:

php
$image = PageData::getImage(true);

Данные маршрута

Метод Возвращает Описание
getPageKey() ?string Базовый ключ страницы или типа записи.
getPageUrl() ?string Оставшаяся часть маршрута после базового ключа.
getPage() ?string Значение параметра текущей административной страницы или null.
getPostTypeId() int Идентификатор типа текущей записи или 0.
getPostType() ?string Системное имя типа записи.
getPageFullUrl() string Полный путь текущей страницы.
getTemplate() string Название активного шаблона.
getType() string Тип текущего запроса.

Для URL записи /ru/news/release-notes значения могут выглядеть так:

text
getPageKey()  -> news
getPageUrl()  -> release-notes
getPostType() -> news

getPageFullUrl(bool $domain = false): string

Возвращает путь с учётом языкового префикса:

php
$url = PageData::getPageFullUrl();

Пример:

text
/ru/news/release-notes

Для получения адреса с доменом передайте true:

php
$url = PageData::getPageFullUrl(true);

Языковые варианты

getTranslationKey(): string

Возвращает общий ключ, связывающий языковые варианты текущей страницы или записи:

php
$translationKey = PageData::getTranslationKey();

Если ключ не задан, возвращается пустая строка.

Для получения самих языковых вариантов используйте getLanguageVersions().

getLanguageVersions(): array

Возвращает языковые варианты текущей страницы, записи или главной страницы:

php
$versions = PageData::getLanguageVersions();

foreach ($versions as $version) {
    echo '<a href="' . $version['url'] . '">' . $version['label'] . '</a>';
}

Каждый элемент содержит:

Поле Тип Описание
code string Код языка.
label string Отображаемое название языка.
url string Локализованный путь страницы.
absolute-url string Полный URL с доменом.
current bool Является ли язык текущим.
default bool Является ли язык языком сайта по умолчанию.
indexable bool Разрешена ли индексация языкового варианта.
canonical string Сохранённый canonical языкового варианта.

В результат включаются только активные языки, для которых существует соответствующий вариант содержимого. Для обычных страниц и записей используются только опубликованные варианты.

Для записи языковые варианты определяются по её типу и общему значению translation_key.

Если мультиязычность выключена или у обычной страницы либо записи не задан translation_key, метод возвращает пустой массив. Если существует только один языковой вариант, массив содержит один элемент, но hreflang не формируется.

Метаполя

getMeta($key, $row = false, $column = false): mixed

Возвращает значение метаполя:

php
$subtitle = PageData::getMeta('subtitle');

Для метаполя типа multi без дополнительных аргументов возвращается весь массив:

php
$sections = PageData::getMeta('sections');

Для получения отдельной ячейки метаполя типа multi передайте номер строки и столбца:

php
$title = PageData::getMeta(
    'sections',
    0,
    0
);

Если метаполе или указанная ячейка отсутствует, возвращается пустая строка.

getTableData(string $key): array

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

php
$table = PageData::getTableData('specifications');
$firstCellText = $table['rows'][0][0]['v'] ?? '';

Результат содержит ключ rows: массив строк таблицы. Каждая строка содержит массив ячеек. Нумерация строк и ячеек начинается с 0.

Каждая ячейка содержит:

Ключ Тип Описание
t string Тип ячейки: td или th.
v string Текст ячейки без HTML-экранирования.
a string Выравнивание: left, center, right или пустая строка.
r int Количество объединяемых строк, не меньше 1.
c int Количество объединяемых столбцов, не меньше 1.

Если метаполе отсутствует или имеет другой тип, возвращается ['rows' => []].

Для получения готовой HTML-таблицы используйте PageData::getMeta('specifications'). Для доступа к отдельным ячейкам таблицы используйте getTableData(), а не аргументы строки и столбца у getMeta().

Галерея

Для метаполя типа gallery метод getMeta() возвращает массив URL выбранных изображений:

php
$images = PageData::getMeta('photos');

if (is_array($images)) {
    foreach ($images as $imageUrl) {
        echo '<img src="' . htmlspecialchars($imageUrl, ENT_QUOTES, 'UTF-8') . '" alt="">';
    }
}

Здесь photos является ключом метаполя галереи.

Каждый элемент массива содержит путь от корня сайта, начинающийся с /, без домена. Идентификаторы изображений и названия файлов в результат не входят.

Порядок изображений соответствует порядку в метаполе. Не найденные записи галереи пропускаются.

Для существующего метаполя без выбранных изображений возвращается пустой массив. Если само метаполе отсутствует, getMeta() возвращает пустую строку, поэтому перед перебором используется is_array().

Для получения отдельного изображения обращайтесь к элементу возвращённого массива. Аргументы строки и столбца у getMeta() для галереи не используются.

Данные метаполей

Для методов объекта используйте текущий экземпляр:

php
$pageData = PageData::current();

$meta = $pageData->getMetaList();
$name = $pageData->getMetaName('subtitle');
$type = $pageData->getMetaType('subtitle');
Метод Описание
getMetaList() Возвращает все значения метаполей.
getMetaName($key) Возвращает название метаполя.
getMetaType($key) Возвращает тип метаполя.

Связанные страницы и записи

getRelationItems($key): array

Возвращает данные страниц и записей, выбранных в метаполе типа relations:

php
$items = PageData::current()->getRelationItems('related-content');

$page = $items['page-7'] ?? null;
$post = $items['12-15'] ?? null;

Каждый элемент результата содержит массив данных соответствующей страницы или записи. Ключ page-7 обозначает страницу с ID 7; ключ 12-15 — запись с ID 15 типа записей с ID 12.

Порядок выбранных материалов сохраняется. Отсутствующие материалы и ссылка на саму текущую страницу или запись пропускаются.

Если метаполе отсутствует, имеет другой тип или не содержит подходящих материалов, возвращается пустой массив.

Статус публикации и язык не используются как фильтры.

getRelations($key)

Возвращает только связанные записи, сгруппированные по названию типа записи и идентификатору:

php
$relations = PageData::current()->getRelations('related-content');
$post = $relations['news'][15] ?? null;

Связанные страницы в результат не входят. Внутри каждого типа записи сортируются по ID по возрастанию.

Если метаполе отсутствует или имеет другой тип, возвращается пустая строка. Для метаполя relations без подходящих записей возвращается пустой массив.

Как и getRelationItems(), метод не фильтрует материалы по статусу публикации или языку.

Для получения только сгруппированных идентификаторов связей используйте PageData::getMeta($key). Этот метод не возвращает данные самих материалов.

Категории и глобальные данные

php
$pageData = PageData::current();

$category = $pageData->getCategory('important');
$globalMeta = $pageData->getGlobalMeta('contacts', 'phone');
$globalCategory = $pageData->getGlobalCategory('regions', 'minsk');
$categoryList = $pageData->getGlobalCategoryList('regions');
Метод Описание
getCategory($key) Возвращает локальную категорию текущей записи.
getGlobalMeta($category, $key) Возвращает значение глобального метаполя.
getGlobalCategory($category, $key) Возвращает значение глобальной категории.
getGlobalCategoryList($category) Возвращает список глобальных категорий группы.

Перед вызовом getGlobalCategory() убедитесь, что нужный ключ существует в группе.

SEO

Метод Возвращает Описание
getSeoTitle() string SEO-заголовок.
getSeoDescription() string SEO-описание.
getSeoKeys() string Ключевые слова.
getNoIndex() string Признак запрета индексации.
getCanonical() string Сохранённый canonical.
getSeoHead() string Готовые SEO-теги и социальная разметка для head.
getFaviconUrl() string URL favicon.
getFaviconHead() string Готовый тег favicon.

Вывод тегов в шаблоне:

php
echo PageData::getSeoHead();
echo PageData::getFaviconHead();

getSeoHead() может сформировать:

  • заголовок страницы
  • description и keywords
  • robots
  • canonical
  • hreflang для языковых вариантов текущей страницы или записи
  • Open Graph
  • Twitter Cards
  • JSON-LD-разметку Schema.org

hreflang формируется автоматически для индексируемых языковых вариантов. Вариант с canonical, указывающим на другой URL, исключается из набора.

Теги выводятся, только если в наборе остаются не менее двух вариантов и среди них присутствует текущая страница или запись.

Если отдельный SEO-заголовок, описание или ключевые слова не заданы, используются данные страницы и глобальные настройки сайта.

Для социальной разметки сначала используется изображение текущей страницы, а при его отсутствии — изображение по умолчанию из настроек SEO.

Open Graph и Twitter Cards учитывают состояние соответствующих настроек. Для страницы 404 социальная разметка, canonical и Schema.org не выводятся.

Базовая Schema.org-разметка описывает сайт и текущую страницу. Если странице или типу записей назначена отдельная схема, она дополняет данные текущей страницы.

Комментарии

getComments(): array

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

php
$comments = PageData::getComments();

comments(): ?CommentsList

Возвращает объект для работы с комментариями:

php
$comments = PageData::current()->comments();
$count = $comments?->publishCommentCount() ?? 0;

Для страницы без объекта комментариев метод возвращает null.

Текущий экземпляр

current(): PageData

Возвращает текущий экземпляр:

php
$pageData = PageData::current();

Подмена данных текущего запроса

Для изменения данных используйте текущий экземпляр:

php
$pageData = PageData::current();

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

Основные значения

Метод Изменяемое значение
setTitle($title) Заголовок, возвращаемый getTitle().
setContent($content) Содержимое, возвращаемое getContent().
setImage($img) Изображение, возвращаемое getImage().
setTemplate($template) Название, возвращаемое getTemplate().
setType($type) Тип, возвращаемый getType().
php
$pageData->setTitle('Временный заголовок');
$pageData->setContent('<p>Временное содержимое</p>');
$pageData->setImage('/upload/preview.jpg');

Методы изменяют только данные PageData. Они не запускают маршрутизацию повторно и не сохраняют страницу.

setPostData($post)

Подменяет основные данные текущей записи:

php
$pageData->setPostData([
    'post_type' => 'news',
    'url' => 'preview',
    'title' => 'Предварительный просмотр',
    'content' => '<p>Содержимое записи</p>',
    'img' => '/upload/preview.jpg',
    'more' => '',
    'meta' => [],
    'comment' => [],
    'global_meta' => [],
    'category' => [],
    'global_category' => [],
]);

Передаваемый массив должен содержать все перечисленные ключи.

Ключ Описание
post_type Системное имя типа записи.
url Идентификатор записи в URL.
title Заголовок.
content Основное содержимое.
img Изображение.
more Дополнительное содержимое.
meta Значения метаполей.
comment Массив комментариев.
global_meta Глобальные метаполя.
category Категории записи.
global_category Глобальные категории записи.

Метод изменяет только перечисленные данные. Идентификатор, автор, даты, SEO и остальные значения текущего объекта сохраняются без изменений.

Массив comment становится доступен через getComments(). Объект, возвращаемый comments(), автоматически не пересоздаётся.

setMeta($meta): void

Подменяет определения и значения метаполей:

php
$pageData->setMeta([
    'post_meta' => [
        'subtitle' => [
            'name' => 'Подзаголовок',
            'type' => 'input',
        ],
    ],
    'meta' => [
        'subtitle' => 'Новый подзаголовок',
    ],
]);

$subtitle = PageData::getMeta('subtitle');

post_meta содержит определения полей, а meta — их значения. Метод также принимает JSON-строку с определениями метаполей.

Переданные поля добавляются или заменяются. Остальные метаполя текущего объекта не удаляются.

Важные замечания

  • класс описывает только текущий запрос
  • для произвольной страницы используйте PageManager
  • для произвольных опубликованных записей используйте PostManager
  • не создавайте экземпляр PageData вручную
  • отсутствующие строковые значения обычно возвращаются как пустая строка
  • методы подмены не сохраняют изменения в базе данных
  • методы подмены не запускают маршрутизацию и выбор шаблона повторно
  • setPostData() требует полный набор перечисленных ключей