К содержимому
Вывод в теме

Хелпер и свои темы

Обновлено

Вызов из другой темы

Хелпер приложения доступен как {$wa->code->…} и возвращает массив данных экрана. Перед использованием в теме другого приложения проверьте доступность объекта и метода:

{$_code = $wa->code}
{if $_code && method_exists($_code, 'docs')}
    {$docs = $_code->hub(['base_url' => 'https://example.com/docs/'])}
    <h1>{$docs.settings.heading|escape}</h1>
    {foreach $docs.projects as $project}
        <a href="{$project.link|escape}">{$project.name|escape}</a>
    {/foreach}
{/if}

Это хелпер приложения, поэтому проверка версии плагина для него не используется.

Метод Результат
docs($project = '', $slug = '', array $options = []) Полный экран: хаб, раздел, статья или поиск
hub(array $options = []) Хаб с плитками и меню
project($project, array $options = []) Вступление, главы и статьи раздела
article($project, $slug, array $options = []) Статья, оглавление и соседние статьи
search($query, array $options = []) Экран поиска с результатами
markdown($markdown) Готовый HTML из Markdown
toc($html) Заголовки h2/h3 в виде массива id, text, level

$project — адрес раздела, например guide, $slug — адрес статьи, например install.

Параметры options

Параметр Назначение
base_url Абсолютный корень поселения с завершающим /
main_project ID раздела для поселения одного проекта
query Переключает docs() на поиск
tag Адрес тега для фильтра хаба; по умолчанию берётся из GET-параметра tag, пустая строка отключает фильтр
preview Включает черновики только для пользователя с доступом к бэкенду приложения

Без base_url хелпер ищет поселение на текущем домене, предпочитая общий хаб. Если хаба нет, используется подходящее поселение раздела. При нескольких вариантах указывайте корень явно.

Неизвестные раздел и статья вызывают waException с кодом 404. Если адрес приходит от посетителя, обрабатывайте исключение в контроллере страницы.

Данные $docs

Штатные экраны получают массив $docs и алиасы $docs_<ключ>, например $docs.page и $docs_page. В index.html готовая разметка экрана доступна как $content. На странице ошибки $docs равен null.

Ключ Содержание
screen hub, project, article, search
settings eyebrow, heading, intro, metaTitle, metaDescription, настройки projects хаба
base_url, search_url Абсолютные адреса корня и поиска
projects Плитки хаба с учётом порядка, подписей, видимости и выбранного тега
menu Полное дерево доступных проектов с главами и статьями
tags, tag Теги хаба с name, url, count и выбранный тег либо null
recent На хабе — до шести обновлённых статей: name, link, project_name, updated_at
project, chapter, page Текущие записи либо null
chapters, pages Главы и статьи текущего проекта в порядке чтения
html Готовый HTML вступления или статьи
toc Оглавление h2/h3: id, text, level
previous, next Соседние статьи с полем link либо null
updated_at Дата изменения в формате Y-m-d H:i:s либо null
breadcrumbs Цепочка элементов name, url
seo title, description, canonical, type, og_title, og_description, og_image, robots, noindex
json_ld Массив объектов микроразметки
query, results Запрос и найденные статьи с name, project_name, project_url, link, excerpt
preview Признак разрешённого предпросмотра

Проект содержит id, url, name, description, intro, kind, icon, color, sort, status, SEO и даты. В дереве дополнительно доступны link, current, page_count, chapters, pages, index и tags. kind принимает theme, app, plugin; теги содержат name и url.

Глава содержит id, code_id, name, sort, pages. Статья содержит id, code_id, chapter_id, url, name, markdown, text, description, status, sort, SEO и даты; в дереве есть link и current. Значение markdown === null обозначает прежнюю HTML-страницу с текстом в text.

SEO-поля записей: meta_title, meta_description, og_title, og_description, og_image. Даты: datetime, update_datetime.

Раздел и статья

Пример для известного опубликованного раздела:

{$docs = $wa->code->project('guide')}
<h1>{$docs.project.name|escape}</h1>
<div>{$docs.html}</div>
{foreach $docs.chapters as $chapter}
    <h2>{$chapter.name|escape}</h2>
    {foreach $chapter.pages as $page}
        <a href="{$page.link|escape}">{$page.name|escape}</a>
    {/foreach}
{/foreach}

Статья с оглавлением и переходами:

{$docs = $wa->code->article('guide', 'install')}
<h1>{$docs.page.name|escape}</h1>
{foreach $docs.toc as $heading}
    <a href="#{$heading.id|escape}">{$heading.text|escape}</a>
{/foreach}
<article>{$docs.html}</article>
{if $docs.previous}
    <a href="{$docs.previous.link|escape}">{$docs.previous.name|escape}</a>
{/if}
{if $docs.next}
    <a href="{$docs.next.link|escape}">{$docs.next.name|escape}</a>
{/if}

Теги и поиск

{$docs = $wa->code->hub(['tag' => 'shop-script'])}
{foreach $docs.tags as $tag}
    <a href="{$docs.base_url|escape}?tag={$tag.url|escape:'url'}">
        {$tag.name|escape} ({$tag.count})
    </a>
{/foreach}
{foreach $docs.projects as $project}
    <a href="{$project.link|escape}">{$project.name|escape}</a>
{/foreach}

Тег фильтрует projects; menu, tags и recent остаются общими.

{$docs = $wa->code->search('установка')}
<form action="{$docs.search_url|escape}">
    <input name="query" value="{$docs.query|escape}">
    <button type="submit">Поиск</button>
</form>
{foreach $docs.results as $page}
    <a href="{$page.link|escape}">{$page.name|escape}</a>
    <p>{$page.excerpt|escape}</p>
{/foreach}

SEO и оформление HTML

При выводе в другом приложении самостоятельно примените SEO в его шаблоне страницы:

<title>{$docs.seo.title|escape}</title>
<meta name="description" content="{$docs.seo.description|escape}">
<link rel="canonical" href="{$docs.seo.canonical|escape}">
<meta name="robots" content="{$docs.seo.robots|escape}">
<meta property="og:title" content="{$docs.seo.og_title|escape}">
<meta property="og:description" content="{$docs.seo.og_description|escape}">
{foreach $docs.json_ld as $entity}
    <script type="application/ld+json">{$entity|json_encode:15}</script>
{/foreach}

Флаг 15 безопасно экранирует специальные символы JSON при вставке в script. Обычные строки выводите с |escape. Готовый $docs.html выводится без него.

HTML использует [data-code-callout], .code-markdown-code и button[data-code-copy]. Собственной теме нужно обеспечить оформление этих элементов и обработку копирования. Хелпер сам по себе не подключает стили и JavaScript штатной темы.