eZ\Publish\Core\Repository\Helper\DomainMapper::buildRelationDomainObject PHP Method

buildRelationDomainObject() public method

Builds API Relation object from provided SPI Relation object.
public buildRelationDomainObject ( eZ\Publish\SPI\Persistence\Content\Relation $spiRelation, eZ\Publish\API\Repository\Values\Content\ContentInfo $sourceContentInfo, eZ\Publish\API\Repository\Values\Content\ContentInfo $destinationContentInfo ) : eZ\Publish\API\Repository\Values\Content\Relation
$spiRelation eZ\Publish\SPI\Persistence\Content\Relation
$sourceContentInfo eZ\Publish\API\Repository\Values\Content\ContentInfo
$destinationContentInfo eZ\Publish\API\Repository\Values\Content\ContentInfo
return eZ\Publish\API\Repository\Values\Content\Relation
    public function buildRelationDomainObject(SPIRelation $spiRelation, ContentInfo $sourceContentInfo, ContentInfo $destinationContentInfo)
    {
        $sourceFieldDefinitionIdentifier = null;
        if ($spiRelation->sourceFieldDefinitionId !== null) {
            $contentType = $this->contentTypeHandler->load($sourceContentInfo->contentTypeId);
            foreach ($contentType->fieldDefinitions as $fieldDefinition) {
                if ($fieldDefinition->id !== $spiRelation->sourceFieldDefinitionId) {
                    continue;
                }
                $sourceFieldDefinitionIdentifier = $fieldDefinition->identifier;
                break;
            }
        }
        return new Relation(array('id' => $spiRelation->id, 'sourceFieldDefinitionIdentifier' => $sourceFieldDefinitionIdentifier, 'type' => $spiRelation->type, 'sourceContentInfo' => $sourceContentInfo, 'destinationContentInfo' => $destinationContentInfo));
    }

Usage Example

 /**
  * Adds a relation of type common.
  *
  * The source of the relation is the content and version
  * referenced by $versionInfo.
  *
  * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to edit this version
  * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the version is not a draft
  *
  * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $sourceVersion
  * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $destinationContent the destination of the relation
  *
  * @return \eZ\Publish\API\Repository\Values\Content\Relation the newly created relation
  */
 public function addRelation(APIVersionInfo $sourceVersion, ContentInfo $destinationContent)
 {
     $sourceVersion = $this->loadVersionInfoById($sourceVersion->contentInfo->id, $sourceVersion->versionNo);
     if ($sourceVersion->status !== APIVersionInfo::STATUS_DRAFT) {
         throw new BadStateException('$sourceVersion', 'Relations of type common can only be added to versions of status draft');
     }
     if (!$this->repository->canUser('content', 'edit', $sourceVersion)) {
         throw new UnauthorizedException('content', 'edit', array('contentId' => $sourceVersion->contentInfo->id));
     }
     $sourceContentInfo = $sourceVersion->getContentInfo();
     $this->repository->beginTransaction();
     try {
         $spiRelation = $this->persistenceHandler->contentHandler()->addRelation(new SPIRelationCreateStruct(array('sourceContentId' => $sourceContentInfo->id, 'sourceContentVersionNo' => $sourceVersion->versionNo, 'sourceFieldDefinitionId' => null, 'destinationContentId' => $destinationContent->id, 'type' => APIRelation::COMMON)));
         $this->repository->commit();
     } catch (Exception $e) {
         $this->repository->rollback();
         throw $e;
     }
     return $this->domainMapper->buildRelationDomainObject($spiRelation, $sourceContentInfo, $destinationContent);
 }