Loading
Красноглазым Джедаям
компьютерной вселенной
посвящается.

Шаг второй. Формирование гиперссылок

Теперь нужно определиться с тем, как мы будем определять абсолютные пути в файловой системе. Надо ведь как то дописывать функцию getTpl($tpl).

В мире хищников всегда виновата жертва.

Абсолютные пути, корень сайта в файловой системе.

Итак у нас начинает нарисовываться структура сайта MVC. Корень сайта обозначим как "/".

Для подключения файлов при помощи инструкции include удобно использовать полные пути к файлам. Чтобы удобно было использовать полный путь, его нужно определить при помощи константы. Встроенная PHP функция define() определит константу. Первым аргументом укажем имя константы, вторым - значение. Имя константы разделено на две части. Первая часть CONFIG означает, что константа определена в файле с названием config.php, который мы разместим в каталоге "/libs/model/", вторая часть Root означает корень сайта. Итак находим корень сайта в файловой системе:

define('CONFIG_ROOT', str_replace('\\', '/', $_SERVER['DOCUMENT_ROOT']) .'/');

Запишем в указанный файл этот код. Кроме того путь к шаблонам нужен как воздух. Определим и его.

define('CONFIG_TPL', CONFIG_ROOT . 'view/tpl/'); 'view/tpl/' - эта строка содержит путь от корня сайта к каталогу с нашими шаблонами. Теперь легко и просто допишем функцию getTpl($tpl) и внесем ее в файл "view.php".

function getTpl($tpl) { $tpl = CONFIG_TPL . $tpl; //вот и полный путь if(file_exists($tpl)) return file_get_contents($tpl); else die('Файл - шаблон '. $tpl .' не найден!'); }

Сетевые пути, корень сайта по протоколу HTTP.

Теперь нам нужны сетевые пути по протоколу HTTP чтобы подключать скрипты и файлы стилей. Добавим в файл "/libs/model/config.php" такую константу:

define('CONFIG_HOST', 'http://'. $_SERVER['HTTP_HOST'] .'/'); Она определит корень сайта по протоколу HTTP. Можно конечно написать слэш "/" ибо браузер - клиент скорее всего воспримет его как корень сайта. Но я использую первый вариант.

Таким способом можно навтыкать множество необходимых Вам путей и подключать файлы при помощи констант. Если вдруг имя какой нибудь папки изменится, то не нужно будет прыгать по всему сайту исправляя имя папки, достаточно изменить путь в конфиге.

Гиперссылки.

Формирование гиперссылок это сложный вопрос. Нужно предусмотреть множество ньюансов от расположения каталогов до использования "REWRITE" то есть перенаправления. Сам собой встал вопрос написать функцию формирования гиперсылок на все случаи жизни. Круто? Начнем! Назовем нашу функцию - обертку href(). Кроме того сразу напишем функцию reDirect(), которая будет нужна для организации защиты от несанкционированного доступа.

function href() { global $GET; //увидели массив внутри функции $tmp = $GET; //чтобы не влиять на глобальный массив $href = ''; //сюда запишем готовую гиперссылку $arg = func_get_args();//если были переданы аргументы, получаем их if(is_array($arg[0]))//если вызвана функция reDirect() $arg = $arg[0]; //получаем массив $arguments $host = CONFIG_HOST;//понадобиться когда организуем админку //возможность ссылки на главную страницу a href="<?php echo href('host'); ?>" if($arg[0] == 'host') return $host; foreach($arg as $var)//перебираем массив аргументов { $param = explode('=', $var); if(array_key_exists($param[0], $tmp)) $tmp[$param[0]] = $param[1]; else die('Ошибка формирования гиперссылки!'); } //обрезаем параметры $GET, не переданные в аргументе функции $cnt = array_flip(array_keys($tmp)); $tmp = array_slice($tmp, 0, $cnt[$param[0]] + 1); foreach($tmp as $var => $val)//перебираем полученный массив //если включен модуль перенаправления if(CONFIG_REWRITE == 'on') //вписываем только значения массива $tmp через слэш $href .= '/'. $val; //если выключен модуль перенаправления elseif(!empty($val)) //вписываем ключи и значения массива $tmp через амперсанд $href .= '&'. $var .'='. $val; if(CONFIG_REWRITE == 'on') return $host . hrefTrim($href); else return $host .'?'. trim($href, '&'); } //эта функция нужна, чтобы устранить проблемы с цифровыми идентификаторами страниц //в обычном случае достаточно было бы ltrim($href, '/') function hrefTrim($link) { return preg_replace('#(/0)+$#', '', ltrim($link, '/')); } /****************************************************************/ function reDirect() //нужна будет для защиты от несанкционированного доступа { // Получаем массив аргументов, переданных в функцию reDirect() $arguments = func_get_args(); // Если аргументы есть, if(count($arguments)) { // отправляем браузер на новый адрес header('location: '. href($arguments)); //в href аргументом передается массив $arguments. exit(); // Останавливаем скрипт } else { // Если аргументов нет, туда, откуда пришел. header('location: '. str_replace("/index.php", "", $_SERVER['HTTP_REFERER'])); exit(); // Останавливаем скрипт } }

Область видимости не позволяет увидеть внутри функции массив $GET, объявленный вне функции. О том как мы получаем $GET чуть позже в файле "variables.php". Чтобы увидеть, его нужно либо передать его аргументом, либо объявить глобальным. Выбираем второй путь. Но в то же время влиять на его содержимое нам не желательно, поэтому мы перезаписываем его во временную переменную $tmp. Массив $GET содержит множество заранее определенных элементов, и нам нужно выбрать нужные и обрезать ненужные.

"is_array($arg[0])" заслуживает одельного описания. В случае вызова функции reDirect() мы в аргументе функции href() уже будем иметь массив $arguments, а не строковые аргументы, которые будут поступать в случае обычного вызова как href('section=section_1', 'page=page_1'); . Таким образом $arg = func_get_args(); в функции href создаст массив массивов, где $arg[0] и будет тем самым массивом $arguments, изначально переданным аргументом в функцию href функцией reDirect().

"$param = explode('=', $var);" разделяет параметры переданные в аргументе href('section=section_1', 'page=page_1'); на элементы массива $param[0] = section; $param[1] = section_1;

"if(array_key_exists($param[0], $tmp))" Если в массиве $GET есть такой ключ. (Как мы помним $tmp = $GET;)

"$tmp[$param[0]] = $param[1];" То ключу массива $GET присваивается соответствующее значение: $GET['section'] = 'section_1' и $GET['page'] = 'page_1'.

"$cnt = array_flip(array_keys($tmp));" Получаем array_keys() только ключи массива $GET как значения промежуточного индексного массива. То есть Массив[0] = 'section'. Функцией array_flip() переворачиваем массив, ключи становятся значениями, а значения ключами. То есть на выходе получаем $cnt['section'] = 0; $cnt['page'] = 1;

"$tmp = array_slice($tmp, 0, $cnt[$param[0]] + 1); " Делает выбор части массива. $param[0] содержит имя последнего переданного функции href в аргументе ключа. $cnt[$param[0]] содержит порядковый номер последнего переданного функции href в аргументе ключа в отсчете от нуля. Чтобы получить общее количество переданных в аргументе ключей нужно сделать $cnt[$param[0]] + 1. Итак массив $tmp содержит обрезанный вариант массива $GET с количеством элементов, в точности соответствующих переданным в аргументе функции href. Все лишнее обрезано. Теперь формируем гиперссылку.

"trim($href, '/')" Убираем слэш в начале и в конце строки, то же самое с амперсандом. Функция возвращает нам текстовую строку, представляющую собой валидную гиперссылку в зависимости от того включен или выключен модуль перенаправления. Ltrim() уберет слэш в начале строки.

И в заключении полный код файла view.php:

///////////////////////////////////////////////////////// /** * Generation of page of an error at access out of system * Генерация страницы ошибки при доступе вне системы * Это должно быть во всех файлах, кроме индекса (index.php) */ if(!defined('INDEX_KEY')) { header("HTTP/1.1 404 Not Found"); exit(file_get_contents($_SERVER['DOCUMENT_ROOT'] .'/404.html')); } /////////////////////////////////////////////////////////// /** * Function of processing of variables for a conclusion in a stream * Функция обработки переменных для вывода в поток */ function htmlChars($data) { if(is_array($data)) $data = array_map("htmlChars", $data); else $data = htmlspecialchars($data); return $data; } $POST = htmlChars($POST); /** * Function of reading of templates * Функция чтения шаблонов * */ function getTpl($tpl) { if(file_exists(CONFIG_ROOT_TPL . $tpl)) return file_get_contents(CONFIG_ROOT_TPL . $tpl); else die('Файл - шаблон '. $tpl .' не найден!'); } /** * Function of analysis of a template * Функция разбора шаблона * */ function parseTpl($cont, $data = '') { if(is_array($data)) { extract($data, EXTR_PREFIX_ALL, 'tpl'); ob_start(); eval('?>'. $cont .'<?php '); $cont = ob_get_contents(); ob_end_clean(); } return $cont; } /** * Function of formation of GET-parametres * Функция формирования GET-параметров (Гиперссылок) */ function href() { global $GET; $tmp = $GET; $href = ''; $arg = func_get_args(); if(is_array($arg[0])) $arg = $arg[0]; //когда будет админка if(defined('ADMIN')) $host = CONFIG_HOST .'admin/'; else $host = CONFIG_HOST; if($arg[0] == 'host') return $host; foreach($arg as $var) { $param = explode('=', $var); if(array_key_exists($param[0], $tmp)) $tmp[$param[0]] = $param[1]; else return $host; } $cnt = array_flip(array_keys($tmp)); $tmp = array_slice($tmp, 0, $cnt[$param[0]] + 1); foreach($tmp as $var => $val) if(CONFIG_REWRITE == 'on') $href .= '/'. $val; elseif(!empty($val)) $href .= '&'. $var .'='. $val; if(CONFIG_REWRITE == 'on') return $host . hrefTrim($href); else return $host .'?'. trim($href, '&'); } function hrefTrim($link) { return preg_replace('#(/0)+$#', '', ltrim($link, '/')); } /** * Function of Redirections * Функция перенаправления */ function reDirect() { // Получаем массив аргументов, переданных в функцию reDirect() $arguments = func_get_args(); // Если аргументы есть, if(count($arguments)) { // отправляем браузер на новый адрес header('location: '. href($arguments)); exit(); } else { // Если аргументов нет, туда, откуда пришел. header('location: '. str_replace("/index.php", "", $_SERVER['HTTP_REFERER'])); exit(); } }

В Шаге 3 рассмотрим формирование файла variables.php и загадочное CONFIG_REWRITE == 'on'.


Контактная информация

E-Mail: oleynikww@gmail.com

Добавить комментарий

Комментарии пользователей