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);
}