Красивые и понятные пути для страниц вашего сайта 2 — Модули
В прошлой статье мы остановились на разборе адресной строки. Пусть у нас будет пока тока один модуль — Новости.
Обычно для легкого понятия, структура файловой системы сайта строится следующим образом (структура папок):
DIR: modules
FILE: index.php
FILE: .htaccess
В папке modules будут хранится модули, в файле index.php — обработка путей и подключение модулей, файл .htaccess — включение модуля mod_rewrite. Обо всем этом я уже писал в прошлой статье, если не читали, обязательно прочтите.
Итак. Нам нужно для примера создать модуль новости. Подумаем, как модуль будет работать.
1. Определяем, что пользователь вызвал модуль
2. Определяем какие параметры передаются модулю в пути. Это могут быть (номер страницы, и номер самой новости)
3. в зависимости от переданных параметров определяем действие модуля. Например, если параметров нет — выводим все новости, с учетом кол-ва на страницу и показываем страницы (1,2,3,4, далее). Если передан параметр номера самой новости — показываем полностью новость и например кнопочку «Назад», чтобы вернуться назад к списку.
Возникает вопрос. Как различить, что мы передали, номер страницы или номер новости как параметр. Тут два ответа:
1. Если Вы сами придумаете хитрый способ определения такого рода параметров, и соответственно обрабатывать их, то Вам респект ![]()
2. Я обычно делаю так: /news/NUM_PAGE/NEWS_ID/ тут видим — передается два параметра, в данном случае это говорит о том, что мы были на странице NUM_PAGE и открыли новость NEWS_ID. В данном случае, если мы не указываем номер новости, мы просто перемещаемся по страницам модуля. т.е. Может быть 2 варианта, либо перемещение по страницам, либо показ новости.
Так вот, начнем писать модуль:
1. когда мы передаем серверу путь http://mysite.ru/news/ разборщик путей index.php должен определить, что мы вызвали модуль новости:
$user_query = isset($_SERVER['REQUEST_URI']) ? trim($_SERVER['REQUEST_URI'], '/'): ''; $elements = explode('/',$user_query); switch ($elements[0]) { Case 'news': { Echo 'Вы запросили модуль новости, но его пока нет на сайте'; } Break; Case '404': { echo 'Страница не найлена'; } Break; Default: { Header('Location: /404/'); } Break; }
Заменим вывод текста о модуле, следующей строкой:
Case 'news': { include($_SERVER['DOCUMENT_ROOT'].'/modules/news.php'); } Break;
Вот и все
при открытии http://mysite.ru/news/ мы вызываем модуль news.php. Для красоты структуры папок, можно поместить файл news.php в папку news или как-то иначе.
2. В самом модуле, нам пора определить какие параметры были переданы. Мы точно знаем, что в массиве $elements самый первый элемент — это название модуля, а все что дальше — параметры, по этому первым делом, мы отрезаем часть массива с параметрами из основного массива.
// news.php // получили параметры модуля $params = array_slice($elements, 1); // делаем проверку // Если параметров больше, чем нужно, выдаем 404ю ошибку >if(sizeof($params)>2) {header("Location: /404/");} // Если номер страницы передан, но не как число - опять 404я страница >if(sizeof($params)==1 && !is_numeric($params[0])) {header("Location: /404/");} // Если номер страницы и номер новости переданы, но не как числа - опять 404я страница >if(sizeof($params)==2 && (!is_numeric($params[0]) || !is_numeric($params[1]))) {header("Location: /404/");} // Начало работы модуля $page_num = isset($params[0]) ? (int)$params[0] : 1; // по умолчанию страница номер 1 $news_id = isset($params[1]) ? (int)$params[1] : 0; // по умолчанию - новость не выбрана
Предварительно мы проверили на «дурака» параметры, передаваемые модулю, после чего можно дать жизнь модулю.
Если вас заинтересовал следующий вид кода (int)$params[1], объясню: тут мы явно приводим тип элемента массива $params[1] в число, т.е. если, ну не знаю, каким-то волшебным образом, в элемент попадет буквенное значение, то оно будет приведено в число, а так как буква не число, то будет 0. Да еще и по тому, что по дефолту, элементы массива — это строки, т.к. взяты из урла.
if ($news_id==0) { echo "Выводим список новостей"; } else { echo "Тут выводим саму новость"; }
в принципе все
таким образом, можно, как говорится «мутить» модули разные и не заразные )))
Статья просто супер, но есть одно но! Может я конечно че не так понял, но если у нас URL будет иметь вид как вы предложили, т.е. /news/NUM_PAGE/NEWS_ID/ то получится что сама новость не будет иметь статичного URL-ла т.к. ведь страницы с добавлением новых новостей будут увеличиваться.
Хотя вообще может быть это и не совсем принципиально, но все же...
ну можно же сделать и под ругому
/news/NEWS_ID/?=page
в данной просто будет использоваться GET переменная, это правда не очень.
можно более извращенно сделать с условием правильной алгоритмики
/news/NEWS_ID/
/news/PAGE/
с условием что NEWS_ID > N
т.е. PAGE < N
не будет пересечений между ID новостями и страницами
а еще можно каждой новости давать текстовое обозначение, либо HASH Какой-нибудь, либо краткое название латиницей
/news/423fhab4d/ — новость )) но не рационально
/news/my_new_car/
в последнем случае есть плюсы и минусы, плюсы в том что УРЛ очень понятен, минус, долго придумывать его
@admin
Ну этт понятно. А вот вообще первый способ (/news/NUM_PAGE/NEWS_ID/) на SEO никак отрицательно не влияет случайно? Для меня это куда важнее.