alexyarik
@alexyarik
Битрикс разработчик

Как получить значение переменной из одного класса в другой?

Прошу помощи советом. Никак у меня не получается вывести значение переменной из одного класса в другом. есть два обработчика, они рабочие, тут все нормально. Мне нужно из класса MyAdmin значение $WORKEREMAIL вывести в классе MyClass. Как это правильно сделать?

// регистрируем обработчик для благодарностей
AddEventHandler("iblock", "OnAfterIBlockElementAdd", Array("MyAdmin", "OnAfterIBlockElementAddHandler"));

class MyAdmin
{
    // создаем обработчик события "OnAfterIBlockElementAdd"
    function OnAfterIBlockElementAddHandler(&$arFields)
    {
 if(!$arFields["RESULT"])
        return false;
        if ($arFields["IBLOCK_ID"] == 31)
        {
		$db_props = CIBlockElement::GetProperty(31, $arFields['ID'], "sort", "asc", Array("CODE"=>"USER"));

if ($ar_props = $db_props->Fetch())
    {
		$THANKSUSER=$ar_props['VALUE'];//получаем значение сотрудника, которому объявили благодарность
		}
$rsUser = CUser::GetByID($THANKSUSER); 
$arUser = $rsUser->Fetch(); 
$WORKEREMAIL=$arUser['EMAIL']; //получаем значение почты сотрудника, которому объявили благодарность
	AddMessage2Log('$WORKEREMAIL-'.$WORKEREMAIL);
{ $arIBlockElement = GetIBlockElement($arFields["ID"]);
                $arSend = array('TEXT');
$arrSite = 's1';
                CEvent::Send('THANKS',$arrSite,$arSend);
}
        }
    }
}
// регистрируем обработчик для добавления в список переменных шаблона
AddEventHandler("main", "OnBeforeEventAdd", array("MyClass", "OnBeforeEventAddHandler"));
class MyClass extends MyAdmin
{
    function OnBeforeEventAddHandler(&$event, &$lid, &$arFields)
    {
	$Object = MyAdmin::OnAfterIBlockElementAddHandler();
	AddMessage2Log(print MyAdmin::$WORKEREMAIL);
        $arFields["WORKER_MAIL"] = '';//тут нужно вывести значение $WORKEREMAIL
		$event = 'THANKS';
    }
}
  • Вопрос задан
  • 314 просмотров
Решения вопроса 1
AlexeyGfi
@AlexeyGfi
YouTube >>> Битриксоид из Колхоза
Во-первых, у вас путаница в коде
38663631d8e1456a9544977bd362537e.jpg
.

Во-вторых (по сути вопроса), исходя из очерёдности наступления событий:
— сначала вызовется
CEvent::Send( 'THANKS', $arrSite, $arSend );
— потом наступит событие
OnBeforeEventAdd
— которое вызовет функцию
OnBeforeEventAddHandler ( &$event, &$lid, &$arFields )

При чём в этой ветке вызовов:
&$event УЖЕ равно'THANKS' и значит его не нужно переопределять (а даже можно добавить проверку, чтобы не резались все почтовые события поголовно);
&$arFields будет содержать ссылку на массив $arSend, в который вы и можете поместить нужную переменную. Использовать как вам нужно и почистить (или не чистить — поля, которых нет в почтовом шаблоне просто проигнорируются).

В-третьих: что-то мне не нравится такая логика (либо не очевидно то, что вы пытаетесь сделать). Если $WORKEREMAIL задумано как одно из полей в письме, его нужно просто учесть в почтовом шаблоне и передать сразу в
CEvent::Send( 'THANKS', $arrSite, $arSend ); без последующего перехвата.

Сюда же: $arSend составлен неправильно. Тут должен быть массив ключ–значение.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Не знаю ваш фреймфорк, но могу предложить записать переменную $WORKEREMAIL в свойство класса MyAdmin и т.к. он наследуется классом MyClass, то это свойство будет находиться и в вашем классе.
то есть, в методе OnAfterIBlockElementAddHandler добавьте строчку $this->WORKEREMAIL = $WORKEREMAIL; а в методе OnBeforeEventAddHandler берите это свойство $this->WORKEREMAIL;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы