Уменьшение вложенности товаров
Материал из Umicms
Версия от 14:33, 29 июня 2018; Lesnik512 (обсуждение | вклад) (Новая страница: «'''Актуально для версии 18.''' Часто для улучшения ранжирования в поисковых системах нужно…»)
Актуально для версии 18.
Часто для улучшения ранжирования в поисковых системах нужно уменьшать вложенность страниц. Например переместить товары на второй уровень, при этом сохранив структуру каталога.
Изначально для данной задачи использовал протокол Umap, но решение было не очень гибкое.
Недавно нашел более удачное решение, которое и привожу.
Для начала нужно перехватывать событие systemPrepare, которое вызывается уже после анализа URL и до генерации глобальных переменных.
Перехват события (файл events.php в папке classes/modules/catalog в директории шаблона, или custom_events.php в системной папке модуля):
new umiEventListener('systemPrepare', 'catalog', 'short_links');
Права на доступ к макросу (permissions.php или permissions_custom.php):
$permissions = array(
'view' => array('short_links')
);
Сама функция с комментариями:
// импортируем Service в самом начале файла
use UmiCms\Service;
//...
public function short_links(iUmiEventPoint $oEventPoint) {
if ($oEventPoint->getMode() === "before") {
// парсим url в массив
$path_parts = Service::Request()->getPathParts();
// у нас ссылки вида /product/{$alt-name}/
// и соответственно здесь проверяется, соответствует ли ссылка данному шаблону
@list($part1, $alt_name, $part3) = $path_parts;
if ($part3 or $part1 !== 'product' or !$alt_name)
return true;
// ищем объект каталога по alt-name
$pages = new selector('pages');
$pages->types('hierarchy-type')->name('catalog', 'object');
$pages->option('return')->value('id');
$pages->where('alt_name')->equals($alt_name);
$page_id = $pages->first();
$page_id = $page_id ? @$page_id['id'] : false;
if (!$page_id)
return true;
// переопределяем данные, чтобы сгенерировалась нужная страница
$cmsController = cmsController::getInstance();
$cmsController->setCurrentElementId($page_id);
$cmsController->setCurrentModule('catalog');
$cmsController->setCurrentMethod('object');
}
return true;
}