diff --git a/application/Espo/Core/ORM/Repositories/RDB.php b/application/Espo/Core/ORM/Repositories/RDB.php index 02bdc2e300..6ff70c990c 100644 --- a/application/Espo/Core/ORM/Repositories/RDB.php +++ b/application/Espo/Core/ORM/Repositories/RDB.php @@ -55,6 +55,8 @@ class RDB extends \Espo\ORM\Repositories\RDB implements Injectable protected $processFieldsBeforeSaveDisabled = false; + protected $processFieldsAfterRemoveDisabled = false; + protected function addDependency($name) { $this->dependencies[] = $name; @@ -206,6 +208,11 @@ class RDB extends \Espo\ORM\Repositories\RDB implements Injectable protected function afterRemove(Entity $entity, array $options = array()) { parent::afterRemove($entity, $options); + + if (!$this->processFieldsAfterRemoveDisabled) { + $this->processArrayFieldsRemove($entity); + } + if (!$this->hooksDisabled && empty($options['skipHooks'])) { $this->getEntityManager()->getHookManager()->process($this->entityType, 'afterRemove', $entity, $options); } @@ -418,6 +425,16 @@ class RDB extends \Espo\ORM\Repositories\RDB implements Injectable } } + protected function processArrayFieldsRemove(Entity $entity) + { + foreach ($entity->getAttributes() as $attribute => $defs) { + if (!isset($defs['type']) || $defs['type'] !== Entity::JSON_ARRAY) continue; + if (!$entity->getAttributeParam($attribute, 'storeArrayValues')) continue; + if ($entity->getAttributeParam($attribute, 'notStorable')) continue; + $this->getEntityManager()->getRepository('ArrayValue')->deleteEntityAttribute($entity, $attribute); + } + } + protected function processEmailAddressSave(Entity $entity) { if ($entity->hasRelation('emailAddresses') && $entity->hasAttribute('emailAddress')) { diff --git a/application/Espo/Repositories/ActionHistoryRecord.php b/application/Espo/Repositories/ActionHistoryRecord.php index ca730dbe23..4bbae30339 100644 --- a/application/Espo/Repositories/ActionHistoryRecord.php +++ b/application/Espo/Repositories/ActionHistoryRecord.php @@ -38,4 +38,6 @@ class ActionHistoryRecord extends \Espo\Core\ORM\Repositories\RDB protected $processFieldsAfterSaveDisabled = true; protected $processFieldsBeforeSaveDisabled = true; + + protected $processFieldsAfterRemoveDisabled = true; } diff --git a/application/Espo/Repositories/ArrayValue.php b/application/Espo/Repositories/ArrayValue.php index 1c4e2bca26..ecb8190f2f 100644 --- a/application/Espo/Repositories/ArrayValue.php +++ b/application/Espo/Repositories/ArrayValue.php @@ -41,6 +41,8 @@ class ArrayValue extends \Espo\Core\ORM\Repositories\RDB protected $processFieldsBeforeSaveDisabled = true; + protected $processFieldsAfterRemoveDisabled = true; + public function storeEntityAttribute(Entity $entity, $attribute, $populateMode = false) { if (!$entity->getAttributeType($attribute) === Entity::JSON_ARRAY) { @@ -92,4 +94,20 @@ class ArrayValue extends \Espo\Core\ORM\Repositories\RDB $this->save($arrayValue); } } + + public function deleteEntityAttribute(Entity $entity, $attribute) + { + if (!$entity->id) { + throw new Error("ArrayValue: Can't delete {$attribute} w/o id given."); + } + $list = $this->select(['id'])->where([ + 'entityType' => $entity->getEntityType(), + 'entityId' => $entity->id, + 'attribute' => $attribute + ])->find(); + + foreach ($list as $arrayValue) { + $this->deleteFromDb($arrayValue->id); + } + } } diff --git a/application/Espo/Repositories/AuthFailLogRecord.php b/application/Espo/Repositories/AuthFailLogRecord.php index 8625f75f30..3324193dfe 100644 --- a/application/Espo/Repositories/AuthFailLogRecord.php +++ b/application/Espo/Repositories/AuthFailLogRecord.php @@ -38,4 +38,6 @@ class AuthFailLogRecord extends \Espo\Core\ORM\Repositories\RDB protected $processFieldsAfterSaveDisabled = true; protected $processFieldsBeforeSaveDisabled = true; + + protected $processFieldsAfterRemoveDisabled = true; } diff --git a/application/Espo/Repositories/AuthLogRecord.php b/application/Espo/Repositories/AuthLogRecord.php index e94269d2e8..929aae743f 100644 --- a/application/Espo/Repositories/AuthLogRecord.php +++ b/application/Espo/Repositories/AuthLogRecord.php @@ -38,4 +38,6 @@ class AuthLogRecord extends \Espo\Core\ORM\Repositories\RDB protected $processFieldsAfterSaveDisabled = true; protected $processFieldsBeforeSaveDisabled = true; + + protected $processFieldsAfterRemoveDisabled = true; } diff --git a/application/Espo/Repositories/AuthToken.php b/application/Espo/Repositories/AuthToken.php index 9739ec557e..8655966970 100644 --- a/application/Espo/Repositories/AuthToken.php +++ b/application/Espo/Repositories/AuthToken.php @@ -38,4 +38,6 @@ class AuthToken extends \Espo\Core\ORM\Repositories\RDB protected $processFieldsAfterSaveDisabled = true; protected $processFieldsBeforeSaveDisabled = true; + + protected $processFieldsAfterRemoveDisabled = true; } diff --git a/application/Espo/Repositories/EmailAddress.php b/application/Espo/Repositories/EmailAddress.php index 001e6628f9..48ffbf2e93 100644 --- a/application/Espo/Repositories/EmailAddress.php +++ b/application/Espo/Repositories/EmailAddress.php @@ -37,6 +37,8 @@ class EmailAddress extends \Espo\Core\ORM\Repositories\RDB protected $processFieldsBeforeSaveDisabled = true; + protected $processFieldsAfterRemoveDisabled = true; + protected function init() { parent::init(); diff --git a/application/Espo/Repositories/Job.php b/application/Espo/Repositories/Job.php index eceae57a86..79dc92ca39 100644 --- a/application/Espo/Repositories/Job.php +++ b/application/Espo/Repositories/Job.php @@ -39,6 +39,8 @@ class Job extends \Espo\Core\ORM\Repositories\RDB protected $processFieldsBeforeSaveDisabled = true; + protected $processFieldsAfterRemoveDisabled = true; + protected function init() { parent::init(); diff --git a/application/Espo/Repositories/NextNumber.php b/application/Espo/Repositories/NextNumber.php index 8f6c799632..847e0f1ceb 100644 --- a/application/Espo/Repositories/NextNumber.php +++ b/application/Espo/Repositories/NextNumber.php @@ -38,4 +38,6 @@ class NextNumber extends \Espo\Core\ORM\Repositories\RDB protected $processFieldsAfterSaveDisabled = true; protected $processFieldsBeforeSaveDisabled = true; + + protected $processFieldsAfterRemoveDisabled = true; } diff --git a/application/Espo/Repositories/PhoneNumber.php b/application/Espo/Repositories/PhoneNumber.php index 83485cbe7e..604d986948 100644 --- a/application/Espo/Repositories/PhoneNumber.php +++ b/application/Espo/Repositories/PhoneNumber.php @@ -37,6 +37,8 @@ class PhoneNumber extends \Espo\Core\ORM\Repositories\RDB protected $processFieldsBeforeSaveDisabled = true; + protected $processFieldsAfterRemoveDisabled = true; + protected function init() { parent::init(); diff --git a/application/Espo/Repositories/ScheduledJob.php b/application/Espo/Repositories/ScheduledJob.php index ded8201dea..6363b1e8e0 100644 --- a/application/Espo/Repositories/ScheduledJob.php +++ b/application/Espo/Repositories/ScheduledJob.php @@ -38,4 +38,6 @@ class ScheduledJob extends \Espo\Core\ORM\Repositories\RDB protected $processFieldsAfterSaveDisabled = true; protected $processFieldsBeforeSaveDisabled = true; + + protected $processFieldsAfterRemoveDisabled = true; } diff --git a/application/Espo/Repositories/UniqueId.php b/application/Espo/Repositories/UniqueId.php index 9f587281aa..46db82d51f 100644 --- a/application/Espo/Repositories/UniqueId.php +++ b/application/Espo/Repositories/UniqueId.php @@ -39,6 +39,8 @@ class UniqueId extends \Espo\Core\ORM\Repositories\RDB protected $processFieldsBeforeSaveDisabled = true; + protected $processFieldsAfterRemoveDisabled = true; + protected function getNewEntity() { $entity = parent::getNewEntity();