Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шаблонизатор php 
:(
    Опции темы
systemIV
Дата 2.6.2011, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 28.3.2011

Репутация: -1
Всего: -1



Пишу свой шаблонизатор, который не претендует на главную роль, а просто для себя, для опыта.
Проблема в том, что он заменяет только одно значение в Шаблоне. Как удалось выяснить, что то не так с перебором и заменой. Вот исходники, если можете помочь, буду очень признателен:
Код

<?php
    class template{
    
    //Инициализируем переменные, и сразу задаём тип
        public $content = "";
        public $array_values = array();
        private $result = "";
        
    //Получаем имя файла, и сразу переводим в строку
        public function getFile($template){
            $this->content = file_get_contents($template);
        }
        
    //Получаем переменную и её значение
        public function getValue($var, $value_input){
            $this->array_values[$var] = $value_input;
        }
        
    //Функция обработки страницы
        private function replaceContent(){
            foreach($this->array_values as $key => $value){
                $this->result = str_replace('{'.$key.'}', $value, $this->content);
            }
            return $this->result;
        }
        
    //Вывод рзультата на экран
        public function printContent(){
            $this->replaceContent();
            echo $this->result;
        }
    }
    
    //Пример работы
    $temp = new template;
    $temp->getFile("template.tpl");
    $temp->getValue("title", "Заголовок");
    $temp->getValue("text", "Привет мир!");
    
    $temp->printContent();
?>


Код

<html>
<head><title>{title}</title></head>
<body>
{text}
</body>
</html>




PM ICQ Skype   Вверх
нуп
Дата 2.6.2011, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ботокодер
**


Профиль
Группа: Участник
Сообщений: 987
Регистрация: 22.6.2009
Где: Кременчуг

Репутация: нет
Всего: 33



Код

 private function replaceContent(){
            $this->result = $this->content;
            foreach($this->array_values as $key => $value){
                $this->result = str_replace('{'.$key.'}', $value, $this->result);
            }
            return $this->result;
        }


Добавлено через 52 секунды
Ну а вообще в str_replace можно передать массивы ключей и валуе для замены
PM MAIL   Вверх
systemIV
Дата 2.6.2011, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 28.3.2011

Репутация: -1
Всего: -1



Спасибо огромное 
нуп, =))
PM ICQ Skype   Вверх
systemIV
Дата 3.6.2011, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 28.3.2011

Репутация: -1
Всего: -1



А как вот можно реализовать теперь в нём блоки циклов?
Например я хочу сделать вот так:
Код

[news]
<p>{new}</p>
[/news]

PM ICQ Skype   Вверх
InfMag
Дата 5.6.2011, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



systemIV, news — это типа массив? а [] - значит бежать по массиву?
Ищем регой: /\[(.*?)\]([^\0]*?)\[\/(.*?)\]/
А потом смотрим \\1 есть ли такой массив, если да: цикл, где уже обрабатывается внутренность \\2.

Вот к примеру:
Код

$template = <<<HTML
<html>
<head>
    <title>{title}</title>
</head>

<body>
    <h1>{title}</h1>
    <ul>
        [news]
        <li><b>{date}</b> | {event}</li>
        [/news]
    </ul>
    
    <ul>
        [list]
        <li>{top_var} - {title}</li>
        [/list]
    </ul>
</body>
</html>
HTML;

$context = array(
    'title' => 'Testing page',
    'top_var' => 'YEAH',
    'news' => array(
        array('date'=>'now', 'event'=>'Barak obama jumping on ears'),
        array('date'=>'today', 'event'=>'This day so ugly'),
        array('date'=>'tomorrow', 'event'=>'I\'M DRUNK!'),
    ),
    'list' => array(
        array('title'=>'lalala'),
        array('title'=>'ololo'),
        array('title'=>'hehehe'),
        array('title'=>'olala'),
    ),
);

function parser($tpl, $context) {
    $result = $tpl;
    $cycle = '/\\[.*?\\][^\0]*?\\[\\/.*?\\]/';
    $cycleParse = '/^\\[(.*?)\\]([^\0]*?)\\[\\/.*?\\]$/';
    preg_match_all($cycle, $result, $matches);
    foreach ($matches as $inset) {
        foreach ($inset as $item) {
            preg_match_all($cycleParse, $item, $vars);
            $name = $vars[1][0];
            $code = $vars[2][0];
            if (isset($context[$name])) {
                $parsed = '';
                foreach ($context[$name] as $item2) {
                    $res = $code;
                    foreach ($item2 as $key => $val) {
                        $res = str_replace('{'.$key.'}', $val, $res);
                    }
                    foreach ($context as $key => $val) {
                        $res = str_replace('{'.$key.'}', $val, $res);
                    }
                    $parsed .= $res;
                }
                $result = str_replace($item, $parsed, $result);
            }
        }
    }
    foreach ($context as $key => $val) {
        $result = str_replace('{'.$key.'}', $val, $result);
    }
    return $result;
}

echo parser($template, $context);

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0703 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.