vendor/pimcore/pimcore/bundles/CoreBundle/Migrations/Version20230320131322.php line 1

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4.  * Pimcore
  5.  *
  6.  * This source file is available under two different licenses:
  7.  * - GNU General Public License version 3 (GPLv3)
  8.  * - Pimcore Commercial License (PCL)
  9.  * Full copyright and license information is available in
  10.  * LICENSE.md which is distributed with this source code.
  11.  *
  12.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  13.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  14.  */
  15. namespace Pimcore\Bundle\CoreBundle\Migrations;
  16. use Doctrine\DBAL\Schema\Schema;
  17. use Doctrine\Migrations\AbstractMigration;
  18. use Pimcore\Cache;
  19. use Pimcore\Db;
  20. use Pimcore\Model\DataObject\ClassDefinition\Data\Localizedfields;
  21. use Pimcore\Model\DataObject\ClassDefinition\Listing;
  22. use Pimcore\Model\DataObject\Concrete;
  23. use Pimcore\Model\DataObject\Localizedfield;
  24. use Pimcore\Model\DataObject\Objectbrick\Data\AbstractData;
  25. final class Version20230320131322 extends AbstractMigration
  26. {
  27.     public function getDescription(): string
  28.     {
  29.         return 'Repair localized relations in object bricks';
  30.     }
  31.     public function up(Schema $schema): void
  32.     {
  33.         $classDefinitionListing = new Listing();
  34.         foreach($classDefinitionListing->getClasses() as $classDefinition) {
  35.             $relations Db::get()->fetchAllAssociative('SELECT src_id, ownername, fieldname, position FROM object_relations_'.$classDefinition->getId().' WHERE ownertype=\'localizedfield\' AND ownername LIKE \'/objectbrick~%\'');
  36.             foreach($relations as $relationItem) {
  37.                 if(preg_match('/^\/objectbrick~([^\/]+)/'$relationItem['ownername'], $match)) {
  38.                     $object Concrete::getById($relationItem['src_id']);
  39.                     if(!$object instanceof Concrete) {
  40.                         continue;
  41.                     }
  42.                     $objectBrickContainerField $match[1];
  43.                     $brickGetter 'get'.$objectBrickContainerField;
  44.                     /** @var \Pimcore\Model\DataObject\Objectbrick $brickContainer */
  45.                     $brickContainer $object->$brickGetter();
  46.                     /** @var AbstractData $objectBrick */
  47.                     foreach($brickContainer->getItems() as $objectBrick) {
  48.                         $brickDefinition $objectBrick->getDefinition();
  49.                         $localizedFieldDefinition $brickDefinition->getFieldDefinition('localizedfields');
  50.                         if($localizedFieldDefinition instanceof Localizedfields) {
  51.                             if($localizedFieldDefinition->getFieldDefinition($relationItem['fieldname'])) {
  52.                                 $fieldGetter 'get'.$relationItem['fieldname'];
  53.                                 $fieldSetter 'set'.$relationItem['fieldname'];
  54.                                 $objectBrick->$fieldSetter($objectBrick->$fieldGetter($relationItem['position']), $relationItem['position']);
  55.                                 $objectBrick->markFieldDirty('localizedfields');
  56.                                 $objectBrick->markFieldDirty($relationItem['fieldname']);
  57.                                 if(!method_exists($objectBrick'getLocalizedfields')) {
  58.                                     // this cannot happen, because we already checked that there are localized fields via $brickDefinition->getFieldDefinition('localizedfields') but PhpStan complains...
  59.                                     continue;
  60.                                 }
  61.                                 /** @var Localizedfield $localizedFields */
  62.                                 $localizedFields $objectBrick->getLocalizedfields();
  63.                                 $localizedFields->markLanguageAsDirty($relationItem['position']);
  64.                                 $localizedFields->markFieldDirty($relationItem['fieldname']);
  65.                                 Db::get()->executeStatement('DELETE FROM object_relations_'.$classDefinition->getId().' WHERE src_id=? AND fieldname=? AND ownertype=\'localizedfield\' AND ownername LIKE \'/objectbrick~%\'', [$object->getId(), $relationItem['fieldname']]);
  66.                                 $objectBrick->save($object, [
  67.                                     'isUntouchable' => false,
  68.                                     'isUpdate' => true,
  69.                                     'context' => [
  70.                                         'containerType' => 'object',
  71.                                     ],
  72.                                     'owner' => $object,
  73.                                     'fieldname' => $objectBrickContainerField,
  74.                                     'saveRelationalData' => ['saveLocalizedRelations' => true],
  75.                                 ]);
  76.                                 continue 2;
  77.                             }
  78.                         }
  79.                     }
  80.                     Cache::remove('object_'.$object->getId());
  81.                 }
  82.             }
  83.         }
  84.     }
  85.     public function down(Schema $schema): void
  86.     {
  87.         $this->up($schema);
  88.     }
  89. }