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

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

Короткая ссылка при помощи router.php Нужен совет

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

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

Сообщений: 180


« : 24.01.2016, 05:30:18 »

Собственно есть адрес материала моего созданного (использовался генератор каркаса - ОГРОМНОЕ СПАСИБО АВТОРУ ЗА НЕГО) компонента:
http://сайт/алиас_пункта_меню/название_вида(view)/(id)-алиас_материала_компонента
А хотелось бы получить
http://сайт/алиас_пункта_меню/алиас_материала_компонента
или
http://сайт/алиас_материала_компонента


Думал воспользоваться - sh404SEF, но судя по спорам в данной теме:
http://joomlaforum.ru/index.php/topic,319721.0.html

Как то перехотелось, в инете инфы по сокращению как то не много, всё больше про то как преобразуется в ЧПУ.

Подскажите как это сделать, или скиньте ссылочку на инструкцию.
« Последнее редактирование: 24.01.2016, 06:50:07 от error648398 » Записан
zomby6888
Живу я здесь
******

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

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


« Ответ #1 : 24.01.2016, 06:24:38 »

Тут как бы несколько вариантов:

1. Хакнуть или переопределить роутер com_content.
2. Написать компонент, который будет выводить материалы из com_content со своим роутингом
3. Использовать какой нибудь сторонний компонент для материалов который формирует подобные ЧПУ
4. Забить на это. Я не очень разбираюсь в SEO, но помоему это все не так важно. Главное чтобы URL не были вида ..index.php?param1=1&param2=2...
« Последнее редактирование: 24.01.2016, 06:29:49 от zomby6888 » Записан
Aleks.Denezh
Практически профи
*******

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

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



« Ответ #2 : 24.01.2016, 14:25:56 »

Ссылку вида http://сайт/алиас_пункта_меню/алиас_материала_компонента  в своем компоненте сделать очень просто:
(итак если вы каркас делали моим сервисом http://inet-reklama.com/sozdanie-komponenta.html)

1. Формирование ссылки: КомпонентHelper::getRoute('имя_вашего_компонента', 'вид_списка', '&id=' . $item->alias);

2. В роутере в методе КомпонентBuildRoute( &$query ) в месте
if ( isset( $query['view'] ) ) {
   $segments[] = $query['view']; // удалить эту строку что бы не было вида в ссылке
   unset( $query['view'] );
}

3. в роутере в методе  КомпонентParseRoute( $segments )
Вставить в начале такие строки:

Код
$vars = array();
$count = count( $segments );
$menu = JMenu::getInstance( 'site' )->getActive();
$view = isset( $menu->query['view'] )? $menu->query['view'] : '';
 
if ( $view === 'Вид_Списка_на_который_завязан_пункт_меню' && $count == 1 ) {
$vars['view'] = 'Вид_одиночной_записи';
$vars['id'] = $segments[0];
return $vars;
}

После этого у вас будет открываться вид одиночной записи, и alias будет в переменной id!



Ссылки вида http://сайт/алиас_материала_компонента чуть сложнее делать!
1. Надо связать вид материала (без привязки id материала), или любой пустой вид, с пунктом меню! и Главное пункт меню сделать главной страницей! А дальше
2. Делаем ссылку КомпонентHelper::getRoute('имя_вашего_компонента', 'имя_вида_с_которым_вы_связали_главный_пункт_менб', '&id=' . $item->alias);
3. в КомпонентBuildRoute( &$query )  делаем все тоже что и выше (тоесть удаляем строку $segments[] = $query['view']Wink
4. в КомпонентParseRoute( $segments ) все тоже самое, только меняем на нужные названия видов!
Записан
balancer
Осваиваюсь на форуме
***

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

Сообщений: 34


« Ответ #3 : 16.03.2016, 13:55:37 »

Всем привет. Хотел бы поднять темку, вопрос у меня примерно тот же. Я не пользовался сервисом товарища Istaan для сборки компонента, поэтому хэлпера с getRoute у меня нет.

Первое -  как убрать ID из ссылки перед алиасом? kompanii/myview/1-sekyuriti.html
Ссылка формируется так $link = JRoute::_('index.php?option=com_mycomponent&view=myview&id=' . $item->id.':'.$item->alias);
Я так понимаю что нужно здесь переправить на $link = JRoute::_('index.php?option=com_mycomponent&view=myview&id='.$item->alias); , а как в роутере это распарсить немного недопонял.

Второе - есть главная страница, на ней так же размещен мой компонент, только с другим видом, SEF-ссылку я формирую таким же образом. В итоге в url я получаю http://dp2.kg/component/mycomponent/myview/1-sekyuriti.html. Вопрос как выпить из url "component", откуда он берется?

Если кто сталкивался с таким, подскажите, пожалуйста, как поправить. Может есть что интересного почитать (в оф. документации все несколько размыто).
Заранее всем благодарен
Записан
zomby6888
Живу я здесь
******

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

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


« Ответ #4 : 16.03.2016, 16:46:27 »

Вы в метод JRoute передаете 3 параметра: Названия компонента, название вьюхи, идентификатор/алиас так как на главной странице первый параметр вам не нужен, добавляете условие проверки на главную страницу в методе Build:

Код
...
$segments[] = $query['view']
$segments[] = $query['id']
if(JURi::current()!= JURI::base())
{
   $segments[] = $query['option'];  
}
unset($query['option']);
unset($query['view']);
unset($query['id']);
...
 

В результате чего в методе parseRoute мы будем иметь три сегмента на главной и два сегмента на остальных страницах, первые два сегмента будет навзвание вьюхи и алиас:
 
Код
...
$vars['view'] = $segments[0];
$vars['id'] = $segments[1];
if(count($segments) > 2)
{
   $vars['option'] = $segments[2];  
}
...
 

В модели или контроллере когда будете получать алиас из запроса то он будет хранится в переменной id. Я бы переименовал ее в алиас везде и в методе jroute и в buildRoute и в parseRoute

PS Я это все не проверял. Просто рассуждаю логически. Возможно проверка на главную и не нужна, и фреймворк это делает автоматом своим дефолтным роутером. Тогда вам нужно смотреть в чем проблема с вашим роутером, вы его явно не с нуля написали, очень похож на роутер com_content.
Записан
balancer
Осваиваюсь на форуме
***

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

Сообщений: 34


« Ответ #5 : 17.03.2016, 09:26:35 »

zomby6888, спасибо вам за подробный ответ, сейчас опробую, по результатам отпишусь Azn
Записан
Aleks.Denezh
Практически профи
*******

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

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



« Ответ #6 : 17.03.2016, 12:28:39 »

Первое -  как убрать ID из ссылки перед алиасом? kompanii/myview/1-sekyuriti.html
Ссылка формируется так $link = JRoute::_('index.php?option=com_mycomponent&view=myview&id=' . $item->id.':'.$item->alias);
Я так понимаю что нужно здесь переправить на $link = JRoute::_('index.php?option=com_mycomponent&view=myview&id='.$item->alias); , а как в роутере это распарсить немного недопонял.


1. Перестаньте писать и view и component в JRoute::_('');
ссылка должна быть вида JRoute::_('index.php?id=' . $item->alias . '&Itemid=110'); где 110 это пункт меню на который завязан вид который вам нужно открыть!
2. в BuildRoute пишете
Код
if ( isset( $query['view'] ) ) {
unset( $query['view'] );
}
if ( isset( $query['task'] ) ) {
$segments[] = $query['task'];
unset( $query['task'] );
}
if ( isset( $query['id'] ) ) {
$segments[] = $query['id'];
unset( $query['id'] );
}

В парсинге роутера все просто

Код
$menu = JMenu::getInstance( 'site' )->getActive();
$view = isset( $menu->query['view'] )? $menu->query['view'] : '';
 
if ( $view === 'myview' ) {
$vars['view'] = 'myview';
$vars['id'] = $segments[0];
return $vars;
}
 
3. Для генерации ссылок использовать метод GetRoute (размещаете его в хелпере вашего компонента)
Код
static $menuIds = array();
 
static function getRoute( $option, $view, $query = '' )
{
if ( empty( self::$menuIds[$option . '.' . $view] ) ) {
$items = JMenuSite::getInstance( 'site' )->getItems( 'component', $option );
foreach ( $items as $item ) {
if ( isset( $item->query['view'] ) && $item->query['view'] === $view ) {
self::$menuIds[$option . '.' . $view] = $item->id;
}
}
}
return (string)JRoute::_( 'index.php?' . $query . '&Itemid=' . self::$menuIds[$option . '.' . $view] );
}

Этот метод поможет автоматически получать Itemid пункта меню для текущего компонента! Использовать так
Код
 <a href="<?php echo вашклассHepler::getRoute('com_mycomponent', 'myview', '&id=' . $item->alias); ?>">Ссылка</a>


Второе - есть главная страница, на ней так же размещен мой компонент, только с другим видом, SEF-ссылку я формирую таким же образом. В итоге в url я получаю http://dp2.kg/component/mycomponent/myview/1-sekyuriti.html. Вопрос как выпить из url "component", откуда он берется?
Вы же сами передает и mycomponent и myview! Что бы выпилить пользуйтесь тем методом что я выше написал!
Записан
zomby6888
Живу я здесь
******

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

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


« Ответ #7 : 17.03.2016, 17:27:32 »

А как быть если вид привязан к нескольким пунктам меню? Передавать еще какой то парметр в getRoute?
Записан
platonische
Давно я тут
****

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

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #8 : 17.03.2016, 21:31:24 »

А как быть если вид привязан к нескольким пунктам меню? Передавать еще какой то парметр в getRoute?
Как мне кажется проблемы здесь нет. Все отработает.
Записан
Aleks.Denezh
Практически профи
*******

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

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



« Ответ #9 : 17.03.2016, 21:55:55 »

А как быть если вид привязан к нескольким пунктам меню? Передавать еще какой то парметр в getRoute?
Ну это же не скайнет же, но для такого случая уж лучше написать отдельный обработчик, который будет для такого вида получать по id записть
Записан
zomby6888
Живу я здесь
******

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

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


« Ответ #10 : 17.03.2016, 22:14:53 »

Ну это кстатии удобно как раз для жирных компонентов, когда у тебя есть отдельный метод для выборки пункта меню. Так то можно и в роутере это написать для каждого вида свое условие, а с одним видом так и вобще можно без привязки к пунктам меню обойтись. Хотя конечно, зависит от задач, может там куча параметров еще помимо алиаса.
Записан
Aleks.Denezh
Практически профи
*******

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

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



« Ответ #11 : 18.03.2016, 01:04:47 »

Ну это кстатии удобно как раз для жирных компонентов, когда у тебя есть отдельный метод для выборки пункта меню. Так то можно и в роутере это написать для каждого вида свое условие, а с одним видом так и вобще можно без привязки к пунктам меню обойтись. Хотя конечно, зависит от задач, может там куча параметров еще помимо алиаса.
Если передан Itemid пункта меню, и получен текущий вид, то там хоть +100500 пареметров в переменной, проблем не будет..
Записан
balancer
Осваиваюсь на форуме
***

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

Сообщений: 34


« Ответ #12 : 18.03.2016, 14:09:59 »

Кажется я ввел всех в небольшое заблуждение: http://site.com/component/mycomponent/myview/1-sekyuriti.html - я спросил как мне убрать component, то есть это не название моего компонента, и именно что слово component, а дальше уже название компонента и вида.

Опробовал метод товарища Istaan, и у меня небольшая проблема - ссылки сформировались, все ок, но когда я перехожу по ссылке например, http://site.com/organizatsiya/okhrannoe-agentstvo-kumaj-sekyuriti.html (organizatsiya - пункт меню одиночной записи, okhrannoe-agentstvo-kumaj-sekyuriti - алиас), то выкидывает exception, что ID нулевой. Получается мне в модели одиночной записи нужно изменить способ получения этой самой записи?

Используемый код:
router.php
Показать текстовый блок

Формирование ссылки:
Показать текстовый блок
Записан
Aleks.Denezh
Практически профи
*******

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

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



« Ответ #13 : 18.03.2016, 14:20:52 »

В роутере и в формировании ссылки у вас все правильно!
Покажите модель!
В модели где у вас получние запроса нужно изменить что бы получалась запись таким способом!
Вы модель не показали но если у вас получение записи в методе getItem
то код получения нужно поменять на что то типа такого:
Код
$input = JFactory::getApplication()->input;
$alias = str_replace( ':', '-', $input->getString( 'id', '' ) );
$query = $this->getDbo()->getQuery( true )
->select( '*' )
->from( '#__table_name' )
->where( 'alias=' . $this->getDbo()->q( $alias ) );
$item = $this->getDbo()->setQuery( $query )->loadObject();
if ( empty( $item->id ) ) {
throw new Exception( 'Запись не найдена', 404 );
}
return $item;
Записан
balancer
Осваиваюсь на форуме
***

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

Сообщений: 34


« Ответ #14 : 18.03.2016, 14:27:54 »

Istaan, да вы правы, спасибо вам большое. Я пробовал такой способ в самой модели, но не обратил внимание что алиас приходит в виде "okhrannoe:agentstvo-kumaj-sekyuriti" Azn
Записан
Страниц: [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