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]   

> Описание: Интересует ваше мнение, может есть более правильные решения
altermann
Отправлено: 04 Июня, 2010 - 00:37:09
Post Id



Частый гость


Покинул форум
Сообщений всего: 196
Дата рег-ции: Март 2010  
Откуда: Днепропетровск


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




Написал класс для простого шаблонизатора, который выполняет минимум необходимых для меня функций. Может кто-то глядя на этот код подскажет более эффективные методы или функции. Просьба не рассказывать про велосипеды и не тыкать на Smarty, ZendView и т.п. Практика написания велосипедов никому не мешала.

Краткое описание:
$tpl_name - имя файла шаблона;
$template - текст шаблона который обрабатывается;
$ifmatch - массив вхождения для условного вывода;
$if_array - массив переменных для условного вывода(задано что выводить - выводит, не задано - не выводит);
Две последние переменные массивы по причине, что планировал поддержку нескольких условий в шаблоне, но пока этого не добился.

function __construct - получает имя шаблона и загружает его в переменною $template. Если есть условия вывода откидывает часть заключенную между тегами <!--{if item=iffer}-->...<!--{/endif}-->;
function var_array - получает массив и заменяет переменные вида <!--{PAGETITLE}--> в шаблоне на её значение. Попутно при наличии в принятом массиве условных переменных подставляет их значение;
function for_array - функция для циклов, поддерживает несколько циклов в шаблоне, но с разными именам. Имя по умолчанию "data";

Сам класс:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class viewer {
  3.   private $tpl_name;
  4.   private $template;
  5.   private $ifmatch;
  6.   private $if_array;
  7.  
  8.   function __construct($tpl_name) {
  9.     $this->tpl_name=TPL_DIR.$tpl_name;
  10.     $this->template=file_get_contents($this->tpl_name);
  11.     preg_match_all("#(.*?)<!--{if item=(.*?)}-->(.*?)(<!--\\2-->)(.*?)<!--{/endif}-->(.*)#is",
  12.                 $this->template, $this->ifmatch, PREG_SET_ORDER);
  13.     if (sizeof($this->ifmatch)>0) {
  14.       foreach ($this->ifmatch as $key=>$value) {
  15.         $this->template=$value[1].$value[4].$value[6];
  16.         $this->if_array["<!--$value[2]-->"]=$value[3].$value[4].$value[5];
  17.       }
  18.     }
  19.   }
  20.  
  21.   function var_array($val_array) {
  22.     if (isset($this->if_array)) {
  23.       foreach ($this->if_array as $key=>$value) {
  24.         if (isset($val_array[$key])) {
  25.           $val_array[$key]=str_replace($key, $val_array[$key], $value);
  26.         }
  27.       }
  28.     }
  29.     $this->template=strtr($this->template, $val_array);
  30.   }
  31.  
  32.   function for_array($data, $name_array='data') {
  33.     preg_match("/(.*?)<!--{foreach from=($name_array) item=(.*?)}-->(.*?)<!--{\/foreach}-->(.*)/is",
  34.                 $this->template, $matches);
  35.     $$name_array=&$data;
  36.     $print=addslashes(ltrim($matches[4]));
  37.     @$strexe.="foreach ($$name_array as \$key=>$$matches[3]) {\n";
  38.     @$strexe.="@\$out_str.=\"$print\";\n}";
  39.     @eval("$strexe");
  40.     $this->template=$matches[1].@$out_str.$matches[5];
  41.   }
  42.  
  43.   function __tostring() {
  44.     return $this->template;
  45.   }
  46. }
  47. ?>


Пример шаблона:
CODE (html):
скопировать код в буфер обмена
  1. <title><!--{PAGETITLE}--></title>
  2.  
  3. <ul>
  4. <!--{foreach from=data item=value}-->
  5.   <li><a href=$value>$key</a></li>
  6. <!--{/foreach}--></ul>
  7.  
  8. <ul>
  9. <!--{foreach from=arg item=value}-->
  10.   <li>--<u>$value</u>--</li>
  11. <!--{/foreach}--></ul>
  12.  
  13. <!--{if item=iffer}-->
  14.   <div style="border: 5px solid #FF0000;">Проверка условного вывода: <b><!--iffer--></b> </div>
  15. <!--{/endif}-->
  16.  
  17. Переменная: <b><!--{BODY}--></b>
  18. <br><br><br><br><br>


Пример использования:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. ini_set('error_reporting', E_ALL);
  3.  
  4. // Подключаем класс
  5. require_once("view.cls.php");
  6. // Задаем папку шаблонов
  7. define('TPL_DIR','');
  8. // Переменная
  9. $body="Это подставляемая переменная";
  10. // Массив для цикла
  11. $cmenu_arr=array('Пункт №1'=>'"index.php"',
  12.                  'Пункт №2'=>'"item1.php"',
  13.                  'Пункт №3'=>'"item2.php"',
  14.                  'Пункт №4'=>'"item3.php"');
  15. // Массив переменных
  16. $page_arr=array('<!--{PAGETITLE}-->'=>'Шаблонизатор',
  17.                 '<!--{BODY}-->'=>"$body");
  18. // Переменная заменяемая с условием
  19. $page_arr['<!--iffer-->']='Проверка условия';
  20. //Отображение страницы;
  21. $page=new viewer('main.htm');
  22. $page->var_array($page_arr);
  23. $page->for_array($cmenu_arr);
  24. $page->for_array($cmenu_arr, 'arg');
  25. echo $page;
  26. ?>


Все три файла находятся в архиве

Большая просьба пинать только в нужном направлении и критику обосновывать.
Скачать файл: test_cls.zip
Скачан раз: 93


-----
Я прирожденный кузнец, я не могу не куя!
 
 Top
alexspb
Отправлено: 04 Июня, 2010 - 09:06:33
Post Id


Посетитель


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


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




по мне это довольно сложно, не слишком читаемо (рекомендую - Закон сохранения сложности)

я к шаблонам вообще по другому отношусь - тут (как и в смарти) все-таки не разделен php и html - это лишняя "надстройка" (шаблонами я пользуюсь, но иначе - есть подготовка данных, есть шаблон (без if ... foreach ... ), обычный str_replace(keys, values, shablon)) - главное все прозрачно

(Отредактировано автором: 04 Июня, 2010 - 09:06:58)



-----
Хостинг - неограниченно доменов на одну папку
Ajax - отличное введение
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB