AbstractEntity.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Eav\Model\Entity\VersionControl;
  7. /**
  8. * Class AbstractEntity
  9. */
  10. abstract class AbstractEntity extends \Magento\Eav\Model\Entity\AbstractEntity
  11. {
  12. /**
  13. * @var \Magento\Framework\Model\ResourceModel\Db\VersionControl\Snapshot
  14. */
  15. protected $entitySnapshot;
  16. /**
  17. * @var \Magento\Framework\Model\ResourceModel\Db\VersionControl\RelationComposite
  18. */
  19. protected $entityRelationComposite;
  20. /**
  21. * @param \Magento\Eav\Model\Entity\Context $context
  22. * @param \Magento\Framework\Model\ResourceModel\Db\VersionControl\Snapshot $entitySnapshot
  23. * @param \Magento\Framework\Model\ResourceModel\Db\VersionControl\RelationComposite $entityRelationComposite
  24. * @param array $data
  25. * @codeCoverageIgnore
  26. */
  27. public function __construct(
  28. \Magento\Eav\Model\Entity\Context $context,
  29. \Magento\Framework\Model\ResourceModel\Db\VersionControl\Snapshot $entitySnapshot,
  30. \Magento\Framework\Model\ResourceModel\Db\VersionControl\RelationComposite $entityRelationComposite,
  31. $data = []
  32. ) {
  33. $this->entitySnapshot = $entitySnapshot;
  34. $this->entityRelationComposite = $entityRelationComposite;
  35. parent::__construct($context, $data);
  36. }
  37. /**
  38. * @inheritdoc
  39. */
  40. protected function _afterLoad(\Magento\Framework\DataObject $object)
  41. {
  42. $this->entitySnapshot->registerSnapshot($object);
  43. return parent::_afterLoad($object);
  44. }
  45. /**
  46. * @inheritdoc
  47. */
  48. public function save(\Magento\Framework\Model\AbstractModel $object)
  49. {
  50. /**
  51. * Direct deleted items to delete method
  52. */
  53. if ($object->isDeleted()) {
  54. return $this->delete($object);
  55. }
  56. $this->beginTransaction();
  57. try {
  58. if (!$this->isModified($object)) {
  59. $this->entityRelationComposite->processRelations($object);
  60. $this->commit();
  61. return $this;
  62. }
  63. $object->validateBeforeSave();
  64. $object->beforeSave();
  65. if ($object->isSaveAllowed()) {
  66. if (!$this->isPartialSave()) {
  67. $this->loadAllAttributes($object);
  68. }
  69. if ($this->getEntityTable() == \Magento\Eav\Model\Entity::DEFAULT_ENTITY_TABLE
  70. && !$object->getEntityTypeId()
  71. ) {
  72. $object->setEntityTypeId($this->getTypeId());
  73. }
  74. $object->setParentId((int)$object->getParentId());
  75. $this->objectRelationProcessor->validateDataIntegrity($this->getEntityTable(), $object->getData());
  76. $this->_beforeSave($object);
  77. $this->_processSaveData($this->_collectSaveData($object));
  78. $this->_afterSave($object);
  79. $this->entitySnapshot->registerSnapshot($object);
  80. $object->afterSave();
  81. $this->entityRelationComposite->processRelations($object);
  82. }
  83. $this->addCommitCallback([$object, 'afterCommitCallback'])->commit();
  84. $object->setHasDataChanges(false);
  85. } catch (\Exception $e) {
  86. $this->rollBack();
  87. $object->setHasDataChanges(true);
  88. throw $e;
  89. }
  90. return $this;
  91. }
  92. /**
  93. * Checks if entity was modified
  94. *
  95. * @param \Magento\Framework\Model\AbstractModel $object
  96. * @return bool
  97. * @codeCoverageIgnore
  98. */
  99. protected function isModified(\Magento\Framework\Model\AbstractModel $object)
  100. {
  101. return $this->entitySnapshot->isModified($object);
  102. }
  103. }