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

createContentType() public method

The content type is created in the state STATUS_DRAFT.
public createContentType ( eZ\Publish\API\Repository\Values\ContentType\ContentTypeCreateStruct $contentTypeCreateStruct, array $contentTypeGroups ) : eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft
$contentTypeCreateStruct eZ\Publish\API\Repository\Values\ContentType\ContentTypeCreateStruct
$contentTypeGroups array Required array of {@link APIContentTypeGroup} to link type with (must contain one)
return eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft
    public function createContentType(APIContentTypeCreateStruct $contentTypeCreateStruct, array $contentTypeGroups)
    {
        if ($this->repository->hasAccess('class', 'create') !== true) {
            throw new UnauthorizedException('ContentType', 'create');
        }
        // Prevent argument mutation
        $contentTypeCreateStruct = clone $contentTypeCreateStruct;
        $this->validateInputContentTypeCreateStruct($contentTypeCreateStruct);
        $this->validateInputContentTypeGroups($contentTypeGroups);
        $initialLanguageId = $this->repository->getContentLanguageService()->loadLanguage($contentTypeCreateStruct->mainLanguageCode)->id;
        try {
            $this->contentTypeHandler->loadByIdentifier($contentTypeCreateStruct->identifier);
            throw new InvalidArgumentException('$contentTypeCreateStruct', "Another ContentType with identifier '{$contentTypeCreateStruct->identifier}' exists");
        } catch (APINotFoundException $e) {
            // Do nothing
        }
        if ($contentTypeCreateStruct->remoteId !== null) {
            try {
                $this->contentTypeHandler->loadByRemoteId($contentTypeCreateStruct->remoteId);
                throw new InvalidArgumentException('$contentTypeCreateStruct', "Another ContentType with remoteId '{$contentTypeCreateStruct->remoteId}' exists");
            } catch (APINotFoundException $e) {
                // Do nothing
            }
        }
        $fieldDefinitionIdentifierSet = array();
        $fieldDefinitionPositionSet = array();
        foreach ($contentTypeCreateStruct->fieldDefinitions as $fieldDefinitionCreateStruct) {
            // Check for duplicate identifiers
            if (!isset($fieldDefinitionIdentifierSet[$fieldDefinitionCreateStruct->identifier])) {
                $fieldDefinitionIdentifierSet[$fieldDefinitionCreateStruct->identifier] = true;
            } else {
                throw new InvalidArgumentException('$contentTypeCreateStruct', "Argument contains duplicate field definition identifier '{$fieldDefinitionCreateStruct->identifier}'");
            }
            // Check for duplicate positions
            if (!isset($fieldDefinitionPositionSet[$fieldDefinitionCreateStruct->position])) {
                $fieldDefinitionPositionSet[$fieldDefinitionCreateStruct->position] = true;
            } else {
                throw new InvalidArgumentException('$contentTypeCreateStruct', "Argument contains duplicate field definition position '{$fieldDefinitionCreateStruct->position}'");
            }
        }
        $allValidationErrors = array();
        $spiFieldDefinitions = array();
        $fieldTypeIdentifierSet = array();
        foreach ($contentTypeCreateStruct->fieldDefinitions as $fieldDefinitionCreateStruct) {
            /** @var $fieldType \eZ\Publish\SPI\FieldType\FieldType */
            $fieldType = $this->fieldTypeRegistry->getFieldType($fieldDefinitionCreateStruct->fieldTypeIdentifier);
            if ($fieldType->isSingular() && isset($fieldTypeIdentifierSet[$fieldDefinitionCreateStruct->fieldTypeIdentifier])) {
                throw new ContentTypeValidationException("FieldType '%identifier%' is singular and can't be repeated in a ContentType", ['%identifier%' => $fieldDefinitionCreateStruct->fieldTypeIdentifier]);
            }
            $fieldTypeIdentifierSet[$fieldDefinitionCreateStruct->fieldTypeIdentifier] = true;
            $fieldType->applyDefaultSettings($fieldDefinitionCreateStruct->fieldSettings);
            $fieldType->applyDefaultValidatorConfiguration($fieldDefinitionCreateStruct->validatorConfiguration);
            $validationErrors = $this->validateFieldDefinitionCreateStruct($fieldDefinitionCreateStruct, $fieldType);
            if (!empty($validationErrors)) {
                $allValidationErrors[$fieldDefinitionCreateStruct->identifier] = $validationErrors;
            }
            if (!empty($allValidationErrors)) {
                continue;
            }
            $spiFieldDefinitions[] = $this->contentTypeDomainMapper->buildSPIFieldDefinitionCreate($fieldDefinitionCreateStruct, $fieldType);
        }
        if (!empty($allValidationErrors)) {
            throw new ContentTypeFieldDefinitionValidationException($allValidationErrors);
        }
        $groupIds = array_map(function (APIContentTypeGroup $contentTypeGroup) {
            return $contentTypeGroup->id;
        }, $contentTypeGroups);
        if ($contentTypeCreateStruct->creatorId === null) {
            $contentTypeCreateStruct->creatorId = $this->repository->getCurrentUserReference()->getUserId();
        }
        if ($contentTypeCreateStruct->creationDate === null) {
            $timestamp = time();
        } else {
            $timestamp = $contentTypeCreateStruct->creationDate->getTimestamp();
        }
        if ($contentTypeCreateStruct->remoteId === null) {
            $contentTypeCreateStruct->remoteId = $this->domainMapper->getUniqueHash($contentTypeCreateStruct);
        }
        $spiContentTypeCreateStruct = new SPIContentTypeCreateStruct(array('identifier' => $contentTypeCreateStruct->identifier, 'name' => $contentTypeCreateStruct->names, 'status' => APIContentType::STATUS_DRAFT, 'description' => $contentTypeCreateStruct->descriptions === null ? array() : $contentTypeCreateStruct->descriptions, 'created' => $timestamp, 'modified' => $timestamp, 'creatorId' => $contentTypeCreateStruct->creatorId, 'modifierId' => $contentTypeCreateStruct->creatorId, 'remoteId' => $contentTypeCreateStruct->remoteId, 'urlAliasSchema' => $contentTypeCreateStruct->urlAliasSchema === null ? '' : $contentTypeCreateStruct->urlAliasSchema, 'nameSchema' => $contentTypeCreateStruct->nameSchema === null ? '' : $contentTypeCreateStruct->nameSchema, 'isContainer' => $contentTypeCreateStruct->isContainer === null ? false : $contentTypeCreateStruct->isContainer, 'initialLanguageId' => $initialLanguageId, 'sortField' => $contentTypeCreateStruct->defaultSortField === null ? Location::SORT_FIELD_PUBLISHED : $contentTypeCreateStruct->defaultSortField, 'sortOrder' => $contentTypeCreateStruct->defaultSortOrder === null ? Location::SORT_ORDER_DESC : $contentTypeCreateStruct->defaultSortOrder, 'groupIds' => $groupIds, 'fieldDefinitions' => $spiFieldDefinitions, 'defaultAlwaysAvailable' => $contentTypeCreateStruct->defaultAlwaysAvailable));
        $this->repository->beginTransaction();
        try {
            $spiContentType = $this->contentTypeHandler->create($spiContentTypeCreateStruct);
            $this->repository->commit();
        } catch (Exception $e) {
            $this->repository->rollback();
            throw $e;
        }
        return $this->contentTypeDomainMapper->buildContentTypeDraftDomainObject($spiContentType, array_map(function ($id) {
            return $this->contentTypeHandler->loadGroup($id);
        }, $spiContentType->groupIds));
    }