Мы столкнулись с проблемой добавления товаров из 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 и добавить ваш плагин в выдачу.