diff --git a/core/dbobject.class.php b/core/dbobject.class.php index 21741a77f..e0cda52ec 100644 --- a/core/dbobject.class.php +++ b/core/dbobject.class.php @@ -2152,8 +2152,14 @@ abstract class DBObject implements iDisplay $sMessageKey = "Class:$sClass/UniquenessRule:$sUniquenessRuleId"; $sTemplate = Dict::S($sMessageKey, ''); - if (empty($sTemplate)) - { + if (empty($sTemplate)) { + + // Generic (class independent) uniqueness rule + $sUniquenessRuleGenericMessage = $this->GetUniquenessRuleGenericMessage($sCurrentClass, $sUniquenessRuleId); + if ($sUniquenessRuleGenericMessage !== null) { + return $sUniquenessRuleGenericMessage; + } + // we could add also a specific message if user is admin ("dict key is missing") return Dict::Format('Core:UniquenessDefaultError', $sUniquenessRuleId); } @@ -2164,9 +2170,67 @@ abstract class DBObject implements iDisplay } /** - * - * @internal - * + * GetUniquenessRuleGenericMessage. + * + * @param string $sCurrentClass + * @param string $sUniquenessRuleId + * + * @return string|null + * @since 3.1.0 + */ + private function GetUniquenessRuleGenericMessage(string $sCurrentClass, string $sUniquenessRuleId): ?string + { + // Dict placeholders data + $aPlaceholdersData = []; + + try { + // Retrieve class uniqueness rules + $aUniquenessRules = MetaModel::GetUniquenessRules($sCurrentClass); + + // Retrieve rule properties + if (!array_key_exists($sUniquenessRuleId, $aUniquenessRules)) { + return null; + } + $aUniquenessRuleProperties = $aUniquenessRules[$sUniquenessRuleId]; + + // Check generic message existence + $sMessageKey = "Class:cmdbAbstractObject/UniquenessRule:$sUniquenessRuleId"; + if (!Dict::Exists($sMessageKey)) { + return null; + } + + // Retrieve rule attributes + if (array_key_exists('attributes', $aUniquenessRuleProperties)) { + + // Retrieve attributes + $aAttributes = $aUniquenessRuleProperties['attributes']; + + // Compute attributes data... + foreach ($aAttributes as $sAttCode) { + $oAttDef = MetaModel::GetAttributeDef($sCurrentClass, $sAttCode); + if ($oAttDef instanceof AttributeExternalKey) { + $aPlaceholdersData[] = $oAttDef->GetTargetClass(); + $aPlaceholdersData[] = MetaModel::GetObject($oAttDef->GetTargetClass(), $this->Get($sAttCode))->Get('friendlyname'); + } else { + $aPlaceholdersData[] = $oAttDef->GetLabel(); + $aPlaceholdersData[] = $oAttDef->GetLabel($this->Get($sAttCode)); + } + } + } + + return Dict::Format($sMessageKey, ...$aPlaceholdersData); + } + catch (Exception $e) { + ExceptionLog::LogException($e); + + return null; + } + } + + /** + * + * @internal + * * @param string $sUniquenessRuleId uniqueness rule ID * @param array $aUniquenessRuleProperties uniqueness rule properties * diff --git a/dictionaries/core/uniqueness-rule/en.dictionary.itop.uniqueness-rule.php b/dictionaries/core/uniqueness-rule/en.dictionary.itop.uniqueness-rule.php new file mode 100644 index 000000000..2a23cb90d --- /dev/null +++ b/dictionaries/core/uniqueness-rule/en.dictionary.itop.uniqueness-rule.php @@ -0,0 +1,26 @@ + + */ + +Dict::Add('EN US', 'English', 'English', [ + 'Class:cmdbAbstractObject/UniquenessRule:no_duplicate' => '%1$s: %2$s is already linked to %3$s: %4$s, duplicates are not allowed on this relation.', +]); diff --git a/dictionaries/core/uniqueness-rule/fr.dictionary.itop.uniqueness-rule.php b/dictionaries/core/uniqueness-rule/fr.dictionary.itop.uniqueness-rule.php new file mode 100644 index 000000000..33da7773a --- /dev/null +++ b/dictionaries/core/uniqueness-rule/fr.dictionary.itop.uniqueness-rule.php @@ -0,0 +1,26 @@ + + */ + +Dict::Add('FR FR', 'French', 'Français', [ + 'Class:cmdbAbstractObject/UniquenessRule:no_duplicate' => '%1$s : %2$s est déjà lié à %3$s : %4$s, les doublons ne sont pas autorisés sur cette relation.', +]);