управление блоками

Spear

почемучка
управление блоками

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

Вот я видел на одном сайте пишется
<%MENU%>
и в месте где это пишется - при сборке страницы вставляется определенный контент (меню, список как-то, форма авторизации и т.п.)

Подскажите пожалуйтса -как это работает?
То есть:
как делать саму настройку где и какие блоки выводить (т.к. где и какие надписи <%_НАВАНИЕ_%> выводить

и как после этого парсить <%_НАВАНИЕ_%> на нужный контент.
Я буду очень признателе за ответы, за любые.

-~{}~ 10.11.05 23:07:

сейчас я подробнее опишу как работает мой ЦМС (если его можно так назвать :))
 

sakon

П..и.н..ок
Ё.
Называется это шаблоны.
>как после этого парсить <%_НАВАНИЕ_%> на нужный контент

Обычная замена одного на другое. (str_replace, preg_replace)
 

magic

lancer
Если просто блоки разбирать - то делаешь себе текстовый файлик и парсишь его на наличие известных тебе блоков.

Можешь еще посмотреть Smarty, но это уже шаблонный движок.
http://smarty.php.net/
 

Spear

почемучка
страктура фалов:
основйной файл:
index.php

основные функции и классы:
/engine/sys/разные файлы (основные функции и классы)

модули:
/engine/modules/_ИМЯ_МОДУЛЯ_/_имя_файла_модуля.php

"скины"
engine/skins/ИМЯ_СКИНА/

Как он работает:
в файле index.php:
сначала запускаются разные класы, идет конект к БД, и так далее. Потом передается переменная (гетом) mod,
и в зависимости от её имени загружается файл модуля
/engine/modules/_ИМЯ_МОДУЛЯ_/_имя_файла_модуля.php

в файле модкуля идут разные вычисления того, что нужно вывести на экран,
потом делается инклуд
header.php
потом вывод того, что нужно вывести (нарпимер, новость)
инклуд footer.php

в header.php делается следующее:
проверяется, есть ли в папке текущего скина (текущий - тот, который использует сайт, например MainSkin) файл
engine/skins/ИМЯ_СКИНА/ИМЯ_МОДУЛЯ.рнр
сли есть - инклуди его.
Если нет - инклудим engine/skins/ИМЯ_СКИНА/default.php

потом (все ещё в head.php)
вызываем функц. head() (ниже описание)

дальше идет вывод инфы из файла модуля
и в нем же (в конце) инклуд footer.php,
который вызывает функцию foot() (ниже описание)



в файле скина есть две функции: head() и foot()
в файле скина идет уже ХТМЛ код, подключение стилей оформления, и так далее. Все сделано в таком виде
(<td>, <tr> и прочее я не пишу. Только так - схематично)

function head() {
<hrml>
<head>
<title><?=$GLOBAL['p_title']?></title>
тут же кейвордсы и т.п.
</head>
<body>
дальше - самое смешное.. т.к. у меня нету системы парчинга блоков и так далее - все блоки которые одлжны плдключаться я ПРОписываю каждый рраз вручную в самих файлах скина.
например
<table>меню:
<?
include"block1.php";
?>
</table>

<table>Голосуем:
<?
include"block2.php";
?>
</table>

и так далее.
}

function foot()
{
закрываются все таблицы, и теги. ну ещё тут же - вызов счетчиков и прочего}

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

Spear

почемучка
magic
спасибо, по ссылке пошел, смарти скачал.
Но я в шаблонах 0 полнейший,
и ещё говорят что шаблоны тормозят сайт, а у меня (несмотря на мои очень скромные познания в РНР) довольно-таки крупный и посещаемый ресурс.
Может есть как-то более упрощенные шаблонные движки?

Если просто блоки разбирать - то делаешь себе текстовый файлик и парсишь его на наличие известных тебе блоков.
К сожалению, не понял :(

У меня такой вопрос (то есть то, чего я немогу понять в первую очередь).
Я совершенно н епонимаю (а желание - огромное..) как мне выучить движок парсить <%menu%> именно на "такой_то_код".
Например на include "xxxx.php";

второе, и не менее важное, я не представляю как вообще указывать что в таком-то месте нужно чтобы были такие-то блоки и .т.п То есть - как, используя парсинг <%xxxx%> на код говорить движку чот именно в этом модуле нужно ставить именно этот блок..
Проще говоря - как сделать, для шаблонов, админку расположения блоков... Или все делают вручную (ну то есть - один раз прописал в нужном месте <%xxxxx%> и все.. только зачем тогда делать парчинг если можно сразу написать код и не заморачиваться.

-~{}~ 11.11.05 02:11:

Бррр,
я основы РНР ещё не до конца изучил (точее я считаю что основы более-менее знаю, но на фоне других участников форума - у меня язык не поворачивается так сказать:))
Так вот. а смарти я буду ещё год учить :)

У меня такой вопрос - а стоит ли мне (сейчас) учить применять смарти, если у меня проект (хоть и крупный) но всегда с одним дизайном. То есть изменение дизайна буде происходить не чаще раза в несколько лет.. А смарти я так понимаю для тех случаев, когда часто может меняться дизайн?

Может быть есть какие-то более простые способы? Просто получается что хотел "пришпорить" управление блоками, а придется учить смарти и переписывать движок.
 

Spear

почемучка
SelenIT
спасибо,
я как раз из-за последней ссылки и не стал использовать (и учить) различные шаблонные движки при написании движка. (и впринципе доволен)

Но проблема-то не в смарти и т.п. а в том, как же управлять блоками :( так ничего и не предумал пока-то..
 

SelenIT

IT-лунатик :)
Spear
как мне выучить движок парсить <%menu%> именно на "такой_то_код"
...наспех слепленный и неоптимальный, но работающий вариант:
PHP:
function simple_parse($filename) {
   # шаблон спец. метки
   $pattern = '/(<%[A-Z\d]+%>)/';

   # массив имен файлов для инклюда
   $blocks = array ('<%MENU%>' => 'menu.php', '<%BLOCK1%>' => 'someblock.php', ...);
   # массив обычных переменных для вставки
   $vars = array ('<%TITLE%>' => $GLOBALS['p_title'], ...);

   $html = file_get_contents($filename);

   $parts = preg_split($pattern, $html, -1, PREG_SPLIT_DELIM_CAPTURE);

   foreach ($parts as $part) {
      # для спец. меток: если им что-то соответствует - 
      # инклюдим или подставляем, смотря что именно совпало
      if (preg_match($pattern, $part)) {
          if (isset($blocks[$part])) include($blocks[$part]);
          elseif (isset($vars[$part])) echo $vars[$part];
      }
      # все, что не явл. спец. меткой - выводим как есть
      else echo $part;
   }
}
Такая функция одна и вызывается в index.php, а каждый "скин" превращается в 1 обычный HTML-файл с "<%хитрыми_вставками%>". Имхо, уже структура станет чуть проще и гибче...
P.S. Пробел в регулярке не нужен (форум добавил).
P.P.S. Движок переписывать все равно придется - рано или поздно ;)
 

Spear

почемучка
SelenIT
Спасибо!, буду разбираться.
Я только как всегда не понял важной детали:
simple_parse($filename)

что указывать для $filename? файл шаблона?

и второй вопросик - как же все-таки посоветуете именно управлять расположением блоков?
 

SelenIT

IT-лунатик :)
1) именно так
2) для начала так, как большинство - верстать руками :) а в перспективе можно хоть wysiwyg для этого прикрутить, если обнаружится реальная необходимость...
 
Сверху