Здравствуйте, вот решил попробоватьнаписать что-то типа своей cms. Просто для себя, для саморазвития. Начал с шаблонизатора. Сам шаблон примерно выглядит вот так: HTML: ... <titile><stitle></title> ... <div class="content"><scontent></div> ... и т.д. и т.п. PHP: $file = file_get_contents("templates/ea/index.php"); // путь к шаблону $file=str_replace('<stitle>',$title,$file); // title страницы $file=str_replace('<sdecr>',$meta_descr,$file); // description страницы $file=str_replace('<skey>',$meta_key,$file); // keywords страницы $file=str_replace('<scontent>',$content,$file); // контент Вот теперь самое интересное...)) Как быть с подключением модулей... Тут возникли трудности... Первое что пришло в голову идти таким же методом... Опишу на примере модуля "Последние новости". Пишем в шаблоне HTML: <smod>module1</smod> В обработчике PHP: preg_match_all("/<smod>(.*?)<\/smod>/", $file,$matches); for ($i=0; $i<count($matches[1]); $i++) { $label=$matches[1][$i]; //получаем label равный module1 include("modules/$label/index.php"); //подключаем module1 $file=str_replace("<smod>$label</smod>",$mod,$file); } В файле модуля с название module1 пишем что-то вот такое: В цикле PHP: { $mod .= $row['theme']; // тема новости $mod .= $row['date_new']; // дата новости $mod .= $row['text']; // текст новости новости } Как-то геморно получается.. Вот хотел бы спросить вашего совета.. Заранее спасибо...
2s-mode можно использовать не xml-теги, а что-то своё. например, {{articles}}. тогда делаешь preg_replace_callback, который находит подобные вхождения, отдаёт функции, которая в ответ генерирует хтмл, вставляемый в нужное место
Gromo, как бы не стлько суть в том как я буду реплейсить.. Вопрос больше касается подключения модулей. Мне кажется как-то это не очень правильно, результат работы модуля заносить в переменную, PHP: { $mod .= $row['theme']; // тема новости $mod .= $row['date_new']; // дата новости $mod .= $row['text']; // текст новости новости } а потом заменять что-то в шаблоне... PHP: $file=str_replace("<smod>$label</smod>",$mod,$file); Может можно как-то проще это сделать...Даже не, то чтобы проще, а правильнее...
2s-mode у тебя вопрос в том, что ты не хочешь каждый раз генерировать/подключать все возможные вариации модулей, и потом бегать по шаблону в их поиске. этого и не нужно делать. у меня, к примеру, сделано так: 1. в шаблоне указывается плейсхолдер для модуля/действия, например, {articles/list} 2. регуляркой я нахожу все подобные плейсхолдеры и отдаю их функции 3. функция принимает строку, содержащую название необходимого модуля + действия/аргументов 4. функция проверяет подключён ли уже модуль, и можно ли выполнить действие: если да - генерирует хтмл, если нет - отдаёт пустую строку 5. результат работы функции подставляется в шаблон вместо плейсхолдера в итоге подключаются/генерируются только те модули/части, которые были затребованы в шаблоне. ну, или я просто не понял твоего вопроса
Ну я как бы примерно тоже самое и делаю.... 1. Нахожу регуляркой в шаблоне все подключенные модули. 2. Получаю список категорий в папке /modules 3. Проверяю включен ли модуль (проверка в бд) 4. подключаю инклудом modules/название модуля/index.php Меня смущает вот это - код файла modules/название модуля/index.php . На сколько правильно делать так? Записывать все это в одну переменную. PHP: $mod .= $row['theme']; // тема новости $mod .= $row['date_new']; // дата новости $mod .= $row['text']; // текст новости новости 4. функция проверяет подключён ли уже модуль, и можно ли выполнить действие: если да - генерирует хтмл, если нет - отдаёт пустую строку 5. результат работы функции подставляется в шаблон вместо плейсхолдера Каким образом вы генерируете html?
В общем сделал вот так: index.php PHP: require("conf.php"); require("settings.php"); require("functions.php"); $file=file_get_contents($template); $file = str_replace ( "<stitle>", $title, $file ); $file = str_replace ( "<skeyw>", $keyw, $file ); $file = str_replace ( "<sdescr>", $descr, $file ); preg_match_all("/<smod>(.*?)<\/smod>/", $file,$matches); $arr=$matches[1]; foreach ($arr as $value) { $label=$value; loadmodules($label); $file=str_replace("<smod>$label</smod>",$mod,$file); } В config.php подключаюсь к базе... В settings.php различные настройки по умолчанию... PHP: function loadmodules($label) { global $mod; $sql = mysql_query("SELECT * FROM modules where label='$label' and active='1'"); $row = mysql_fetch_array($sql); if (mysql_num_rows($sql)==0) { $mod=""; } else { $path="modules/".$row['name_mod']."/index.php"; require($path); } mysql_free_result($sql); return $mod; } Вот тут чет не получилось вернуть значение $mod ну и сам файл модуля выглядит вот так... PHP: <?php $mod="Привет я модуль"; $mod .="Давай дружить"; ?>