1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - коммерческий форумный движок от бывших создателей vBulletin, написанный на PHP.

Компиляция шаблона из текста

Тема в разделе "Вопросы и ответы по XenForo Framework", создана пользователем infis, 25.07.2011.

Загрузка
  1. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Озадачился сим моментом. Мне нужно в обработке хука вставлять произвольный текст. Т.е. нет возможности создать шаблон, а затем его использовать. Пробовал использовать класс XenForo_Template_Compiler - не осилил, он ошибок не выдает, но при парсинге не обрабатывает переменные в фигурных скобках, да и вообще любые теги. Может кто-нибудь помочь?
     
  2. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    С фразами и синтаксисом разобрался. Теперь все загружается. Остается только с переменными разобраться. Не могу понять, как переменные автоматом в шаблон попадают. В частности, мне нужно в шаблоне использовать
    HTML:
    <a href="{$requestPaths.requestUri}#navigation">{xen:phrase go_to_top}</a>
    На выходе я получаю все, за исключением значения $requestPaths.requestUri, которое компилятор шаблонов не видит, а потому и считает пустым. В итоге ссылка получается некорректная.
     
  3. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Решил сделать по-другому, использовав $_SERVER.
    Выкладываю результат в виде плагина сюда. Покритикуйте, пожалуйста. На рабочий форум ставить не советую, ибо слишком альфа.
    Заодно подскажите, почему хуки срабатывают только при авторизованном пользователе, а при госте нет?
     

    Вложения:

  4. Yoskaldyr

    Yoskaldyr Пользователь

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    Переменная в шаблон попадет только в том случае если ее передать в шаблон в качестве параметра.
     
  5. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Это-то понятно. Хотя на примере $_SERVER видно, что глобальные переменные автоматом туда попадают. Потому и подумал, что должны некоторые переменные также автоматом туда попасть. Я не смог найти место, где подгружаются нужные переменные в дефолтные шаблоны. Конечно же, создать свои переменные и подгрузить их в шаблон - не проблема, но это костыльно. Лучше ведь использовать готовое :)
     
  6. Yoskaldyr

    Yoskaldyr Пользователь

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    Как раз это правильно. Это как раз и есть классический MVC подход - во вьюху передаем только то что нам надо, т.е. вьюха работает только с тем что она знает и все.
     
  7. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    "Костыльно" в данном случае использовать переменные, отличные от стандартных шаблонов. А на принципы MVC я и не покушался :)
     
  8. Yoskaldyr

    Yoskaldyr Пользователь

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    Почему? Передвать через $_SERVER на порядок более костыльно. Ведь все равно вызывается отдельный шаблон, со своими переменными... Да даже если бы вызывался стандартный шаблон, но отдельно, то большинство переменных тоже не было бы видно, т.к. без переддачи в шаблон переменных они не будут в нем видны.
    Не зря же в параметрах вызова createTemplateObject первым параметром идет имя шаблона, а вторым - массив переменных используемых в шаблоне, который может быть пустым или его вообще может не быть, но он нужен если необходимо передавать переменные в шаблон.
     
  9. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Ну любой шаблон в итоге через eval() проходит, потому глобальные переменные (тот же $_SERVER) там видны. Я имел ввиду, что не хотелось городить свой огород под словом "костыльно". Все, закрываем тему, так как и так все очевидно. В общем мы достаточно поняли друг друга.
    Если не сложно, гляньте то, что я нарисовал, и покритикуйте/направьте в нужном направлении, что и как можно сделать лучше. Также я так и не понял, почему из под обычного пользователя не срабатывают хуки.

    P.S. Чтобы было понятнее, я просто учился писать плагин. Ну а задачу себе поставил простейшую - сделать инструмент легкого добавления любого кода на страницу через хуки. Те же различные счетчики вставлять проще через хук, чем в сам шаблон лезть. Ну и в качестве практического применения через плагин я легко добавил ссылку "Вверх" в каждом посте, чтобы быстро перейти к навигации без пролистывания до конца страницы. Без плагина потребовалось бы либо изменять шаблон, либо писать свой отдельный обработчик нужного хука. Думаю, применений можно в будущем найти достаточно.
     
  10. Yoskaldyr

    Yoskaldyr Пользователь

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    Если по существу, то очень жестоко костыльно. Но наверное по другому и не сделать, т.к. парсинг идет в обход системы шаблонов и юзается eval, хотя для инклуда лучше было бы юзать статические классы и в них передавать необходимые переменные. Т.е. желательно сводить eval к минимуму.
    Но тут просто претензия ни к коду продукта, а к тому что в будущем он может вылезти очень побочными эффектами.
    Также этот продукт не самым лучшим образом скажется на производительности - довольно много проверок получается на каждом темплейт хуке, которых на странице может быть много (хотя это вообще проблема текущей системы темплейт хуков, которая определенно - зло)
     
  11. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Для этого можно предусмотреть обработку кода как HTML без использования синтаксиса шаблонов ксена. Например, поставить флажок "Обрабатывать как шаблон". Если флажок не установить, тогда не потребуется в результате и eval использовать. Т.е. фактически будет голый текст включаться в output.
    И еще. Класс шаблонов в ксене работает с кешированием. Кешируются в том числе и неименованные шаблоны, генерируемые "на лету". Я проверял - вроде работает.
    А можно с этого места поподробнее?
    Ну я постарался не делать лишние проверки. Т.е. сразу проверяется, есть ли необходимость обработки текущего хука. Если есть, тогда идет перебор по массиву. Соответственно, массив организован таким образом, чтобы на верхнем уровне имя хука было ключом, а ниже уровнем идут блоки обработки. Таким образом, производительность не должна пострадать, особенно с учетом кеширования.
     
  12. Yoskaldyr

    Yoskaldyr Пользователь

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    Может что и поменялось в последних версиях, но когда смотрел раньше кешированием там и не пахло. Если можно, то поподробнее, что подразумевалось под кешированием и где именно этот код?
     
  13. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    В классе XenForo_Template_Compiler есть кеширование промежуточных результатов, а также распарсенных шаблонов. Именно для этого при вызове функции compileParsed требуется указывать идентификатор шаблона, который может быть произвольный. Внутри классе кешируются не только шаблоны, но и фразы, а также переменные, как я понял. За счет этого при изменении набора переменных, наверное, не требуется перестраивать весь шаблон. Я этот класс, хотя и разбирал по полочкам, но в подробности кеширования не вдавался.
     
  14. Yoskaldyr

    Yoskaldyr Пользователь

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    Это не кеширование в прямом смысле - это кеш шаблонов в момент выполнения чтобы не дергать повторно из базы их. Настоящего кеша там нет.
     
  15. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Естественно, это не кешируется в полном виде. Для этого предназначены серверные средства кеширования. В любом случае в момент выполнения код фактически выполнится один раз для каждого уникального хука. При наличии множества одних и тех же задействованных хуков производительность сильно не пострадает. Думаю, что проверки хуков в результате дадут мизерную прибавку к общей нагрузке на сервер и ко времени вывода. Кстати, выполнение кода в одном месте сразу для нескольких хуков теоретически более производительное решение, чем создавать на каждый хук отдельный аддон. Я как бы от этого и отталкивался изначально - все в одном месте + нет нужды править шаблоны -> легче администрировать + нет проблем с обновлениями шаблонов.
     
  16. Yoskaldyr

    Yoskaldyr Пользователь

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    Ну каждый останется при своем мнении... :)
     
    infis нравится это.

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