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

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Еще раз про router.php
« : 20.02.2017, 17:59:20 »
Доброго времени суток. Знаю что полетят камни, палки и известная субстанция но нужен совет с роутами Joomla.

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

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

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

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

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

Код: 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

Прошу помочь, челом бью. Не даются роуты хоть убей  :'(
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Еще раз про router.php
« Ответ #1 : 20.02.2017, 19:04:24 »
Вы привели содержимое router.php?
Не будь паразитом, сделай что-нибудь самостоятельно!
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Re: Еще раз про router.php
« Ответ #2 : 20.02.2017, 19:17:52 »
Вы привели содержимое router.php?

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

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

Код: 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

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Еще раз про router.php
« Ответ #3 : 20.02.2017, 20:03:26 »
При переходе в саму запись URL имеет вид item/14 но ведь я указывал в ParseRoute что если всего 1 сегмент то вид равен MFO /
Не понял. По-моему, вы перепутали роли build и parse. Объясните, что вы хотите делать?
Не будь паразитом, сделай что-нибудь самостоятельно!
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Re: Еще раз про router.php
« Ответ #4 : 20.02.2017, 20: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

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Еще раз про router.php
« Ответ #5 : 20.02.2017, 20:17:26 »
Так вы же указали, что если есть параметр view, то он будет первым сегментом. Затем ищется параметр id и если он найдется, то станет вторым сегментом.
Ваш none-SEF URL так выглядит: index.php?optiom=com_zaim&view=item&id=12, да?
Не будь паразитом, сделай что-нибудь самостоятельно!
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Re: Еще раз про router.php
« Ответ #6 : 20.02.2017, 20:18:22 »
Ваш none-SEF URL так выглядит: index.php?optiom=com_zaim&view=item&id=12, да?

да, все верно
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Еще раз про router.php
« Ответ #7 : 20.02.2017, 20:18:58 »
Так все же работает, как надо.
« Последнее редактирование: 20.02.2017, 20:23:56 от robert »
Не будь паразитом, сделай что-нибудь самостоятельно!
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Re: Еще раз про router.php
« Ответ #8 : 20.02.2017, 20:19:54 »
Так все же работает, как надо.

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

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Re: Еще раз про router.php
« Ответ #9 : 20.02.2017, 20:23:58 »
тогда подскажите плз, что бы не засорять новой темой форум : как скрыть кастомный гет параметр  ? к примеру я  в URL просто передаю какой-либо гет параметр. Допустим site.com/item/34?some_param=1 . Как ?some_param=1 превратить во что то типа sometext/1 или sometext1 . Возможно ли это сделать через router.php ?
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Еще раз про router.php
« Ответ #10 : 20.02.2017, 20:24:44 »
build() строит из нормальных URL "красивые ссылки", по очереди прячет параметры в нехитрые сегменты, а parse(), наоборот, должна угадать, какой параметр прячется в каком сегменте, и вернуть его назад: иначе система не поймет, что от нее нужно - для нее нет понятия "красивый URL".
Не будь паразитом, сделай что-нибудь самостоятельно!
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Еще раз про router.php
« Ответ #11 : 20.02.2017, 20:25:38 »
Удалить его: unset($query['some_param']).
Не будь паразитом, сделай что-нибудь самостоятельно!
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Re: Еще раз про router.php
« Ответ #12 : 20.02.2017, 20:27:40 »
Удалить его: unset($query['some_param']).

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

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Еще раз про router.php
« Ответ #13 : 20.02.2017, 20:36:02 »
Хм, а говорите
Вроде бы и не сильно дурак
Что, сами не понимаете, что написали?
Код: php
        if(isset($query['view']))
        {
            $segments[] = $query['view'];
            unset($query['view']);
        }
Вот так вы убрали параметр view, делайте по аналогии.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Re: Еще раз про router.php
« Ответ #14 : 20.02.2017, 20:44:52 »
Вот так вы убрали параметр view, делайте по аналогии.

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

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


Далее в parse

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

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

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

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Еще раз про router.php
« Ответ #15 : 20.02.2017, 20:47:27 »
Блин, я начинаю терять терпение. Какой jform? Приведите исходный URL и расскажите, что хотите получить. Сколько можно гадать?
Не будь паразитом, сделай что-нибудь самостоятельно!
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Re: Еще раз про router.php
« Ответ #16 : 20.02.2017, 20: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

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Еще раз про router.php
« Ответ #17 : 20.02.2017, 21:31:11 »
Код: php-brief
    if (isset($query['jform']['max_limit'])) {
        $segments[] = $query['jform']['max_limit'];
        unset($query['jform']['max_limit']);
    }
Зачем так извращаться?
Не будь паразитом, сделай что-нибудь самостоятельно!
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Re: Еще раз про router.php
« Ответ #18 : 20.02.2017, 21:46:42 »
Код: php-brief
    if (isset($query['jform']['max_limit'])) {
        $segments[] = $query['jform']['max_limit'];
        unset($query['jform']['max_limit']);
    }

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

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

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

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

Код: php
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']  все равно в своем первозданном виде. Пробовал по аналогии с ид добавить ему какие - либо приставки - не помогло :(
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Еще раз про router.php
« Ответ #19 : 20.02.2017, 21:56:26 »
Я специально проверял перед тем, как писать: вставил в макет такую строку
Код: php-brief
echo JRoute::_('index.php?option=com_mycomp&view=myview&id=10&jform[max_limit]=11');
и на выходе получил /component/mycomp/myview/10/11.
Так что вы что-то не так делали или чего-то не договаривали.
« Последнее редактирование: 20.02.2017, 22:00:13 от robert »
Не будь паразитом, сделай что-нибудь самостоятельно!
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Re: Еще раз про router.php
« Ответ #20 : 20.02.2017, 22:01:43 »
Код: php-brief
echo JRoute::_('index.php?option=com_mycomp&view=myview&id=10&jform[max_limit]=11');
Странно. Буду ковырять, возможно где то туплю

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

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

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Re: Еще раз про router.php
« Ответ #21 : 21.02.2017, 20:43:11 »
В общем разобрался. Все верно писал Robert. Решил все же не страдать идиотизмом и не маскировать все гет параметры.  Спасибо Robert за помощь с роутами - реально  стал лучше понимать что к чему (плюсанул) До этого как то все на обум. Тему можно закрывать )
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Переделать router.php

Автор sesil

Ответов: 2
Просмотров: 565
Последний ответ 24.10.2019, 12:01:44
от sesil
Override router.php в com_content – возможно ли?

Автор goga_pgasovav

Ответов: 3
Просмотров: 772
Последний ответ 18.07.2016, 20:07:45
от goga_pgasovav
Непонятки с router

Автор spirit1086

Ответов: 1
Просмотров: 601
Последний ответ 29.04.2016, 11:20:33
от spirit1086
Куда сохранять измененный router.php?

Автор R31rus

Ответов: 4
Просмотров: 705
Последний ответ 25.09.2015, 22:51:53
от stendapuss