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