Yii - наследник от CBaseUrlRule пример - наначение url псевдонимов средствами Yii
Primary tabs
Собственно говоря, рассуждения были начаты нами здесь
о том, какие настройки надо определить в конфиге чтобы всё работало было упомянуто здесь
Моё предложение?
да - оно следующее - предлагаю реализовать универсальный способ хранения псевдонима для любой страницы -
а именно - заводим модель псевдонима (alias)
и, собственно, если не считать ,что нам понадобится контроллер (точнее одно действие какого-нибудь контроллера), который позволит создавать или редактировать url-псевдонимы (ну а для контроллера конечно же предствление с формой редактирования - надо же как-то указать какой именно псевдоним мы желаем видеть) - то\можно написать вот такой вот код, который позволяет порыскать в БД - и в случае если для данной страницы псевдоним известен - то выводить именно пседоним,
и обратно (parceURL)-
если получаемый url является псевдонимом, то можно - опять же - найдя соответствующую запись в БД - получить оригинальный маршрут + необходимые параметры - чтобы действие вызываемой с помощью псевдонима могло корректно выполниться)
А вот и код моего правила:
<?php
class AllPagesRule extends CBaseUrlRule
{
public $connectionID = 'db';
public function createUrl($manager,$route,$params,$ampersand)
{
$frags = explode("/", $route); // рзбиваем на контроллер и действие
$controller = $frags[0]; // получаем оригинальный конттроллер
$action = $frags[1];// а также оригинальное действие
$params = $this->ParamsArrayIntoString($params); // переводим в строку
Yii::trace("действие 2000 = " . $action);
Yii::trace("контроллер = " . $controller);
Yii::trace("параметры = " . $params);
$alias = Alias::model()->findByAttributes( // пытаемся подгрузить модель псевдонима из базы
array('controller' => $controller, 'action' => $action, 'params' => $params)
);
if (!$alias) // если ничего загрузить не удалось
return false; // то есть возращаем обычный url
else // а если удалось
return $alias->alias; //возвращаем псевдоним
}
public function parseUrl($manager,$request,$pathInfo,$rawPathInfo)
{
// предположим, что передавамый путь псевдоним
$al = $pathInfo;// предположим
// а теперь проверим - есть ли такой псевдоним в базе
$alias = Alias::model()->findByAttributes( // пытаемся подгрузить модель псевдонима из базы
array('alias' => $al)
);
if (!$alias) // если ничего загрузить не удалось
return false; // то есть возращаем обычный url
else // а если удалось - то тут самое интересное =))
{
// скливаем маршрут из контроллера и действия
$route = $alias->controller . '/' . $alias->action;
// а затем "набиваем" $_GET массив оригинальными значениями
// извлекая их из строки $alias->params
$_GET = $this->ParamsStringIntoArray($alias->params);// цепляем GET параметры
// возвращаем оригинальный маршрут (GET параметры уже прикреплены)
return $route;
}
}
/* подразумевается,
что в эту функцию передаётся $_GET
массив параметров страницы, сведения
о которых необходимы для назначения
этой странице url-псевдонима */
public static function ParamsArrayIntoString($arr)
{
$str = '';
foreach ($arr as $key => $val)
{
if ($key != 'r') // еслли это не маршрут
$str .= $key . '=' . $val . '&';
}
return $str;
}
/* подразумевается,
что в эта функция преобразует строку созданную
функцией ParamsArrayIntoString()
назад в массив - то есть выполнит обратное преобразование */
public static function ParamsStringIntoArray($str)
{
$arr = array();// массив-результат
$frags = explode("&", $str);
foreach ($frags as $key => $val)
{
if ($val != '') // если строка не пуста
{
$frag = explode("=", $val);// разбиваем на "ключ / значение"
$k = $frag[0];
$v = $frag[1];
$arr[$k] = $v; // добавляем очередной элемент в массив-результат
}
}
return $arr;
}
}
- Log in to post comments
- 7859 reads