/** * Publish the content type and update content objects. * * This method updates content objects, depending on the changed field definitions. * * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If the content type has no draft * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the content type has no field definitions * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to publish a content type * * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft $contentTypeDraft */ public function publishContentTypeDraft(APIContentTypeDraft $contentTypeDraft) { if ($this->repository->hasAccess('class', 'update') !== true) { throw new UnauthorizedException('ContentType', 'update'); } try { $loadedContentTypeDraft = $this->loadContentTypeDraft($contentTypeDraft->id); } catch (APINotFoundException $e) { throw new BadStateException('$contentTypeDraft', 'The content type does not have a draft.', $e); } if (count($loadedContentTypeDraft->getFieldDefinitions()) === 0) { throw new InvalidArgumentException('$contentTypeDraft', 'The content type draft should have at least one field definition.'); } $this->repository->beginTransaction(); try { if (empty($loadedContentTypeDraft->nameSchema)) { $fieldDefinitions = $loadedContentTypeDraft->getFieldDefinitions(); $this->contentTypeHandler->update($contentTypeDraft->id, $contentTypeDraft->status, $this->contentTypeDomainMapper->buildSPIContentTypeUpdateStruct($loadedContentTypeDraft, new ContentTypeUpdateStruct(array('nameSchema' => '<' . $fieldDefinitions[0]->identifier . '>')), $this->repository->getCurrentUserReference())); } $this->contentTypeHandler->publish($loadedContentTypeDraft->id); $this->repository->commit(); } catch (Exception $e) { $this->repository->rollback(); throw $e; } }
/** * Fetches the list of available Field identifiers in the token and returns * an array of their current title value. * * @see \eZ\Publish\Core\Repository\FieldType::getName() * * @param string[] $schemaIdentifiers * @param \eZ\Publish\SPI\Persistence\Content\Type|\eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType * @param array $fieldMap * @param string $languageCode * * @throws \eZ\Publish\Core\Base\Exceptions\InvalidArgumentType * * @return string[] Key is the field identifier, value is the title value */ protected function getFieldTitles(array $schemaIdentifiers, $contentType, array $fieldMap, $languageCode) { $fieldTitles = array(); foreach ($schemaIdentifiers as $fieldDefinitionIdentifier) { if (isset($fieldMap[$fieldDefinitionIdentifier][$languageCode])) { if ($contentType instanceof SPIContentType) { $fieldDefinition = null; foreach ($contentType->fieldDefinitions as $spiFieldDefinition) { if ($spiFieldDefinition->identifier === $fieldDefinitionIdentifier) { $fieldDefinition = $this->contentTypeDomainMapper->buildFieldDefinitionDomainObject($spiFieldDefinition); break; } } if ($fieldDefinition === null) { $fieldTitles[$fieldDefinitionIdentifier] = ''; continue; } } elseif ($contentType instanceof ContentType) { $fieldDefinition = $contentType->getFieldDefinition($fieldDefinitionIdentifier); } else { throw new InvalidArgumentType('$contentType', 'API or SPI variant of ContentType'); } $nameableFieldTypeService = $this->nameableFieldTypeRegistry->getFieldType($fieldDefinition->fieldTypeIdentifier); $fieldTitles[$fieldDefinitionIdentifier] = $nameableFieldTypeService->getFieldName($fieldMap[$fieldDefinitionIdentifier][$languageCode], $fieldDefinition, $languageCode); } } return $fieldTitles; }