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));
}