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

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

Еще раз про router.php

 (Прочитано 279 раз)
0 Пользователей и 1 Гость смотрят эту тему.
voron121
Давно я тут
****

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

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


Метод тыка и мата помогает в кодинге


« : 20.02.2017, 18:59:20 »

Доброго времени суток. Знаю что полетят камни, палки и известная субстанция но нужен совет с роутами Joomla.

Имеется компонент. Самописный. В нем ссылки прописанны вот в таком виде

Код
<?=JRoute::_('index.php?option=com_zaim&view=item&id='.$item->id);?>

Хочу получить ссылку вида item/some_text_36

и не знаю как. Перерыл кучу статей про роуты и ничегошеньки не понял. Понял только то что есть route.php, в нем можно прописать функции для обработки урлов своего компонента...и все. дальше запутался в потоке инфы. Нужен совет и пример.

Вот такой у меня роут сейчас

Код
class ZaimHelperRoute {
   function ZaimBuildRoute(&$query) {
       $segments = array();
       if(isset($query['view']))
       {
           $segments[] = $query['view'];
           unset($query['view']);
       }
       if(isset($query['id']))
       {
           $segments[] = $query['id'];
           unset($query['id']);
       };
       return $segments;
   }
 
 
   function ZaimParseRoute( $segments ) {
       $vars = array();
       $count = count( $segments );
       if ( $count ) {
           $count--;
           $segment = array_shift( $segments );
           $vars['view'] = $segment;
       }
       if ( $count ) {
           $count--;
           $segment = array_shift( $segments );
           $vars['id'] = $segment;
       }
       return $vars;
   }
 
   public static function getZaimRoute($id){
       $link = 'index.php?option=com_zaim&view=item&id=' . $id;
       return $link;
   }
 
}

Код стягивал давно с одного из множества туториалов. Он не работает для моей задачи т.к в итоге ссылка на статью имеет вид  ?view=item&id=4

Прошу помочь, челом бью. Не даются роуты хоть убей  Cry
Записан
robert
Профи
********

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

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


« Ответ #1 : 20.02.2017, 20:04:24 »

Вы привели содержимое router.php?
Записан
voron121
Давно я тут
****

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

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


Метод тыка и мата помогает в кодинге


« Ответ #2 : 20.02.2017, 20:17:52 »

Вы привели содержимое router.php?

да. сейчас попробовал убрать клсаа из файла - роутер начал работать (странно но в примере откуда я спилил  фаил именно так было и именно роутер пхп).

но все равно. сейчас у меня вот такой код

Код
    function ZaimBuildRoute(&$query) {
       $segments = array();
       if(isset($query['view']))
       {
           $segments[] = $query['view'];
           unset($query['view']);
       }
       if(isset($query['id']))
       {
           $segments[] = $query['id'];
           unset($query['id']);
       };
       return $segments;
   }
 
 
   function ZaimParseRoute( $segments ) {
       $vars = array();
       $count = count( $segments );
       if ( $count == 1 ) {
       $vars['view'] = "MFO";
   }
 
   return $vars;
       return $vars;
   }


и пункт меню главной страницы - это страницы с выводом всех записей моего компонента. При переходе в саму запись URL имеет вид item/14 но ведь я указывал в ParseRoute что если всего 1 сегмент то вид равен MFO / Я примерно понял как по сегментам и по кусочкам Joomla строит URL, но  на практике не хочет делать то что я пишу и все .
Записан
robert
Профи
********

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

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


« Ответ #3 : 20.02.2017, 21:03:26 »

При переходе в саму запись URL имеет вид item/14 но ведь я указывал в ParseRoute что если всего 1 сегмент то вид равен MFO /
Не понял. По-моему, вы перепутали роли build и parse. Объясните, что вы хотите делать?
Записан
voron121
Давно я тут
****

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

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


Метод тыка и мата помогает в кодинге


« Ответ #4 : 20.02.2017, 21:06:43 »

Возможно. В общем смотрите, есть компонент. Он сейчас выводит записи на главной странице. При переходе в статью компонента путь будет такой site.com/item/12   где 12 это ид записи. Что я хочу : изменить в URL item на свое значение. Так же интересует как замаскировать гет параметры если они есть. К примеру есть адрес site.com/item/31?some_param=1  на site.com/item/31/some_text1  . Не дается мне router.php. Вроде бы и не сильно дурак а вот что к чему не могу понять.
Записан
robert
Профи
********

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

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


« Ответ #5 : 20.02.2017, 21:17:26 »

Так вы же указали, что если есть параметр view, то он будет первым сегментом. Затем ищется параметр id и если он найдется, то станет вторым сегментом.
Ваш none-SEF URL так выглядит: index.php?optiom=com_zaim&view=item&id=12, да?
Записан
voron121
Давно я тут
****

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

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


Метод тыка и мата помогает в кодинге


« Ответ #6 : 20.02.2017, 21:18:22 »

Ваш none-SEF URL так выглядит: index.php?optiom=com_zaim&view=item&id=12, да?

да, все верно
Записан
robert
Профи
********

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

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


« Ответ #7 : 20.02.2017, 21:18:58 »

Так все же работает, как надо.
« Последнее редактирование: 20.02.2017, 21:23:56 от robert » Записан
voron121
Давно я тут
****

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

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


Метод тыка и мата помогает в кодинге


« Ответ #8 : 20.02.2017, 21:19:54 »

Так все же работает, как надо.

тоесть item он берет из самого URL ? если там будет другой параметр то он соответсвенно и будет в ЧПУ ?
Записан
voron121
Давно я тут
****

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

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


Метод тыка и мата помогает в кодинге


« Ответ #9 : 20.02.2017, 21:23:58 »

тогда подскажите плз, что бы не засорять новой темой форум : как скрыть кастомный гет параметр  ? к примеру я  в URL просто передаю какой-либо гет параметр. Допустим site.com/item/34?some_param=1 . Как ?some_param=1 превратить во что то типа sometext/1 или sometext1 . Возможно ли это сделать через router.php ?
Записан
robert
Профи
********

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

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


« Ответ #10 : 20.02.2017, 21:24:44 »

build() строит из нормальных URL "красивые ссылки", по очереди прячет параметры в нехитрые сегменты, а parse(), наоборот, должна угадать, какой параметр прячется в каком сегменте, и вернуть его назад: иначе система не поймет, что от нее нужно - для нее нет понятия "красивый URL".
Записан
robert
Профи
********

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

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


« Ответ #11 : 20.02.2017, 21:25:38 »

Удалить его: unset($query['some_param']).
Записан
voron121
Давно я тут
****

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

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


Метод тыка и мата помогает в кодинге


« Ответ #12 : 20.02.2017, 21:27:40 »

Удалить его: unset($query['some_param']).

дело в том что он нужен. Для самого URL который потом будет где либо на сайте или просто кому то скидываться в сообщении ... или же для чего либо другого. Я  бы постом передавал но мне именно геты нужны. И вот Google как это можно сделать  но результат нулевой.
Записан
robert
Профи
********

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

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


« Ответ #13 : 20.02.2017, 21:36:02 »

Хм, а говорите
Вроде бы и не сильно дурак
Что, сами не понимаете, что написали?
Код
        if(isset($query['view']))
       {
           $segments[] = $query['view'];
           unset($query['view']);
       }
 
Вот так вы убрали параметр view, делайте по аналогии.
Записан
voron121
Давно я тут
****

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

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


Метод тыка и мата помогает в кодинге


« Ответ #14 : 20.02.2017, 21:44:52 »

Вот так вы убрали параметр view, делайте по аналогии.

Пробую, но что то не то. Вот смотрите, есть параметр get в URL. Он передается в модель для того что бы уточнить параметры выборки (по аналогии с поиском). Параметр jform[max_limit]

делаю по аналогии. В build()
Код
 
       if(isset($query['jform[max_limit]'])){
           $segments[] = $query['jform[max_limit]'];
           unset($query['jform[max_limit]']);
       }


Далее в parse

Код
        if ( $count ) {
           $count--;
           $segment = array_shift( $segments );
           $vars['jform[max_limit]'] = "test_items_param".$segment;
       }
 

И ничего. параметр как был так и остался :/

Хотя с видом это сработало. Урл перед ид теперь имеет  то что я ему укажу
Записан
robert
Профи
********

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

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


« Ответ #15 : 20.02.2017, 21:47:27 »

Блин, я начинаю терять терпение. Какой jform? Приведите исходный URL и расскажите, что хотите получить. Сколько можно гадать?
Записан
voron121
Давно я тут
****

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

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


Метод тыка и мата помогает в кодинге


« Ответ #16 : 20.02.2017, 21:52:05 »

Приведите исходный URL и расскажите, что хотите получить. Сколько можно гадать?

http://site.com/zaim.html?jform%5Bmax_limit%5D=10000

хочу

http://site.com/zaim.html/bla-bla-bla10000

то есть что бы не было гет параметра а вместо него своего рода маска. Я не уверен можно ли это сделать через router.php по этому и справшиваю на форуме.
Jform - это  $_GET[]  из формы. Он уходит в модель.
Записан
robert
Профи
********

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

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


« Ответ #17 : 20.02.2017, 22:31:11 »

Код
    if (isset($query['jform']['max_limit'])) {
       $segments[] = $query['jform']['max_limit'];
       unset($query['jform']['max_limit']);
   }
 
Зачем так извращаться?
Записан
voron121
Давно я тут
****

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

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


Метод тыка и мата помогает в кодинге


« Ответ #18 : 20.02.2017, 22:46:42 »

Код
    if (isset($query['jform']['max_limit'])) {
       $segments[] = $query['jform']['max_limit'];
       unset($query['jform']['max_limit']);
   }
 

Попробовал, ваш пример + аналогия того как я убирал view - не сработало. Гет параметр все равно остается в строке /

Зачем так извращаться?

Что бы можно было передать строку с отфильтрованными результатами в виде ЧПУ и скармливать ее ПС

вот такое у меня сейчас получилось

Код
function ZaimBuildRoute(&$query) {
       $segments = array();
       if(isset($query['view'])){
           $segments[] = $query['view'];
           unset($query['view']);
       }
 
       if (isset($query['jform']['max_limit'])) {
           $segments[] = $query['jform']['max_limit'];
           unset($query['jform']['max_limit']);
       }
 
       if(isset($query['id'])){
           $segments[] = "mfo_".$query['id'];
           unset($query['id']);
       };
       return $segments;
   }
 
 
   function ZaimParseRoute( $segments ) {
       $vars = array();
       $count = count( $segments );
       if ( $count ) {
           $count--;
           $segment = array_shift( $segments );
           $vars['view'] = $segment;
       }
       if ( $count ) {
           $count--;
           $segment = array_shift( $segments );
           $vars['jform']['max_limit'] = $segment;
       }
       if ( $count ) {
           $count--;
           $segment = array_shift( $segments );
           $vars['id'] = "mfo_".$segment;
       }
       return $vars;
 
   }
 
['jform']['max_limit']  все равно в своем первозданном виде. Пробовал по аналогии с ид добавить ему какие - либо приставки - не помогло Sad
Записан
robert
Профи
********

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

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


« Ответ #19 : 20.02.2017, 22:56:26 »

Я специально проверял перед тем, как писать: вставил в макет такую строку
Код
echo JRoute::_('index.php?option=com_mycomp&view=myview&id=10&jform[max_limit]=11');
и на выходе получил /component/mycomp/myview/10/11.
Так что вы что-то не так делали или чего-то не договаривали.
« Последнее редактирование: 20.02.2017, 23:00:13 от robert » Записан
voron121
Давно я тут
****

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

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


Метод тыка и мата помогает в кодинге


« Ответ #20 : 20.02.2017, 23:01:43 »

Код
echo JRoute::_('index.php?option=com_mycomp&view=myview&id=10&jform[max_limit]=11');
Странно. Буду ковырять, возможно где то туплю

или что-то не договаривали.

та вроде все сказал как есть ) мне утаивать нет смысла. Есть в адресной строке адрес с гет параметрами ну и дальше как и писал, хочу max_limit превратить во что то ЧПУ средствами router.php
Записан
voron121
Давно я тут
****

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

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


Метод тыка и мата помогает в кодинге


« Ответ #21 : 21.02.2017, 21:43:11 »

В общем разобрался. Все верно писал Robert. Решил все же не страдать идиотизмом и не маскировать все гет параметры.  Спасибо Robert за помощь с роутами - реально  стал лучше понимать что к чему (плюсанул) До этого как то все на обум. Тему можно закрывать )
Записан
Страниц: [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