Как добавить свой плагин в Winter Sitemap

Мы столкнулись с проблемой добавления товаров из Shop List в файл Sitemap в одном из проектов. Для этой задачи в WinterCMS есть специальный плагин от разработчиков, но мы не нашли информации о том, как связать наш плагин с выдачей. После продолжительного поиска в интернете, нам удалось найти всего две статьи на эту тему. Это подтолкнуло нас написать данное руководство, чтобы помочь другим не тратить столько времени на элементарные вещи.


Для выполнения манипуляций следует перейти к файлам плагина в корневой папке и обратить внимание на нужный файл - в моем случае это файл "Items", связанный со всеми товарами на сайте.

Чтобы добавить необходимый функционал, следует внести изменения в файл Plugin, вставив соответствующий код:

<?php namespace RaccoonLord\TestPlugin;

use System\Classes\PluginBase;
use Event;
use \Winter\Sitemap\Models\Definition;

class Plugin extends PluginBase
{

    public function boot()
    {
        // Sitemap
        $this->bootMenuItem();
    }

    private function bootMenuItem() {
        Event::listen('pages.menuitem.listTypes', function () {
            return [

                // Список плагинов с их названиями в настройках Sitemap
                'all-products' => 'Все товары',

            ];
        });

        Event::listen('pages.menuitem.getTypeInfo', function ($type) {

            // Проверяем есть ли наш плагин и выполняем код
            if ($type == 'all-products') {
                return Models\Items::getMenuTypeInfo($type);
            }

        });

        Event::listen('pages.menuitem.resolveItem', function ($type, $item, $url, $theme) {
            if ($type == 'all-products') {

                // Обращаемся к нужной функции в модели
                return Models\Items::resolveMenuItem($item, $url, $theme);

            }
        });
    }

    public function registerComponents()
    {
    }

    public function registerSettings()
    {
    }
}


Добавляем следующую строку в начало модели:

use Cms\Classes\Page;

Далее необходимо вставить данный код в саму модель.

public static function resolveMenuItem($item, $url, $theme) {

    // Назначаем название файла шаблона
    $pageName = 'shop-single';
    $cmsPage = Page::loadCached($theme, $pageName);

    // Обращамся к функции по выводу всех товаров
    $items   = Items::orderBy('id', 'ASC')->get()
        ->map(function ($item) use ($cmsPage, $url, $pageName) {

            // Генерация URL страницы
            $pageUrl = $cmsPage->url($pageName, [

                // В таблице с Product у нас уже имеется колонка со slug
                'slug' => $item->slug,

                // Теперь получаем ее для категории (мои категории используют Relation)
                'category' => $item->category['0']['slug']
            ]);

            return [
                // Не до конца понимаю зачем нужен title, но решил оставить, как есть
                'title' => $item->name,

                // Ссылка на страницу с товаром
                'url' => $pageUrl,

                // Дата последнего изменения (если оставить закомментированной, то cms сама будет ее подставлять)
                // 'mtime' => $item->updated_at,
            ];
        })
        ->toArray();

    return [
        'items' => $items,
    ];
}


После того, как вы отредактируете все необходимые переменные, вам останется лишь зайти в настройки плагина Sitemap и добавить ваш плагин в выдачу.