За последние 24 часа нас посетили 17313 программистов и 1871 робот. Сейчас ищут 1713 программистов ...

Написание своей CMS

Тема в разделе "Прочие вопросы по PHP", создана пользователем 2s-mode, 3 июн 2011.

  1. 2s-mode

    2s-mode Активный пользователь

    С нами с:
    27 июн 2010
    Сообщения:
    17
    Симпатии:
    0
    Здравствуйте, вот решил попробоватьнаписать что-то типа своей cms. Просто для себя, для саморазвития.
    Начал с шаблонизатора.

    Сам шаблон примерно выглядит вот так:

    HTML:
    1. ...
    2. <titile><stitle></title>
    3. ...
    4. <div class="content"><scontent></div>
    5. ...
    и т.д. и т.п.

    PHP:
    1. $file = file_get_contents("templates/ea/index.php"); // путь к шаблону
    2. $file=str_replace('<stitle>',$title,$file); // title страницы
    3. $file=str_replace('<sdecr>',$meta_descr,$file); // description страницы
    4. $file=str_replace('<skey>',$meta_key,$file); // keywords страницы
    5. $file=str_replace('<scontent>',$content,$file); // контент
    Вот теперь самое интересное...)) Как быть с подключением модулей... Тут возникли трудности...

    Первое что пришло в голову идти таким же методом... Опишу на примере модуля "Последние новости". Пишем в шаблоне
    HTML:
    1. <smod>module1</smod>
    В обработчике

    PHP:
    1. preg_match_all("/<smod>(.*?)<\/smod>/", $file,$matches);
    2. for ($i=0; $i<count($matches[1]); $i++)
    3. {
    4. $label=$matches[1][$i]; //получаем label равный module1
    5. include("modules/$label/index.php"); //подключаем module1
    6. $file=str_replace("<smod>$label</smod>",$mod,$file);
    7. }
    В файле модуля с название module1 пишем что-то вот такое:

    В цикле
    PHP:
    1. {
    2. $mod .= $row['theme']; // тема новости
    3. $mod .= $row['date_new']; // дата новости
    4. $mod .= $row['text']; // текст новости новости
    5. }

    Как-то геморно получается.. Вот хотел бы спросить вашего совета.. Заранее спасибо...
     
  2. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    2s-mode
    можно использовать не xml-теги, а что-то своё. например, {{articles}}.
    тогда делаешь preg_replace_callback, который находит подобные вхождения,
    отдаёт функции, которая в ответ генерирует хтмл, вставляемый в нужное место
     
  3. 2s-mode

    2s-mode Активный пользователь

    С нами с:
    27 июн 2010
    Сообщения:
    17
    Симпатии:
    0
    Gromo, как бы не стлько суть в том как я буду реплейсить.. Вопрос больше касается подключения модулей.

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

    PHP:
    1. {
    2. $mod .= $row['theme']; // тема новости
    3. $mod .= $row['date_new']; // дата новости
    4. $mod .= $row['text']; // текст новости новости
    5. }
    а потом заменять что-то в шаблоне...

    PHP:
    1. $file=str_replace("<smod>$label</smod>",$mod,$file);
    Может можно как-то проще это сделать...Даже не, то чтобы проще, а правильнее...
     
  4. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    2s-mode
    у тебя вопрос в том, что ты не хочешь каждый раз генерировать/подключать все возможные вариации модулей, и потом бегать по шаблону в их поиске. этого и не нужно делать. у меня, к примеру, сделано так:

    1. в шаблоне указывается плейсхолдер для модуля/действия, например, {articles/list}
    2. регуляркой я нахожу все подобные плейсхолдеры и отдаю их функции
    3. функция принимает строку, содержащую название необходимого модуля + действия/аргументов
    4. функция проверяет подключён ли уже модуль, и можно ли выполнить действие: если да - генерирует хтмл, если нет - отдаёт пустую строку
    5. результат работы функции подставляется в шаблон вместо плейсхолдера

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

    ну, или я просто не понял твоего вопроса :)
     
  5. 2s-mode

    2s-mode Активный пользователь

    С нами с:
    27 июн 2010
    Сообщения:
    17
    Симпатии:
    0
    Ну я как бы примерно тоже самое и делаю....
    1. Нахожу регуляркой в шаблоне все подключенные модули.
    2. Получаю список категорий в папке /modules
    3. Проверяю включен ли модуль (проверка в бд)
    4. подключаю инклудом modules/название модуля/index.php

    Меня смущает вот это - код файла modules/название модуля/index.php . На сколько правильно делать так? Записывать все это в одну переменную.

    PHP:
    1. $mod .= $row['theme']; // тема новости
    2. $mod .= $row['date_new']; // дата новости
    3. $mod .= $row['text']; // текст новости новости


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

    Каким образом вы генерируете html?
     
  6. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    с помощью шаблонизатора :)))))
     
  7. 2s-mode

    2s-mode Активный пользователь

    С нами с:
    27 июн 2010
    Сообщения:
    17
    Симпатии:
    0
    В общем сделал вот так:

    index.php
    PHP:
    1. require("conf.php");
    2. require("settings.php");
    3. require("functions.php");
    4.  
    5. $file=file_get_contents($template);
    6. $file = str_replace ( "<stitle>", $title, $file );
    7. $file = str_replace ( "<skeyw>", $keyw, $file );
    8. $file = str_replace ( "<sdescr>", $descr, $file );
    9.  
    10. preg_match_all("/<smod>(.*?)<\/smod>/", $file,$matches);
    11. $arr=$matches[1];
    12.         foreach ($arr as $value)
    13.         {
    14.         $label=$value;
    15.         loadmodules($label);
    16.         $file=str_replace("<smod>$label</smod>",$mod,$file);
    17.         }
    В config.php подключаюсь к базе...
    В settings.php различные настройки по умолчанию...

    PHP:
    1. function loadmodules($label)
    2. {
    3. global $mod;
    4. $sql = mysql_query("SELECT * FROM modules where label='$label' and active='1'");
    5. $row = mysql_fetch_array($sql);
    6.     if (mysql_num_rows($sql)==0)
    7.     {
    8.     $mod="";
    9.     }
    10.     else
    11.     {
    12.     $path="modules/".$row['name_mod']."/index.php";
    13.     require($path);
    14.     }
    15. return $mod;   
    16. }
    Вот тут чет не получилось вернуть значение $mod

    ну и сам файл модуля выглядит вот так...

    PHP:
    1. <?php
    2. $mod="Привет я модуль";
    3. $mod .="Давай дружить";
    4. ?>