Возможность использовать короткие теги в плагинах для Smarty

Трюки с LiveStreet
Данная заметка написана больше «для себя» и касается разрабатываемой версии лс, а не текущей выпущенной на момент написания статьи (1.0.3).

Задача

Например, есть плагин lang для (smarty_function_lang), который разрешает вставку языковых текстовок в шаблон указанным способом:

{lang name='admin.plugins.plugin_apply_update'}

на месте этого вызова в шаблон будет вставлена текстовка из языкового файла по ключу:

admin.plugins.plugin_apply_update

Можно ли сделать так чтобы не писать атрибут "name"? Ответ: да, но для всех плагинов Smarty.

Решение

Для этого нужно добавить разрешенный короткий атрибут для плагинов, но это требует правок в файле класса Smarty_Internal_Compile_Private_Function_Plugin смарти, который находится по пути:

/framework/libs/vendor/Smarty/libs/sysplugins/smarty_internal_compile_private_function_plugin.php

нужно добавить свойство:

/**
 * Shorttag attribute order defined by its names
 *
 * @var array
 */
public $shorttag_order = array('name');

таким образом можно будет во всех плагинах использовать короткое написание параметров — данные без указания атрибута будут считаться атрибутом "name", т.е.:

{lang 'admin.plugins.plugin_apply_update'}

равносильно:

{lang name='admin.plugins.plugin_apply_update'}


Встроенный пример

Пример работы можно посмотреть как это используется встроенным синтаксисом смарти:

{include file="test.tpl"}

можно записать и короче:

{include "test.tpl"}

для этого в классе Smarty_Internal_Compile_Include файла smarty_internal_compile_include.php задано свойство так:

/**
* Attribute definition: Overwrites base class.
*
* @var array
* @see Smarty_Internal_CompileBase
*/
public $shorttag_order = array('file');


Примечание 1:

Но не следует забывать что это будет действовать на все плагины т.е. для данных без указания атрибута он будет задан как «name». Но не следует бояться что это нарушит обратную совместимость — по-умолчанию короткие атрибуты не заданы для плагинов смарти, поэтому при попытке их использовать без указанной выше правки класса приведет к ошибке компиляции шаблона, иными словами — ни один из плагинов в стандартной конфигурации шаблонизатора Смарти не использует короткие атрибуты (данные без указания атрибутов).

Примечание 2

Данные без указания атрибута следует указывать в самом начале после написания имени функции:

{lang 'admin.plugins.plugin_apply_update' atrib_1=val_1 atrib_2=val_2}

но нельзя так:

{lang atrib_1=val_1 atrib_2=val_2 'admin.plugins.plugin_apply_update'}

т.к. порядок в свойстве:

/**
 * Shorttag attribute order defined by its names
 *
 * @var array
 */
public $shorttag_order = array('name');

класса указывает на числовые ключи атрибутов функции (в примере выше — lang), даже если они указаны с именем атрибута (atrib_1).

UPD: Обновил раздел «встроенный пример» т.к. там был раньше ошибочный кусок кода.
2 комментария
lifecom
а что при вставке текстовок могут обозначать параметы atrib_1=val_1 atrib_2=val_2?
Serge Pustovit
Это лишь примеры атрибутов и их значений. Для вставки текстовок ещё есть атрибут замены ключей в текстовках:

Текст с %%key%% для замены
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.