/**
     * Returns Content ids of all ancestor Locations of all Locations
     * of a Content with given $contentId.
     *
     * Used to determine user groups of a user with $contentId.
     *
     * @param int|string $contentId
     *
     * @return array
     */
    protected function getAncestorLocationsContentIds( $contentId )
    {
        $locations = $this->locationHandler->loadLocationsByContent( $contentId );
        $ancestorLocationContentIds = array();
        $ancestorLocationIds = array();

        foreach ( $locations as $location )
        {
            $locationIds = explode( "/", trim( $location->pathString, "/" ) );
            // Remove Location of Content with $contentId
            array_pop( $locationIds );
            // Remove Root Location id (id==1 in legacy DB)
            array_shift( $locationIds );

            $ancestorLocationIds = array_merge( $ancestorLocationIds, $locationIds );
        }

        foreach ( array_unique( $ancestorLocationIds ) as $locationId )
        {
            $location = $this->locationHandler->load( $locationId );

            $ancestorLocationContentIds[$location->contentId] = true;
        }

        return array_keys( $ancestorLocationContentIds );
    }
Beispiel #2
0
 /**
  * Map content to document.
  *
  * A document is an array of fields
  *
  * @param \eZ\Publish\SPI\Persistence\Content $content
  *
  * @return array
  */
 protected function mapContent(Content $content)
 {
     $locations = $this->locationHandler->loadLocationsByContent($content->versionInfo->contentInfo->id);
     $mainLocation = null;
     foreach ($locations as $location) {
         if ($location->id == $content->versionInfo->contentInfo->mainLocationId) {
             $mainLocation = $location;
         }
     }
     $section = $this->sectionHandler->load($content->versionInfo->contentInfo->sectionId);
     $document = array(new Field('id', $content->versionInfo->contentInfo->id, new FieldType\IdentifierField()), new Field('type', $content->versionInfo->contentInfo->contentTypeId, new FieldType\IdentifierField()), new Field('version', $content->versionInfo->versionNo, new FieldType\IdentifierField()), new Field('status', $content->versionInfo->status, new FieldType\IdentifierField()), new Field('name', $content->versionInfo->contentInfo->name, new FieldType\StringField()), new Field('creator', $content->versionInfo->creatorId, new FieldType\IdentifierField()), new Field('owner', $content->versionInfo->contentInfo->ownerId, new FieldType\IdentifierField()), new Field('section', $content->versionInfo->contentInfo->sectionId, new FieldType\IdentifierField()), new Field('section_identifier', $section->identifier, new FieldType\IdentifierField()), new Field('section_name', $section->name, new FieldType\StringField()), new Field('remote_id', $content->versionInfo->contentInfo->remoteId, new FieldType\IdentifierField()), new Field('modified', $content->versionInfo->contentInfo->modificationDate, new FieldType\DateField()), new Field('published', $content->versionInfo->contentInfo->publicationDate, new FieldType\DateField()), new Field('path', array_map(function ($location) {
         return $location->pathString;
     }, $locations), new FieldType\MultipleIdentifierField()), new Field('location', array_map(function ($location) {
         return $location->id;
     }, $locations), new FieldType\MultipleIdentifierField()), new Field('depth', array_map(function ($location) {
         return $location->depth;
     }, $locations), new FieldType\IntegerField()), new Field('priority', array_map(function ($location) {
         return $location->priority;
     }, $locations), new FieldType\IntegerField()), new Field('location_parent', array_map(function ($location) {
         return $location->parentId;
     }, $locations), new FieldType\MultipleIdentifierField()), new Field('location_remote_id', array_map(function ($location) {
         return $location->remoteId;
     }, $locations), new FieldType\MultipleIdentifierField()), new Field('language_code', array_keys($content->versionInfo->names), new FieldType\MultipleStringField()), new Field('main_language_code', $content->versionInfo->contentInfo->mainLanguageCode, new FieldType\StringField()), new Field('invisible', array_map(function ($location) {
         return $location->invisible;
     }, $locations), new FieldType\MultipleBooleanField()), new Field('always_available', $content->versionInfo->contentInfo->alwaysAvailable, new FieldType\BooleanField()));
     if ($mainLocation !== null) {
         $document[] = new Field('main_location', $mainLocation->id, new FieldType\IdentifierField());
         $document[] = new Field('main_location_parent', $mainLocation->parentId, new FieldType\IdentifierField());
         $document[] = new Field('main_location_remote_id', $mainLocation->remoteId, new FieldType\IdentifierField());
         $document[] = new Field('main_path', $mainLocation->pathString, new FieldType\IdentifierField());
         $document[] = new Field('main_depth', $mainLocation->depth, new FieldType\IntegerField());
         $document[] = new Field('main_priority', $mainLocation->priority, new FieldType\IntegerField());
     }
     $contentType = $this->contentTypeHandler->load($content->versionInfo->contentInfo->contentTypeId);
     $document[] = new Field('group', $contentType->groupIds, new FieldType\MultipleIdentifierField());
     foreach ($content->fields as $field) {
         foreach ($contentType->fieldDefinitions as $fieldDefinition) {
             if ($fieldDefinition->id !== $field->fieldDefinitionId) {
                 continue;
             }
             $fieldType = $this->fieldRegistry->getType($field->type);
             foreach ($fieldType->getIndexData($field) as $indexField) {
                 $document[] = new Field($this->fieldNameGenerator->getName($indexField->name, $fieldDefinition->identifier, $contentType->identifier), $indexField->value, $indexField->type);
             }
         }
     }
     $objectStateIds = array();
     foreach ($this->objectStateHandler->loadAllGroups() as $objectStateGroup) {
         $objectStateIds[] = $this->objectStateHandler->getContentState($content->versionInfo->contentInfo->id, $objectStateGroup->id)->id;
     }
     $document[] = new Field('object_state', $objectStateIds, new FieldType\MultipleIdentifierField());
     return $document;
 }
 public function mapFields(Content $content)
 {
     $locations = $this->locationHandler->loadLocationsByContent($content->versionInfo->contentInfo->id);
     $mainLocation = null;
     $isSomeLocationVisible = false;
     $locationData = [];
     $fields = [];
     foreach ($locations as $location) {
         $locationData['ids'][] = $location->id;
         $locationData['parent_ids'][] = $location->parentId;
         $locationData['remote_ids'][] = $location->remoteId;
         $locationData['path_strings'][] = $location->pathString;
         if ($location->id == $content->versionInfo->contentInfo->mainLocationId) {
             $mainLocation = $location;
         }
         if (!$location->hidden && !$location->invisible) {
             $isSomeLocationVisible = true;
         }
     }
     if (!empty($locationData)) {
         $fields[] = new Field('location_id', $locationData['ids'], new FieldType\MultipleIdentifierField());
         $fields[] = new Field('location_parent_id', $locationData['parent_ids'], new FieldType\MultipleIdentifierField());
         $fields[] = new Field('location_remote_id', $locationData['remote_ids'], new FieldType\MultipleIdentifierField());
         $fields[] = new Field('location_path_string', $locationData['path_strings'], new FieldType\MultipleIdentifierField());
     }
     if ($mainLocation !== null) {
         $fields[] = new Field('main_location', $mainLocation->id, new FieldType\IdentifierField());
         $fields[] = new Field('main_location_parent', $mainLocation->parentId, new FieldType\IdentifierField());
         $fields[] = new Field('main_location_remote_id', $mainLocation->remoteId, new FieldType\IdentifierField());
         $fields[] = new Field('main_location_visible', !$mainLocation->hidden && !$mainLocation->invisible, new FieldType\BooleanField());
         $fields[] = new Field('main_location_path', $mainLocation->pathString, new FieldType\IdentifierField());
         $fields[] = new Field('main_location_depth', $mainLocation->depth, new FieldType\IntegerField());
         $fields[] = new Field('main_location_priority', $mainLocation->priority, new FieldType\IntegerField());
     }
     $fields[] = new Field('location_visible', $isSomeLocationVisible, new FieldType\BooleanField());
     return $fields;
 }
 /**
  * Maps given Content to a Document.
  *
  * @param \eZ\Publish\SPI\Persistence\Content $content
  *
  * @return \eZ\Publish\SPI\Search\Document[]
  */
 public function mapContentBlock(Content $content)
 {
     $contentInfo = $content->versionInfo->contentInfo;
     $locations = $this->locationHandler->loadLocationsByContent($contentInfo->id);
     $blockFields = $this->getBlockFields($content);
     $contentFields = $this->getContentFields($content);
     $documents = [];
     $locationFieldsMap = [];
     foreach ($locations as $location) {
         $locationFieldsMap[$location->id] = $this->getLocationFields($location);
     }
     foreach (array_keys($content->versionInfo->names) as $languageCode) {
         $blockTranslationFields = $this->getBlockTranslationFields($content, $languageCode);
         $translationLocationDocuments = array();
         foreach ($locations as $location) {
             $translationLocationDocuments[] = new Document(array('id' => $this->generateLocationDocumentId($location->id, $languageCode), 'fields' => array_merge($blockFields, $locationFieldsMap[$location->id], $blockTranslationFields)));
         }
         $isMainTranslation = $contentInfo->mainLanguageCode === $languageCode;
         $alwaysAvailable = $isMainTranslation && $contentInfo->alwaysAvailable;
         $contentTranslationFields = $this->getContentTranslationFields($content, $languageCode);
         $documents[] = new Document(array('id' => $this->generateContentDocumentId($contentInfo->id, $languageCode), 'languageCode' => $languageCode, 'alwaysAvailable' => $alwaysAvailable, 'isMainTranslation' => $isMainTranslation, 'fields' => array_merge($blockFields, $contentFields, $blockTranslationFields, $contentTranslationFields), 'documents' => $translationLocationDocuments));
     }
     return $documents;
 }