- Модуль: sender
- Путь к файлу: ~/bitrix/modules/sender/lib/subscription.php
- Класс: Bitrix\Sender\Subscription
- Вызов: Subscription::unsubscribe
static function unsubscribe($data)
{
$result = false;
if(isset($data['TEST']) && $data['TEST'] == 'Y')
return true;
$data['ABUSE'] = isset($data['ABUSE']) ? (bool) $data['ABUSE'] : false;
$data['ABUSE_TEXT'] = isset($data['ABUSE_TEXT']) ? $data['ABUSE_TEXT'] : null;
$posting = null;
if($data['RECIPIENT_ID'])
{
$postingDb = PostingRecipientTable::getList(array(
'select' => array('POSTING_ID', 'POSTING_MAILING_ID' => 'POSTING.MAILING_ID'),
'filter' => array(
'=ID' => $data['RECIPIENT_ID'],
'=CONTACT.CODE' => $data['EMAIL'],
'=CONTACT.TYPE_ID' => Recipient\Type::EMAIL,
)
));
$posting = $postingDb->fetch();
}
$mailingDb = MailingTable::getList(array(
'select' => array('ID'),
'filter' => array(
'=ID' => $data['UNSUBSCRIBE_LIST'],
)
));
while($mailing = $mailingDb->fetch())
{
$unsub = null;
if($posting && $posting['POSTING_MAILING_ID'] == $mailing['ID'])
{
$unsub = array(
'POSTING_ID' => $posting['POSTING_ID'],
'RECIPIENT_ID' => $data['RECIPIENT_ID'],
'CONTACT_ID' => isset($data['CONTACT_ID']) ? (int) $data['CONTACT_ID'] : null,
);
}
else
{
$mailingPostingDb = PostingRecipientTable::getList(array(
'select' => array('RECIPIENT_ID' => 'ID', 'CONTACT_ID', 'POSTING_ID'),
'filter' => array(
'=POSTING.MAILING_ID' => $mailing['ID'],
'=CONTACT.CODE' => $data['EMAIL'],
'=CONTACT.TYPE_ID' => Recipient\Type::EMAIL,
),
'limit' => 1
));
if($mailingPosting = $mailingPostingDb->fetch())
{
$unsub = $mailingPosting;
}
}
// add mark in statistic if there is no previous mark
if(!empty($unsub))
{
if ($unsub['CONTACT_ID'] && $data['ABUSE'])
{
ContactTable::update($unsub['CONTACT_ID'], array('BLACKLISTED' => 'Y'));
}
$unsubExists = PostingUnsubTable::getRowById($unsub);
if(!$unsubExists)
{
$unsubResult = PostingUnsubTable::add($unsub);
if($unsubResult->isSuccess())
{
$eventData = array(
'ABUSE' => $data['ABUSE'],
'ABUSE_TEXT' => $data['ABUSE_TEXT'],
'CAMPAIGN_ID' => $mailing['ID'],
'MAILING_ID' => $mailing['ID'],
'RECIPIENT_ID' => $unsub['RECIPIENT_ID'],
'EMAIL' => $data['EMAIL'],
);
$event = new Event('sender', 'OnAfterRecipientUnsub', array($eventData));
$event->send();
if ($data['ABUSE'])
{
AbuseTable::add(array(
'TEXT' => $data['ABUSE_TEXT'],
'CONTACT_ID' => $unsub['CONTACT_ID'],
'CONTACT_CODE' => $data['EMAIL'],
'CONTACT_TYPE_ID' => Recipient\Type::EMAIL,
));
}
Integration\EventHandler::onAfterPostingRecipientUnsubscribe($eventData);
}
}
$result = true;
}
// add row to unsubscribe list
$contactId = ContactTable::addIfNotExist(array('EMAIL' => $data['EMAIL']));
if($contactId)
{
MailingSubscriptionTable::addUnSubscription(array('MAILING_ID' => $mailing['ID'], 'CONTACT_ID' => $contactId));
$result = true;
}
}
return $result;
}