Nu3oN » 2010.11.20 14:38

Короче написал такую ерунду, но что-то мне кажется что это гомнокд

З.ы приведу пример в процедурном виде, т.к еще в класс это не пихал...

.htaccess

Код:

1
2
RewriteEngine on
RewriteRule ^mod\[([a-z]{3,10})\]($|\[[a-z]{3,10}\])($|\[.{0,150}\])$ index.php?mod=$1&act=$2&var=$3 [L,QSA]

index.php

Код:

1
span style="color: #0000BB"><?php// ищем корневую категориюdefine('SITE_PATH_ROOT', realpath(dirname(__FILE__)));// Указываем префикс для модулей.$arrSet['pref']['modul'] = '.modul.php'; /** * Обрабатываем url, и указываем какой модуль выводить. */$_modules = array( // Список доступных модулей 'home' => array('index'), 'member' => array('entry', 'inlet'));/** * Удаляем квадратные скобки. */$_GET['mod'] = isset($_GET['mod']) ? $_GET['mod'] : 'home';$_GET['act'] = isset($_GET['act']) ? strtr($_GET['act'], array("["=>"","]"=>"")) : 'index';$_GET['var'] = isset($_GET['var']) ? strtr($_GET['var'], array("["=>"","]"=>"")) : null;// Если категория существует, и существует // в массиве ключ с именем переданным $_GET['mod']if (is_dir(SITE_MODUL_DIR.$_GET['mod'].'/') and isset($_modules[$_GET['mod']])) { $_modul['dir'] = $_GET['mod'].'/'; // Если в массиве существует ключ с именем переданным $_GET['act'] if ($_GET['act'] != 'index') { // Если модуль существует и он указан в массиве с модуляьми. if (is_file(SITE_MODUL_DIR.$_modul['dir'].$_GET['act'].$arrSet['pref']['modul']) and in_array($_GET['act'], $_modules[$_GET['mod']])) { $_modul['act'] = $_GET['act']; } else { $_SESSION['issetErr'] = '404'; header ('Location: '.$arrSet['site']['link']); die; } } else { $_modul['act'] = 'index'; }} else { $_SESSION['issetErr'] = '404'; header ('Location: '.$arrSet['site']['link']); die;}if (isset($_GET['var']) and $_GET['var']) { // режем строку на подстроки. $expVar = explode(',', $_GET['var']); $intVar = count($expVar); if ($intVar) { // Выводим в цикле все переменные foreach($expVar as $key) { // режем переменную на лдюч и значение. $_expVar = explode('=', $key); // записываем полученные значения в глобальный массив $_GET[trim($_expVar[0])] = isset($_expVar[1]) ? trim($_expVar[1]) : false; } }}/** * Создаем константу */define('SITE_SET_MODUL', $_modul['dir'].$_modul['act'].$arrSet['pref']['modul']);/** * Подключаем модуль. */include_once (SITE_MODUL_DIR.SITE_SET_MODUL);?>
Morgan » 2010.11.20 14:55

>> and $_GET['act']
это на что проверка? на пустоту?
Тогда уже
if(!empty($_GET['act']))

>> array_key_exists($_GET['mod'], $_modules))
чем isset($_modules[$_GET['mod']]) не угодил?
Тем более, isset быстрее в данном случае на 25-50% (зависит от случая).

Nu3oN » 2010.11.20 14:58

Morgan написал:

>> and $_GET['act']
это на что проверка? на пустоту?
Тогда уже
if(!empty($_GET['act']))

Я не знаю что за фигня, но у меня на денвере если просто написать
if (isset($_GET['act']) то выдает что ничего не передано о_О
----

Morgan написал:

>> array_key_exists($_GET['mod'], $_modules))
чем isset($_modules[$_GET['mod']]) не угодил?
Тем более, isset быстрее в данном случае на 25-50% (зависит от случая).

Не додумался... спасибо!

Morgan » 2010.11.20 15:16

Nu3oN написал:

if (isset($_GET['act']) то выдает что ничего не передано о_О

т.е как?

Morgan » 2010.11.20 15:17

Насчет реализации, хочу оповестить о том что написание модульной системы вытянет из тебя еще много соков.
Я до сих пор рихтую свою систему, добавляю там, убираю это, и т.д.

Nu3oN » 2010.11.20 16:51

ну не знаю... Поживем увидем как говорится гг
З.ы мне не нравятся 19 и 20 строки...
Добавлено спустя   2 минуты :

Morgan написал:

Nu3oN написал:

if (isset($_GET['act']) то выдает что ничего не передано о_О

т.е как?

Да вот так... Показывает что переменной не существует
Добавлено спустя   9 минут  12 секунд:
поправил свою гомнятину))))

Gemorroj » 2010.11.20 19:58

isset вернет false если значение === null

Код:

1
2
3
$arr['key'] = null;
var_dump(isset($arr['key']));
var_dump(array_key_exists('key', $arr));

Добавлено спустя   1 минуту  18 секунд:
а по коду... много всяких условий. очень перегруженно выглядит.

Fuelen » 2010.11.21 03:27

Я чота нипонял про квадратные скобки, зачем их удалять? Т.е. откуда он берутся? :)
Как по мне, то лучше правило
RewriteRule ^.*$ index.php?path=$0 [L,QSA]
И тогда переменную path парсить.

Nu3oN » 2010.11.21 10:42

Fuelen написал:

Я чота нипонял про квадратные скобки, зачем их удалять? Т.е. откуда он берутся?

адрес получается потому что такой http://site.ru/mod[home][index][id=1,page=2]

З.ы уж лучше резать эти скобки!

Gemorroj » 2010.11.21 13:28

я, кстати, тоже думаю, что намного лучше делать одну точку входа и реализовать роутинг на PHP. очень гибко получается.

Fuelen » 2010.11.21 16:08

небыло чем занятся)) измерял скорость: что быстрее
удаление скобок через strtr или через trim. 10 000 итераций.
strtr:
0.0617
0.0619
0.0613
trim:
0.0415
0.041
0.0414

ыы :) как и ожидал))

Morgan » 2010.11.21 18:14

Fuelen
str_replace: 0.015634 сек.

strtr: 0.026619 сек.

trim в данном случае сравнивать не логично, т.к. функция обрабатывает только боковые символы.

Fuelen » 2010.11.21 18:20

ну как я понял, здесь и  будут только боковые))

Gemorroj » 2010.11.21 18:31

тут нужно полноценные тесты делать, на результатах в сотые доли секунды слишком высокая погрешность будет.

Fuelen » 2010.11.21 18:36

а полноценные это как?

Gemorroj » 2010.11.21 19:34

http://wapinet.ru/forum/viewtopic.php?id=49