Форум → Программирование → Пыхнуть хотите? → Готовые решения → Мой нативный шаблонизатор STemp 2.0
Мой нативный шаблонизатор STemp 2.0
Страницы: ← Предыдущая страница • Следующая страница →
- 
                    
                    
                        
- 
                    
                    
                         Сен. 11, 2009, 4:05 п.п., спустя 1 час 27 минут 34 секунды Сен. 11, 2009, 4:05 п.п., спустя 1 час 27 минут 34 секунды
 Если могут понадобиться какие-то значения, разработчик должен знать о том, что они понадобятся, уже в контроллере.
 По Вашему и правильней будет.
 Я бы указал типы результатов … зачем зря читателя напрягать (а ещё лучше пример возвр. значений) 
 Не понял к чему это.
 Я о том, что Вы вызываете "внешние" методы. И читатель не знает, какого вида результат он возвращает. Язык не типизирован. Приходится уже потом догадываться, что же там нам вернули и в каком виде. Помогите читателю … покажите, с какими данными в переменных он двигается дальше по коду.Почему в контроллере решаем, что будет подключать шаблонизатор ? 
 И в итоге почти все контроллеры почти всегда стартуют из index.tpl.php
 Смешиваем логики C и V. Или нет?
 Нет. В контроллере решаем, что подключать. В index.tpl.php только подключаем. Где там контроллеры?
 Вроде как идентично.
 Вы в контроллере принимаете ДВА решения "КОГО показать, В ЧЁМ показать". Необычно.Потенциальная дыра. 
 "не должно" - плохо так думать в вопросах защиты.
 Про часы и параметры … по умолчанию ставят, обычно, наиболее часто используемый вариант.Расширил бы до возможности принимать ассоц. массивы [name] => value. 
 Если я правильно понял, чтобы каждый элемент массива становился отдельной переменной? А как быть, если нужно передать именно массив?))
 http://pyha.ru/forum/topic/3393.msg69508#msg69508 второй метод.Не уловил, в чем тут игра со спичками. 
 Спички в том, что Вы оперируете HTML-кодом ДО шаблона. Я считаю, что в MVC ему место только в V … точнее в шаблоне, который этот V обрабатывает.По-умолчанию, все переменные обрабатываются перед отдачей. 
 А я предлагаю фильтровать не на выходе из шаблона, а на входе в шаблон.
 Выше уже описано почему.
 "Всё настраивается".
 Пистолет … у него настраивается направление вылета пули … по умолчанию как обычно. А если админ дурак и настроил вылет в противоположную сторону - его право.
 Удобно! Хочешь застрелится - только настройки поменяй. Не надо напрягаться, тащить пистоль к виску.
 И какова цена ошибки?
 Вот и Ваши настройки … раз ошибитесь … и до одного места все ваши 99 аккуратных шаблонов. Для хака хватает одного дырявого.
 Спустя 259 сек.
 хз, что за get_block такой. мой класс весь на виду, шаблоны и тестовые данные в архиве.
 у тебя я вижу в исходниках один охуенный assign — извини, это плохой код. ничего больше не надо.
 …
 Давайте включим мозги.
 Тема "Нативный шаблонизатор".
 Название метода "get_block($block_name)"
 Спор идет о выводе подключаемых блоков.
 Логично предположить, что эта функция возвращает код, который сформирован по шаблону с именем $block_name.
 "Плохой код …" … похоже на подростка в период полового созревания. От меня, наверное, ожидают: "Посмотри на свой _escape" ? :)
- 
                    
                    
                         Сен. 11, 2009, 4:53 п.п., спустя 48 минут 13 секунд
                                    
                                нет, батенька, я от вас ничего не ожидаю. у меня дети в периоде полового созревания, так что я смотрю на вас филоофски, без напряга.ιιlllιlllι унц-унц Сен. 11, 2009, 4:53 п.п., спустя 48 минут 13 секунд
                                    
                                нет, батенька, я от вас ничего не ожидаю. у меня дети в периоде полового созревания, так что я смотрю на вас филоофски, без напряга.ιιlllιlllι унц-унц
- 
                    
                    
                         Сен. 11, 2009, 11:15 п.п., спустя 6 часов 22 минуты 5 секунд
                                    
                                Кстати, Адворд, я вот сделал страничку для своего шаблонизатора: http://s-a-p.in/stemp/ Сен. 11, 2009, 11:15 п.п., спустя 6 часов 22 минуты 5 секунд
                                    
                                Кстати, Адворд, я вот сделал страничку для своего шаблонизатора: http://s-a-p.in/stemp/
 Не подскажешь, как бы я мог такое сделать на вордпрессе, который ты так восхваляешь?)
- 
                    
                    
                         Сен. 12, 2009, 10:47 д.п., спустя 11 часов 32 минуты 6 секунд
                                    
                                sap, а что ты там такого сложного сделал? Это легко решается на вордпрессеhttps://smappi.org/ - платформа по созданию API на все случаи жизни Сен. 12, 2009, 10:47 д.п., спустя 11 часов 32 минуты 6 секунд
                                    
                                sap, а что ты там такого сложного сделал? Это легко решается на вордпрессеhttps://smappi.org/ - платформа по созданию API на все случаи жизни
- 
                    
                    
                        
- 
                    
                    
                         Сен. 13, 2009, 3:39 п.п., спустя 1 день 4 часа 13 минут Сен. 13, 2009, 3:39 п.п., спустя 1 день 4 часа 13 минут
 sap, а что ты там такого сложного сделал? Это легко решается на вордпрессе
 Неужели?) Почему тогда мануал php.net не на вордпрессе?)
- 
                    
                    
                         Сен. 13, 2009, 6:39 п.п., спустя 2 часа 59 минут 25 секунд
                                    
                                sap, сам то понимаешь что сказал?https://smappi.org/ - платформа по созданию API на все случаи жизни Сен. 13, 2009, 6:39 п.п., спустя 2 часа 59 минут 25 секунд
                                    
                                sap, сам то понимаешь что сказал?https://smappi.org/ - платформа по созданию API на все случаи жизни
- 
                    
                    
                        
- 
                    
                    
                         Сен. 13, 2009, 6:41 п.п., спустя 1 минуту 45 секунд Сен. 13, 2009, 6:41 п.п., спустя 1 минуту 45 секунд
 чеж тогда его херню не юзает пхп.нет? невзаимная любовь)
 adw0rd, он фанат php.net ))))))https://smappi.org/ - платформа по созданию API на все случаи жизни
- 
                    
                    
                         Сен. 13, 2009, 6:53 п.п., спустя 12 минут 16 секунд
                                    
                                adw0rd, точно, то он и бурый такой всегда)Сапожник без сапог Сен. 13, 2009, 6:53 п.п., спустя 12 минут 16 секунд
                                    
                                adw0rd, точно, то он и бурый такой всегда)Сапожник без сапог
- 
                    
                    
                         Сен. 15, 2009, 10:01 п.п., спустя 2 дня 3 часа 7 минут Сен. 15, 2009, 10:01 п.п., спустя 2 дня 3 часа 7 минут
 AndryG, как выглядит то! DEFENCE!!!
 http://ru2.php.net/manual/en/function.array-walk-recursive.php
 …..<?php
 $arr = array(
 'branc_a' => array (11,12,13),
 'branc_b' => array (21,22,23)
 );
 function call_back(&$v,&$k){
 $k = 'change_'.$k;
 $v = 'change_'.$v;
 echo "\n $k => $v";
 }
 echo "<PRE>\n Изначальный массив:".print_r($arr,true)."\n\n array_walk_recursive: \n";
 array_walk_recursive($arr,'call_back');
 echo "\n\n мой метод assign:";
 $v = new v_www();
 $v->assign('arr',$arr);
 echo "\n".print_r($v->tpl_var_for_pyha(),true);
 exit();Изначальный массив:Array
 (
 [branc_a] => Array
 (
 [0] => 11
 [1] => 12
 [2] => 13
 )
 [branc_b] => Array
 (
 [0] => 21
 [1] => 22
 [2] => 23
 )
 )
 array_walk_recursive:
 change_0 => change_11
 change_1 => change_12
 change_2 => change_13
 change_0 => change_21
 change_1 => change_22
 change_2 => change_23
 мой метод assign:
 Array
 (
 [arr] => Array
 (
 [branc_a] => Array
 (
 [0] => change_11
 [1] => change_12
 [2] => change_13
 )
 [branc_b] => Array
 (
 [0] => change_21
 [1] => change_22
 [2] => change_23
 )
 )
 )
 В справке пишут: "Никакой ключ, соответствующий значению типа array, не будет передан в функцию."
 В справке пишут: " Если требуется, чтобы функция funcname изменила значения в массиве, определите первый параметр funcname как ссылку. "
 Получается, что с array_walk_recursive я теряюпервоначальное дерево ивозможность "прорабатывать" ключи массива.Спустя 192 сек.Прогнал :) Уже тут увидел, что прогнал с деревом.
 Но невозможность изменять ключи мне всё одно фигня получается.
- 
                    
                    
                         Сен. 15, 2009, 10:51 п.п., спустя 49 минут 53 секунды
                                    
                                а зачем тебе менять ключи? ты их тоже выводишь?ιιlllιlllι унц-унц Сен. 15, 2009, 10:51 п.п., спустя 49 минут 53 секунды
                                    
                                а зачем тебе менять ключи? ты их тоже выводишь?ιιlllιlllι унц-унц
- 
                    
                    
                         Сен. 16, 2009, 10:11 д.п., спустя 11 часов 19 минут 55 секунд
                                    
                                Конечно. Сен. 16, 2009, 10:11 д.п., спустя 11 часов 19 минут 55 секунд
                                    
                                Конечно.
 Для примера …
 Модель возвращает массив [id] => [value]. Делаем ссылки. [id] уходит в href, [value] в текст ссылки.
 И я не буду надеяться на то, что id - это только число.
 Вполне возможны и НЕ суррогатные ключи, а какой-нить натуральный текстовый.
- 
                    
                    
                         Ноя. 17, 2009, 3:14 п.п., спустя 62 дня 6 часов 3 минуты
                                    
                                Вот тут http://pyha.ru/forum/topic/554.105 поднимал вопрос по поводу перехвата ошибок Parse error … в нативном шаблонизаторе Ноя. 17, 2009, 3:14 п.п., спустя 62 дня 6 часов 3 минуты
                                    
                                Вот тут http://pyha.ru/forum/topic/554.105 поднимал вопрос по поводу перехвата ошибок Parse error … в нативном шаблонизаторе
 В случае если в самом шаблоне допущена синтакс. ошибка выполнение прерывается и вываливается ошибка Parse error …
 если все остальные ошибки можно перехватить так:<?php
 class MyException extends Exception {
 public function __construct($message, $errorLevel = 0, $errorFile = '', $errorLine = 0) {
 parent::__construct($message, $errorLevel);
 $this->file = $errorFile;
 $this->line = $errorLine;
 }
 }
 set_error_handler(create_function('$c, $m, $f, $l', 'throw new MyException($m, $c, $f, $l);'), E_ALL);
 try
 {
 include "echo.php";
 }
 catch (MyException $e) {echo $e->getCode();}
 ?>
 то для Parse error данный способ не подходит
 Первоночально функция display имела практически такой же видpublic function display($template)
 {
 $this->template = $this->path.$template;
 if (!file_exists($this->template))
 throw new STempDisplayException('Template file '.$template.' not exitst');
 header("Content-type: text/html; charset=".$this->params['charset']);
 require($this->template);
 if ($this->params['exit_after_display'])
 exit;
 }
 за исключением некоторых мелочей так вместо require использовал include
 однако всеже было желание найти способ отлавливать все ошибки которые могут возникнуть при разборе и выполнении шаблона в итоге пришел к такомуpublic function display($template)
 {
 if(!$template) die('Шаблон не задан!');
 $this->_template_ = "{$this->_path_}$template.tpl";
 if(!file_exists($this->_template_)) die("Шаблона $this->_template_ не существует!");
 //$this->_template_ = preg_replace("#global[^\?;]+#si", "", file_get_contents($this->_template_));
 
 $this->_template_ = file_get_contents($this->_template_);
 ob_start();
 $result = @eval("?>{$this->_template_}").ob_get_clean();
 if(!$result)
 {
 $exceptionFunction = create_function('$a', 'throw new ParseException($a);');
 ob_start();
 *** $result = eval("?>{$this->_template_}").ob_get_clean();
 preg_replace("#<b>Parse error</b>:.*?on line.*?<b>(.*)</b><br />#ei", "\$exceptionFunction('Ошибка в шаблоне '.\$template.'.tpl строка $1');", $result);
 }
 return $result;
 }
 include заменил на @eval именно с собакой чтобы в буфер не кидалось сообщение об ошибке
 тогда если наступает ошибка Parse error переменная $result = null; проверяем и если так то в строке *** получаем сообщение об ошибке
 и в следующей строке парсим его при этом видно что если это ошибка типа Parse error то бросается исключение иначе исключение в этом месте не бросается
 а бросается способом описанным выше.
 далее для отрисовки шаблона используем такой вызовtry{echo $this->template->display($document->template);}
 catch (MyException $e) {echo $e->getLine();}
 catch (ParseException $e) {echo $e->getMessage();}
 таким образом перехватывая все ошибки и выводя на экран или в лог
 Плюсы от замены include на eval
 1 возможность перехватить ошибку Parser error
 2 шаблоны перед исполнением можно редактировать например через preg_replace
 что позволит запретить использование дерективы global и соответственно несанкцианированного доступа к данным
 или например замены md5(); на $this->md5(); (md5 так для примера а вообще нужно по шаблону заменять все стандартные
 функции php и далее добавляя в класс шаблонизатора нужные методы можно разрешить использование только нужных нам функций)
 3 также смело можно использовать <?= …?> вместо <?php echo …?>
 Минус в том что Fatal error не получается поймать.
 все это просто размышления о том как сделать использование нативных шаблонов более безопасным
 чтобы скачивая такой шаблон можно было не боясь запускать без предварительных проверок.
Страницы: ← Предыдущая страница • Следующая страница →
Пожалуйста, авторизуйтесь, чтобы написать комментарий!
 
         
                                     
                                     
                                     
                                     
                                    