alhames.ru
Имеется схема, при которой существует только одна страничка (index.php), на которой генерируется весь сайт (в зависимости от переданных параметров).
К примеру по запросу site.ru/?a=news, должна сгенерироваться главная страничка новостей, по запросу site.ru/?a=news&b=05 на страницу должны быть выведены новости за май, а по запросу site.ru/?a=news&b=05&c=09 - новсть за конкретное девятое число.
Вопрос: каким образом у вас устроена обработка переданных параметров, и по какому принципу генерируется сайт?
Самый банальный пример, который мне приходит в голову - каждый раз подставлять для include новый адрес (к примеру, в случае новостей - "news.txt"), в котором и будет код запрашиваемой странички.
К примеру по запросу site.ru/?a=news, должна сгенерироваться главная страничка новостей, по запросу site.ru/?a=news&b=05 на страницу должны быть выведены новости за май, а по запросу site.ru/?a=news&b=05&c=09 - новсть за конкретное девятое число.
Вопрос: каким образом у вас устроена обработка переданных параметров, и по какому принципу генерируется сайт?
Самый банальный пример, который мне приходит в голову - каждый раз подставлять для include новый адрес (к примеру, в случае новостей - "news.txt"), в котором и будет код запрашиваемой странички.
если не предусмотреть альтернативные пути скармливания роботам страниц, то могут возникнуть проблемы )
2) лучше все бы бд.
И не забывать
$b = (int) $_GET['b'];
и т.д...
а если подключать файлы п отипу
files/$a$b$c.txt
то ещё проверять $a
1) ну лучше бы не иклуд (file_gets_content к примеру)
А чем функции работы с файлами лучше инклуда?
2) лучше все бы бд.
Код php хранить в БД?
а если подключать файлы п отипуfiles/$a$b$c.txt
Ну это не совсем устраивает, так как новостей должно быть большое количество - дисковое пространство будет излишне загружено..
Меня, собственно интересует вопрос "каким образом у вас устроена обработка переданных параметров", а не каким образом её можно устроить.. =)
инклуд это хорошо.. если хорошо путь фильтровать..
хотя с mod_rewrite ом тут ошибок быть не может..)
в бд тексты новостей..
ну индекс будет подсоединять как бы модули
...
if (isset($_GET['a']) and !is_array($_GET['a']))
{
$a = $_GET['a'];
}else{
$a = 'main.php';
}
$pages = array ('news' => 'news.php', 'blog' => 'lib/blog.php');
if (isset($pages[$a]))
{
include $pages[$a];
}else{
include ('main.php');
}
...
и в каждом из них обработка с другими параметрами...
типа в news.php будет извлечение новости из бд к примеру.
if (isset($_GET['b']))
{
$b = (int) $_GET['b'];
}else{
$b = false;
}
анологично для $c
далее можно
if ($a!== false and $b!==false)
{
... // Вывод на дату
}else if ($a!==false){
... // На месяц
}else{
... // главная страница новостей
}
Сиб =)
Если есть другие идеи - я весь во внимании =)
У меня, наверное, так и устроено...
если хочешь без массива с функцией
для подключения файлов из текущей папки
Можно хранить новости в базе с таймстампоп, а потом делать выборку в зависимости от запроса.
Ну, пример с новостями я привел как самый распространенный. =)
А вообще запросы там намного сложнее - вот теперь думаю как обрабатывать запрос по двум и более параметрам - т.е. массив уже будет иметь вид $page[$a1][$a2][...], и проверка
if (isset($pages[$a]))
{
include $pages[$a];
}else{
include ('main.php');
}
?>
UPD а вообще если хочешь с инклудами, что не стандартно, то регеспы действительно умеют творить чудеса...
если хочешь без массива с функцией
Не-не-не, это функция не устроит, т.к. я категорически против прямой связи переданных параметров с именем файла. Потому тока массив.
Да, тут еще один момент, помимо адреса для инклуда в этом массиве хранятся title, keywords и description, т.к. для каждой сгенерированной странички они разные..
Гм.. А что если их хранить в БД? Тогда уж проще и инклуды тоже в БД хранить..
Надо думать.. думать...
UPD а вообще если хочешь с инклудами, что не стандартно, то регеспы действительно умеют творить чудеса...
Дело в том, что я заранее знаю все возможные варианты значений, которые может принять $_GET['a'] - т.е. это всего несколько конкретных разделов с конкретными именами - в регулярке нет смысла из-за малого объема данных.
Да и вообще, у меня как-то странно все получилось: изначально хотел полностью отделить html от php для простоты настройки дизайна - получилось куча кусков, но ничего толком отделить не удалось.. Наверно раз в пятый переделываю в поисках более рационального решения =)
т.е. в html коде оставляй типа {user} потом str_replace ом его...
$classname=strtolower($classname);
$path=explode('_',$classname,2);
if (isset($path[1])) {
(file_exists(CL.$classname.'.php')) ? $classname=CL.$classname : $classname=MODULES.$path[1].'/'.$classname;
} else {
$classname=CL.$path[0];
}
include $classname.'.php';
}
PHP5 - рулит =)
Каждая страничка отдельно генерится в своем классе... ну че тут сказать... удобно...