Убрать часть Url

Приветствую! На сайте использую minishop2. Чтобы не засорять дерево ресурсов, создал категорию товаров Shop, в ней подкатегории товаров. Страница Shop не нужна, и не нужно, чтобы она была в url. Как от нее избавиться? Юзал компонент CustomUrls, работает, но при выводе, к примеру, меню, в url соответственно shop присутствует.
Спасибо
Андрей
20 марта 2015, 17:13
modx.pro
6
9 473
+1

Комментарии: 19

Sergey Pozhidaev
21 марта 2015, 08:13
0
Отключите Использовать вложенные URL в настройках.
    Андрей
    21 марта 2015, 08:17
    0
    Это не вариант. У подкатегорий есть еще подкатегории. И товар должен иметь нормальный url — /домен.local/категория/товар. Мне нужно лишь убрать один пункт.
    Можно было-бы вынести категории в корень и смириться с тем, что в дереве все перемешано, однако, удобно иметь общий контейнер для всех товаров и категорий, и производить при необходимости поиск товара по всему каталогу.
      Sergey Pozhidaev
      21 марта 2015, 08:38
      0
      Тогда с помощью редиректов попробуйте в htaccess или конфигурации nginx если он стоит.
      Что-то типа этого:
      RewriteCond %{ENV:REDIRECT_STATUS} ^$
      RewriteRule ^shop/category1/item/$ %{HTTP_HOST}category1/item/ [R=301,L]
        Николай
        21 марта 2015, 09:21
        +1
        Никакие редиректы не нужны. Нужно просто снять публикацию с ресурса шоп. Тогда его как бы не будет.
          Андрей
          21 марта 2015, 09:34
          0
          В адресе он все равно присутствует.
            Андрей
            Андрей
            21 марта 2015, 11:54
            0
            Так URI пропиши ручками.
            Пункт «Заморозить URI»
              Андрей
              21 марта 2015, 12:28
              0
              Можно и так. Я ищу, так сказать, более универсальный способ. Заказчик захочет добавить категорию, и мне нужно будет ему объяснять, что нужно еще поставить галочку там то, и дописать url. Хотя… появилась мысль подкрутить компонент CustomUrls. Попробую.
                De Ribaskin
                21 марта 2015, 12:56
                0
                Напиши плагин на событие OnDocFormSave, где формируй и записывай необходимый URI.
                И не надо ничего будет объяснять заказчикам
                  Андрей
                  21 марта 2015, 13:04
                  0
                  Да, пожалуй, это лучший вариант. Спасибо!
                  Андрей
                  Андрей
                  21 марта 2015, 13:02
                  0
                  Универсальным в данном случае может быть либо плагин, либо сторонний компонент.
            Андрей
            21 марта 2015, 13:04
            +1
            Всем спасибо за помощь, решение найдено. Все же, надеюсь в будущих релизах, будет возможность исключать контейнеры из урл, без использования плагинов и тд. Мне кажется, это нужно.
              Виталий Валерьевич
              21 марта 2015, 13:23
              +1
              Как вышли из ситуации? Опубликуйте решение, если не затруднит.
                Андрей
                21 марта 2015, 16:31
                8
                +1
                Ну вот как-то так набросал на скорую руку. -)

                Создал плагин, повесил на событие 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') {
                    // код выше
                }
                  Сергей Сергеевич
                  04 февраля 2016, 09:15
                  0
                  Начинаю только вникать в MODX, и ваше решение для моей ситуации очень полезно.
                  Скажите пожалуйста, правильно ли я понял следующие моменты:

                  — Плагин при сохранении ресурса, ищет заданный контейнер, и если он есть просто исключает его методом заморозки URI?

                  — здесь надо указать тот контейнер, который мы хотим исключать в URL?

                  if($v == 22 || $v == 0) continue;

                  — Чтобы был на конце .html его надо здесь прописать

                  $resource->set('uri', implode('/',array_reverse($aliases)) . '/' . $curAlias . '.html');

                  Большое спасибо!
                    A B
                    A B
                    01 августа 2016, 14:13
                    0
                    Работает ли этот способ, если я создаю ресурсы через процессор при импорте из CSV?
                      Андрей
                      01 августа 2016, 14:57
                      0
                      Работая с процессорами будут отрабатываться также и плагины. Поэтому ответ — да, будет работать.
                      Александр
                      11 сентября 2018, 18:36
                      0
                      Плагин отличный, но упорно не хочет правильно работать на событии OnResourceSort, использует свое старое местонахождение, а не новое. А без этого весь смысл теряется.
                  Максим
                  21 марта 2015, 13:27
                  1
                  0
                  Есть еще такое исправление, пока не принятое: github.com/Qwarble/revolution/commit/df1902d5b68e02d760842c19f3a6e647f38ff6ab
                    Андрей Шевяков
                    26 января 2017, 11:01
                    1
                    0
                    Нашел решение для исключения ресурсов-контейнеров из урл у Ильи Уткина.
                    Попробовал у себя на сайте, все отлично работает.
                    Вот статья: Исключение алиаса ресурса в URL дочерних ресурсов
                    Может кому пригодится!
                      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                      19