Yii - наследник от CBaseUrlRule пример - наначение url псевдонимов средствами Yii

Собственно говоря, рассуждения были начаты нами здесь
о том, какие настройки надо определить в конфиге чтобы всё работало было упомянуто здесь

Моё предложение?

да - оно следующее - предлагаю реализовать универсальный способ хранения псевдонима для любой страницы -
а именно - заводим модель псевдонима (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;
	}

}