За последние 24 часа нас посетили 17829 программистов и 1685 роботов. Сейчас ищут 1830 программистов ...

Шаблонизатор

Тема в разделе "Решения, алгоритмы", создана пользователем Danilka, 30 апр 2008.

  1. nimistar

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

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    PHP:
    1.           ob_start();
    2.           extract($this->vars);
    3.           include($this->template);
    4.           $content = ob_get_clean();
    5.           ob_end_clean();
    6.           return $content;
    7.  
    вот любопытно а как вы вложенные шаблоны обходите ?
    ob_end_clean(); - завершит же все открытые буферы ....
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Отлично, так и запишем
    PHP:
    1. <?php
    2. final class view
    3. {
    4.     // Буфер переменных
    5.     private $vars = array();
    6.     // Шаблон (путь, файл)
    7.     private $template = null;
    8.     // Установка шаблона
    9.     function __construct($path)
    10.     {
    11.         $this -> template = $path;
    12.     }
    13.     // Установка переменной
    14.     function set($var, $val)
    15.     {
    16.         $this -> vars[$var] = $val;
    17.     }
    18.     // Выполнение шаблона с возвращением строки
    19.     public function __toString()
    20.     {
    21.         ob_start();
    22.         include($this -> template);
    23.         return ob_get_clean();
    24.     }
    25.     // Вывод результата работы
    26.     function flush()
    27.     {
    28.         extract($this -> vars);
    29.         include($this -> template);
    30.     }
    31. }
    Не, пускай flush делает вывод, а не возвращает значение :)
    Смотри фокус
    PHP:
    1.  
    2. <?php
    3. echo 'Hello';
    4.  
    5. echo 'World!';
    6. $b = ob_get_clean();
    7.  
    8. $a = ob_get_clean();
    9.  
    10. var_dump(compact('a','b'));
    11.  
     
  3. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    пропустил
    extract($this->vars);
     
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Неа. Этот метод чтобы делать так:
    PHP:
    1. <?php
    2. $view -> set($block, new view('block.php'));
    неймспейс экстрактом засорять не надо.
     
  5. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Брр. Не гони.
    Ты сам себя лишаешь возможности передать в подшаблон переменные.

    Более того, если где-то у тебя сделается
    echo $view
    Для основного шаблона, то он вылезет без переменных вовсе.

    Это вообще о чем?
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Там по задумке должен грузиться не подшаблон, а контроллер... о подшаблонах-то я и не подумал))
     
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Остановился на варианте с прокси
    PHP:
    1.  
    2. <?php
    3. final class view
    4. {
    5.     // Буфер переменных
    6.     private $vars = array();
    7.     // Шаблон (путь, файл)
    8.     private $template = null;
    9.     // Установка шаблона
    10.     function __construct($path)
    11.     {
    12.         $this -> template = $path;
    13.     }
    14.     // Установка переменной
    15.     function set($var, $val)
    16.     {
    17.         $this -> vars[$var] = $val;
    18.     }
    19.     // Прокси к compile
    20.     public function __toString()
    21.     {
    22.         return $this -> compile();
    23.     }
    24.     // Компилирование результата
    25.     function compile()
    26.     {
    27.         extract($this -> vars);
    28.         ob_start();
    29.         include($this -> template);
    30.         return ob_get_clean();
    31.     }
    32. }
     
  8. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Тогда вообще лучше волшебно
    PHP:
    1. <?php
    2. final class view
    3. {  
    4.     // Буфер переменных
    5.     private $vars = array();
    6.     // Шаблон (путь, файл)
    7.     private $_path = null;
    8.     // Установка шаблона
    9.     function __construct($_path)
    10.     {
    11.         $this -> _path = $_path;
    12.     }
    13.     // Установка переменной
    14.     function __set($var, $val)
    15.     {
    16.         $this -> vars[$var] = $val;
    17.     }
    18.     // Получение переменной
    19.     function __get($var)
    20.     {
    21.         if (isset($this -> $var))
    22.         {
    23.             return $this -> _path; // funny? :)
    24.         }
    25.         return $this -> vars[$var];
    26.     }
    27.     // Выполнение шаблона
    28.     function __toString()
    29.     {
    30.         extract($this -> vars);
    31.         ob_start();
    32.         include($this -> _path);
    33.         return ob_get_clean();
    34.     }
    35. }
     
  10. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    PHP:
    1. <?php
    2. final class view extends ArrayObject
    3.  
    4.  
    5.       function __construct()
    6.       {
    7.             parent::__construct(ArrayObject::ARRAY_AS_PROPS) //не помню как там точно
    8.       }
    9.       function __toString()
    10.       {
    11.           ob_start();
    12.           include($this->path);
    13.           return ob_get_clean();
    14.       }
    15.  
    )
     
  11. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    почти тру шаблонизатор гы...
     
  12. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Только одна неточность - view и ArrayObject - логически разные вещи...
    Да и часть методов ArrayObject не нужны для view. =))
     
  13. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    Volt(220)
    ну ради тебя можно еще один класс наследования впихнуть )))
     
  14. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Зато как клево - создается как объект, используется как массив, и выводится как строка :D
     
  15. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    PHP:
    1. <?php
    2. // Шаблонизатор
    3. class view
    4. {
    5.     protected _content = false;
    6.     ...
    7.     function __toString()
    8.     {
    9.         if (!$this -> _content)
    10.         {
    11.             extract($this -> vars);
    12.             ob_start();
    13.             include($this -> _path);
    14.             return ob_get_clean();
    15.         }
    16.         return $this -> _content;
    17.     }
    18. }
    19.  
    20. // MySQL
    21. final class count extends view
    22. {
    23.     function __construct($table, $by = '*', $where = false)
    24.     {
    25.         $query = 'SELECT COUNT(' . ($by == '*' ? '*' : '`'.$by.'`') . ') FROM `' . $table . '`';
    26.         if ($where)
    27.         {
    28.             $query .= ' WHERE ' . $where;
    29.         }
    30.         $res = mysql_query($query);
    31.         $this -> _content = mysql_result($res, 0);
    32.     }
    33. }
    34.  
    35. // =)
    36. echo new count('users');
    :)
     
  16. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    PHP:
    1. <?php
    2. function __construct($table, $by = false, $where = false){
    3.          $query = 'SELECT COUNT(' . ($by ? '*' : '`'.$by.'`') . ') FROM `' . $table . '`' . ($where ? '' : ' WHERE ' . $where) ;
    4. ...
    :)
     
  17. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    [vs]
    а ты попробуй попользоваться этим в средненьком проектике, посмотришь какая лажа может выйти....
     
  18. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    И вообще если мы наследуем от шаблона, то это тоже должен быть шаблон =)):

    PHP:
    1. <?php
    2. final class count extends view {
    3.      function __construct($table, $by = '*', $where = false) {
    4.          
    5.          if(!file_exists("count.tpl")){
    6.              StandartTemplate::createCount();
    7.          }
    8.          parent::__construct("count.tpl");
    9.          
    10.          $query = 'SELECT COUNT(' . ($by ? '*' : '`'.$by.'`') . ') FROM `' . $table . '`' . ($where ? '' : ' WHERE ' . $where) ;
    11.          $res = mysql_query($query);
    12.          $this -> _content = mysql_result($res, 0);
    13.      }
    14.  }
    15. ?>
    veiw берем старый, без _content. =))
     
  19. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Этим щас и занимаюсь =)
     
  20. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    А че
    PHP:
    1. <?
    2. if ((string)new count(cfg::$DB_PRX.'accounts', '*', '`nick`=\''.$data['nick'].'\''))
    ... проверка на занятость ника
     
  21. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Можно засорить весь неймспейс такими классами и функциями, да, не гибко, но зачем гибкость, если код пишется под конкретную задачу?
     
  22. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    [vs]
    тогда ты не ленивый программист ;)
     
  23. vuzy

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

    С нами с:
    11 мар 2010
    Сообщения:
    199
    Симпатии:
    0
    Адрес:
    киев
    Не знаю не знаю я всегда писал сайты где HTML тесно переплетается c PHP и затрудняет разбор кода даже для меня ) шаблоны позволяют же отделить HTML от php и тогда каждый занимается своим делом. например есть группа дизайнеров и группа програмистов одни ваяют стиль и табличную верстку а другие клепают программу после чего подключают модуль шаблонизатора и он берет страничку стиля и меняет выражения типа $GLOBAL_BLOCK_NEWS$ на новостную ленту которая в свою очередь была выведена из базы данных и сохранена в переменную
     
  24. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    vuzy
    блин да ты всем глаза открыл!!!