За последние 24 часа нас посетили 20337 программистов и 1082 робота. Сейчас ищут 744 программиста ...

Шаблонизатор

Тема в разделе "Решения, алгоритмы", создана пользователем Danilka, 30 апр 2008.

  1. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    данные не придут тогда, когда ты их туда не передашь. Другого варианта нет. Ещё раз: парсим шаблон — да, выводим данные — да, принимаем от скрипта данные — да. Отладка приложения на уровне шаблона — нет.
    Единственное, что в этом смысле позволено делать в шаблоне — это:
    PHP:
    1. <?php if(is_set('row')):?>
    2. покажем чего хотели
    3. <?php else:?>
    4. ой, блин, а никого нет дома
    5. <?php endif?>
    а разбор и логирование того почему произошло так, что is_set('row') == false — это задача совсем другого куска кода.
    Ещё раз: шаблон показывает, а не контролирует.
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    А чего там отлаживать? К примеру, когда переменная неожиданно окажется пустой
    HTML:
    1. <span><?php echo $var?></span>
    PHP:
    1. $tpl -> var = mysql_fetch_row($res, 0); // вылетит ошибка в этом месте, если данные не пришли
    или
    PHP:
    1. $tpl -> var = file_get_contents('file.html'); // вылетит ошибка если файла нет
    или
    PHP:
    1. $tpl -> var = $array['var']; // если нет такой пермеенной, то нотис и так тут вылетит
    единственная возможная ошибка, которой не будет в логах - программист забыл присвоить переменной значение.
     
  3. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    не лезь, если не умеешь читать.

    Еще раз. В вашем случае он вообще ничего не показывает.
    Он тупо выводит пустое место.

    PHP:
    1. <?php
    2. echo $this->undefined; // я получу нотис
    3.  
    4. function get($varname) {
    5.    return isset($this->{$varname}) ? $this->{$varname} : '';
    6. }
    7.  
    8. echo get('undefined'); // а дульки мне, а не нотис в логи.
    Еще вопросы?
     
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    читать то я умею. Тут размером h1 вопрос тебе ставится - ЗАЧЕМ НОТИС В ШАБЛОНЕ? get('undefined') да, не вызовет ошибки, но если была неудачная попытка определить переменную, то ошибка и так вылетит в месте определения.
     
  5. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    PHP:
    1. <?php
    2.     $parser->set('var',$var); // нотис ещё до начала парсинга ;)
    3. ?>
    теперь твоя очередь привести вариант штатной ситуации, когда переменная была задана, но не дойдёт до момента вставки в шаблон :)
     
  6. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    [vs]
    школьники курят пока в сторонке. Я закончу беседовать, и только потом буду заниматься просветительской деятельностью с тобой.

    Не-не, не уважаемый.

    Это ваш метод get() для не заданных переменных. И родился он в вашем коде - а посему это ваши проблемы, где оно у вас возникает. Я фантазировать на этот счет не собираюсь.

    Если же у вас все переменные в шаблоне определены при помощи $parser->set('var',$var); - то в чем фишка get('var')? Абы було? Ога?

    P.S. В моем случае происходит инициализация пустых структур, но они валидны и все их свойства defined, а посему и никаких нотисов в шаблонах вызвать не могут, и буде вкрадется ошибка, то я это залогирую, поскольку не занимаюсь маскировкой ошибок.
     
  7. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    уже фантазируешь. Не я же про недошедшие данные и несуществующие нотисы начал :)

    Если бы get() брало значение из глобального пространства переменных, то да, была бы проблема. Так как мы работаем с конкретным массивом данных, который сами же сознательно и заполняем, то о каких нотисах и неконтролируемых ошибках может идти речь? Вот честно, не понимаю. Мы задали, мы получили.

    Это как если бы говорить про код
    PHP:
    1. <?php
    2. $vars = array();
    3. $vars['var'] = 'val';
    4.  
    5. $param = $vars['var'];
    6.  
    7. // …
    8.  
    9. echo isset($param)?$param:'';
    10. ?>
    «из-за isset() мы не можем гарантировать, что $param существует и что-то содержит, а это потенциальное место ошибки, потому что потому».
     
  8. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Luge
    Контрольный в голову.
    В чем смысл echo get('var');
    вместо echo $var

    какую, нагрузку несет этот вызов?
     
  9. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    ууу, началось. В принципе каждый велен делать как хочет, НО я лично убеждён в следующем:
    я в принципе так и делаю - в шаблонизаторах, на методе __get генерирую исключение, если нет ключа. Не знаю как вы Luge так разбираетесь, что шаблонизатор должен обрабатывать чьи то ошибки забывания передачи переменной в виде возврата пустого значения или еще как то, но это если ключа нет, то это ошибка программиста, как по мне. Да, может вам так и удобнее, но увы, у нас разные взгляды ))

    Mr.M.I.T. а я так и делаю. Кстати ничего там заумного не надо, просто экшен возвращает представление зоны и всё. Оно так и дёргается - древовидно или даже графовидно.
     
  10. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Костян
    А мне кажется, что на самом деле никаких проблем такой подход не создает. Наоборот - юзабилити :)
     
  11. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    лучше массив, тк. это универсальный формат данных системы, сокращаем лишние вызовы шаблонизатора
    плюс получаем абстрагирование вида. тоесть в разных зонах, блок новостей может выглядеть поразному или вообще не быть

    Simpliest
    Luge
    бгг. есть вариант "для всех"
    error_reporting(E_ERROR | E_WARNING);
    /*.....*/
    print $var; =)
     
  12. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    хотя забавно бывает когда ждёшь массив, а получаешь строку
     
  13. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    Шаблон не включён в область видимости заполняющего его метода, он просто не знает о существовании какой-то гипотетической $var. Для того, чтобы получить от get('var') какие-то данные их сначала надо определить. Опять же, через get('var') происходит обращение к элементу заполненного нами массива, а не к какой-то переменной в дебрях кода.

    где-то читал, что обращаться к приватным свойствам класса не получится. Врут? :)
     
  14. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    E_ALL | E_STRICT

    Конечно врут :D

    Ключевая ошибка в
    PHP:
    1. <?php
    2. public function __toString() {
    3.     ob_start();
    4.     include $this->template; // $this->var даже для приватных переменных.
    5.     $return = ob_get_clean();
    6.     ob_end_clean();
    7.     return $return
    8. }
    9.  
     
  15. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    Ещё раз вопрос в зал: зачем шаблону заботиться о типе или наличии даных, которые в него пришли? Это задача и зона ответственности программиста.

    Самое интересное, что стой в методе get() какое-нибудь
    PHP:
    1. <?php
    2.     Logger::error('undefined_variable', gebug_backtrace());
    3.     die('Ахтунг!!!');
    4. ?>
    вопросов бы не возникло.

    А самое смешное, что функциональность с возвращением пустой строки используется только в конечном собирании общего шаблона страницы из уймы мелких.
     
  16. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    спасение утопающего дело рук самого утопающего
     
  17. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    вот и пускай шаблон разрешит ситуацию и присовит переменной null! Аминь!

    ЗЫ. Почему делают $var=''; вместо $var=null; если надо просто инициализировать?
     
  18. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    да он без проблем присвоит. Дело в том, что будет вопрос, передал ли я туда null в контроллере или туда вообще никто ничего не передал! Вот в этом вся дилема.
    а у меня вроде массив и потом instanceof-ы всякие, я не помню..., ну массив лучше, да
     
  19. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Заботиться ему не зачем. Но знать тип ожидаемых структур - он обязан.
     
  20. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    о, я понял, главное недовольство вызвало get('var') вместо $this->var . Ну, вот такие мы засранцы, не сующие явно объект в шаблон.:D

    Про нотисы и их сокрытие лучше давай. Любая переменная приходит из моего же кода, я контролирую что передаётся в шаблон и откуда у нас тут нотис? Будет ошибка — появится ещё раньше, при добавлении. Кстати, в случае с $this->var нотис так же появится ещё до вызова.
     
  21. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Вы не засранцы, это называется несколько иначе :)
    Вы просто поимеете анальный секс (или уже поимели) эпических масштабов с областями видимости, когда выяснится что надо иметь более 1го шаблона.

    Разве?

    А это зависит от того как использовать.

    $this->view->payments = $payments;
    и даже если мы этого делать не будем, то notice - будет отсутствовать ровно до тех пор, пока мы не обратимся к payments внутри шаблона.
    Причем в вашем случае get('var')
    А в моем случае будут матюки в логах.
     
  22. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    ты рассматриваешь ситуацию, когда $payments в любом случае существует, а с $this->view->payments что-то может произойти и она почему-то не существует (ну, или опечатка какая). Я — совершенно противоположную. Так мы ни к чему не придём.

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

    Так объясни, что же тебе кажется ненормальным и я пойду смотреть кино, как наши солдаты убивают одной пулей сотню фрицев.
     
  23. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    как там сейчас не знаю, Psih появится — поправит, но раньше одна страница собиралась из 10-15 шаблонов и проблем с пересечением имён переменных (если ты об этом) не было, хотя в многие шаблоны приходили переменные с именами data или rows.
     
  24. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Если он не существует, то как справедливо ты заметил - ошибка будет до шаблона.

    в варианте "б" в вашем варианте я не контролирую отсутствие данных.
    Т.е. я могу думать что угодно и что алгоритм у меня идеальный. Но по факту в рабочем режиме могут быть и будут возникать ошибки, которые программист упустил.

    Поэтому в моем случае я явно получу ошибку в логе. в вашем варианте - пустое место увидит юзер, а я могу об этом и не узнать.

    Вот пример
    ждем
    Код (Text):
    1. $this->user_name as string
    передали
    Код (Text):
    1. $this->view->name_user = $user_name;
    И все... приплыли у вас вывелась пустая строка, и это никак не отразилось в логах.
     
  25. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    Я же тебя не убежу в высосанности проблемы из пальца? :) Проблемы связанные с пользовательским вводом отсеиваются на этапе обработки данных, проблемы получения данных из потока или базы — зона ответственности интерфейса работы с потоком, опечатки и отсутствие данных — ты сам увидишь проблему при первом же пробном запуске скрипта. Если происходит исключительная ситуация, достойная фиксации в логи, то это должно быть обработано задолго до шаблона. А опечатки и забывчивость — что ж, и такое бывает, но такие ошибки отсеиваются элементарно.