Убираем константы из шаблонов

После прочтения вот этого поста: Убираем дублирование при добавлении роутинга, понял что эта проблема волнует не только меня. Хочу поделиться своими соображениями на этот счет.

Linch правильно заметил, что при добавлении нового роута приходиться дублировать информацию. Но, на самом деле здесь происходит более «серьезное» дублирование, чем копипаст из config/config.route.php в Viewer.class.php — мы дублируем функционал по составлению пути — один раз это делает программист, разрабатывая модуль, второй раз это делает верстальщик, когда делает шаблон. Большее неудобство не в том, как мы доставим константу во Viewer, а именно в том факте, что верстальщику этими константами нужно пользоваться.

Если нам вдруг понадобиться изменить принцип роутинга, то придется перелапачивать весь шаблон, исправляя ошибки адресов. Имхо, если Router, решает какой Action должен отработать, пусть сам нам скажет, как к этому Action нужно обратиться. Тогда необходимость в константах во Viewer`e вообще отпадет сама собой.

Как этого добиться? Под катом 20 строчек кода.

1. Нам нужна функция роутера, которая по переданому action`у вернет путь к нему. Нет ничего проще. Добавляем к /classes/engine/Router.class.php
static public function getPath($action) {
		$aRoutes = array_flip(self::getInstance()->aConfigRoute['page']);
		// Если пользователь запросил action по умолчанию
		if($action == 'default') {
			$action = self::getInstance()->aConfigRoute['config']['action_default'];
		}
		// Пытаемся найте соответствующий роут
		if(!$sPage = @$aRoutes['Action'.ucfirst($action)]) {
			return false;
		} 
		return DIR_WEB_ROOT."/$sPage/";
	}

Замечу, что аналогичная фукнция в роутере есть — DefineActionClass(), но у нее один недостаток, она так и «норовит» сделать это:
$this->Message_AddError($this->Lang_Get('system_error_404'),'404');

Думаю не нужно объяснять, почему такое поведение нас не устраивает.

2. Привык работать с Zend`овскими ViewHelper`ами, но поскольку здесь у нас Smarty, то сделаем все по философии этого шаблонизатора. У Smarty для таких случаем есть механизм плагинов. Им и воспользуемся. В папку /classes/modules/sys_viewer/plugs/ вкладываем файлик function.router.php следующего содаржания:

/**
 * Smarty Plugin by Alex Kachayev
 * Позволяет получать данные о роутах
 *
 * @param   array $aParams
 * @param   Smarty $oSmarty
 * @return  string
 */
function smarty_function_router($aParams,&$oSmarty) {	
	if(empty($aParams['action'])) {
		$oSmarty->trigger_error("Router: missing 'action' parametr");
		return ;
	}
	require_once(DIR_SERVER_ROOT.'/classes/engine/Router.class.php');
	
	if(!$sPath = Router::getPath($aParams['action'])) {
		$oSmarty->trigger_error("Router: unknown 'action' given");
		return ;		
	}
	/**
	 * Возвращаем полный адрес к указаному Action
	 */
	return (isset($aParams['extend'])) 
		? $sPath . $aParams['extend'] ."/"
		: $sPath;
}


Все. На этом наш труд завершен, можем пожинать его плоды. Теперь мы можем в любом месте шаблона использовать следующие конструкции:

1. Получение правильного пути к любому action`у:
{router action='top'}

Вернет _http://yoursite.ru/top/

2. Получение полного пути с указанием дополнительных параметров
{router action='blog' extend='bad'}

Вернет _http://yoursite.ru/blog/bad/

3. Получение Action`а по умолчанию
{router action='default'}

Вернет _http://yoursite.ru/index/

Вы можете свободно добавить сколько угодно новых Action`ов или изменить пути к старым. И при этом не волноваться — шаблоны все узнают сами.
С появлением цифровых диктофон стало достаточно просто конспектировать и записывать речь, теперь не нужно изводить стопку бумаги и торопиться успеть за оратором. Достаточно включить диктофон, а уже потом в спокойной обстановке обработать запись. Купить цифровой диктофон в Москве очень просто, особенно через интернет магазины.

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.