Написал CMS. Как укротить велосипед?

Светозар

Новичок
Доброго времени суток. Я - велосипедист, написал свой мини велосипед и теперь мучаюсь, как избавиться от лишнего запроса.

Архитектура такая:

PHP:
-system/data
-system/mods
-system/mods/cont
-templates/default
-index.php
Теперь о работе скрипта... Index.php проверяет на наличие файла конфигурации и елси тот существует, то собирает шаблон из main.php / header.php / footer.php

в -templates/default/main.php (файл отвечает за вывод контента) инклудится модуль --system/mods/content.php

он представляет из себя что-то страшное:

PHP:
<?php 
if ( !isset( $_GET["action"] ) ) $_GET["action"] = "index";

switch ( $_GET["action"] ) 
{ 
   case "index":    		// Выводим главную страничку
     index(); break; 
  	 
   case "categories":      	    // Выводим страничку с категорией 
     categories(); break;  
	
   case "news":    		// Выводим главную страничку
     news(); break; 
   
   default: 
     index(); 
}

// Выводим главную страничку
function index() 
{ 
	 include $_SERVER[DOCUMENT_ROOT]."/templates/default/stat_page.php";
	 

}

function categories() 
{ 
	include $_SERVER[DOCUMENT_ROOT]."/templates/default/cat_page.php";
}

function news()
{
	echo "новаость";
}
?>

в свою очередь stat_page.php и cat_page.php выводят главную страничку, или страничку с категориями методом index.php?action=index

суть в том, что когда я таким образом вывожу категорию, впрочем, и новость тоже, получается два запроса. Первый, чтобы вывести заголовок категории/новости, второй, чтобы вывести контент из таблицы... Вроде, разместить один запрос в начале страницы. Так нет, он почему-то у меня распространяется только на вывод titlov и мета тегов...

Вопрос до боли прост. Как оставить всего лишь один запрос..


P.S.


include $_SERVER[DOCUMENT_ROOT]."/templates/default/stat_page.php" - отвечает только за вывод новости... за вывод titlov отвечает мод определяющий get запрос страницы. Например, если мы читаем новость 1, то будет выведен заголовок страницы с id 1. Если мы прыгнем на категории 123, то будет заголовок с id категории 123
 

AmdY

Пью пиво
Команда форума
Светозар
просто посмотри как это сделано в любой неВАМИписанной CMS или фреймворке с единой точкой входа, затем выберете подходящий ВАМ вариант.

Вам не кажется, что можно избавиться от case и сделать имя вызываемого метода и инклуд на основании только почищенного $_GET["action"]
 

Фанат

oncle terrible
Команда форума
Светозар
Первое, что надо уяснить на этом форуме - не надо тушеваться.
Большая часть отвечающих будет исполнять арию "какой я крутой, а тебе надо все переделать или вообще бросить".
При этом сами по себе ребята неплохие, но вот как-то странно на них форум действует. Загадка, которую еще предстоит решить психологам.
Короче, не надо этого пугаться и обращать внимание.

проблема твоя, судя по всему, заключается в области видимости функций.
Ну, и в кривой архитектуре конечно.

Для решения обеих проблем я бы порекомендовал, во-первых, добавить недостающие шаблоны (они нужны для каждой страницы, а не только для хидера и футера. По сути, надо каждый скрипт разделить на две части - получение данных и отображение данных. Начинать что-то выводить надо только после получения и форматирования всех нужных данных.)
а во-вторых - обойтись без функций, а просто сразу инклюдить нужные скрипты.
а в-третьих - можно, кстати, обойтись без скрипта-диспетчера, а напрямую обращаться к скриптам новостей, каталога и так далее.

как это сделать, можно посмотреть здесь: http://phpfaq.ru/tpl#example
 

Фанат

oncle terrible
Команда форума
AmdY
Это другое.
Один из модулей CMS вполне может быть организован по такому принципу.
Но именно что один из модулей, а не вся.
Этот скрипт предназначен для показа статических текстов, а не для вызова других скриптов.

Хотя я согласен, в описании присутствует некоторая неоднозначность. Все-таки, этот код писался сильно раньше, лет на 8
 

AmdY

Пью пиво
Команда форума
Фанат
readfile заменить на require и достаточно для начала
 

Фанат

oncle terrible
Команда форума
вопрос - зачем это делать.
зачем писать скрипт-дитспетчер, если можно обойтись вообще без него? а обращаться к модулям напрямую.
зачем бессмысленно усложнять задачу?

причин для диспетчера может быть две:
Первая - неверное понимание шаблонизации, когда индекс занимается выводом хтмл хидера перед вызовом конкретного модуля. Это самый распространенный вариант нубоскриптов и он в корне неправильный. Шаблон должен вызываться самим модулем.
Вторая - фронт контроллер под рерайт. Здесь - да, без роутера не обойтись. Но поскольку в данном случае рерайт отсутствует, роутер оказывается лишним.

Ну, только если как задел на будущее. Но я бы пока не стал все равно роутер городить.
 

Светозар

Новичок
Мозг лопнул..
Если я не ошибаюсь, то http://phpfaq.ru/easy/index.php?code - тайтлы не выводятся, но за идею спасибо.
фронт контроллер под рерайт
...

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

так что я пока не вижу альтернативного варианта, чем заменить case break..

PHP:
} 
$file="txt/".$name.".htm"; 
if (is_readable($file)) { 
  readfile($file); 
} else { 
  echo "<br>Запрошенный вами файл не найден<br>"; 
}
тут мы вытаскиваем из текстового файла... А если захочу из БД.

нужно же будет определять уже $file=.$db['id'].".htm"; - и это уже напоминает ЧПУ - а оно мне не нужно...
 

Фанат

oncle terrible
Команда форума
Все очень просто.
1. читаем на http://phpfaq.ru/tpl#example
2. создаем файл news.php состоящий из двух строчек
PHP:
<?php 
$tpl = "tpl_links.php";
include "tpl_main.php";
?>
3.создаем шаблон для новостей tpl_news.php, состоящий из одного слова "новаость";
4. Создаем основной шаблон сайта tpl_main.php с хидером, футером, меню и прочим, как показано по ссылке.
5. обращаемся напрямую к news.php, безо всяких индексов.
...
6. PROFIT!
 
Сверху