Задать вопрос
yous
@yous

Bitrix Триггерные рассыкилки как персонализировать по группам пользователя?

Подскажите, как можно ограничить отправку писем по триггерной рассылке по группам пользователя?

Создана триггерная рассылка Забытая корзина, нужно не отправлять пользователям которые входят в определенную группу(Дилеры).
  • Вопрос задан
  • 1492 просмотра
Подписаться 1 Простой 26 комментариев
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Python-разработчик
    10 месяцев
    Далее
  • Skillfactory
    DevOps-инженер
    6 месяцев
    Далее
  • Хекслет
    Фронтенд-разработчик
    10 месяцев
    Далее
Решения вопроса 1
@PetrPo
Вариант, если нужно ограничить все триггерные рассылки по принадлежности юзера к группе пользователей
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('sender', 'OnBeforePostingSendRecipient', ['SenderEvents', 'OnBeforePostingSendRecipient']);

class SenderEvents {
	const USER_GROUP_DILLER_ID = 1;
	
	public static function OnBeforePostingSendRecipient($event) {
		$parameters = $event->getParameters()[0];
		$isUserDiller = self::userInGroup($parameters['FIELDS']['USER_ID'], self::USER_GROUP_DILLER_ID);
		
		if($isUserDiller) {
			$parameters['FIELDS']['EMAIL_TO'] = '';
		}
		
		return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $parameters);
	}
	
	private static function userInGroup(int $userId = 0, $userGroupsId = []) {
		if($userId && $userGroupsId) {
			$userGroupsId = (array) $userGroupsId;
			$userGroups = CUser::GetUserGroup($userId);
			
			return array_intersect($userGroups, $userGroupsId) ? true : false;
		}
		else {
			return false;
		}
	}
}


Вариант, если нужно ограничить определенные триггеры, например "Забытая корзина"
class SenderEvents {
	const USER_GROUP_DILLER_ID = 1;
	
	public static function OnBeforePostingSendRecipient($event) {
		$parameters = $event->getParameters()[0];
		
		$mailingChainId = $parameters['MAILING_CHAIN_ID'];
		$isUserDiller = self::userInGroup($parameters['FIELDS']['USER_ID'], self::USER_GROUP_DILLER_ID);
		
		if($mailingChainId && $isUserDiller) {
			$mailingTrigger = new \MailingTrigger($mailingChainId);
			
			if($mailingTrigger->isTriggerBasketForgotten()) {
				$parameters['FIELDS']['EMAIL_TO'] = '';
			}
		}

		return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $parameters);
	}
	
	private static function userInGroup(int $userId = 0, $userGroupsId = []) {
		if($userId && $userGroupsId) {
			$userGroupsId = (array) $userGroupsId;
			$userGroups = CUser::GetUserGroup($userId);
			
			return array_intersect($userGroups, $userGroupsId) ? true : false;
		}
		else {
			return false;
		}
	}
}

class MailingTrigger {
	private $trigger;
	
	public function __construct(int $mailingChainId) {
		$this->setTrigger($mailingChainId);
	}
	
	public function getTrigger(int $mailingChainId) {
		return $this->trigger;
	}
	
	private function setTrigger(int $mailingChainId) {
		if(!isset($this->trigger)) {
			$this->trigger = \Bitrix\Sender\MailingTriggerTable::getList([
				'select' => ['ENDPOINT'],
				'filter' => ['MAILING_CHAIN_ID' => $mailingChainId, 'IS_TYPE_START' => 1]
			])->fetch();
		}
	}
	
	public function getCode() {
		return $this->trigger['ENDPOINT']['CODE'];
	}
	
	public function isTriggerBasketForgotten() {
		$triggerBasketForgottenCode =  \Bitrix\Sale\Sender\TriggerBasketForgotten::getCode();
		
		return $this->getCode() == $triggerBasketForgottenCode ? true : false;
	}
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы