- Модуль: sender
- Путь к файлу: ~/bitrix/modules/sender/lib/entity/letter.php
- Класс: BitrixSenderEntityLetter
- Вызов: Letter::saveData
protected function saveData($id, array $data)
{
if(!$this->getMessage()->isAvailable())
{
$this->addError(Loc::getMessage('SENDER_ENTITY_LETTER_ERROR_NOT_AVAILABLE'));
return $id;
}
$segmentsInclude = $data['SEGMENTS_INCLUDE'];
$segmentsExclude = $data['SEGMENTS_EXCLUDE'];
foreach (static::getFilterFields() as $field)
{
if (!$field['CODE'])
{
continue;
}
if (is_array($field['VALUE']))
{
if (empty($data[$field['CODE']]) || !in_array($data[$field['CODE']], $field['VALUE']))
{
$data[$field['CODE']] = current($field['VALUE']);
}
}
else
{
$data[$field['CODE']] = $field['VALUE'];
}
}
$this->filterDataByEntityFields(LetterTable::getEntity(), $data);
$initialId = $id;
$previousData = $id ? LetterTable::getRowById($id) : null;
$previousData = $previousData ?: array();
// segment check
if(!is_array($segmentsInclude) || count($segmentsInclude) == 0)
{
if (
(
isset($data['NOT_USE_SEGMENTS'])
&& !$data['NOT_USE_SEGMENTS']
)
&& $data['IS_TRIGGER'] <> 'Y'
&& $previousData['IS_TRIGGER'] <> 'Y'
)
{
$this->addError(Loc::getMessage('SENDER_ENTITY_LETTER_ERROR_NO_SEGMENTS'));
return $id;
}
}
$segmentsExclude = is_array($segmentsExclude) ? $segmentsExclude : array();
// campaign setting
if (!isset($data['CAMPAIGN_ID']))
{
$data['CAMPAIGN_ID'] = Campaign::getDefaultId(SITE_ID);
$this->set('CAMPAIGN_ID', $data['CAMPAIGN_ID']);
}
// parent letter setting for triggers
if (!$id && $data['IS_TRIGGER'] === 'Y')
{
if (empty($data['PARENT_ID']))
{
$previousLetter = (new Chain)->load($data['CAMPAIGN_ID'])->getLast();
if ($previousLetter && $previousLetter->getId() != $this->getId())
{
$data['PARENT_ID'] = $previousLetter->getId();
}
}
if (!isset($data['TIME_SHIFT']))
{
$data['TIME_SHIFT'] = 1440;
}
$data['STATUS'] = DispatchState::WAITING;
$data['REITERATE'] = 'Y';
}
if ($this->filterDataByChanging($data, $previousData))
{
$id = $this->saveByEntity(LetterTable::getEntity(), $id, $data);
}
if ($this->canChangeSegments())
{
$this->saveDataSegments($id, $segmentsInclude, $segmentsExclude);
$data['DATE_UPDATE'] = new DateTime();
$this->saveByEntity(LetterTable::getEntity(), $id, $data);
}
if ($this->hasErrors())
{
return $id;
}
// update template use count
$this->updateTemplateUseCount($data, $previousData);
// change status for init recipients
if (!$initialId && !$this->isTrigger())
{
$this->setId($id)->getState()->init();
}
return $id;
}