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

error648398

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


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

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

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

zomby6888

  • Живу я здесь
  • 1484
  • 167
Тут как бы несколько вариантов:

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

  • Практически профи
  • 2806
  • 377
Ссылку вида 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 )
Вставить в начале такие строки:

Код: 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 ) все тоже самое, только меняем на нужные названия видов!
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016
*

balancer

  • Осваиваюсь на форуме
  • 34
  • 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

  • Живу я здесь
  • 1484
  • 167
Вы в метод 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
zomby6888, спасибо вам за подробный ответ, сейчас опробую, по результатам отпишусь :)
*

Aleks.Denezh

  • Практически профи
  • 2806
  • 377
Первое -  как убрать 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! Что бы выпилить пользуйтесь тем методом что я выше написал!
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016
*

zomby6888

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

platonische

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

Aleks.Denezh

  • Практически профи
  • 2806
  • 377
А как быть если вид привязан к нескольким пунктам меню? Передавать еще какой то парметр в getRoute?
Ну это же не скайнет же, но для такого случая уж лучше написать отдельный обработчик, который будет для такого вида получать по id записть
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016
*

zomby6888

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

Aleks.Denezh

  • Практически профи
  • 2806
  • 377
Ну это кстатии удобно как раз для жирных компонентов, когда у тебя есть отдельный метод для выборки пункта меню. Так то можно и в роутере это написать для каждого вида свое условие, а с одним видом так и вобще можно без привязки к пунктам меню обойтись. Хотя конечно, зависит от задач, может там куча параметров еще помимо алиаса.
Если передан Itemid пункта меню, и получен текущий вид, то там хоть +100500 пареметров в переменной, проблем не будет..
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016
*

balancer

  • Осваиваюсь на форуме
  • 34
  • 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

  • Практически профи
  • 2806
  • 377
В роутере и в формировании ссылки у вас все правильно!
Покажите модель!
В модели где у вас получние запроса нужно изменить что бы получалась запись таким способом!
Вы модель не показали но если у вас получение записи в методе 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;
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016
*

balancer

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

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

Автор Septdir

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

Автор borro

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