diff --git a/vendor/magento/module-staging/Model/Operation/Update.php b/vendor/magento/module-staging/Model/Operation/Update.php index 83e36ba0fa8..17b4d22b88d 100644 --- a/vendor/magento/module-staging/Model/Operation/Update.php +++ b/vendor/magento/module-staging/Model/Operation/Update.php @@ -134,6 +134,8 @@ class Update implements UpdateInterface } /** + * Resolve version id + * * @param array $data * @return string|null */ @@ -143,6 +145,8 @@ class Update implements UpdateInterface } /** + * Process entity update + * * @param EntityMetadataInterface $metadata * @param string $entityType * @param object $entity @@ -156,22 +160,28 @@ class Update implements UpdateInterface $entity, $arguments ) { - $needReschedule = (isset($arguments['origin_in']) && $arguments['created_in'] != $arguments['origin_in']); - if ($needReschedule) { - $this->rescheduleUpdate->reschedule($arguments['origin_in'], $arguments['created_in'], $entity); - } $hydrator = $this->metadataPool->getHydrator($entityType); $entityData = $hydrator->extract($entity); - $identifier = $entityData[$metadata->getIdentifierField()]; - $version = $this->versionInfoProvider->getVersionInfo( - $entity, - $this->resolveVersion(array_merge($entityData, $arguments)) - ); if (!isset($arguments['created_in'])) { $createdIn = array_key_exists('created_in', $entityData) ? $entityData['created_in'] : 1; $arguments['created_in'] = $createdIn; } $update = $this->updateRepository->get($arguments['created_in']); + + $needReschedule = false; + if (isset($arguments['origin_in'])) { + $needReschedule = $arguments['created_in'] != $arguments['origin_in'] + || $update->getRollbackId() != $entityData['updated_in']; + if ($needReschedule) { + $this->rescheduleUpdate->reschedule($arguments['origin_in'], $arguments['created_in'], $entity); + } + } + + $identifier = $entityData[$metadata->getIdentifierField()]; + $version = $this->versionInfoProvider->getVersionInfo( + $entity, + $this->resolveVersion(array_merge($entityData, $arguments)) + ); if ($version->getRowId() != null) { if ($update->getRollbackId()) { $arguments['updated_in'] = $update->getRollbackId(); @@ -192,10 +202,7 @@ class Update implements UpdateInterface } /** - * @param object $entity - * @param array $arguments - * @return object - * @throws \Exception + * @inheritdoc */ public function execute($entity, $arguments = []) { diff --git a/vendor/magento/module-staging/Model/Operation/Update/RescheduleUpdate.php b/vendor/magento/module-staging/Model/Operation/Update/RescheduleUpdate.php index b19e29128c0..ac4f8eba0c1 100644 --- a/vendor/magento/module-staging/Model/Operation/Update/RescheduleUpdate.php +++ b/vendor/magento/module-staging/Model/Operation/Update/RescheduleUpdate.php @@ -14,9 +14,6 @@ use Magento\Framework\App\ResourceConnection; use Magento\Staging\Api\UpdateRepositoryInterface; use Magento\Staging\Model\VersionManager; -/** - * Class RescheduleUpdate - */ class RescheduleUpdate { /** @@ -228,6 +225,8 @@ class RescheduleUpdate } /** + * Update entity + * * @param EntityMetadataInterface $metadata * @param UpdateInterface $origin * @param UpdateInterface $target @@ -273,22 +272,23 @@ class RescheduleUpdate $hydrator = $this->hydratorPool->getHydrator($entityType); $entityData = $hydrator->extract($entity); $identifier = $entityData[$metadata->getIdentifierField()]; + $rollbackId = $origin->getRollbackId() ?: $entityData['updated_in']; $connection = $this->resourceConnection->getConnectionByName($metadata->getEntityConnectionName()); $connection->update( $metadata->getEntityTable(), [ - 'updated_in' => $this->getNextForRollback($metadata, $origin->getRollbackId(), $identifier), + 'updated_in' => $this->getNextForRollback($metadata, $rollbackId, $identifier), ], [ $metadata->getIdentifierField() . ' = ?' => $identifier, - 'created_in = ?' => $this->getPreviousForRollback($metadata, $origin->getRollbackId(), $identifier) + 'created_in = ?' => $this->getPreviousForRollback($metadata, $rollbackId, $identifier) ] ); $connection->delete( $metadata->getEntityTable(), [ $metadata->getIdentifierField() . ' = ?' => $identifier, - 'created_in = ?' => $origin->getRollbackId() + 'created_in = ?' => $rollbackId ] ); return true; @@ -335,7 +335,7 @@ class RescheduleUpdate $connection = $this->resourceConnection->getConnectionByName($metadata->getEntityConnectionName()); $connection->beginTransaction(); try { - if ($origin->getRollbackId()) { + if ($origin->getRollbackId() || !$target->getRollbackId()) { $this->purgeRollbackEntry($entityType, $entity, $origin); } $this->moveEntityVersion($entityType, $entity, $origin, $target);