Форум русской поддержки Joomla!® CMS
06.12.2016, 04:53:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

Грамотное ЧПУ для своего компонента

 (Прочитано 215 раз)
0 Пользователей и 1 Гость смотрят эту тему.
john.deff
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 112



« : 14.09.2016, 20:56:19 »

Есть ссылка сформированная в нашем компоненте
Код
// здесь цикл foreach
$link = "index.php?view=object_list&alias_category=kommercheskaya-nedvizhimost&Itemid=140"; // Если указываем Itemid компонента, то значение option не нужно!
JRoute::_($link);
 
После получаем ЧПУ url: site.ru/nedvizhimost/kommercheskaya-nedvizhimost.html

Роутер у нас работает правильно за исключением одного НО,
Я хочу делать выборку объектов из БД по id категории, а не по алиасу.
Обойти это можно только дополнительными запросами к БД, но ведь чем меньше запросов тем производительнее система работает.
Прошу помощи в решении задачи:

Мой роутер
Код
function MycompBuildRoute( &$query )
{
   $segments = array();
   if( isset($query['view']) ){       unset($query['view']);}
   if( isset($query['task']) ){       $segments[] = $query['task'];        unset($query['task']); }
   if( isset($query['al_category']) ){$segments[] = $query['al_category']; unset($query['al_category']); }
   if( isset($query['id']) ){         $segments[] = $query['id'];          unset($query['id']); }
   if( isset($query['limitstart']) ){ unset($query['limitstart']); }
   return $segments;
}
 
function MycompParseRoute( $segments )
{
   $vars  = array();
   $count = count($segments);
   $menu  = JMenu::getInstance('site')->getActive();
   $view  = isset($menu->query['view'])? $menu->query['view'] : '';
 
if( $view === 'object_list' && $count == 1){// && $count == 1
       $vars['view'] = 'object_list';
       $vars['al_category'] = str_replace( ':', '-', $segments[0] );
       return $vars;
   }
 
   if( $view === 'object_list' && $count == 2 ){// && $count == 2
       $vars['view'] = 'object_view';
       $vars['al_category'] = str_replace( ':', '-', $segments[0] );
       $vars['id'] = $segments[1];
       return $vars;
   }
}
 

Моя сылка
Код
// здесь цикл foreach
$link = "index.php?view=object_list&id_category='.$cat->id.'&al_category='.$cat->alias.'&Itemid=140";
JRoute::_($link);
 

Результат работы ЧПУ site.ru/nedvizhimost/kommercheskaya-nedvizhimost.html?id_category=188
Возможно ли передать id_category в URL или как-то ещё, но без участия ?id_category=188
То есть замаскировать под kommercheskaya-nedvizhimost.html ??

Или может есть какие другие варианты решения данного вопроса?
так как уровень вложенности может быть и больше сайт.ру/статья/материал/новости/вовость и всё это хочется без
сайт.ру/12-статья/222-материал/134324-новости/3-вовость
Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #1 : 14.09.2016, 21:38:26 »

Не понимаю а что вам мешает выборку в модели делать по ид вместе алиаса?

Цитировать
Возможно ли передать id_category в URL или как-то ещё, но без участия ?id_category=188
То есть замаскировать под kommercheskaya-nedvizhimost.html ??

Привязать категорию к пункту меню

Цитировать
так как уровень вложенности может быть и больше сайт.ру/статья/материал/новости/вовость и всё это хочется без
сайт.ру/12-статья/222-материал/134324-новости/3-вовость

Для таких роутингов вам ваш 4-хстрочный роутер явно не подойдет. Тут надо думать как разруливать роутинг с таким кол-вом сегментов и вложенностью  
Записан
john.deff
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 112



« Ответ #2 : 14.09.2016, 23:55:03 »

Привязать категорию к пункту меню

категории создаются в моём компоненте, в моих таблицах по моим правилам.
Как задействовать взаимосвязи категорий со стандартным функционалом?
можно пример?


Для таких роутингов вам ваш 4-хстрочный роутер явно не подойдет. Тут надо думать как разруливать роутинг с таким кол-вом сегментов и вложенностью 

Это я понимаю..
Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #3 : 15.09.2016, 00:39:24 »

Вам что нужно чтобы категорию можно было и по алиасу определять и по ид? Ну сделайте тогда просто в модели проверку если category_id число тогда выборку делайте по ид, если строка то по алиасу в чем проблема то? Чтобы убрать ид из URL его нужно привязать к какому то другому параметру, использовать алиас категории или пункта меню или любой другой параметр который с этой категорией так или иначе связан, иначе никак.

Когда вы пункт меню создаете для компонента вы указываете там параметры для полей которые указаны в XML файле в разделе request вроде бы. Я уже сейчас точно не помню но это как раз те параметры которые можно получить из запроса при этом их в самом запросе как таковом не указывая. Таким образом вы можете к пункту меню привязать id категории, статьи и вообще чего угодно а в URL вам достаточно будет указать алиас или ид этого пункта меню. Вы например можете создать пункт меню к которому не только ид категории но и ид статьи привязать. Чтобы попасть на эту конкретную статью в этой конкретной категории вам не нужно будет прописывать ни ид/алиас категории ни ид/алиас статьи так как ваш роутер будет передавать/получать только алиас пункта меню а ваша модель будет выбирать категорию и статью которая к этому конкретному пункту меню привязана.

Ну уж а если не нравится пункт меню, что он там будет где то отображатся в админке, используйте любой другой параметр который будет хранится в базе и к которому вы привяжете ид категории и любую другую хрень которую вы хотите чтобы в URL у вас не было. В url будете передавать тогда этот параметр. Все в ваших руках.

Надеюсь я ясно излагаюсь.
« Последнее редактирование: 15.09.2016, 01:16:03 от zomby6888 » Записан
john.deff
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 112



« Ответ #4 : 16.09.2016, 00:24:43 »

Вам что нужно чтобы категорию можно было и по алиасу определять и по ид? Ну сделайте тогда просто в модели проверку если category_id число тогда выборку делайте по ид, если строка то по алиасу в чем проблема то? Чтобы убрать ид из URL его нужно привязать к какому то другому параметру, использовать алиас категории или пункта меню или любой другой параметр который с этой категорией так или иначе связан, иначе никак.

Когда вы пункт меню создаете для компонента вы указываете там параметры для полей которые указаны в XML файле в разделе request вроде бы. Я уже сейчас точно не помню но это как раз те параметры которые можно получить из запроса при этом их в самом запросе как таковом не указывая. Таким образом вы можете к пункту меню привязать id категории, статьи и вообще чего угодно а в URL вам достаточно будет указать алиас или ид этого пункта меню. Вы например можете создать пункт меню к которому не только ид категории но и ид статьи привязать. Чтобы попасть на эту конкретную статью в этой конкретной категории вам не нужно будет прописывать ни ид/алиас категории ни ид/алиас статьи так как ваш роутер будет передавать/получать только алиас пункта меню а ваша модель будет выбирать категорию и статью которая к этому конкретному пункту меню привязана.

Ну уж а если не нравится пункт меню, что он там будет где то отображатся в админке, используйте любой другой параметр который будет хранится в базе и к которому вы привяжете ид категории и любую другую хрень которую вы хотите чтобы в URL у вас не было. В url будете передавать тогда этот параметр. Все в ваших руках.

Надеюсь я ясно излагаюсь.

Лучше примеры живого кода, конструкций API Joomla 3 и на этом делать разбор!
иначе рассказывать можно что угодно, но без кода все равно ни вправо ни влево..
Записан
Septdir
Живу я здесь
******

Репутация: +35/-3
Offline Offline

Пол: Мужской
Сообщений: 838


Skype: septdir


« Ответ #5 : 16.09.2016, 00:49:58 »

Честно не стал читываться текст, увидел, что нужны примеры и т.д Могу посоветовать вскрыть k2 у него роут самый адовый(и в хорошем и прохом смыле) и в нем чего того нет и чисто по id и чисто по алиасу и по алиасу и ид, думаю найдете что нужно, так конечно реализация хромая, но идею уловить можно.
P.S Личное мнение солидарен со сказанным где-то в начале, немного перефразирую 1 категория = 1 пункт меню(тут в гет идет), особенно если это комопнент не для массового распоранения. Ну да даже для масового. Один фиг так всегда надежнее.
P.S и не забудьте про канонический линк иначе грош цена вашему роуту
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #6 : 16.09.2016, 01:45:45 »

я бы вам посоветовал не морочить себе голову и сделать два лишних запроса, которые вы можете прокешировать..
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet