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
- 7326 reads