Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Как у вас реализовано чпу?

Anna | 31.05.2014 | нет комментариев

Хочу изменить реализацию чпу у себя, но не знаю как будет отменнее. Под спойлером описан мой метод. Хотелось-бы посмотреть как это реализуете вы без применения фреймворков

Заголовок

Это пишем в файле index.php позже загрузки ядра и всех нужных файлов

define('MAIN_URI', ($_SERVER['REQUEST_URI'] == '/' ? '/index.php' : $_SERVER['REQUEST_URI']) );

// грузим правила для ЧПУ
include 'incl/furl_patterns.php';

$res =  preg_replace($patterns_keys, $patterns_values, MAIN_URI);
if ($res == MAIN_URI){
	// если не совпало ни одно из правил, выводим ошибку 404 либо редиректим...
}	

// разбираем url и преопределяем суперглобальный массив _REQUEST
parse_str($res, $_REQUEST);	

$module = $_REQUEST['module'];

// дальше подгружаем необходимый модуль -  упрощенный вариант
// скажем modules/news/index.php
if(file_exists("modules/".$module."/index.php")) {		
	include "modules/".$module."/index.php";			
} else {		
	//опять 404 либо редирект	
}

файл с правилами выглядит так:

$patterns_keys = array(
			'#^/(id([0-9]*)/?)?$#i',				//test.ru/id154 дозволено без слеша позже ид, а дозволено и с ним
			'#^/(user/?)(new/?)?$#i',
			'#^/(user/?)(settings/?)?$#i',
			'#^/(user/?)(settings/?)?((general|avatar|security|social)/?)$#i'
			);

$patterns_values = array(
			'module=account&id=$2',
			'module=account&action=new', 
			'module=account&action=settings', 
			'module=account&action=settings&do=$4'				//модулю дозволено передавать добавочные параметры
			);

Скажем для test.ru/user/new будет подключен файл modules/account/new_user.php,
для ссылки test.ru/user/settings — modules/account/settings.php и в зависимости от того какие настройки указаны — они и будут выведены(по дефолту general). Правда в таком случае модуль подключается напротив:

switch ($module) {			
	case 'account':				
		switch ($_REQUEST['action']) {						
			case 'new':
				include 'modules/account/new_user.php';
			break;
			case 'settings':
				include 'modules/account/settings.php';
			break;
			default:
				include 'modules/account/profile.php';
		}						
	break;
	...
}

Дозволено безусловно грузить файл modules/account/index.php и теснее в нем определять действия, и так для всякого модуля — неудобно, следственно решил: пускай все будет в одном месте(дозволено перенести в обособленный файл).

Файл htaccess выглядит легко

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php?%{REQUEST_URI} [l]

Данный метод был написан давным-давно и абсолютно типично работает, и я так давным-давно его использую что не могу придумать ничего нового.
Исключительным плюсом является то, что дозволено указывать всякие правила, скажем:

test.ru/
	id15484
	userid15484
	15484
	erth15484yryu
	user/15484
	user/id/15484
	...

будет отображена страница профиля пользователя с id=15484
либо легко логин пользователя, без указания его id

test.ru/artishok
test.ru/user/artishok

Минусов несколько. Помимо явственных — невозможно передавать параметры через массив $_GET.

Если тут поиск примитивный:
habrahabr.ru/search/?target_type=posts&q=text&order_by=relevance

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

'#^/(search/?)(([a-zA-Zа-яА-Я0-9% ]*)/?)?((posts|comments|questions|users)/?)?((time|relevance)/?)?(page([0-9]*)/?)?$#i'

и

'module=search&text=$3&type=$5&sort=$7&page=$9',

test.ru/search/text/posts/time/page2 — не ясно что происходит, и если в ссылке тип и сортировку поменять местами — выдаст ошибку, также ошибку выдаст если убрать один из параметров…

Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB