public function save($onlyCheck = false)
{
$this->errors = array();
$result = $this->params;
unset($result['SCRIPTS']);
$agreements = [];
foreach ($result['AGREEMENTS'] ?? [] as $agreement)
{
$agreementId = $agreement['ID'] ?? $agreement['AGREEMENT_ID'] ?? null;
if (!$agreementId || in_array($agreementId, array_column($agreements, 'AGREEMENT_ID')))
{
continue;
}
$agreements[] = [
'AGREEMENT_ID' => $agreementId,
'CHECKED' => $agreement['CHECKED'] === 'Y' ? 'Y' : 'N',
'REQUIRED' => $agreement['REQUIRED'] === 'Y' ? 'Y' : 'N',
];
}
unset($result['AGREEMENTS']);
if ($result['AGREEMENT_ID'])
{
if (!in_array($result['AGREEMENT_ID'], array_column($agreements, 'AGREEMENT_ID')))
{
$agreements[] = [
'AGREEMENT_ID' => $result['AGREEMENT_ID'],
'CHECKED' => $result['LICENCE_BUTTON_IS_CHECKED'] === 'Y' ? 'Y' : 'N',
'REQUIRED' => 'Y',
];
}
elseif (isset($result['LICENCE_BUTTON_IS_CHECKED']))
{
foreach ($agreements as $index => $agreement)
{
if ($agreement['AGREEMENT_ID'] != $result['AGREEMENT_ID'])
{
continue;
}
$agreements[$index]['CHECKED'] = $result['LICENCE_BUTTON_IS_CHECKED'] === 'Y' ? 'Y' : 'N';
}
}
}
$result['AGREEMENT_ID'] = null;
$fields = $result['FIELDS'];
unset($result['FIELDS']);
$depGroups = $result['DEP_GROUPS'];
unset($result['DEP_GROUPS']);
$dependencies = $result['DEPENDENCIES'];
unset($result['DEPENDENCIES']);
$presetFields = $result['PRESET_FIELDS'];
unset($result['PRESET_FIELDS']);
unset($result['INTEGRATION']);
$assignedById = $result['ASSIGNED_BY_ID'];
$assignedWorkTime = $result['ASSIGNED_WORK_TIME'];
$result['ASSIGNED_BY_ID'] = null;
unset($result['ASSIGNED_WORK_TIME']);
// captcha
$captchaKey = $result['CAPTCHA_KEY'] ?? '';
$captchaSecret = $result['CAPTCHA_SECRET'] ?? '';
$captchaVersion = $result['CAPTCHA_VERSION'] ?? '';
if ($captchaKey <> '' && $captchaSecret <> '')
{
if (
$captchaKey !== ReCaptcha::getKey($captchaVersion)
&& $captchaSecret !== ReCaptcha::getSecret($captchaVersion)
)
{
$this->forceBuild = true;
ReCaptcha::setKey($captchaKey, $captchaSecret, $captchaVersion);
}
}
unset($result['CAPTCHA_KEY']);
unset($result['CAPTCHA_SECRET']);
unset($result['CAPTCHA_VERSION']);
$result['ENTITY_SCHEME'] = (string) $result['ENTITY_SCHEME'];
if($onlyCheck)
{
/*INTEGRATION*/
$this->prepareResult('INTEGRATION',$this->getIntegration()->checkData());
if(!in_array($result['ENTITY_SCHEME'], $this->getAllowedEntitySchemes()))
{
$this->errors[] = Loc::getMessage('CRM_WEBFORM_FORM_ERROR_SCHEME');
}
// captcha
if($result['USE_CAPTCHA'] == 'Y')
{
$hasCaptchaKey = ReCaptcha::getKey(2) <> '' && ReCaptcha::getSecret(2) <> '';
$hasCaptchaDefaultKey = ReCaptcha::getDefaultKey(2) <> '' && ReCaptcha::getDefaultSecret(2) <> '';
if (!$hasCaptchaKey && !$hasCaptchaDefaultKey)
{
$this->errors[] = Loc::getMessage('CRM_WEBFORM_FORM_ERROR_CAPTCHA_KEY');
}
}
$formResult = new Main\Entity\Result;
$result['DATE_CREATE'] = new Main\Type\DateTime();
Internals\FormTable::checkFields($formResult, $this->id, $result);
$this->prepareResult('FIELDS', $formResult);
foreach($presetFields as $presetField)
{
$presetField['FORM_ID'] = (int) $this->id;
$presetFieldResult = new Main\Entity\Result;
Internals\PresetFieldTable::checkFields($presetFieldResult, null, $presetField);
$replaceList = null;
if(!$presetFieldResult->isSuccess())
{
$field = EntityFieldProvider::getField($presetField['ENTITY_NAME'] . '_' . $presetField['FIELD_NAME']);
if($field)
{
$replaceList = array('VALUE' => $field['caption']);
}
}
$this->prepareResult('PRESET_FIELDS', $presetFieldResult, $replaceList);
}
$fieldCodeList = array();
foreach($fields as $field)
{
$field['FORM_ID'] = (int) $this->id;
$fieldResult = new Main\Entity\Result;
Internals\FieldTable::checkFields($fieldResult, null, $field);
$this->prepareResult('FIELDS', $fieldResult);
$fieldCodeList[] = $field['CODE'];
}
foreach($depGroups as $depGroup)
{
$depGroup['FORM_ID'] = (int) $this->id;
if(!in_array($depGroup['IF_FIELD_CODE'], array_keys(Internals\FieldDepGroupTable::getDepGroupTypes())))
{
continue;
}
$depGroupResult = new Main\Entity\Result;
Internals\FieldDepGroupTable::checkFields($depGroupResult, null, $depGroup);
$this->prepareResult('DEP_GROUPS', $depGroupResult);
}
foreach($dependencies as $dependency)
{
$dependency['FORM_ID'] = (int) $this->id;
$dependency['GROUP_ID'] = (int) ($dependency['GROUP_ID'] ?? 0);
if(!in_array($dependency['IF_FIELD_CODE'], $fieldCodeList))
{
continue;
}
if(!in_array($dependency['DO_FIELD_CODE'], $fieldCodeList))
{
continue;
}
$dependencyResult = new Main\Entity\Result;
Internals\FieldDependenceTable::checkFields($dependencyResult, null, $dependency);
$this->prepareResult('DEPENDENCIES', $dependencyResult);
}
foreach($agreements as $agreement)
{
$agreement['FORM_ID'] = (int) $this->id;
$agreementResult = new Main\Entity\Result;
Internals\AgreementTable::checkFields($agreementResult, null, $agreement);
$this->prepareResult('AGREEMENTS', $agreementResult);
}
return;
}
if(!$this->check())
{
return;
}
if($this->id)
{
unset($result['ID']);
$formResult = Internals\FormTable::update($this->id, $result);
$isAdded = false;
}
else
{
$result['DATE_CREATE'] = new Main\Type\DateTime();
$formResult = Internals\FormTable::add($result);
$this->id = $formResult->getId();
$isAdded = true;
}
if(!$formResult->isSuccess())
{
return;
}
/* RESPONSIBLE QUEUE */
$assignedById = is_array($assignedById) ? $assignedById : array($assignedById);
$responsibleQueue = new ResponsibleQueue($this->id);
$responsibleQueue->setList($assignedById, $assignedWorkTime == 'Y');
/* PRESET FIELDS */
Internals\PresetFieldTable::delete(array('FORM_ID' => $this->id));
foreach($presetFields as $presetField)
{
$presetFieldResult = Internals\PresetFieldTable::add(array(
'ENTITY_NAME' => $presetField['ENTITY_NAME'],
'FIELD_NAME' => $presetField['FIELD_NAME'],
'VALUE' => $presetField['VALUE'],
'FORM_ID' => $this->id
));
$this->prepareResult('PRESET_FIELDS', $presetFieldResult);
}
/*INTEGRATION*/
$this->prepareResult('INTEGRATION',$this->getIntegration()->save());
/* FIELDS */
$existedFieldList = array();
$existedFieldDb = Internals\FieldTable::getList(array(
'select' => array('ID'),
'filter' => array('=FORM_ID' => $this->id)
));
while($existedField = $existedFieldDb->fetch())
{
$existedFieldList[] = $existedField['ID'];
}
$newFieldList = array();
foreach($fields as $field)
{
$field['FORM_ID'] = $this->id;
if($field['ID'] > 0)
{
$fieldId = $field['ID'];
unset($field['ID']);
$fieldResult = Internals\FieldTable::update($fieldId, $field);
$newFieldList[] = $fieldId;
}
else
{
$fieldResult = Internals\FieldTable::add($field);
}
$this->prepareResult('FIELDS', $fieldResult);
}
$deleteFieldList = array_diff($existedFieldList, $newFieldList);
foreach($deleteFieldList as $deleteFieldId)
{
Internals\FieldTable::delete($deleteFieldId);
}
/* DEPENDENCIES */
$fieldCodeList = array();
$fieldCodeDb = Internals\FieldTable::getList(array(
'select' => array('CODE'),
'filter' => array('=FORM_ID' => $this->id)
));
while($fieldCode = $fieldCodeDb->fetch())
{
$fieldCodeList[] = $fieldCode['CODE'];
}
$fieldDepGroupDb = Internals\FieldDepGroupTable::getList(['select' => ['ID'], 'filter' => ['=FORM_ID' => $this->id]]);
while($fieldDepGroup = $fieldDepGroupDb->fetch())
{
Internals\FieldDepGroupTable::delete($fieldDepGroup['ID']);
}
$depGroupMap = [];
foreach($depGroups as $depGroup)
{
$depGroupId = $depGroup['ID'];
$depGroup['FORM_ID'] = $this->id;
unset($depGroup['ID']);
$depGroupResult = Internals\FieldDepGroupTable::add($depGroup);
$this->prepareResult('DEP_GROUPS', $depGroupResult);
$depGroupMap[$depGroupId] = $depGroupResult->getId();
}
foreach($dependencies as $depIndex => $dependency)
{
$dependency['GROUP_ID'] = !empty($dependency['GROUP_ID']) ? $dependency['GROUP_ID'] : 0;
$dependency['FORM_ID'] = $this->id;
if (isset($depGroupMap[$dependency['GROUP_ID']]))
{
$dependency['GROUP_ID'] = $depGroupMap[$dependency['GROUP_ID']];
}
elseif (count($depGroupMap) === 1)
{
$dependency['GROUP_ID'] = current($depGroupMap);
}
else
{
$dependency['GROUP_ID'] = 0;
}
$dependencies[$depIndex] = $dependency;
}
$fieldDepDb = Internals\FieldDependenceTable::getList(['select' => ['ID'], 'filter' => ['=FORM_ID' => $this->id]]);
while($fieldDep = $fieldDepDb->fetch())
{
Internals\FieldDependenceTable::delete($fieldDep['ID']);
}
foreach($dependencies as $dependency)
{
if(!in_array($dependency['IF_FIELD_CODE'], $fieldCodeList))
{
continue;
}
if(!in_array($dependency['DO_FIELD_CODE'], $fieldCodeList))
{
continue;
}
$dependency['FORM_ID'] = $this->id;
$dependencyResult = Internals\FieldDependenceTable::add($dependency);
$this->prepareResult('DEPENDENCIES', $dependencyResult);
}
$agreementDb = Internals\AgreementTable::getList(['select' => ['ID'], 'filter' => ['=FORM_ID' => $this->id]]);
while($agreement = $agreementDb->fetch())
{
Internals\AgreementTable::delete($agreement['ID']);
}
foreach($agreements as $agreement)
{
$agreement['FORM_ID'] = $this->id;
$agreementResult = Internals\AgreementTable::add($agreement);
$this->prepareResult('AGREEMENTS', $agreementResult);
}
$this->buildScript();
if ($isAdded && (int)$this->params['TYPE_ID'] === Internals\FormTable::TYPE_DEFAULT)
{
LandingTable::createLanding($this->id, $result['NAME']);
}
}