Ответы пользователя по тегу Шаблонизаторы
  • Какой смысл в использовании шаблонизаторов?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Шаблонизатор шаблонизатору рознь. Но в целом следует выделить общие задачи. которые должны решать за вас шаблонизаторы. С blade не работал и не вижу смысла есть есть twig.

    Безопасность. Это пожалуй можно поднять на верх. Типичная картина в шаблонах на php - <?= $someUserInput; ?>. Частенько это можно встретить в выводе инпутов, при формировании ошибок поиска (мол "по запросу $userInput ничего не найдено. То есть вставляем в инпут подключение наших js скриптиков, если это форма поиска - делимся с "другом" и забираем его сессию. Ну или еще какие забавные штуки можно делать. А ведь все очень просто решается. Ставим какую-то функцию, которая по умолчанию будет фильтровать XSS инъекции при выводе, и не будет этого делать только если мы попросим. Если писать просто на php - появляются отвратные функции, которые можно просто забыть вызвать. А с шаблонизаторами мы пишем красивые {{ someUserInput }} и можем спать спокойно.

    Помогают соблюдать принцип DRY. Современные средства шаблонизации (twig например), предоставляют вам возможность разделять шаблоны на блоки, переиспользовать их несколько раз, выделять макросы, наследовать шаблоны... словом все что угодно. лишь бы вы могли реюзать куски html а не копипастить их.

    Ограничивают полет фантазии разработчика. Далеко не новость что разработчики ленивые засранцы. Особенно молодые. Если им в шаблоне внезапно понадобились какие-то данные из БД, или данные связанные с запросом, большинство не будет париться и зафигачит нужный код прямо в темплейте. Так же некоторые грешат тем что часть бизнес логики размазывают по шаблонам. Так же встречал проекты отданные на суппорт, где чуваки в шаблонах разбирали через xpath ответы от сторонней апишки (которая использовалась вместо базы данных. То есть это дело было размазано по всему проекту). Рефакторинг в случае изменения апишки будет болью.

    Хороший шаблонизатор должен настолько сильно усложинить вам процесс написания говнокода в шаблонах, что бы вы перехотели это делать и подумали как это можно сделать нормально. На выходе же мы имеем чистенькие шаблоны, которые ничего не знаю о бизнес логике приложения и знают только о логике отображения, чего мы и добиваемся вообще разделяя логику от представления. Это так же упрощает жить верстальщику (если он отдельно существует) или вам же в будущем при суппорте.

    С другой стороны, тот же twig позволяет в рамках проекта расширять синтаксис шаблонизатора, писать экстеншены, словом делать очень много забавных и нужных вещей, позволяющих сократить время поддержки шаблонов в будущем.

    Так как за все эти приятные вещи мы по сути ничего не платим (шаблонизатор должен компилировать все это в нативный php так что оверхэда просто не будет), почему бы не пользоваться?
    Ответ написан
    1 комментарий
  • Как сделать редирект в шаблонезаторе Twig?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Еще один плюс Twig - если разработчик хочет сделать что-то там, где этому нету места, то у него будут с этим проблемы.

    Не следует делать этого в шаблонах. Вообще. Если очень хочется то можно так:
    <script>
    window.location = {{post.link | json_encode()}};
    </script>

    Почему именно так? Потому что иначе пришлось бы возиться с буфером вывода, а это уже явно не то место где это следует делать. Если же у вас хоть один байт лета запроса просочился в stdout, то заголовки менять уже нельзя.
    но по хорошему это следует делать в контроллере.
    Ответ написан
  • Как сделать шаблонизатор без ООП?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Мне было малость скучно...

    function render($template, array $data = array()) {
        $content = file_get_content(sprintf('%s/templates/%s.tpl', __DIR__, $template);
        
        return preg_replace_callback('/\{\{\s*([a-z_\-][a-z0-9_\-]*)\s*(\|\s*raw\s*)?\}\}/i', function ($matches) use ($data) {
            $needToEscape = !isset($matches[2]);
            if (!isset($data[$matches[1]]) {
                throw new \Exception(sprintf('Variable "%s" not exists', $matches[1]));     
            }
    
            $value = $data[$matches[1]];
            if ($needToEscape) {
                 // тут можно придумать чего получше, это просто для примера.
                 $value = htmlentities($value);
            }
    
            return $value;
        }, $content);
    }


    Использование:
    <!-- post.tpl -->
    <h1>{{ title }}</h1>
    {{ content | raw }}


    echo render('post', ['title' => 'Some Title', 'content' => 'Some <strong>content with html</strong>!']);
    Ответ написан
    3 комментария
  • Неправильно работает underscore, что делать?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Режим ванги: проверьте что вы передаете в шаблоны.
    Ответ написан
    7 комментариев
  • Как реализовать цикл в шаблонах Quicky?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    while это оператор, а не функция...
    Ответ написан
    Комментировать
  • Шаблонизатор на PHP

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Twig. Причин несколько. Очень удобный и понятный синтаксис, фильтры/функции, компиляция шаблонов, наследование шаблонов. Реализован он при помощи AST парсера, так что расширять синтаксис довольно удобно.
    Ответ написан
    Комментировать
  • Как добавить user функции в Twig?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Вообще такие вещи обычно делаются через HMVC.
    Ответ написан
    Комментировать