CUrlManager как распарсить Url

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
RusAlex
Сообщения: 324
Зарегистрирован: 2010.08.29, 15:30

CUrlManager как распарсить Url

Сообщение RusAlex »

могу ли я имея строку

Код: Выделить всё

/index.php?r=test/exportWidget&var1=value1&var2=value2
как-то распарсить её, заменить в ней контроллер и действие, и вернуть опять в вид строки?

Для чего мне это надо:
CGridView хранит урл своего последнего запроса в html теге. Мне надо сделать экспорт в csv, тех записей которые видит пользователь, учитывая сортировку и фильтрацию. Т.е. я хочу взять тот самый урл от CGridView, заменить в нем контроллер/действие, и отправить все настройки CGridView на действие которое сделает экспорт. Т.е. составит соответствующий DataProvider и сортировку. А затем экспортирует данные.
SpiLLeR
Сообщения: 350
Зарегистрирован: 2009.09.17, 16:47
Откуда: Санкт-Петербург
Контактная информация:

Re: CUrlManager как распарсить Url

Сообщение SpiLLeR »

А почему не взять просто $_GET и unset($_GET['r']);&
Предупрежден - значит вооружен.
devKP.ru
Аватара пользователя
RusAlex
Сообщения: 324
Зарегистрирован: 2010.08.29, 15:30

Re: CUrlManager как распарсить Url

Сообщение RusAlex »

а если app()->urlManager будет type=PATH ?

вообщем пока решил.
Аватара пользователя
GennadySmagin
Сообщения: 22
Зарегистрирован: 2011.08.21, 21:37

Re: CUrlManager как распарсить Url

Сообщение GennadySmagin »

А есть ли возможность парсить произвольный запрос? Такая задача, конечно, костыль. Но вполне может быть.
Ну, еще чуть-чуть и стану профи.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: CUrlManager как распарсить Url

Сообщение samdark »

Есть. Можно задать правило и для него написать свой класс, который будет разбирать URL http://rmcreative.ru/blog/post/svoi-kla ... outera-yii
Аватара пользователя
GennadySmagin
Сообщения: 22
Зарегистрирован: 2011.08.21, 21:37

Re: CUrlManager как распарсить Url

Сообщение GennadySmagin »

Снова возникла данная тема. Предположим, ситуация такая. Нужно реализовать SEF, с возможностью задавать прямые ссылки на любой контент (контроллер).

Итак, пока такой вариант. Есть таблица и модель для ЧПУ, где есть поле url (ну или alias - это и есть ЧПУ), а так же поля route и id. Существует правило класс в конфигурации (наследующее CBaseUrlRule), которое берет по ссылке из базы данных маршрут и идентификатор контента - и возвращает нужное.

Код: Выделить всё

lass SefRule extends CBaseUrlRule
{
    public $connectionID = 'db';
     public function createUrl($manager,$route,$params,$ampersand)
    {
        if( !isset($params['id']) ) return false;

        // при создании ссылки - берем ЧПУ из базы данных, если есть
        $url = Yii::app()->db->createCommand("SELECT `url` FROM {{sef}} WHERE `route`='$route' AND `id`='{$params['id']}';")->query()->read();
        if( !$url ) return false;

        // дописываем произвольные параметры, скажем ?page=5
        unset($params['id']);
        $suffix = '';
        foreach ($params as $key => $value) $suffix .= "$key=$value&";

        // Если есть параметры - допиливаем
        if( isset($suffix[1]) )
        {
            rtrim($suffix, '&');
            $suffix = '?' . $suffix;
        }

        return $url['url'] . $suffix; // Вуаля, метод вернет ЧПУ
    }
 
    public function parseUrl($manager,$request,$pathInfo,$rawPathInfo)
    {
        // Если в ссылке есть слеши, значит это не ЧПУ, вида site.ru/прямая-ссылка, а маршрут - не дергаем базу данных
        if( strpos($pathInfo, '/') !== false ) return false;

        // Найдем маршрут
        $sef = Yii::app()->db->createCommand("SELECT `id`,`route` FROM {{sef}} WHERE `url`='$pathInfo';")->query()->read();
        if( !$sef) return false;

        // Вернем маршрут
        $_GET['id'] = $sef['id'];
        return $sef['route'];
    }
} 
Собственно, примитивный вариант. Суть вопроса: хотелось бы хранить в базе не машрут идентификатор, а вообще - любую ссылку. Но ее на выходе нужно распарсить, чтобы выдернуть из нее маршрут и параметры. В случае, если ссылки не в виде пути ('urlFormat'=>'path') - проблем нет. А если в виде пути ссылки по умолчанию? Можно ли Yii попросить распарсить путь или будет рекурсия?

Плюс, сомнения вызывает производительность, если для каждой ссылки дергать базу данных. Кэш можно, конечно, заюзать. Но...
Ну, еще чуть-чуть и стану профи.
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: CUrlManager как распарсить Url

Сообщение anton44eg »

Если подключен компонент cache, то кешируется автоматически
Аватара пользователя
GennadySmagin
Сообщения: 22
Зарегистрирован: 2011.08.21, 21:37

Re: CUrlManager как распарсить Url

Сообщение GennadySmagin »

Кэшируется только состояние компонента.
Вот точная цитата кэша, по классу приведенному выше: a:2:{i:0;a:2:{i:0;a:1:{i:0;a:2:{s:5:"class";s:30:"application.components.SefRule";s:12:"connectionID";s:2:"db";}}i:1;s:32:"7d8d7c297358e7c2167064ba0df4118b";}i:1;N;} - если кэшировать, то руками - всю таблицу в массив, в рамках класса.

Вопрос в разборе path.
Ну, еще чуть-чуть и стану профи.
Maxim
Сообщения: 13
Зарегистрирован: 2012.05.02, 19:15

Re: CUrlManager как распарсить Url

Сообщение Maxim »

та же задача возникла - нужно парсить строку и получать из неё название модуля, контроллера и действия
как вариант думаю попробовать сделать класс производный от CUrlManager, и подменять его в нужный момент, но это все очень напоминает костыль
может быть кто нибудь знает метод проще?
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: CUrlManager как распарсить Url

Сообщение masson »

RusAlex писал(а):могу ли я имея строку
как-то распарсить её, заменить в ней контроллер и действие, и вернуть опять в вид строки?
А может регулярки помогут отцу русской демократии?

Код: Выделить всё

$url = '/index.php?r=test/exportWidget&var1=value1&var2=value2';
$newUrl = preg_replace('#(.+)\?r=[^&]+(.+)#', '\\1?r=NewController/NewAction\\2', $url);
Ответить