1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Туториал Создаем свой шаблонизатор

Тема в разделе "Руководства, инструкции, утилиты", создана пользователем bat9s, 20 май 2015.

  1. Автор темы
    bat9s

    bat9s Активный участник Пользователь

    Баллы:
    68
    Имя в Minecraft:
    bat9s

    <?php
    /*
    * Класс шаблонизатора
    */
    class Template{
    /*
    * @var string;
    */
    const DIR = "tpl/";
    /*
    * Открытие файла
    * @params string
    */
    public function load($file_name){
    $this->_dir = self::DIR.$file_name.'.tpl';
    if(!file_exists($this->_dir)){
    exit("Файла " .$this->_dir." не существует!!!");
    return false;
    }
    $this->temp = file_get_contents($this->_dir);
    }
    /*
    * Метод для замены %маркеров%
    * @params string
    * @params string
    */
    public function set($search, $replace){
    $this->temp = str_replace('%'.$search.'%', $replace, $this->temp);
    }
    /*
    * Вывод файла на экран
    */
    public function display(){
    echo $this->temp;
    }
    }

    ?>
     
  2. MySt1k

    MySt1k Старожил Пользователь

    Баллы:
    173
    1) В видео вообще ничего не слышно
    2) Не совсем полный и качественный код, забыл самое требовательное, инклюд "шаблона в шаблон"
     
  3. Автор темы
    bat9s

    bat9s Активный участник Пользователь

    Баллы:
    68
    Имя в Minecraft:
    bat9s
    За видео извиняюсь, я дал только идею для создания шаблонизатора, если нужно могу скинуть реализацию данного метода
     
  4. MySt1k

    MySt1k Старожил Пользователь

    Баллы:
    173
    Мне в принципе, все ровно, кому нужно - отпишется, а у меня совсем другая реализация шаблонизатора.
     
  5. Vladlen_198

    Vladlen_198 Старожил Пользователь

    Баллы:
    108
    Skype:
    ultrashock98
    Имя в Minecraft:
    UltraShock
    Гавно шаблонизатор твой. Аля dle так как только они так начинают. Да и методы... Кому нужно могу свой предоставить. Там есть возможность ставить теги типа {user} блоки [block][/block] возможность инклюда {inc src="124.tpl"}. Самое главное чистый код и скорость.
     
  6. MySt1k

    MySt1k Старожил Пользователь

    Баллы:
    173
    Го
     
  7. Vladlen_198

    Vladlen_198 Старожил Пользователь

    Баллы:
    108
    Skype:
    ultrashock98
    Имя в Minecraft:
    UltraShock
    Да прольётся чистота на rubukkit
    PHP:
    <?php
        
    if(!defined('ROOT')){exit;}

        class 
    tpl {
            public 
    $html = ['app'=>''];

            public function 
    __construct ($tpl) {
                
    $this->dirs $tpl;
            }
            public function 
    load ($tpl) {
                if (empty(
    $tpl) || !file_exists($this->dirs.$tpl)) die('Не удалось загрузить файл &rsaquo; '.$tpl);
                
    $this->tpl file_get_contents($this->dirs.$tpl);
                if(
    strpos($this->tpl,'{inc src=') !== false) {
                    
    $this->tpl preg_replace_callback("#\\{inc src=['\"](.+?)['\"]\\}#i",[&$this'load_file'],$this->tpl);
                }
            }
            public function 
    load_file ($arr = []) {
                
    $file explode('.',$arr['1']);
                if (
    $file['1'] == 'php') {
                    if (
    file_exists(ROOT.'/core/app/tpl/'.$arr['1'])) {
                        
    /* В global добавляем переменные которые можно использовать в модуле */
                        
    global $cfg,$db,$pdo,$tpl,$user;
                        
    ob_start();
                        require 
    ROOT.'/core/app/tpl/'.$arr['1'];
                        
    $file['3'] = ob_get_contents();
                        
    ob_end_clean();
                        return 
    $file['3'];
                    } else {
                        return 
    'Модуль &rsaquo; не найден';
                    }
                } elseif (!
    file_exists($this->dirs.$arr['1'])) {
                    return 
    'Шаблон &rsaquo; файл не найден';
                } else {
                    return 
    file_get_contents($this->dirs.$arr['1']);
                }
            }
            public function 
    vars ($arr,$var null) {
                if (
    is_array($arr)) {
                    foreach (
    $arr as $k => $v) {
                        
    $this->vars[$k] = $v;
                    }
                } else {
                    
    $this->vars[$arr] = $var;
                }
            }
            public function 
    dats ($tpl,$var '',$arr '') {
                if (
    is_array($tpl)) {
                    foreach (
    $tpl as $f => $v) {
                        
    $this->dats['#\['.$f.'\](.+?)\[\/'.$f.'\]#is'] = $v;
                    }
                } else {
                    
    $this->dats['#\['.$tpl.$arr.'\](.+?)\[\/'.$tpl.'\]#is'] = $var;
                }
            }
            public function 
    save ($tpl) {
                
    $html $this->tpl;
                if (!isset(
    $this->vars)) $this->vars = [];
                if (!isset(
    $this->dats)) $this->dats = [];
                if (
    count($this->vars) > 0) {
                    
    $f = [];
                    
    $r = [];
                    foreach (
    $this->vars as $k => $v) {
                        
    $f[] = $k;
                        
    $r[] = $v;
                    }
                    
    $html str_replace($f,$r,$html);
                    unset(
    $f);
                    unset(
    $r);
                }
                if (
    count($this->dats) > 0) {
                    
    $f = [];
                    
    $r = [];
                    foreach (
    $this->dats as $k => $v) {
                        
    $f[] = $k;
                        
    $r[] = $v;
                    }
                    
    $html preg_replace($f,$r,$html);
                }
                if(
    strpos($this->tpl,'{inc src=') !== false) {
                    
    $html preg_replace_callback("#\\{inc src=['\"](.+?)['\"]\\}#i",[&$this'load_file'],$html);
                }
                if (!isset(
    $this->html[$tpl])) {
                    
    $this->html[$tpl] = $html;
                } else {
                    
    $this->html[$tpl] .= $html;
                }
                unset(
    $this->vars);
                unset(
    $this->dats);
                unset(
    $this->tpl);
            }
        }
     
  8. IvanMC

    IvanMC Участник Пользователь

    Баллы:
    31
    А как его запустить? Покажите пример, как нужно делать теги, блоки и инклюды
     
  9. Vladlen_198

    Vladlen_198 Старожил Пользователь

    Баллы:
    108
    Skype:
    ultrashock98
    Имя в Minecraft:
    UltraShock
    Всё очень просто
    Инициализируем
    PHP:
    require '/tpl_class.php';
    $tpl = new tpl('Папка с шаблоном');
    Загрузка шаблона
    PHP:
    $tpl->load('Файл шаблона скажем main.tpl');
    Установка перемененных типа {vars} через массив и без
    PHP:
        $tpl->vars(array(
            
    '{user}' => 'UltraShock',
            
    '{money}' => '120',
        ));
        
    $tpl->vars('{user}','UltraShock');
        
    $tpl->vars('{money}','120');
    Блоки с массивом и без с допонительными параметрами типа [group=5] =5 дополнительный парметр
    PHP:
        $tpl->dats(array(
            
    'main' => '\\1',
            
    'block' => false,
        ));
        
    $tpl->dats('main','\\1');
        
    $tpl->dats('block',false);
        
    $tpl->dats('group','\\1','=3');
    Сохранение
    PHP:
    $tpl->save('Названия переменной');
    Вывод
    PHP:
    echo $tpl->html['Название переменной'];
    И в шаблоне {inc src="block.tpl"} или php файл будет из модулей {inc srс="hello.php"}
     
    Последнее редактирование: 17 июн 2015
  10. saharin94

    saharin94 Старожил Пользователь Заблокирован

    Баллы:
    173
    Тот же убогий шаблонизатор DLE. В ucoz и то лучше.
     
  11. MySt1k

    MySt1k Старожил Пользователь

    Баллы:
    173
    Кто нибудь использует нативный наблонизатор?
     
  12. Vladlen_198

    Vladlen_198 Старожил Пользователь

    Баллы:
    108
    Skype:
    ultrashock98
    Имя в Minecraft:
    UltraShock
    Предложи лучше с таким же небольшим кодом.
     
  13. IvanMC

    IvanMC Участник Пользователь

    Баллы:
    31
    @Vladlen_198, а как можно сделать, чтобы в вашем шаблонизаторе можно было {inc str="hello.php"} делать с параметрами ( {inc str="hello.php?name=test"} )
    ?
     
  14. Vladlen_198

    Vladlen_198 Старожил Пользователь

    Баллы:
    108
    Skype:
    ultrashock98
    Имя в Minecraft:
    UltraShock
    Хмм, надо будет переделать чтобы принимал параметры. И ещё не str а src
     
  15. IvanMC

    IvanMC Участник Пользователь

    Баллы:
    31
    Сегодня можно будет ожидать этого?
    Просто ваш шаблонизатор, мне кажется идеальным и простым, а вот функции этой не хватает, к сожалению
    Уделите несколько минут, пожалуйста:oops:
     
  16. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    И к чему все это? Есть же готовый класс bbCode.
     

Поделиться этой страницей