ЧПУ - передача переменных и отслеживание статуса действия

yujin

Новичок
ЧПУ - передача переменных и отслеживание статуса действия

Здравствуйте, помогите, пожалуйста, советом.

Есть простейшая cms, которая при просмотре страницы сайта вызывает по умолчанию привязанный к ней модуль:

Имеется древовидный сайт с url вида
site.com/part/subsection/ACTION

И при вызове, например, страницы site.com/users/ мы получаем название для страницы users модуль,
подключаем файл его содержащий, и вызываем в нем функцию users_ACTION
PHP:
...
var $module_name // уже получили из бд название модуля
var $action // действие
if (!$action) // если ничего не указано, то вызываем функцию по-умолчанию
  $action = 'show';
include ('modules/'.$module_name.'.php'); // подключили его название
$f = $module_name . '_' . $action ;
if (function_exists($f)){
	$result = $f(); // вызываем действие.
}
echo $result;
И казалось бы все хорошо.
Но возникает два вопроса:

1) Например, есть два модуля:
один показывает новости по датам
другой показывает личную страницу пользователя по его имени.
То есть для первого нужен адрес:
site.com/news/2010/1/2 или site.com/$q=news&y=2010&m=1&d=2
а для второго:
site.com/users/vasya или site.com/$q=users&user=vasya

Как выдергивать из адресной строки эти переменные,
как передавать их в модули учитывая их разное, заранее неизвестное, количество
и, пожалуй самое главное и непонятное,
как работать с ними в модулях - ведь в случае с ЧПУ у нас нет названия переменных... ?

2) Как правильно работать с формами?
Для исключения повторного нажатия и выдачи ответного сообщения использую метод
указанный в faq'е этого сайта:

То есть три на каждое действие есть статус и три функции
f() -> f_run() -> f_ok();
PHP:
$f = $module_name . '_' . $action ;
$status = $_POST['status']
if (status == 'run' ) then{
  $f .= '_run' // совершаем действие после отправки формы 
}elseif (status == 'ok' ) {
  $f .= '_ok' // и потом выводим ответ пользователю
}
if (function_exists($f)){
	$result = $f(); // вызываем действие.
}
Насколько будет правильным такой подход или как можно сделать проще?
 

Духовность™

Продвинутый новичок
Как выдергивать из адресной строки эти переменные,
как передавать их в модули учитывая их разное, заранее неизвестное, количество
и, пожалуй самое главное и непонятное,
как работать с ними в модулях - ведь в случае с ЧПУ у нас нет названия переменных... ?
Единая точка входа в приложение с последующей обработкой URI или стандартный mod_rewrite с перечислением возможных комбинаций.

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

-~{}~ 06.09.10 18:37:

как работать с ними в модулях - ведь в случае с ЧПУ у нас нет названия переменных... ?
я вот так делаю - обозначаю карту всех возможных URL адресов в проекте.
 

sverel

Новичок
а я делаю только первую часть вышеописанного: определяю модуль и запускаю его. На входе модуль получат распарсенный адрес начиная с того места где он был найден. Дальше моудль сам должен решить какой экшн ему выполнить.
Т.е. в моём случае обращение к site.com/users/vasya вызывал класс
PHP:
$controller = new user('vasya');
В случае обращения к "site.com/news/2010/1/2" вызывается
PHP:
$controller = new news('2010/1/2'); // пускай сам разбирается что ему отображать.
Это так же удобно в случае древовидных разделов. Например, новости находятся по адресу /company/news/. тогда обращение site.ru/company/news/2010/1/2 вызовет всё тот же
PHP:
$controller = new news('2010/1/2');
 

sverel

Новичок
У меня такого не бывает и это не правильно. Но если очень надо, то в дереве есть корневой раздел. В админке ему можно назначить модуль 'users'. Тогда мой поиск остановится на этом самом корневом разделе и будет вызван new users('vasya');
Хотя обычно в системе у меня есть модуль "главной страницы".
 

sverel

Новичок
Потому что в корне сайта кроме юзеров есть ещё и другие разделы. Например site.ru/company - получается, что юзер если юзер вдруг выбирет себе такой же логин, то в его профил зайти не получится. А если вы сделаете проверку и будете говорить, что такой логин уже занят, то в будующем Вам может понадобится наоборот: создать раздел, а такой УРЛ уже занят логином.
Потому что должна быть локализация, групировка и "пространство имён". В программинге вообще очень правильным, я считаю, отделением в группу всё что можно отделить: все иконки в папке /template/images/icons/ даже если их всего 2 пока...
 

tz-lom

Продвинутый новичок
sverel
кривая карта ссылок и реализация ЧПУ это разные вещи
 

yujin

Новичок
triumvirat
количество переменных всегда известно.
Известно модулю, но не известно главному обработчику.

я вот так делаю - обозначаю карту всех возможных URL адресов в проекте.
то есть если будете писать новый модуль, то будете редактировать карту в исходном коде, так ведь?
Хотя с другой стороны ничто не мешает и хранить ее в бд. =)

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


triumvirat
сфига ли это не правильно? ЧПУ должен быть гибким, а вы его завязываете на названии модуля. какой же это ЧПУ тогда?
Где завязывает? ведь по названию (индексу) страницы ищется привязанный к ней модуль?
 

Духовность™

Продвинутый новичок
то есть если будете писать новый модуль, то будете редактировать карту в исходном коде, так ведь?
Так. В системе заранее прописываются все возможные комбинации виртуальных адресов. На основании этой карты мои ЧПУ могут быть какие угодно, вообще - максимальная гибкость.

Но я не знаю, как обычно это делают другие. Я бы послушал, как реализовать ЧПУ более правильно.
 
Сверху