eZ\Publish\Core\Persistence\Legacy\Content\FieldHandler::updateFields PHP Method

updateFields() public method

Updates the fields in for content identified by $contentId and $versionNo in the database in respect to $updateStruct.
public updateFields ( eZ\Publish\SPI\Persistence\Content $content, eZ\Publish\SPI\Persistence\Content\UpdateStruct $updateStruct, eZ\Publish\SPI\Persistence\Content\Type $contentType )
$content eZ\Publish\SPI\Persistence\Content
$updateStruct eZ\Publish\SPI\Persistence\Content\UpdateStruct
$contentType eZ\Publish\SPI\Persistence\Content\Type
    public function updateFields(Content $content, UpdateStruct $updateStruct, Type $contentType)
    {
        $updatedFields = array();
        $fieldsToCopy = array();
        $nonTranslatableCopiesUpdateSet = array();
        $mainLanguageCode = $content->versionInfo->contentInfo->mainLanguageCode;
        $languageCodes = $existingLanguageCodes = $this->getLanguageCodes($content->versionInfo->languageIds);
        $contentFieldMap = $this->getFieldMap($content->fields);
        $updateFieldMap = $this->getFieldMap($updateStruct->fields, $languageCodes);
        $initialLanguageCode = $this->languageHandler->load($updateStruct->initialLanguageId)->languageCode;
        $languageCodes[$initialLanguageCode] = true;
        foreach ($contentType->fieldDefinitions as $fieldDefinition) {
            foreach (array_keys($languageCodes) as $languageCode) {
                if (isset($updateFieldMap[$fieldDefinition->id][$languageCode])) {
                    $field = clone $updateFieldMap[$fieldDefinition->id][$languageCode];
                    $field->versionNo = $content->versionInfo->versionNo;
                    if (isset($field->id)) {
                        $this->updateField($field, $content);
                        $updatedFields[$fieldDefinition->id][$languageCode] = $field;
                    } else {
                        $this->createNewField($field, $content);
                    }
                } elseif (!isset($existingLanguageCodes[$languageCode])) {
                    // If field is not set for new language
                    if ($fieldDefinition->isTranslatable) {
                        // Use empty value for translatable field
                        $field = $this->getEmptyField($fieldDefinition, $languageCode);
                        $this->createNewField($field, $content);
                    } else {
                        // Use value from main language code for untranslatable field
                        $fieldsToCopy[$fieldDefinition->id][$languageCode] = isset($updateFieldMap[$fieldDefinition->id][$mainLanguageCode]) ? $updateFieldMap[$fieldDefinition->id][$mainLanguageCode] : $contentFieldMap[$fieldDefinition->id][$mainLanguageCode];
                    }
                } elseif (!$fieldDefinition->isTranslatable && isset($updateFieldMap[$fieldDefinition->id][$mainLanguageCode])) {
                    // If field is not set for existing language and is untranslatable and main language is updated,
                    // also update copied field data
                    // Register for processing after all given fields are updated
                    $nonTranslatableCopiesUpdateSet[$fieldDefinition->id][] = $languageCode;
                }
                // If no above conditions were met - do nothing
            }
        }
        foreach ($nonTranslatableCopiesUpdateSet as $fieldDefinitionId => $languageCodes) {
            foreach ($languageCodes as $languageCode) {
                $this->updateCopiedField($contentFieldMap[$fieldDefinitionId][$languageCode], $updateFieldMap[$fieldDefinitionId][$mainLanguageCode], $updatedFields[$fieldDefinitionId][$mainLanguageCode], $content);
            }
        }
        $this->copyFields($fieldsToCopy, $content);
    }

Usage Example

示例#1
0
 /**
  * Updates a content version, identified by $contentId and $versionNo.
  *
  * @param int $contentId
  * @param int $versionNo
  * @param \eZ\Publish\SPI\Persistence\Content\UpdateStruct $updateStruct
  *
  * @return \eZ\Publish\SPI\Persistence\Content
  */
 public function updateContent($contentId, $versionNo, UpdateStruct $updateStruct)
 {
     $content = $this->load($contentId, $versionNo);
     $this->contentGateway->updateVersion($contentId, $versionNo, $updateStruct);
     $contentType = $this->contentTypeHandler->load($content->versionInfo->contentInfo->contentTypeId);
     $this->fieldHandler->updateFields($content, $updateStruct, $contentType);
     foreach ($updateStruct->name as $language => $name) {
         $this->contentGateway->setName($contentId, $versionNo, $name, $language);
     }
     return $this->load($contentId, $versionNo);
 }