ФорумПрограммированиеПыхнуть хотите?Готовые решения → STemp — мой шаблонизатор

STemp — мой шаблонизатор

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 15 декабря 2008 г. 9:41, спустя 35 секунд

    слушайте оффтоп - "интересно стоит ли у кого нить на хостинге пхп3 все еще?" (:
    Сапожник без сапог
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 15 декабря 2008 г. 11:41, спустя 1 час 59 минут 56 секунд

    оффтоп - "я встречал пару месяцев назад, плюс там еще стоял 3-й МуСКЛ"
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 15 декабря 2008 г. 11:43, спустя 1 минуту 41 секунду


    оффтоп - "я встречал пару месяцев назад, плюс там еще стоял 3-й МуСКЛ"
    пиздец))
    Сапожник без сапог
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 15 декабря 2008 г. 13:18, спустя 1 час 35 минут 5 секунд

    да, на прошлой работе я тоже так сказал тимлиду, но он сказал: "ниипёт и делай что хочешь, но чтоб к завтрашнему утру проект стоял и работал", и с этими словами он свалил домой, а я остался ипать хостеров чтоб включили 5-ый…
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 15 декабря 2008 г. 14:09, спустя 51 минуту 7 секунд

    NRG, жестко! Нахер такого тимлида!
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 24 мая 2009 г. 23:52, спустя 160 дней 8 часов 42 минуты

    Кстати, немного доработанная версия)

    class STemp
    {
    private $path;

    private $template;

    private $variables = array();

    private $params = array(
    'xss_protection' => false,
    'exit_after_display' => true,
    'endofline_to_br' => false,
    'charset' => 'UTF-8'
    );

    private $include_file;

    public function __construct($path = 'templates/')
    {
    $this->path = $path;
    }

    public function setParam($param, $value)
    {
    if (isset($this->params[$param])) {
    $this->params[$param] = $value;
    return true;
    }

    return false;
    }

    public function setIncludeFile($include_file)
    {
    $this->include_file = $this->path.$include_file;

    if (!is_file($this->path.$include_file))
    throw new STempException('Include file '.$this->include_file.' not exitst');
    }

    public function assign($name, $value)
    {
    $this->variables[$name] = $value;
    }

    public function display($template)
    {
    $this->template = $this->path.$template;

    if (!is_file($this->template))
    throw new STempException('Template file '.$template.' not exitst');

    header("Content-type: text/html; charset=".$this->params['charset']);

    require_once($this->template);

    if ($this->params['exit_after_display'])
    exit;
    }

    private function __get($name)
    {
    if (isset($this->variables[$name])) {
    $variable = $this->variables[$name];

    if ($this->params['xss_protection'])
    $variable = $this->xssProtection($variable);

    if ($this->params['endofline_to_br'])
    $variable = $this->endoflineToBr($variable);

    return $variable;
    }

    return false;
    }

    private function includeFile($include_file = null)
    {
    if ($include_file) {
    $include_file = $this->path.$include_file;
    if (!is_file($include_file))
    throw new STempException('Include file '.$include_file.' not found');

    require_once($include_file);
    } else {
    if (!is_file($this->include_file))
    throw new STempException('Include file '.$this->include_file.' not found');

    require_once($this->include_file);
    }
    }

    private function morph($value, $word0, $word1, $word2, $separator = ' ')
    {
    if (preg_match('/1\d$/', $value))
    return $value.$separator.$word2;
    elseif (preg_match('/1$/', $value))
    return $value.$separator.$word0;
    elseif (preg_match('/(2|3|4)$/', $value))
    return $value.$separator.$word1;
    else
    return $value.$separator.$word2;
    }

    private function formatDate($date)
    {
    return date("j", $date).' '.$this->getMonth(date("m", $date)).' '.date("Y", $date);
    }

    private function getMonth($month)
    {
    switch ($month)
    {
    case 1: return 'января';
    break;

    case 2: return 'февраля';
    break;

    case 3: return 'марта';
    break;

    case 4: return 'апреля';
    break;

    case 5: return 'мая';
    break;

    case 6: return 'июня';
    break;

    case 7: return 'июля';
    break;

    case 8: return 'августа';
    break;

    case 9: return 'сентября';
    break;

    case 10: return 'октября';
    break;

    case 11: return 'ноября';
    break;

    case 12: return 'декабря';
    break;

    default: return 'хуй знает чего';
    break;
    }
    }

    private function xssProtection($variable)
    {
    if (is_array($variable)) {
    $protected = array();
    foreach ($variable as $key=>$value)
    $protected[$key] = $this->xssProtection($value);
    return $protected;
    }

    return htmlspecialchars($variable);
    }

    private function endoflineToBr($variable)
    {
    if (is_array($variable)) {
    $protected = array();
    foreach ($variable as $key=>$value)
    $protected[$key] = $this->endoflineToBr($value);
    return $protected;
    }

    return nl2br($variable);
    }
    }
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 25 мая 2009 г. 0:15, спустя 23 минуты 42 секунды

    switch ($month)
    {
    case 1: return 'января';
    break;

    case 2: return 'февраля';
    break;

    case 3: return 'марта';
    break;

    case 4: return 'апреля';
    break;

    case 5: return 'мая';
    break;

    case 6: return 'июня';
    break;

    case 7: return 'июля';
    break;

    case 8: return 'августа';
    break;

    case 9: return 'сентября';
    break;

    case 10: return 'октября';
    break;

    case 11: return 'ноября';
    break;

    case 12: return 'декабря';
    break;

    default: return 'хуй знает чего';
    break;
    }

    уууууууууу

    Даже я так не пишу =)

    а чем массивы не нравятся?

    Кстати, пользуюсь твоим шаблонизатором.
    правда много чего уже сам добавил =)
    Спасибо.
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 25 мая 2009 г. 0:20, спустя 4 минуты 4 секунды

    Был нетрезв, оставил как фичу)
  • AndryG

    Сообщения: 237 Репутация: N Группа: Адекваты

    Spritz 25 мая 2009 г. 15:35, спустя 15 часов 15 минут 25 секунд



    «Магический» метод __get возвращает значение переданной в шаблон переменной. Если переменная не определена, возвращает false. В зависимости от параметров, переменные перед отдачей могут обрабатываться.

    Шаблон index.tpl.php:
    <html>
    <head>
    <title><?php echo $this->title ?></title>
    </head>
    <body>
    <?php $this->includeFile() ?>
    </body>
    </html>



    У меня в шаблонизаторе работает вот такая штука:

     protected function tpl_include($tpl_name){
       extract($this->tpl_vars,EXTR_SKIP|EXTR_REFS,'_');
       include(SPIDER_DIR_TPL.'/'.str_replace('_','/',$tpl_name).'.php');
     }

    и HTML превращается в:
    <title><?=$title?></title>


    Код шаблона "выполняется" в пространстве имен этого самого метода. Таким макаром "как обычные" переменные ($var) видны только привязанные переменные.

    Защита переменных (htmlspecialchars) обрабатывается на шаге добавления данных.
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 25 мая 2009 г. 15:43, спустя 7 минут 38 секунд

    AndryG, молодец
    Сапожник без сапог
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 25 мая 2009 г. 15:47, спустя 4 минуты 36 секунд

    Код шаблона "выполняется" в пространстве имен этого самого метода. Таким макаром "как обычные" переменные ($var) видны только привязанные переменные.

    Круто. Тоже хотел так сделать, но руки не доходили)

    Защита переменных (htmlspecialchars) обрабатывается на шаге добавления данных.

    А если потом вдруг понадобится выводить их в другом виде? Или нужно выводить на одной странице зачаренные, а в админке, например, нет?
  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 25 мая 2009 г. 15:50, спустя 2 минуты 29 секунд

    <title><?=$title?></title>

    это гавно
    и нативный синтаксис в принципе гавно
    с обилием логических структур и форичей — он превращается в малочитаемую говно-кашу
    все умрут, а я изумруд
  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 25 мая 2009 г. 15:50, спустя 23 секунды

    пардон, в этой теме, кажется, уже говорил
    все умрут, а я изумруд
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 25 мая 2009 г. 15:51, спустя 55 секунд


    пардон, в этой теме, кажется, уже говорил
    кажется что и в этом тоне тоже)
    Сапожник без сапог
  • AndryG

    Сообщения: 237 Репутация: N Группа: Адекваты

    Spritz 25 мая 2009 г. 16:06, спустя 15 минут 5 секунд


    А если потом вдруг понадобится выводить их в другом виде? Или нужно выводить на одной странице зачаренные, а в админке, например, нет?

    Я примером показал общий принцип "сбрасывания" переменных в шаблон.
    В текущей реализации защита проводится так: extract(ЗАЩИТА($this->tpl_vars))
    Если надо добраться до оригинальных данных - юзаем $this->tpl_vars['var_name'], скажете сложно?
    Получилась защита от дурака … пока сознательно не полезешь в глубь - не получишь шанса на ошибку (опасный вывод).

Пожалуйста, авторизуйтесь, чтобы написать комментарий!