Вернуть массив из хука в шаблон (РЕШЕНО)

Добрый день. Имеется хук, возвращающий в качестве результата массив.

class PluginLive_HookLive extends Hook
{
    public function RegisterHook()
    {
        $this->AddHook('template_header_banner_begin', 'GoGoGo');
    }

    public function GoGoGo()
    {
        return array('foo'=>'bar');
    }
}
 


Вызываю в шаблоне:
{hook run='header_banner_begin' assign='aResult'}


Ожидаю, что в $aResult окажется «ассоциативный» массив, т.е. {$aResult.foo} вернет «bar». Но в результате возвращается массив вида array(0=>'A', 1=>'r', 1=>'r', 1=>'a', 1=>'y', 1=>'(' и так далее.

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

UPD: По-быстрому сделал костыльный вариант для одноуровневого массива. Буду рад предложениям как это сделать «академически верно» :)

class PluginLive_HookLive extends Hook
{
    public function RegisterHook()
    {
        $this->AddHook('template_header_banner_begin', 'Countdown');
    }

    public function Countdown()
    {
        r = array('foo'=>'bar', 'foo2'=>'bar2');
        ksort($r);
        return implode(',',$r);
    }
}


В шаблоне:
    {assign var="aLive" value=","|explode:$aLive}
    {assign var="sVar1" value=$aLive[0]}
    {assign var="sVar2" value=$aLive[1]}

7 комментариев

avatar
Ожидаю, что в $aResult окажется «ассоциативный» массив, т.е. {$aResult.foo} вернет «bar». Но в результате возвращается массив вида array(0=>'A', 1=>'r', 1=>'r', 1=>'a', 1=>'y', 1=>'(' и так далее.
Хук возвращает строку. В пхп 5.4 вы бы увидели нотис из-за этого.

Помогите, пожалуйста, как корректно передать массив из хука в шаблон?
Зависит от задачи:

1. Сделать просто добавление переменной в шаблон:
$this->Viewer_Assign('VarName', $mData);

и в шаблоне доступно $VarName

или

2. Создать локальную копию вьюера, в неё передать все переменные, обработать шаблон и вернуть хтмл представление для вставки в месте хука:
$oViewer = $this->Viewer_GetLocalViewer();
$oViewer->Assign('mVar', $mVar);
return $oViewer->Fetch(Plugin::GetTemplatePath(__CLASS__) . 'folder/file.tpl');

и на месте хука будет добавлен хтмл код шаблона folder/file.tpl папки шаблонов плагина
avatar
PSNet, спасибо за ответ с примерам.
Пока не могу на 100% оценить ответы из-за недостатка опыта, но, все-таки, пару слов напишу.

Вариант 1, в моем случае, не сработал.

Реализация Хука:
class PluginLive_HookLive extends Hook
{
    public function RegisterHook()
    {
        $this->AddHook('template_header_banner_begin', 'Countdown');
    }

    public function Countdown()
    {
        $this->Viewer_Assign('aLive', array('foo'=>'bar'));
    }
}

Вызов хука в шаблоне (header.tpl, шапка сайта):
{hook run='header_banner_begin'}
{$aLive.foo}


На выходе — пусто.
Второй вариант пока не реализовывал, так как проект очень горит :).

В целом, еще раз спасибо, не ожидал такого быстрого ответа.
avatar
тут уточнить нужно, т.к. я написал все возможные варианты. первый вариант добавит массив в шаблон, но сам хук нужно перенести выше по иерархии запуска движка, т.е. до формирования шаблона. в вашем конкретно случае — не подходит.

вам нужно использовать второй вариант и в файл folder/file.tpl положить всю логику.

но мне кажется что вы просто не договорили суть задачи: если вы в шаблон движка вшиваете свой код и получаете данные из переменной, то просто прицепите хук, например, на «engine_init_complete» и воспользуйтесь первым вариантом — будет переменная:
class PluginLive_HookLive extends Hook
{
    public function RegisterHook()
    {
        $this->AddHook('engine_init_complete', 'Countdown');
    }

    public function Countdown()
    {
        $this->Viewer_Assign('aLive', array('foo'=>'bar'));
    }
}

в любом месте шаблона будет переменная $aLive.

Если же вам нужно делать все правильно и добавить некую логику, то делайте все вторым вариантом (см. первый комментарий) — таким образом при обновлении движка ваши правки не исчезнут т.к. вся ваша логика будет внутри плагина.
avatar
PSNet, согласен с Вами, что с точки зрения архитектуры правильнее перенести логику внуть плагина.
Внедрил первый вариант — работает «like a charm». Еще раз спасибо :)
avatar
В новой версии LS 2.0 появится возможность возвращать из хука массив, будет как то так:
{hook run='header_banner_begin' assign='aResult' array=true}
avatar
Будем ждать, полезная возможность.

P.S. LiveStreet нравится все больше и больше.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.