Передать объект через хук

Добрый вечер, дорогие друзья. Сразу же прошу прощения за не очень хорошее поведение прошлым летом.

Не передается объект $oTopic через хук. Можно пример, как это вообще сделать?

Заранее спасибо.

Похожие статьи

  • Количество друзей (hook)
    Ребята, помогите правильно написать хук для вывода кол-ва друзей на произвольных страницах сайта (в моем случае, нужно вывести на главной). Спасибо!

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

0
Уверен, что немного подробностей не помешают.
0
Экшн топика, add.tpl. Вызывается хук. В хуке нужно определить объект oTopic, раз уж в шаблоне это не сделать.
0
Шаблон add.tpl вызывается в двух случаях — при создании топика и при его редактировании.
— При редактировании топика переменная-объект oTopic существует и ее можно использовать как угодно.
— При создании топика этой переменной нет, поскольку нет еще самого топика — он не сохранен. Получить этот объект вы не сможете ни каким образом по причине его отсутствия.

Я что-то не так понял?
0
Нет, все так поняли. Но при редактировании она не доступна! Сами попробуйте.
0
Вы что-то не так делаете, ибо вот содержимое объекта $oTopic типа ModuleTopic_EntityTopic при вызове метода EventEdit() при редактировании топика.
CLASSNAME   string	"ModuleTopic_EntityTopic"	
aExtra	    array[5]		
aValues	    boolean	0	
_aData	    array[39]		
aValidateRules	array[8]		
aValidateErrors	array[0]		
sValidateScenario	string	""


Посмотрите в любой IDE через xdebug.
0
Мне надо узнать логин текущего юзера. Как это сделать в экшне редактирования топика?
0
В экшене:
$sLogin = $this->oUserCurrent->getLogin();


В шаблоне экшена:
{$oUserCurrent->getLogin()}
0
Спасибо. Теперь oTopic недоступна…
0
напишите в шаблоне
**{$oTopic|print_r}**

если выведется **1**, то переменная действительно недоступна, если выведет объект, значит переменная доступна, а вы что-то не так делаете.
0
1, к сожалению.
0
— Какой адрес страницы?
— Какой полный путь к шаблону?
0
Фрагмент кода выложите с той его частью, где проблема.
0
в хуке все нормально. возвращаю
$oTopic = $aData['oTopic'];
return $oTopic->getUserTwo();

в экшне делаю так
$this->Viewer_Assign('userTwo', $this->Hook_Run('topic_edit_show',array('oTopic'=>$oTopic)));

но приходит пустой массив.
+1
У вас ошибка. В хуке не нужно возвращать $oTopic. В хук передаются параметры по ссылке, то есть: если в экшене вы пишете:
<code>$this->Hook_Run('topic_edit_show',array('oTopic'=>$oTopic));
echo($oTopic->getTitle());</code>
и, если хук меняет значение переданной переменной так:
<code>public function DoIt($aData) {
    $aData['oTopic']->setTitle('title from hook');
}</code>

то в результате echo выведет заголовок топика, установленный хуком = 'title from hook', а не тот, который был.
Отредактирован:
+1
Спасибо большое, именно после этого комментария я понял смысл хуков!
+1
1. В Экшене вызываем хук, а в него передаем массивом набор параметров.
$this->Hook_Run('my_unhappy_hook', array('oTopic' => $oTopic, 'bShow' => true));

или в шаблоне *.tpl
{hook run='my_unhappy_hook' oTopic=$oTopic bShow=true}


2. В хуке плагина регистрируем обработчик хука в методе их регистрации. Заметьте, для хука шаблона используется префикс template
/**
* Регистрация хуков
*/
public function RegisterHook() {
    $this->AddHook('my_unhappy_hook', 'DoIt');
    // или для шаблона
    $this->AddHook('template_my_unhappy_hook', 'DoIt');
}


3. Реализуем метод обработки хука и в нем получаем переданные параметры
public function DoIt($aData) {
    $oTopic = $aData['oTopic'];
    $bShow= $aData['bShow'];
    // Дальше реализуем логику метода с использованием этих параметров  
}
0
Спасибо. Ном не надо вызвать метод $oTopic->getUserId(), а он не доходит до экшна создания топика. Что же тогда делать?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.