diff --git a/doc/bc/changes-6.10.md b/doc/bc/changes-6.10.md new file mode 100644 index 00000000000..7afe381f42a --- /dev/null +++ b/doc/bc/changes-6.10.md @@ -0,0 +1,14 @@ +# Backwards compatibility changes + +Changes affecting version compatibility with former or future versions. + +## Changes + +- EZP-27420: `SPI\Persistence\VersionInfo->languageIds` has been removed and replaced by property `languageCodes` + + Change is done to reduce complexity, make it consistent with other language properties on Content aggregate, + and slightly optimize mapping of API VersionInfo objects. + +## Deprecations + +## Removed features diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/FieldHandler.php b/eZ/Publish/Core/Persistence/Legacy/Content/FieldHandler.php index 5e4d783da4a..b9334f39630 100644 --- a/eZ/Publish/Core/Persistence/Legacy/Content/FieldHandler.php +++ b/eZ/Publish/Core/Persistence/Legacy/Content/FieldHandler.php @@ -321,7 +321,7 @@ public function updateFields(Content $content, UpdateStruct $updateStruct, Type $fieldsToCopy = array(); $nonTranslatableCopiesUpdateSet = array(); $mainLanguageCode = $content->versionInfo->contentInfo->mainLanguageCode; - $languageCodes = $existingLanguageCodes = $this->getLanguageCodes($content->versionInfo->languageIds); + $languageCodes = $existingLanguageCodes = array_fill_keys($content->versionInfo->languageCodes, true); $contentFieldMap = $this->getFieldMap($content->fields); $updateFieldMap = $this->getFieldMap($updateStruct->fields, $languageCodes); $initialLanguageCode = $this->languageHandler->load($updateStruct->initialLanguageId)->languageCode; @@ -411,23 +411,6 @@ protected function updateCopiedField(Field $field, Field $updateField, Field $or } } - /** - * For given $languageIds returns array with language codes as keys. - * - * @param array $languageIds - * - * @return array - */ - protected function getLanguageCodes(array $languageIds) - { - $languageCodes = array(); - foreach ($languageIds as $languageId) { - $languageCodes[$this->languageHandler->load($languageId)->languageCode] = true; - } - - return $languageCodes; - } - /** * Returns given $fields structured in hash array with field definition ids and language codes as keys. * diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Gateway/DoctrineDatabase.php b/eZ/Publish/Core/Persistence/Legacy/Content/Gateway/DoctrineDatabase.php index 34a8e9a9802..e7d45e636e9 100644 --- a/eZ/Publish/Core/Persistence/Legacy/Content/Gateway/DoctrineDatabase.php +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Gateway/DoctrineDatabase.php @@ -325,17 +325,17 @@ public function updateContent($contentId, MetadataUpdateStruct $struct, VersionI ); } if ($prePublishVersionInfo !== null) { - $mask = 0; - - if (isset($struct->alwaysAvailable)) { - $mask |= $struct->alwaysAvailable ? 1 : 0; - } else { - $mask |= $prePublishVersionInfo->contentInfo->alwaysAvailable ? 1 : 0; + $languages = []; + foreach ($prePublishVersionInfo->languageCodes as $languageCodes) { + if (!isset($languages[$languageCodes])) { + $languages[$languageCodes] = true; + } } - foreach ($prePublishVersionInfo->languageIds as $languageId) { - $mask |= $languageId; - } + $languages['always-available'] = isset($struct->alwaysAvailable) ? $struct->alwaysAvailable : + $prePublishVersionInfo->contentInfo->alwaysAvailable; + + $mask = $this->languageMaskGenerator->generateLanguageMask($languages); $q->set( $this->dbHandler->quoteColumn('language_mask'), diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Mapper.php b/eZ/Publish/Core/Persistence/Legacy/Content/Mapper.php index 4816b716506..8ec23527cb8 100644 --- a/eZ/Publish/Core/Persistence/Legacy/Content/Mapper.php +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Mapper.php @@ -105,14 +105,13 @@ public function createVersionInfoFromCreateStruct(CreateStruct $struct, $version $versionInfo->modificationDate = $struct->modified; $versionInfo->names = $struct->name; - $languageIds = array(); + $languages = []; foreach ($struct->fields as $field) { - if (!isset($languageIds[$field->languageCode])) { - $languageIds[$field->languageCode] = - $this->languageHandler->loadByLanguageCode($field->languageCode)->id; + if (!isset($languages[$field->languageCode])) { + $languages[$field->languageCode] = true; } } - $versionInfo->languageIds = array_values($languageIds); + $versionInfo->languageCodes = array_keys($languages); return $versionInfo; } @@ -138,7 +137,7 @@ public function createVersionInfoForContent(Content $content, $versionNo, $userI $versionInfo->creationDate = time(); $versionInfo->modificationDate = $versionInfo->creationDate; $versionInfo->names = is_object($content->versionInfo) ? $content->versionInfo->names : array(); - $versionInfo->languageIds = $content->versionInfo->languageIds; + $versionInfo->languageCodes = $content->versionInfo->languageCodes; return $versionInfo; } @@ -300,7 +299,7 @@ private function extractVersionInfoFromRow(array $row, array $names = array()) $versionInfo->creationDate = (int)$row['ezcontentobject_version_created']; $versionInfo->modificationDate = (int)$row['ezcontentobject_version_modified']; $versionInfo->initialLanguageCode = $this->languageHandler->load($row['ezcontentobject_version_initial_language_id'])->languageCode; - $versionInfo->languageIds = $this->extractLanguageIdsFromMask($row['ezcontentobject_version_language_mask']); + $versionInfo->languageCodes = $this->extractLanguageCodesFromMask($row['ezcontentobject_version_language_mask']); $versionInfo->status = (int)$row['ezcontentobject_version_status']; $versionInfo->names = $names; @@ -335,7 +334,7 @@ public function extractVersionInfoListFromRows(array $rows, array $nameRows) $versionInfo->creationDate = (int)$row['ezcontentobject_version_created']; $versionInfo->modificationDate = (int)$row['ezcontentobject_version_modified']; $versionInfo->initialLanguageCode = $this->languageHandler->load($row['ezcontentobject_version_initial_language_id'])->languageCode; - $versionInfo->languageIds = $this->extractLanguageIdsFromMask((int)$row['ezcontentobject_version_language_mask']); + $versionInfo->languageCodes = $this->extractLanguageCodesFromMask((int)$row['ezcontentobject_version_language_mask']); $versionInfo->status = (int)$row['ezcontentobject_version_status']; $versionInfo->names = $nameData[$versionId]; $versionInfoList[$versionId] = $versionInfo; @@ -346,21 +345,19 @@ public function extractVersionInfoListFromRows(array $rows, array $nameRows) } /** - * @todo use langmask handler for this - * * @param int $languageMask * - * @return array + * @return string[] */ - public function extractLanguageIdsFromMask($languageMask) + public function extractLanguageCodesFromMask($languageMask) { $exp = 2; - $result = array(); + $result = []; // Decomposition of $languageMask into its binary components. while ($exp <= $languageMask) { if ($languageMask & $exp) { - $result[] = $exp; + $result[] = $this->languageHandler->load($exp)->languageCode; } $exp *= 2; diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldHandlerTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldHandlerTest.php index b11de1d7525..07bece17559 100644 --- a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldHandlerTest.php +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldHandlerTest.php @@ -773,7 +773,7 @@ protected function getContentPartialFieldsFixture() $content = new Content(); $content->versionInfo = new VersionInfo(); $content->versionInfo->versionNo = 1; - $content->versionInfo->languageIds = array(2, 4); + $content->versionInfo->languageCodes = ['eng-US', 'eng-GB']; $content->versionInfo->contentInfo = new ContentInfo(); $content->versionInfo->contentInfo->id = 42; $content->versionInfo->contentInfo->contentTypeId = 1; @@ -811,7 +811,7 @@ protected function getContentNoFieldsFixture() $content = new Content(); $content->versionInfo = new VersionInfo(); $content->versionInfo->versionNo = 1; - $content->versionInfo->languageIds = array(2, 4); + $content->versionInfo->languageCodes = ['eng-US', 'eng-GB']; $content->versionInfo->contentInfo = new ContentInfo(); $content->versionInfo->contentInfo->id = 42; $content->versionInfo->contentInfo->contentTypeId = 1; @@ -831,7 +831,7 @@ protected function getContentSingleLanguageFixture() $content = new Content(); $content->versionInfo = new VersionInfo(); $content->versionInfo->versionNo = 1; - $content->versionInfo->languageIds = array(4); + $content->versionInfo->languageCodes = ['eng-GB']; $content->versionInfo->contentInfo = new ContentInfo(); $content->versionInfo->contentInfo->id = 42; $content->versionInfo->contentInfo->contentTypeId = 1; diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/MapperTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/MapperTest.php index 2d8e818e78c..14e4bc63f96 100644 --- a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/MapperTest.php +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/MapperTest.php @@ -103,7 +103,7 @@ public function testCreateVersionInfoForContent() 'creatorId' => 14, 'status' => 0, 'initialLanguageCode' => 'eng-GB', - 'languageIds' => array(4), + 'languageCodes' => ['eng-GB'], ), $versionInfo ); @@ -127,7 +127,7 @@ protected function getFullContentFixture() array( 'versionNo' => 1, 'initialLanguageCode' => 'eng-GB', - 'languageIds' => array(4), + 'languageCodes' => ['eng-GB'], ) ); diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/extract_content_from_rows_result.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/extract_content_from_rows_result.php index 7dda4e05057..548257a0dce 100644 --- a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/extract_content_from_rows_result.php +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/extract_content_from_rows_result.php @@ -20,7 +20,7 @@ $versionInfo->creationDate = 1313061317; $versionInfo->status = 1; $versionInfo->initialLanguageCode = 'eng-US'; -$versionInfo->languageIds = array( 2 ); +$versionInfo->languageCodes = ['eng-US']; $versionInfo->contentInfo = new ContentInfo(); $versionInfo->contentInfo->id = 226; diff --git a/eZ/Publish/Core/Repository/Helper/DomainMapper.php b/eZ/Publish/Core/Repository/Helper/DomainMapper.php index 16d46c86907..cdaf2e3b211 100644 --- a/eZ/Publish/Core/Repository/Helper/DomainMapper.php +++ b/eZ/Publish/Core/Repository/Helper/DomainMapper.php @@ -191,11 +191,6 @@ public function buildDomainFields(array $spiFields, $contentType, array $languag */ public function buildVersionInfoDomainObject(SPIVersionInfo $spiVersionInfo) { - $languageCodes = array(); - foreach ($spiVersionInfo->languageIds as $languageId) { - $languageCodes[] = $this->contentLanguageHandler->load($languageId)->languageCode; - } - // Map SPI statuses to API switch ($spiVersionInfo->status) { case SPIVersionInfo::STATUS_ARCHIVED: @@ -220,7 +215,7 @@ public function buildVersionInfoDomainObject(SPIVersionInfo $spiVersionInfo) 'creationDate' => $this->getDateTime($spiVersionInfo->creationDate), 'status' => $status, 'initialLanguageCode' => $spiVersionInfo->initialLanguageCode, - 'languageCodes' => $languageCodes, + 'languageCodes' => $spiVersionInfo->languageCodes, 'names' => $spiVersionInfo->names, 'contentInfo' => $this->buildContentInfoDomainObject($spiVersionInfo->contentInfo), ) diff --git a/eZ/Publish/Core/Repository/Tests/Service/Mock/DomainMapperTest.php b/eZ/Publish/Core/Repository/Tests/Service/Mock/DomainMapperTest.php index fec326ee348..937f80e90fe 100644 --- a/eZ/Publish/Core/Repository/Tests/Service/Mock/DomainMapperTest.php +++ b/eZ/Publish/Core/Repository/Tests/Service/Mock/DomainMapperTest.php @@ -11,7 +11,6 @@ use eZ\Publish\API\Repository\Values\Content\VersionInfo as APIVersionInfo; use eZ\Publish\Core\Repository\Tests\Service\Mock\Base as BaseServiceMockTest; use eZ\Publish\Core\Repository\Helper\DomainMapper; -use eZ\Publish\SPI\Persistence\Content\Language as SPILanguage; use eZ\Publish\SPI\Persistence\Content\VersionInfo as SPIVersionInfo; use eZ\Publish\SPI\Persistence\Content\ContentInfo as SPIContentInfo; @@ -26,24 +25,8 @@ class DomainMapperTest extends BaseServiceMockTest */ public function testBuildVersionInfo(SPIVersionInfo $spiVersionInfo, array $languages, array $expected) { - $i = 0; $languageHandlerMock = $this->getLanguageHandlerMock(); - foreach ($languages as $languageId => $languageCode) { - $languageHandlerMock->expects($this->at($i++)) - ->method('load') - ->with($languageId) - ->will( - $this->returnValue( - new SPILanguage( - array('id' => $languageId, 'languageCode' => $languageCode) - ) - ) - ); - } - - if (empty($languages)) { - $languageHandlerMock->expects($this->never())->method('load'); - } + $languageHandlerMock->expects($this->never())->method('load'); $versionInfo = $this->getDomainMapper()->buildVersionInfoDomainObject($spiVersionInfo); $this->assertInstanceOf('eZ\\Publish\\Core\\Repository\\Values\\Content\\VersionInfo', $versionInfo); @@ -95,7 +78,7 @@ public function providerForBuildVersionInfo() array( 'status' => SPIVersionInfo::STATUS_ARCHIVED, 'contentInfo' => new SPIContentInfo(), - 'languageIds' => array(1, 3, 5), + 'languageCodes' => array('eng-GB', 'nor-NB', 'fre-FR'), ) ), array(1 => 'eng-GB', 3 => 'nor-NB', 5 => 'fre-FR'), diff --git a/eZ/Publish/SPI/Persistence/Content/VersionInfo.php b/eZ/Publish/SPI/Persistence/Content/VersionInfo.php index d68ef7b93c7..54faae2e77c 100644 --- a/eZ/Publish/SPI/Persistence/Content/VersionInfo.php +++ b/eZ/Publish/SPI/Persistence/Content/VersionInfo.php @@ -94,15 +94,16 @@ class VersionInfo extends ValueObject /** * In 4.x this is the language code which is used for labeling a translation. * - * @var int + * @var string */ public $initialLanguageCode; /** - * List of languages in this version + * List of languages in this version. + * * Reflects which languages fields exists in for this version. * - * @var int[] + * @var string[] */ - public $languageIds = array(); + public $languageCodes = array(); }