За последние 24 часа нас посетили 20345 программистов и 1012 роботов. Сейчас ищет 371 программист ...

Dirk - еще один шаблонизатор на PHP

Тема в разделе "Решения, алгоритмы", создана пользователем artoodetoo, 19 фев 2015.

  1. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Прошу пробовать: https://github.com/artoodetoo/dirk , на пакагисте заведен как artoodetoo/dirk , то есть можно подключать через компосер.
    Зависимостей от других пакетов нет, PHP 5.4+
    Синтаксис стянут у laravel/blade.

    Код (Text):
    1. @extends('layout/main')
    2.  
    3. <h1>Hello {{{ $name }}}!<h1>
    4.  
    5. {{ $timestamp or 'Timestamp not defined' }}
    6.  
    7. @section('sidebar')
    8.  
    9.   @foreach($list as $l)
    10.     <p>{{ $l }} @if($l == 3) is equal 3 ! @endif</p>
    11.   @endforeach
    12.  
    13. @endsection
    Здесь показаны: наследование шаблона от layout/main. Вывод переменной $name с экранированием. Вывод переменной $timestamp со значением по умолчанию, если она не определена. Секция 'sidebar', которую выведет родительский шаблон. Цикл, условие — всё как в нормальных домах )))

    От вставки нативного PHP шаблон никак не защищается, позже наверное сделаю опциональную порчу <?php ?>.

    Предназначен для тех, кто хочет иметь шаблоны, но не хочет сильно раздувать приложение.
    2 файла, 236 строк кода (так говорит cloc). Для сравнения: если подключить blade без прочего ларавеля, то прилетит 148 файлов и 8515 строк. Это и есть причина, по которой появился dirk.

    Свободно для использования. Лицензия MIT.
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Re: Еще один шаблонизатор на PHP

    А в чем принципиальное отличие
    От
    Код (Text):
    1. echo (!empty($timestamp))?($timestamp):('Timestamp not defined'));
    , кроме лишнего оверхеда и "минималистичнее смотрится"?

    Ну и то же про циклы, ифы.
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Re: Еще один шаблонизатор на PHP

    скобок-то нафигарил
    echo !empty($timestamp) ? $timestamp : 'Timestamp not defined';

    ну для шаблонизатора в том виде, в каком они нычне существуют (без ограждающих тегов как в пхп) очень даже удобная фишка так писать. Мне нравайся. Просто я шаблонизаторы не уважаю.
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Fell-x27, ты сторонник нативных шаблонов? смотри как Dirk транслирует
    было
    Код (Text):
    1. {{ $timestamp or 'Timestamp not defined' }}
    стало
    Код (PHP):
    1. <?= isset($timestamp) ? $timestamp : 'Timestamp not defined' ?>
    где тут оверхед?
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Re: Еще один шаблонизатор на PHP

    Моя любить скобки, скобки вносить порядок, скобки убирать неоднозначность, в пыхе без скобок можно выстрелить себе в ногу. Классический пример:
    Код (Text):
    1. $arg = 'T';
    2. $vehicle = ( ( $arg == 'B' ) ? 'bus' :
    3.              ( $arg == 'A' ) ? 'airplane' :
    4.              ( $arg == 'T' ) ? 'train' :
    5.              ( $arg == 'C' ) ? 'car' :
    6.              ( $arg == 'H' ) ? 'horse' :
    7.              'feet' );
    8. echo $vehicle;// выведет horse
    А с "нафигаренными скобками" все будет работать как нужно.
    Никто не спорит, но
    Моя пытаться понять смысл этих телодвижений...

    Добавлено спустя 1 минуту 16 секунд:
    Re: Dirk - еще один шаблонизатор на PHP
    и сохраняет в файлик, который потом дергается, или транслирует при каждом вызове?
    В любом случае, почему сразу не написать
    ?
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    ёманарот, чем я заслужил такое! суслик, конечно он каждый раз транслирует еще и sleep херачит, чтобы сервер выспался.

    Добавлено спустя 3 минуты 54 секунды:
    я же не навязываюсь, хочешь, сразу пиши.

    вместо того, чтобы п*еть, взял бы да качнул. там в коробке есть "нативный" класс PhpEngine, который ничего не транслирует, а только поддерживает среду выполнения — наследование шаблонов и блоки .

    Dirk наследует от PhpEngine добавляя только транслятор. в перспективе можно и других наследников завести, если есть особые пристрастия по синтаксису.
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    isset($timestamp)  AND $timestamp ?
    Не?
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Тю, не ругайся и не обзывайся, у мне правда искренний интерес, все еще пытаюсь понять суть подобных шаблонизаторов. Я б качнул, но я на работе.
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    а ты видел "подобные", чтобы рассуждать о них?
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    не, ну вообще-то пхп не выведет пустую строку в такой конструкции:
    $a = "";
    if ($a) { echo $a;}
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    пустая строка ≠ неинициализированная переменная
    Код (PHP):
    1. $view->render('hello', ['timestamp' => '']);
    2. ... и где-то в шаблоне ...
    3. echo isset($timestamp) ? $timestamp : 'Timestamp not defined';
    выведет пустую строку.

    только в случае не-инициализированной переменной или null эта штука выводит дефолтовое значение. так и задумывалось. в blade оно так и я не стал изменять поведение, ибо нефиг.

    Добавлено спустя 8 минут 6 секунд:
    мне вот хочется локализацию в шаблоны прикрутить, но так, чтобы не жестко завязываться на какие-то классы!
    в ларавеле для этого есть фасад Lang, но я же не для того сделал независимый шаблонизатор, чтобы приклеить его к конкретному фреймворку )))

    в общем, выслушаю советы.
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    не раскрыта причина появления ещё одного шаблонизатора
     
  14. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    По-моему раскрыта. Минимализм кода и отсутствие зависимостей.
    Тупиковый путь, но лучше уж так, чем водку в подъездах ;)
    gettext посмотри. Сдандарт в линуксе

    Добавлено спустя 13 минут 33 секунды:
    ЗЫ: ого, я тут узрел только, что у твига php экстеншн есть. Хотя вряд ли оно сильно производительность улучшит.
     
  15. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    спасибо

    Добавлено спустя 1 минуту 44 секунды:
    Что у твига? Ты про симфонии пхпенжин?
     
  16. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
  17. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
  18. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    append дописывает новую порцию к блоку вместо полного перекрытия. в твиге, по моему, нет аналога. можно сэмулировать конечно.
     
  19. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    artoodetoo а как в Dirk добавить с верху информацию от блока который наследуется?
     
  20. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    не понял. покажи на конкретном примере что нужно. скажу сразу, никакого <parent> не существует. надо другими средствами оперировать.
     
  21. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    Думаю такой пример будет понятен, как получить данные в блоке который находится ниже по иерархии информацию из более высокого блока в иерархии.
    Код (PHP):
    1. {% extends "base.html" %}
    2.  
    3. {% block sidebar %}
    4.     {{ parent() }}
    5.     <img src="/example.jpg">
    6. {% endblock %} 
     
  22. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    парента в распоряжении нет. рассуждая логически, если мы хотим оставить в выводе родительский блок, то можно просто в родителе вынести текст из блока sidebar и ниже него сделать @yield('sidebar'). на выходе получится:
    Код (Text):
    1. родительский текст
    2. дочерний текст с img
     
  23. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    О точно, теперь понятно.
     
  24. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Выглядит занятно, поставил плюсик ))

    Пожелание: т.к. синтаксис сдернут с блейда, сделать возможным расширение файлов .blade.php. Получим "кроссплатформенность" и разметку в phpstorm.
     
  25. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Это уже есть. Можно задать параметр 'ext' при создании объекта.