• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/Service/Operation.php
  • Класс: Bitrix\Crm\Service\Operation
  • Вызов: Operation::checkRequiredFields
public function checkRequiredFields(array $requiredFields, Factory $factory): Result
{
	/**
	 * we can`t pass required attribute into collection for 2 reasons:
	 * - we would have to clone fieldsCollection entirely, because it is entity-dependant, and not item-specific.
	 * - we would have to separate checking required fields from processAttributes() to another method,
	 *   to call it after processLogic, because stage can be changed during processLogic()
	 **/

	$result = new Result();
	$dependantFieldNames = $factory->getDependantFieldsMap();

	foreach ($requiredFields as $fieldName)
	{
		$field = $this->fieldsCollection->getField($fieldName);
		if ($field && $field->isItemValueEmpty($this->item))
		{
			$result->addError($field::getRequiredEmptyError($fieldName, $field->getTitle()));
		}
		elseif (isset($dependantFieldNames[$fieldName]))
		{
			$emptyValuesCount = 0;
			foreach ($dependantFieldNames[$fieldName] as $dependantFieldName)
			{
				$dependantField = $this->fieldsCollection->getField($dependantFieldName);
				if (
					$dependantField
					&& $this->item->hasField($dependantFieldName)
					&& $dependantField->isValueEmpty($this->item->get($dependantFieldName))
				)
				{
					$emptyValuesCount++;
				}
			}

			if ($emptyValuesCount >= count ($dependantFieldNames[$fieldName]))
			{
				$result->addError(Field::getRequiredEmptyError($fieldName, $factory->getFieldCaption($fieldName)));
			}
		}
		elseif (
			Multifield\TypeRepository::isTypeDefined($fieldName)
			&& $this->item->hasField(Item::FIELD_NAME_FM)
			&& count($this->item->getFm()->filterByType($fieldName)) <= 0
		)
		{
			$result->addError(
				Field::getRequiredEmptyError(
					$fieldName,
					Multifield\TypeRepository::getTypeCaption($fieldName),
				)
			);
		}
	}

	return $result;
}