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

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

Trustmaster
#35816 16. Oktober 2012, 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!