Имя модификатора переменной в smarty?

У меня есть две переменные, одна из которых $video_id, которая содержит идентификатор видео YouTube или Vimeo. Другой — $video_type, который содержит либо «youtube», либо «vimeo».

У меня есть две функции в php,
youtube_embed($id, $width, $height)
vimeo_embed($id, $width, $height)

Что я хочу сделать, так это вызвать эту функцию, передав ее в $video_id

Я мог бы сделать:

{if $video_type == 'youtube'}
    {$video_id|youtube_embed:123:123}
{elseif $video_type == 'vimeo'}
    {$video_id|vimeo_embed:123:123}
{/if}

Но мне интересно, можете ли вы иметь имена модификаторов переменных, что-то вроде

{$video_id|`$video_type`_embed:123:123}

person Hailwood    schedule 11.12.2012    source источник
comment
Не уверен, но должен сказать, что надеюсь, что нет. Это отправит Смарти еще дальше в кроличью нору... +1   -  person Michael Berkowski    schedule 11.12.2012


Ответы (1)


Это Плохая Идея, даже если бы вы могли.

Ваш код будет намного понятнее для чтения, поддержки и расширения в будущем, если вы сделаете:

{$video_id|video_embed:$video_type:123:123}

а затем в PHP проверьте $video_type и передайте его соответствующему модификатору, вместо того, чтобы пытаться обрабатывать его на уровне шаблона.

function video_embed($video_id, $video_type, $x, $y){
    switch($video_type){
        case('youtube'):
            youtube_embed($video_id, $x, $y);
            break;

        case('vimeo'):
            vimeo_embed($video_id, $x, $y);
            break;

        default:
            throw new UnsupportVideoTypeException($video_type);
    }
}

Когда вам неизбежно понадобится поддержка нового типа видео, вам нужно будет только добавить некоторый код в функцию video_embed в PHP, а не редактировать каждый шаблон, отображающий видео.

Для протокола: нет, это не представляется возможным. Глядя на исходный код Smarty, он не пытается оценивать переменные, когда ожидает модификатор.

person Danack    schedule 11.12.2012