Пара плюшек для своего блога на Rainlab.Blog

Сам по себе плагин блога весьма скудноват по возможностям в сравнении возможностями эталонного WordPress. Архив, теги, подборки, галереи, embedded контент и т.д. требует дополнительных плагинов или разработки функциональности вручную. Такой подход лежит в основе самой OctoberCMS.

Но вот чего не хватает самой cms, это аналога admin bar'a

screenshot-wpadminbar

Касательно блога: требуется возможность сразу перейти на страницу редактирования записи.

Кнопка редактировать пост

Как только я завёл этот блог, то сразу добавил такую кнопку. На страницу с компонентом записи требуется добавить информацию о текущем пользователе. В простейшем случае, если пользователь залогинен, то отображать кнопку редактирования.

... 
[blogPost]
slug = "{{ :slug }}"
categoryPage = "blog/category"
...

==

<?php
function onEnd()
{
    if ($this->post) {
        $this['backendUser'] = BackendAuth::getUser();
    } 
}
?>
==

...
    {% if backendUser %}
        <a 
            href="/backend/rainlab/blog/posts/update/{{ post.id }}" 
            class="btn" 
            role="button"
        >Редактировать</a>
    {% endif %}  
...

С переходом в админку разобрались.

Кнопка предпросмотр

Тут сложнее

Заготовка под кнопку оставлена разработчиками в файле plugins\rainlab\blog\controllers\posts\_post_toolbar.htm. Формально кнопка в DOM`е, но она перманентно скрыта.

...
    <!-- Preview -->
    <a
        href="<?= URL::to($pageUrl) ?>"
        target="_blank"
        class="btn btn-primary oc-icon-crosshairs <?php if (!false): ?>hide<?php endif ?>"
        data-control="preview-button">
            <?= e(trans('backend::lang.form.preview_title')) ?>
    </a>
...

Причины и сложности, как я их вижу:

  1. Компонент записи размещается конечным разработчиком. Плагин не знает на каком url открывать предпросмотр.
  2. Разработчик может разместить несколько компонентов на нескольких cms страницах. Как выбирать url?

Костыль следующий:

...
    <!-- Preview -->
    <a
        href="<?= 'https://tyapk.ru/blog/post/'.$formModel->slug ?>"
        target="_blank"
        class="btn btn-primary oc-icon-crosshairs <?php if (!$formModel->slug): ?>hide<?php endif ?>"
        data-control="preview-button">
            <?= e(trans('cms::lang.editor.preview')) ?>
    </a>
...

Переменная $formModel находится в vars и хранить текущую запись (пост). Если в записи содержися slug (а содержится он после сохранения), то отображается кнопка предпросмотра.

Да, слетит при обновлении, но костыль и есть костыль.

Похожие записи

FrontEnd контроллеры в OctoberCMS

В OctoberCMS нет концепции frontEnd контроллеров. Иными словами, идеология этой CMS не подразумевает возможность просто создать некий ProductController с несколькими action для обслуживания маршрутов Route::method('product/{id}', 'ProductController@show'). Вместо этого предлагается использовать компоненты плагинов. Именно компоненты являются формой frontEnd контроллеров.