Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите довести до ума идею шаблонизатора

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
SkaN
Отправлено: 02 Сентября, 2011 - 14:23:47
Post Id



Гость


Покинул форум
Сообщений всего: 103
Дата рег-ции: Март 2011  


Помог: 0 раз(а)




Стадию "быдлокодер" я уже прошел (вроде), нависла необходимость написать шаблонизатор. У меня уже было много идей, но все они немного кривы и нету возможности внедрять эти идеи с максимальной простотой. Но в то же время от шаблонизатора требуется много возможностей: циклы и, желательно, вложенные условия. Хотя условиями можно обойтись обычными. Вот последняя идея, на мой взгляд лучшая:
пример кода в tmpl файле:
CODE (html):
скопировать код в буфер обмена
  1. <! BEGIN ARTICLES !>
  2.         <span style="font-size: 30px; font-weight: 400;"><a href="?id=cat&cat={CAT}" style="color: black; opacity: 0.3;">{CAT_NAME}</a></span><br><h1><a href="?id=article&article={ID}">{NAME}</a></h1>
  3.         <div style="font-size: 10px;">Оставлено {DATE}</div>
  4.         <div class="article-text">{PROMO}</div>
  5. <! END ARTICLES !>

Скрипт PHP, который должен все это парсить:
PHP:
скопировать код в буфер обмена
  1. $page = file_get_contents('test.tmpl');
  2. $offset = 0;
  3. while ($pos = strpos($page, '<! BEGIN ', $offset) != FALSE) {
  4.         $begin = strpos($page, '!>', $pos+6);
  5.         $len = ($begin + 4) - ($pos + 2);
  6.         $begin = substr($page, $pos+2, $len);
  7.         list($what) = sscanf($begin, ' BEGIN %s ');
  8.         $end_pos = strpos($page, '<! END '.$what.' !>', $pos+$len);
  9.         $code_len = $end_pos - ($pos+1 + $len);
  10.         $code = substr($page, $pos+$len, $code_len);
  11. }

Этот код сначала высчитывает позицию строчки <! BEGIN , выясняет, к чему этот BEGIN , ищет END, который относится к этому же элементу, потом вычисляет расстояние между началом и концом, извлекает из этого промежутка код. Дальше части кода нужно заменить и вернуть уже полноценную страницу.
Вот я не могу придумать дальше извлекалки кода. Хотелось бы реализовать это с помощью ООП (чтобы по понятиям). При этом нужно, чтобы код было максимально легко внедрить в любой другой проект.
(Добавление)
Главное забыл описать: зачем такая фигня. Так как пишу я блог, нужны цикличные части страницы. То есть берется кусок кода, к нему подставляются нужные переменные, берется еще раз этот же кусок кода, к нему подставляются аналогично переменные. Потом это все склеивается. Плюс у движка блога есть такие возможности, как отключение комментирования статьи. Они требуют отдельной части шаблонизатора, при ненужности удаляемой.
P.S.: мне не столько нужен код, которым это все реализовать, сколько сама идея...
(Добавление)
Все, я наконец-то родил идею. Можно закрывать тему

(Отредактировано автором: 02 Сентября, 2011 - 14:30:15)

 
 Top
DeepVarvar Супермодератор
Отправлено: 02 Сентября, 2011 - 16:56:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




SkaN пишет:
<! BEGIN
зачем???

PHP:
скопировать код в буфер обмена
  1. class template {
  2.   private $vars = array();
  3.   function assign($name,$value) {
  4.     $this->vars[$name] = $value;
  5.     }
  6.   function view($tpl) {
  7.     extract($this->vars);
  8.     require_once($tpl);
  9.     }
  10.   }
  11.  
  12. $page = new template;
  13.  
  14. $arr = array(
  15.   0 => array("a","b","c"),
  16.   1 => array("a1","b1","c1"),
  17.   2 => array("a2","b2","c2")
  18.   );
  19. $page->assign("test","dsfgh df hdf h dfghd");
  20. $page->assign("spisok",$arr);
  21. $page->view("template.tpl");


template.tpl:
CODE (html):
скопировать код в буфер обмена
  1. <title><?=$test?></title>
  2. <div>
  3. <?php foreach ($spisok as $item) echo $item[0]."<br />"; ?>
  4. </div>

(Отредактировано автором: 02 Сентября, 2011 - 16:57:14)

 
 Top
White
Отправлено: 02 Сентября, 2011 - 17:44:12
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




DeepVarvar пишет:
зачем???

Может человек фанат Паскаля. Некоторые даже так делают:
PHP:
скопировать код в буфер обмена
  1. function write($str) {echo $str}
  2. function writeln($str) {echo $str.'<br />'}


-----
if(time()>1356048000) die();
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB