Убрать часть Url
Приветствую! На сайте использую minishop2. Чтобы не засорять дерево ресурсов, создал категорию товаров Shop, в ней подкатегории товаров. Страница Shop не нужна, и не нужно, чтобы она была в url. Как от нее избавиться? Юзал компонент CustomUrls, работает, но при выводе, к примеру, меню, в url соответственно shop присутствует.
Спасибо
Спасибо
Комментарии: 19
Отключите Использовать вложенные URL в настройках.
Это не вариант. У подкатегорий есть еще подкатегории. И товар должен иметь нормальный url — /домен.local/категория/товар. Мне нужно лишь убрать один пункт.
Можно было-бы вынести категории в корень и смириться с тем, что в дереве все перемешано, однако, удобно иметь общий контейнер для всех товаров и категорий, и производить при необходимости поиск товара по всему каталогу.
Можно было-бы вынести категории в корень и смириться с тем, что в дереве все перемешано, однако, удобно иметь общий контейнер для всех товаров и категорий, и производить при необходимости поиск товара по всему каталогу.
Тогда с помощью редиректов попробуйте в htaccess или конфигурации nginx если он стоит.
Что-то типа этого:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^shop/category1/item/$ %{HTTP_HOST}category1/item/ [R=301,L]
Что-то типа этого:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^shop/category1/item/$ %{HTTP_HOST}category1/item/ [R=301,L]
Никакие редиректы не нужны. Нужно просто снять публикацию с ресурса шоп. Тогда его как бы не будет.
В адресе он все равно присутствует.
Так URI пропиши ручками.
Пункт «Заморозить URI»
Пункт «Заморозить URI»
Можно и так. Я ищу, так сказать, более универсальный способ. Заказчик захочет добавить категорию, и мне нужно будет ему объяснять, что нужно еще поставить галочку там то, и дописать url. Хотя… появилась мысль подкрутить компонент CustomUrls. Попробую.
Напиши плагин на событие OnDocFormSave, где формируй и записывай необходимый URI.
И не надо ничего будет объяснять заказчикам
И не надо ничего будет объяснять заказчикам
Да, пожалуй, это лучший вариант. Спасибо!
Универсальным в данном случае может быть либо плагин, либо сторонний компонент.
Всем спасибо за помощь, решение найдено. Все же, надеюсь в будущих релизах, будет возможность исключать контейнеры из урл, без использования плагинов и тд. Мне кажется, это нужно.
Как вышли из ситуации? Опубликуйте решение, если не затруднит.
Ну вот как-то так набросал на скорую руку. -)
Создал плагин, повесил на событие OnDocFormSave.
Создал плагин, повесил на событие OnDocFormSave.
<?php
if ($modx->event->name == 'OnDocFormSave') {
$parentIds = $modx->getParentIds($id, 4, array('context' => 'web')); // Получаем id всех родителей ресурса
$res = $modx->getObject('modResource',$id);
$curAlias = $res->get('alias'); // Алиас текущего ресурса
$cnt = count($parentIds); // Количество родителей
if($cnt > 2) {
$aliases = array(); // Массив для всех найденных алиасов
foreach($parentIds as $v) {
if($v == 22 || $v == 0) continue; // Если родитель - контейнер Shop(22) или главный родитель (0) - пропускаем.
$obj = $modx->getObject('modResource', $v);
$alias = $obj->get('alias');
$aliases[] = $alias;
}
$resource->set('uri', implode('/',array_reverse($aliases)) . '/' . $curAlias);
} else {
$resource->set('uri', $curAlias);
}
$resource->set('uri_override', true);
$resource->save();
}
Можно еще добавить условие, чтобы урл, таким образом, формировался только для новых ресурсов. Мне пока не нужно.if ($mode == 'new') {
// код выше
}
Начинаю только вникать в MODX, и ваше решение для моей ситуации очень полезно.
Скажите пожалуйста, правильно ли я понял следующие моменты:
— Плагин при сохранении ресурса, ищет заданный контейнер, и если он есть просто исключает его методом заморозки URI?
— здесь надо указать тот контейнер, который мы хотим исключать в URL?
— Чтобы был на конце .html его надо здесь прописать
Большое спасибо!
Скажите пожалуйста, правильно ли я понял следующие моменты:
— Плагин при сохранении ресурса, ищет заданный контейнер, и если он есть просто исключает его методом заморозки URI?
— здесь надо указать тот контейнер, который мы хотим исключать в URL?
if($v == 22 || $v == 0) continue;
— Чтобы был на конце .html его надо здесь прописать
$resource->set('uri', implode('/',array_reverse($aliases)) . '/' . $curAlias . '.html');
Большое спасибо!
Работает ли этот способ, если я создаю ресурсы через процессор при импорте из CSV?
Работая с процессорами будут отрабатываться также и плагины. Поэтому ответ — да, будет работать.
Плагин отличный, но упорно не хочет правильно работать на событии OnResourceSort, использует свое старое местонахождение, а не новое. А без этого весь смысл теряется.
Есть еще такое исправление, пока не принятое: github.com/Qwarble/revolution/commit/df1902d5b68e02d760842c19f3a6e647f38ff6ab
Нашел решение для исключения ресурсов-контейнеров из урл у Ильи Уткина.
Попробовал у себя на сайте, все отлично работает.
Вот статья: Исключение алиаса ресурса в URL дочерних ресурсов
Может кому пригодится!
Попробовал у себя на сайте, все отлично работает.
Вот статья: Исключение алиаса ресурса в URL дочерних ресурсов
Может кому пригодится!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.