Автор Тема: class Template. Зацените.  (Прочитано 8583 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн D1g174LM4n14c

  • 1m
  • Постоялец
  • ***
  • Сообщений: 137
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
class Template. Зацените.
« : 18 Апреля 2003, 17:50:53 »
Тема шаблонов в PHP поднимается часто...
Каждый раз кто-то предлагает свои классы, половина из которых сразу обливаются грязью и забываются.
Все же я не посмотрел на это. Зря наверно :)

Читал тут про FastTemplate и решил написать свой класс, похожий на FT. Зацените пожалуйста: что нравиться, что не нравиться, что нужно поменять...

Скажу честно, весь нижеприведенный код я писал 10-15 минут максимум... Не реализовал динамические блоки как в ФастТемплейте, но это неважно... надо будет - сделаю...

В общем, вот сам код:

<?php
class Template
{
   var 
$path = \'templates\';
   
   var $tpls = array();
   var $vars = array();
   
   var $rl = \'{\'; // variable limiters
   var $ll = \'}\'; //
   
   var $ext = \'.tpl\';
   
   ////////////////////////////////////////////////////////////////////////////////
   
   function Template($path = 0)
   {
      $this->path = ($path === 0 ? $this->path : $path);
   }
   
   function define($tpl, $filename = 0)
   {
      if (is_array($tpl))
      {
         foreach ($tpl as $key => $val)
            $this->tpls[$key] = $val;
      }
      else $this->tpls[$tpl] = $filename;
   }
   
   function assign($var, $value = 0)
   {
      if (is_array($var))
      {
         foreach ($var as $key => $val)
            $this->vars[$key] = $val;
      }
      else $this->vars[$var] = $value;
   }
   
   function parse($var, $tpl)
   {
      $tpl = file_get_contents($this->path.\'/\'.$this->tpls[$tpl].$this->ext);
      
      foreach ($this->vars as $key => $val)
         $tpl = str_replace($this->rl.$key.$this->ll, $val, $tpl);
      
      $this->vars[$var] = $tpl;
   }
   
   function output($tpl)
   {
      echo $this->vars[$tpl];
   }
}
?>

гы. Какой-то он примитивный получился - но пашет как надо.
Мы такие!

Оффлайн Tronyx

  • Модератор
  • Ветеран
  • *****
  • Сообщений: 826
  • +0/-0
  • 2
    • Просмотр профиля
class Template. Зацените.
« Ответ #1 : 18 Апреля 2003, 18:51:38 »
Цитировать
D1g174LM4n14c:
что нравиться

Ничего
Цитировать
D1g174LM4n14c:
что не нравиться, что нужно поменять

Всё. Можешь только имена функций не менять.
Цитировать
D1g174LM4n14c:
Скажу честно, весь нижеприведенный код я писал 10-15 минут максимум...

Что ты хотел получить? Или ты хотел всем показать что ты умеешь писать галимые и практически не функциональные шаблонизаторы? Я своего "зверя" уже наверное пол года пишу (просто мало времени ему уделял и раза три координально менял алгоритм работы) и только недавно закончил ядро и оснастил его "небольшой" функциональностью, а твои 15 минут не просто не существенны, а совершенно ни чего не значат. Лучше возьми какой-нибудь готовый или напиши хороший, хотя хороший шаблонизатор это ОЧЕНЬ спорное понятие.
С уважением, Владимир Гончаренко - COPI# 93
Ролевая онлайн игра

Оффлайн D1g174LM4n14c

  • 1m
  • Постоялец
  • ***
  • Сообщений: 137
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
class Template. Зацените.
« Ответ #2 : 18 Апреля 2003, 18:59:49 »
Но почему же?
То что я написал работает как надо. Относительно быстро.
Да и код получается довольно выразительный.

toplevel.tpl




{TL_TITLE}


{HEADER}

{LEFT}

{CONTENT}

{RIGHT}

{FOOTER}




script.php

<?php
require \'inc/class.template.php\';

$tpl = new Template;
$tpl->define(array(\'TOPLEVEL\' => \'toplevel\',
                   \'HEADER\' => \'header\',
                   \'LEFT\' => \'left\',
                   \'CONTENT\' => \'content\',
                   \'RIGHT\' => \'right\',
                   \'FOOTER\' => \'footer\'));

$tpl->assign(\'TL_TITLE\', \'Заголовок страницы\');

   $tpl->parse(\'MT_HEADER\', \'HEADER\');
   $tpl->parse(\'MT_LEFT\', \'LEFT\');
   $tpl->parse(\'MT_CONTENT\', \'CONTENT\');
   $tpl->parse(\'MT_RIGHT\', \'RIGHT\');
   $tpl->parse(\'MT_FOOTER\', \'FOOTER\');
$tpl->parse(\'TOPLEVEL\', \'TOPLEVEL\');

$tpl->output(\'TOPLEVEL\');
?>
« Последнее редактирование: 18 Апреля 2003, 20:56:49 от D1g174LM4n14c »
Мы такие!

Оффлайн D1g174LM4n14c

  • 1m
  • Постоялец
  • ***
  • Сообщений: 137
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
class Template. Зацените.
« Ответ #3 : 18 Апреля 2003, 19:05:17 »
Цитировать
Tronyx:
Или ты хотел всем показать что ты умеешь писать галимые и практически не функциональные шаблонизаторы?

конечно, согласен что это не совершенство... но я считаю, что если ты делаешь для себя какой-то класс, то нужно реализовать в нем ТОЛЬКО те функции, которыми ты пользуешься. Зачем писать больше? Это-же не стандартную библиотеку пишешь!
Мы такие!

Оффлайн Tronyx

  • Модератор
  • Ветеран
  • *****
  • Сообщений: 826
  • +0/-0
  • 2
    • Просмотр профиля
class Template. Зацените.
« Ответ #4 : 18 Апреля 2003, 20:24:37 »
Цитировать
D1g174LM4n14c:
нужно реализовать в нем ТОЛЬКО те функции, которыми ты пользуешься

Я тоже так считаю. Но ты просил оценить, я оценил.
С уважением, Владимир Гончаренко - COPI# 93
Ролевая онлайн игра

Оффлайн D1g174LM4n14c

  • 1m
  • Постоялец
  • ***
  • Сообщений: 137
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
class Template. Зацените.
« Ответ #5 : 18 Апреля 2003, 20:31:57 »
нет. за оценку, конечно, спасибо!
только я не понимаю, что можно сюда еще добавить кроме функциональности? Или есть способы реально оптимизировать реализованные функции? В частности str_replace заменить на что-то более быстрое...
Мы такие!

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
class Template. Зацените.
« Ответ #6 : 18 Апреля 2003, 20:47:48 »
Цитировать
Зацените.
малофункциональный (хотя признаю что быстрый)
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн D1g174LM4n14c

  • 1m
  • Постоялец
  • ***
  • Сообщений: 137
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
class Template. Зацените.
« Ответ #7 : 18 Апреля 2003, 20:51:27 »
функции - это так... главное чтобы работало хорошо и быстро. короче, как тебе надо! если надо что-то новое - добавить всегда можно. А так - просто и быстро :D
Мы такие!

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
class Template. Зацените.
« Ответ #8 : 18 Апреля 2003, 21:04:10 »
если хочешь скорости, возьми http://php-templates.sourceforge.net/
Там функциональность в порядке.
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн D1g174LM4n14c

  • 1m
  • Постоялец
  • ***
  • Сообщений: 137
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
class Template. Зацените.
« Ответ #9 : 18 Апреля 2003, 22:07:59 »
посмотрю... ради интереса... спасибо.
Мы такие!

Оффлайн Tronyx

  • Модератор
  • Ветеран
  • *****
  • Сообщений: 826
  • +0/-0
  • 2
    • Просмотр профиля
class Template. Зацените.
« Ответ #10 : 18 Апреля 2003, 22:45:42 »
Цитировать
D1g174LM4n14c:
только я не понимаю, что можно сюда еще добавить кроме функциональности?

1. Разрешить php код в шаблоне.
2. Контроль ошибок ("блок не найден", "Неверный формат параметра" и т.п.), но это имеет смысл делать если у тебя функционал побольше.
3. Модульность(?)
4. Отказаться от assign (?) - сейчас меня Макс будет "ругать" за это ;)

Цитировать
D1g174LM4n14c:
В частности str_replace заменить на что-то более быстрое...

Компиляция в PHP код, тогда шаблон подключается обычным include`ом
С уважением, Владимир Гончаренко - COPI# 93
Ролевая онлайн игра

Оффлайн D1g174LM4n14c

  • 1m
  • Постоялец
  • ***
  • Сообщений: 137
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
class Template. Зацените.
« Ответ #11 : 18 Апреля 2003, 23:07:11 »
Цитировать
Tronyx:
Контроль ошибок ("блок не найден", "Неверный формат параметра" и т.п.), но это имеет смысл делать если у тебя функционал побольше.
я же говорил, что это не библиотечный класс. Зачем делать обработку ошибок в своем же классе. Главное - внимательно писать код - тогда не нужно будет тратить время на обработку ошибок.

Цитировать
Tronyx:
Модульность(?)
а что ты имеешь ввиду под модкльностью в данном контексте?


Цитировать
Tronyx:
Компиляция в PHP код, тогда шаблон подключается обычным include`ом
ды, с таким же успехом можно обойтись вообще без шаблонизаторов. просто в нужных местах юзать include\\require операторы...
Мы такие!

Оффлайн D1g174LM4n14c

  • 1m
  • Постоялец
  • ***
  • Сообщений: 137
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
class Template. Зацените.
« Ответ #12 : 18 Апреля 2003, 23:43:22 »
Цитировать
Tronyx:
Разрешить php код в шаблоне.

реально. вот как я это сделал:

вместо кода
$tpl file_get_contents($this->path.\'/\'.$this->tpls[$tpl].$this->ext);я сделал так:
ob_start();
require 
$this->path.\'/\'.$this->tpls[$tpl].$this->ext;
$tpl = ob_get_contents();
ob_end_clean();


be simple! ;)
Мы такие!

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
class Template. Зацените.
« Ответ #13 : 18 Апреля 2003, 23:45:37 »
Tronyx
Цитировать
4. Отказаться от assign (?) - сейчас меня Макс будет "ругать" за это
неее, ругать буду за :
Цитировать
1. Разрешить php код в шаблоне.
;) ИМХО это противоречит самой идеологии шаблонов
Дизайнер (или html-кодер) тебе там такого php-кода напишет :D

Насчет отказа от assign-а
ты имеешь ввиду сделать как в шаблонизаторе Britva-ы, где шаблонизатор использует для подстановки меток переменные из глобального пространства имен ? И таким образом не нужно делать assign.
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн D1g174LM4n14c

  • 1m
  • Постоялец
  • ***
  • Сообщений: 137
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
class Template. Зацените.
« Ответ #14 : 19 Апреля 2003, 00:45:26 »
Цитировать
Макс:
Разрешить php код в шаблоне
ну почему бы и нет? есть некоторые "моменты", которые намного прроще сделать со вставкой ПХП-кода в шаблон, чем геммороиться с подставляемыми переменными... хотя с другой стороны - ты прав. Это не абстрагирует html от php, а шаблоны как раз и преследуют эту цель.


Цитировать
Макс:
Насчет отказа от assign-а
ты имеешь ввиду сделать как в шаблонизаторе Britva-ы, где шаблонизатор использует для подстановки меток переменные из глобального пространства имен ? И таким образом не нужно делать assign.
м-да... мусора много и, как я уже говорил,
Цитировать
D1g174LM4n14c:
ды, с таким же успехом можно обойтись вообще без шаблонизаторов. просто в нужных местах юзать include\\require операторы...
Мы такие!

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28