From cc4af0a0271a40bc9d598100c1b51b1ee44bbcea Mon Sep 17 00:00:00 2001 From: Eric Espie Date: Tue, 22 Aug 2023 14:30:18 +0200 Subject: [PATCH] =?UTF-8?q?N=C2=B06667=20-=20Ignore=20trigger=20on=20state?= =?UTF-8?q?=20entering=20with=20auto-dispatch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/dbobject.class.php | 71 +++++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 31 deletions(-) diff --git a/core/dbobject.class.php b/core/dbobject.class.php index 9673f79d1..dca939b16 100644 --- a/core/dbobject.class.php +++ b/core/dbobject.class.php @@ -3574,7 +3574,8 @@ abstract class DBObject implements iDisplay $oKPI->ComputeStatsForExtension($this, 'AfterUpdate'); // - TriggerOnObjectUpdate - $aParams = array('class_list' => MetaModel::EnumParentClasses(get_class($this), ENUM_PARENT_CLASSES_ALL)); + $aClassList = MetaModel::EnumParentClasses(get_class($this), ENUM_PARENT_CLASSES_ALL); + $aParams = array('class_list' => $aClassList); $oSet = new DBObjectSet(DBObjectSearch::FromOQL('SELECT TriggerOnObjectUpdate AS t WHERE t.target_class IN (:class_list)'), array(), $aParams); while ($oTrigger = $oSet->Fetch()) { @@ -3588,6 +3589,44 @@ abstract class DBObject implements iDisplay } } + $sClass = get_class($this); + if (MetaModel::HasLifecycle($sClass)) + { + $sStateAttCode = MetaModel::GetStateAttributeCode($sClass); + if (isset($this->m_aPreviousValuesForUpdatedAttributes[$sStateAttCode])) { + $sPreviousState = $this->m_aPreviousValuesForUpdatedAttributes[$sStateAttCode]; + // Change state triggers... + $aParams = array( + 'class_list' => MetaModel::EnumParentClasses($sClass, ENUM_PARENT_CLASSES_ALL), + 'previous_state' => $sPreviousState, + 'new_state' => $this->Get($sStateAttCode), + ); + $oSet = new DBObjectSet(DBObjectSearch::FromOQL('SELECT TriggerOnStateLeave AS t WHERE t.target_class IN (:class_list) AND t.state=:previous_state'), array(), $aParams); + while ($oTrigger = $oSet->Fetch()) { + /** @var \TriggerOnStateLeave $oTrigger */ + try { + $oTrigger->DoActivate($this->ToArgs('this')); + } + catch (Exception $e) { + $oTrigger->LogException($e, $this); + utils::EnrichRaisedException($oTrigger, $e); + } + } + + $oSet = new DBObjectSet(DBObjectSearch::FromOQL('SELECT TriggerOnStateEnter AS t WHERE t.target_class IN (:class_list) AND t.state=:new_state'), array(), $aParams); + while ($oTrigger = $oSet->Fetch()) { + /** @var \TriggerOnStateEnter $oTrigger */ + try { + $oTrigger->DoActivate($this->ToArgs('this')); + } + catch (Exception $e) { + $oTrigger->LogException($e, $this); + utils::EnrichRaisedException($oTrigger, $e); + } + } + } + } + // Activate any existing trigger // - TriggerOnObjectMention // Forgotten by the fix of N°3245 @@ -4283,36 +4322,6 @@ abstract class DBObject implements iDisplay $this->DBWrite(); } - // Change state triggers... - $aParams = array( - 'class_list' => MetaModel::EnumParentClasses($sClass, ENUM_PARENT_CLASSES_ALL), - 'previous_state' => $sPreviousState, - 'new_state' => $sNewState, - ); - $oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT TriggerOnStateLeave AS t WHERE t.target_class IN (:class_list) AND t.state=:previous_state"), array(), $aParams); - while ($oTrigger = $oSet->Fetch()) { - /** @var \TriggerOnStateLeave $oTrigger */ - try { - $oTrigger->DoActivate($this->ToArgs('this')); - } - catch (Exception $e) { - $oTrigger->LogException($e, $this); - utils::EnrichRaisedException($oTrigger, $e); - } - } - - $oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT TriggerOnStateEnter AS t WHERE t.target_class IN (:class_list) AND t.state=:new_state"), array(), $aParams); - while ($oTrigger = $oSet->Fetch()) { - /** @var \TriggerOnStateEnter $oTrigger */ - try { - $oTrigger->DoActivate($this->ToArgs('this')); - } - catch (Exception $e) { - $oTrigger->LogException($e, $this); - utils::EnrichRaisedException($oTrigger, $e); - } - } - $this->FireEvent(EVENT_DB_AFTER_APPLY_STIMULUS, $aEventData); } else