eZ\Publish\Core\Repository\ContentTypeService::addFieldDefinition PHP Method

addFieldDefinition() public method

The content type must be in state DRAFT.
public addFieldDefinition ( eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft $contentTypeDraft, eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct $fieldDefinitionCreateStruct )
$contentTypeDraft eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft
$fieldDefinitionCreateStruct eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct
    public function addFieldDefinition(APIContentTypeDraft $contentTypeDraft, FieldDefinitionCreateStruct $fieldDefinitionCreateStruct)
    {
        if ($this->repository->hasAccess('class', 'update') !== true) {
            throw new UnauthorizedException('ContentType', 'update');
        }
        $this->validateInputFieldDefinitionCreateStruct($fieldDefinitionCreateStruct);
        $loadedContentTypeDraft = $this->loadContentTypeDraft($contentTypeDraft->id);
        if ($loadedContentTypeDraft->getFieldDefinition($fieldDefinitionCreateStruct->identifier) !== null) {
            throw new InvalidArgumentException('$fieldDefinitionCreateStruct', "Another FieldDefinition with identifier '{$fieldDefinitionCreateStruct->identifier}' exists in the ContentType");
        }
        /** @var $fieldType \eZ\Publish\SPI\FieldType\FieldType */
        $fieldType = $this->fieldTypeRegistry->getFieldType($fieldDefinitionCreateStruct->fieldTypeIdentifier);
        $fieldType->applyDefaultSettings($fieldDefinitionCreateStruct->fieldSettings);
        $fieldType->applyDefaultValidatorConfiguration($fieldDefinitionCreateStruct->validatorConfiguration);
        $validationErrors = $this->validateFieldDefinitionCreateStruct($fieldDefinitionCreateStruct, $fieldType);
        if (!empty($validationErrors)) {
            $validationErrors = array($fieldDefinitionCreateStruct->identifier => $validationErrors);
            throw new ContentTypeFieldDefinitionValidationException($validationErrors);
        }
        if ($fieldType->isSingular()) {
            foreach ($loadedContentTypeDraft->getFieldDefinitions() as $fieldDefinition) {
                if ($fieldDefinition->fieldTypeIdentifier === $fieldDefinitionCreateStruct->fieldTypeIdentifier) {
                    throw new BadStateException('$contentTypeDraft', "ContentType already contains field definition of non-repeatable field type '{$fieldDefinition->fieldTypeIdentifier}'");
                }
            }
        }
        if ($fieldType->onlyEmptyInstance() && $this->contentTypeHandler->getContentCount($loadedContentTypeDraft->id)) {
            throw new BadStateException('$contentTypeDraft', "Field definition of '{$fieldDefinitionCreateStruct->fieldTypeIdentifier}' field type cannot be added because ContentType has Content instances");
        }
        $spiFieldDefinitionCreateStruct = $this->contentTypeDomainMapper->buildSPIFieldDefinitionCreate($fieldDefinitionCreateStruct, $fieldType);
        $this->repository->beginTransaction();
        try {
            $this->contentTypeHandler->addFieldDefinition($contentTypeDraft->id, $contentTypeDraft->status, $spiFieldDefinitionCreateStruct);
            $this->repository->commit();
        } catch (Exception $e) {
            $this->repository->rollback();
            throw $e;
        }
    }