Forums / National / Russian / Тех. поддержка / Вызов функций из шаблона и шаблонные теги

Как работает и что быстрее?

Macik
#1 2012-10-15 11:52

У меня вопрос возник - какой вариант лучше использовать с точки зрения кеширования (скорости работы):

  • {MY_TAG}  
  • {PHP.my_tag}  
  • {PHP|my_tag()} 

 

Я так понимаю:

первый вариант наиболее предпочтительный, т.к. вешается на хук и вызывается только на соотв. странице, плюс хорошо кешируется.

второй вариант генерится заранее без привязки к конкретному вызову (тоже можно повесить на хук и вызывать только на целевой странице), как здесь с кешированием? 

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

 

Т.к. внутренние механизмы кеширования coTemplate (и Котонти в целом) мне малопонятны - хочется услышать комменнтарии от спецов на счет что лучше, что быстрее, что целесообразнее... 

 

https://github.com/macik
правильный хостинг — https://goo.gl/fjCa1F
Eugene
#2 2012-10-16 06:12

полезный вопрос!

присоединяюсь к слушающим ответ. ))

Trustmaster
#3 2012-10-16 12:11

Я, кажется, где-то уже отвечал, как работает кеширование CoTemplate. Повторю главное: CoTemplate кеширует структуру самого шаблона, а не отображаемые данные. О кешировании данных или же страниц целиком должен позаботиться контроллер.

Соответственно, ни один из перечисленных вариантов непосредственно на кеширование не влияет. Но различия в скорости работы и условиях применения есть.

{MY_TAG}

Назначается контроллером для данного шаблона, шаблонизатором обрабатывается быстрее всего и из-за простоты конструкции, и из-за того, что поиск происходит по небольшому локальному массиву тегов.

Плюсы:

  • Простота использования в шаблоне, скорость отрисовки.
  • Полный контроль поведения в контроллере, конфликты и коллапсы маловероятны.

Минусы:

  • Назначается только для конкретных шаблонов и блоков. Чтобы расширить область действия, необходимо править код.

{PHP.my_tag}

Это глобальная переменная PHP. Работает медленнее, чем локальный тег, потому что поиск переменной происходит в (огромном) массиве $GLOBALS. Больше отличий по скорости нет.

Плюсы:

  • Может быть виден из множества шаблонов и плагинов, в отличие от локальных тегов.
  • Иногда проще использовать готовый тег из глобальной переменной, чем писать специально для этого контроллер.

Минусы:

  • Чуть медленнее, чем {MY_TAG}.
  • Гораздо более подвержен конфликтам и случайным изменениям другими участками кода.

{PHP|my_tag()}

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

Плюсы:

  • Теги только выводят данные неизменно. Callback-функции могут не только выводить, но и изменять данные.
  • Можно указывать параметры и получать более вариабельный результат.
  • Глобальность области применения, как и у {PHP.my_tag}.

Минусы:

  • Это полновесная PHP-функция, так что она может, скажем, положить весь скрипт в случае ошибки. В целом, требует разумного применения.

Краткое резюме:

  • используйте теги {MY_TAG} в большинстве случаев;
  • используйте {PHP.my_tag}, если тег нужно выводить в неопределённом множестве локаций или если нет смысла писать плагин для вывода легко доступной переменной;
  • используйте {PHP|my_tag()} и другие формы callback-функций для обработки данных или создания виджетов (виджет - это callback-функция, которая отображает целый шаблон согласно переданным ей параметрам).
May the Source be with you!
Macik
#4 2012-10-16 21:52

Очень доходчего. Спасибо.

p.s. Полез смотреть куда можно разместить в документации этот кусок. Оказалось, что почти все уже расписано здесь: http://www.cotonti.com/docs/ext/themes/cotemplate_statements

Но все равно, по-русски намного понятнее. И прояснило вопрос кеширования. :)

 

https://github.com/macik
правильный хостинг — https://goo.gl/fjCa1F
Eugene
#5 2012-10-17 08:03

отлично!