0 Пользователей и 1 Гость просматривают эту тему.
  • 14 Ответов
  • 2009 Просмотров
*

error648398

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


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

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

Подскажите как это сделать, или скиньте ссылочку на инструкцию.
« Последнее редактирование: 24.01.2016, 05:50:07 от error648398 »
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Тут как бы несколько вариантов:

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

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Ссылку вида http://сайт/алиас_пункта_меню/алиас_материала_компонента  в своем компоненте сделать очень просто:
(итак если вы каркас делали моим сервисом http://ссылка вырезана, так как домен распространяет вирусы/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 )
Вставить в начале такие строки:

Код: php
$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'];)
4. в КомпонентParseRoute( $segments ) все тоже самое, только меняем на нужные названия видов!
*

balancer

  • Осваиваюсь на форуме
  • 34
  • 0 / 0
Всем привет. Хотел бы поднять темку, вопрос у меня примерно тот же. Я не пользовался сервисом товарища 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

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

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

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

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

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

balancer

  • Осваиваюсь на форуме
  • 34
  • 0 / 0
zomby6888, спасибо вам за подробный ответ, сейчас опробую, по результатам отпишусь :)
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Первое -  как убрать 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 пишете
Код: php
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'] );
}

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

Код: php
$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 (размещаете его в хелпере вашего компонента)
Код: php
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 пункта меню для текущего компонента! Использовать так
Код: php
 <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

  • Завсегдатай
  • 1473
  • 171 / 3
А как быть если вид привязан к нескольким пунктам меню? Передавать еще какой то парметр в getRoute?
интернет-блог: http://websiteprog.ru
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
А как быть если вид привязан к нескольким пунктам меню? Передавать еще какой то парметр в getRoute?
Как мне кажется проблемы здесь нет. Все отработает.
*

Aleks.Denezh

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

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Ну это кстатии удобно как раз для жирных компонентов, когда у тебя есть отдельный метод для выборки пункта меню. Так то можно и в роутере это написать для каждого вида свое условие, а с одним видом так и вобще можно без привязки к пунктам меню обойтись. Хотя конечно, зависит от задач, может там куча параметров еще помимо алиаса.
интернет-блог: http://websiteprog.ru
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Ну это кстатии удобно как раз для жирных компонентов, когда у тебя есть отдельный метод для выборки пункта меню. Так то можно и в роутере это написать для каждого вида свое условие, а с одним видом так и вобще можно без привязки к пунктам меню обойтись. Хотя конечно, зависит от задач, может там куча параметров еще помимо алиаса.
Если передан Itemid пункта меню, и получен текущий вид, то там хоть +100500 пареметров в переменной, проблем не будет..
*

balancer

  • Осваиваюсь на форуме
  • 34
  • 0 / 0
Кажется я ввел всех в небольшое заблуждение: 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

  • Живу я здесь
  • 3406
  • 428 / 4
В роутере и в формировании ссылки у вас все правильно!
Покажите модель!
В модели где у вас получние запроса нужно изменить что бы получалась запись таким способом!
Вы модель не показали но если у вас получение записи в методе getItem
то код получения нужно поменять на что то типа такого:
Код: php
$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

  • Осваиваюсь на форуме
  • 34
  • 0 / 0
Istaan, да вы правы, спасибо вам большое. Я пробовал такой способ в самой модели, но не обратил внимание что алиас приходит в виде "okhrannoe:agentstvo-kumaj-sekyuriti" :)
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Как при помощи плагина изменить $data до сохраннения?

Автор Septdir

Ответов: 9
Просмотров: 813
Последний ответ 02.06.2017, 17:34:35
от Septdir
Нужен ли подконтроллер в компоненте?

Автор borro

Ответов: 2
Просмотров: 693
Последний ответ 20.09.2016, 18:35:55
от Septdir