/** * Create document(s) update XML * * @param array $documents * * @return string */ protected function createUpdates(array $documents) { $xml = new \XmlWriter(); $xml->openMemory(); $xml->startElement('add'); foreach ($documents as $document) { $xml->startElement('doc'); foreach ($document as $field) { foreach ((array) $this->fieldValueMapper->map($field) as $value) { $xml->startElement('field'); $xml->writeAttribute('name', $this->nameGenerator->getTypedName($field->name, $field->type)); $xml->text($value); $xml->endElement(); } } $xml->endElement(); } $xml->endElement(); return $xml->outputMemory(true); }
/** * Get field type information * * Returns an array in the form: * * <code> * array( * "field-identifier" => array( * "solr_field_name", * … * ), * … * ) * </code> * * @param \eZ\Publish\API\Repository\Values\Content\Query\CustomFieldInterface $criterion * * @return array */ public function getFieldTypes(CustomFieldInterface $criterion) { // @TODO: temp fixed by disabling caching, see https://jira.ez.no/browse/EZP-22834 $this->fieldTypes = array(); foreach ($this->contentTypeHandler->loadAllGroups() as $group) { foreach ($this->contentTypeHandler->loadContentTypes($group->id) as $contentType) { foreach ($contentType->fieldDefinitions as $fieldDefinition) { if (!$fieldDefinition->isSearchable) { continue; } if ($customField = $criterion->getCustomField($contentType->identifier, $fieldDefinition->identifier)) { $this->fieldTypes[$fieldDefinition->identifier]["custom"][] = $customField; continue; } $fieldType = $this->fieldRegistry->getType($fieldDefinition->fieldType); foreach ($fieldType->getIndexDefinition() as $name => $type) { $this->fieldTypes[$fieldDefinition->identifier][$type->type][] = $this->nameGenerator->getTypedName($this->nameGenerator->getName($name, $fieldDefinition->identifier, $contentType->identifier), $type); } } } } return $this->fieldTypes; }
/** * 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; }