diff --git a/core/attributedef.class.inc.php b/core/attributedef.class.inc.php index 642f990ed..2259cbc16 100644 --- a/core/attributedef.class.inc.php +++ b/core/attributedef.class.inc.php @@ -6830,15 +6830,10 @@ class AttributeTagSet extends AttributeDBFieldVoid $aGoodTags[] = $sTagCode; if (count($aGoodTags) === $this->GetTagMaxNb()) { - // extra tags are ignored + // extra and bad tags are ignored continue; } } - else - { - // Ignore bad tags from database - IssueLog::Warning("Unknown tag $sTagCode for $sClass::$sAttCode found in database, ignored."); - } } $oTagSet->SetValue($aGoodTags); @@ -7082,36 +7077,12 @@ class AttributeTagSet extends AttributeDBFieldVoid $aAllowedTags = TagSetFieldData::GetAllowedValues(MetaModel::GetAttributeOrigin($this->GetHostClass(), $this->GetCode()), $this->GetCode()); - if (!empty($aDelta['added'])) - { - $aAdded = array(); - foreach($aDelta['added'] as $idx => $sTagCode) - { - $sTagLabel = $sTagCode; - foreach($aAllowedTags as $oTag) - { - if ($sTagCode === $oTag->Get('tag_code')) - { - $sTagLabel = $oTag->Get('tag_label'); - } - } - $aAdded[] = $sTagLabel; - } - - $sAdded = $this->GenerateViewHtmlForValues($aAdded); - $sResult .= Dict::Format('Change:LinkSet:Added', $sAdded); - } - if (!empty($aDelta['removed'])) { - if (!empty($sAdded)) - { - $sResult .= ', '; - } - $aRemoved = array(); foreach($aDelta['removed'] as $idx => $sTagCode) { + if (empty($sTagCode)) {continue;} $sTagLabel = $sTagCode; foreach($aAllowedTags as $oTag) { @@ -7124,7 +7095,39 @@ class AttributeTagSet extends AttributeDBFieldVoid } $sRemoved = $this->GenerateViewHtmlForValues($aRemoved); - $sResult .= Dict::Format('Change:LinkSet:Removed', $sRemoved); + if (!empty($sRemoved)) + { + $sResult .= Dict::Format('Change:LinkSet:Removed', $sRemoved); + } + } + + if (!empty($aDelta['added'])) + { + if (!empty($sRemoved)) + { + $sResult .= ', '; + } + + $aAdded = array(); + foreach($aDelta['added'] as $idx => $sTagCode) + { + if (empty($sTagCode)) {continue;} + $sTagLabel = $sTagCode; + foreach($aAllowedTags as $oTag) + { + if ($sTagCode === $oTag->Get('tag_code')) + { + $sTagLabel = $oTag->Get('tag_label'); + } + } + $aAdded[] = $sTagLabel; + } + + $sAdded = $this->GenerateViewHtmlForValues($aAdded); + if (!empty($sAdded)) + { + $sResult .= Dict::Format('Change:LinkSet:Added', $sAdded); + } } return $sResult; @@ -7142,6 +7145,7 @@ class AttributeTagSet extends AttributeDBFieldVoid */ private function GenerateViewHtmlForValues($aValues, $sCssClass = 'attribute-tagset') { + if (empty($aValues)) {return '';} $sHtml = ''; foreach($aValues as $oTag) { diff --git a/core/metamodel.class.php b/core/metamodel.class.php index 004530f7a..c1ba6c964 100644 --- a/core/metamodel.class.php +++ b/core/metamodel.class.php @@ -7103,12 +7103,6 @@ abstract class MetaModel return $sRet; } - public static function GetTagDataClass($sClass, $sAttCode) - { - $sTagSuffix = $sClass.'_'.$sAttCode; - return 'TagSetFieldDataFor_'.$sTagSuffix; - } - } diff --git a/core/ormtagset.class.inc.php b/core/ormtagset.class.inc.php index 4849ea1bc..729063533 100644 --- a/core/ormtagset.class.inc.php +++ b/core/ormtagset.class.inc.php @@ -595,7 +595,7 @@ final class ormTagSet public function GetTagDataClass() { - return MetaModel::GetTagDataClass($this->sClass, $this->sAttCode); + return TagSetFieldData::GetTagDataClassName($this->sClass, $this->sAttCode); } } \ No newline at end of file diff --git a/core/tagsetfield.class.inc.php b/core/tagsetfield.class.inc.php index 0087beef6..3980efd0f 100644 --- a/core/tagsetfield.class.inc.php +++ b/core/tagsetfield.class.inc.php @@ -101,6 +101,13 @@ abstract class TagSetFieldData extends cmdbAbstractObject $this->_Set('tag_attcode', $aRes['tag_attcode']); } + public static function GetTagDataClassName($sClass, $sAttCode) + { + $sTagSuffix = $sClass.'__'.$sAttCode; + + return 'TagSetFieldDataFor_'.$sTagSuffix; + } + /** * Extract Tag class and attcode from the TagFieldData class name * @@ -113,7 +120,7 @@ abstract class TagSetFieldData extends cmdbAbstractObject { $aRes = array(); // Extract class and attcode from class name using pattern TagSetFieldDataFor__>; - if (preg_match('@^TagSetFieldDataFor_(?\w+)_(?\w+)$@', $sClassName, $aMatches)) + if (preg_match('@^TagSetFieldDataFor_(?\w+)__(?\w+)$@', $sClassName, $aMatches)) { $aRes['tag_class'] = $aMatches['class']; $aRes['tag_attcode'] = $aMatches['attcode']; @@ -144,7 +151,7 @@ abstract class TagSetFieldData extends cmdbAbstractObject $this->m_aDeleteIssues[] = Dict::S('Core:TagSetFieldData:ErrorDeleteUsedTag'); } // Clear cache - $sTagDataClass = MetaModel::GetTagDataClass($sClass, $sAttCode); + $sTagDataClass = self::GetTagDataClassName($sClass, $sAttCode); unset(self::$m_aAllowedValues[$sTagDataClass]); } @@ -199,7 +206,7 @@ abstract class TagSetFieldData extends cmdbAbstractObject $this->m_aCheckIssues[] = Dict::S('Core:TagSetFieldData:ErrorDuplicateTagCodeOrLabel'); } // Clear cache - $sTagDataClass = MetaModel::GetTagDataClass($sClass, $sAttCode); + $sTagDataClass = self::GetTagDataClassName($sClass, $sAttCode); unset(self::$m_aAllowedValues[$sTagDataClass]); parent::DoCheckToWrite(); @@ -275,7 +282,7 @@ abstract class TagSetFieldData extends cmdbAbstractObject { try { - $aTagFieldInfo = TagSetFieldData::ExtractTagFieldName($sClass); + $aTagFieldInfo = self::ExtractTagFieldName($sClass); } catch (CoreException $e) { return $sClass; @@ -305,7 +312,7 @@ abstract class TagSetFieldData extends cmdbAbstractObject public static function GetAllowedValues($sClass, $sAttCode) { $sClass = MetaModel::GetAttributeOrigin($sClass, $sAttCode); - $sTagDataClass = MetaModel::GetTagDataClass($sClass, $sAttCode); + $sTagDataClass = self::GetTagDataClassName($sClass, $sAttCode); if (!isset(self::$m_aAllowedValues[$sTagDataClass])) { $oSearch = new DBObjectSearch($sTagDataClass); diff --git a/setup/compiler.class.inc.php b/setup/compiler.class.inc.php index c69ec826e..d3002c639 100644 --- a/setup/compiler.class.inc.php +++ b/setup/compiler.class.inc.php @@ -1855,8 +1855,7 @@ EOF; ); foreach ($aTagFieldsInfo as $sTagFieldName) { - $sTagSuffix = $sClassName.'_'.$sTagFieldName; - $sTagClassName = 'TagSetFieldDataFor_'.$sTagSuffix; + $sTagClassName = static::GetTagDataClassName($sClassName, $sTagFieldName); $sTagClassParams = var_export($aTagClassParams, true); $sPHP .= $this->GeneratePhpCodeForClass($sTagClassName, $sTagClassParentClass, $sTagClassParams); } @@ -1865,6 +1864,12 @@ EOF; return $sPHP; } + private static function GetTagDataClassName($sClass, $sAttCode) + { + $sTagSuffix = $sClass.'__'.$sAttCode; + + return 'TagSetFieldDataFor_'.$sTagSuffix; + } /** * @param $oMenu diff --git a/test/ItopDataTestCase.php b/test/ItopDataTestCase.php index e000323f2..fc5f8cbaa 100644 --- a/test/ItopDataTestCase.php +++ b/test/ItopDataTestCase.php @@ -38,6 +38,7 @@ use lnkContactToFunctionalCI; use MetaModel; use Person; use Server; +use TagSetFieldData; use Ticket; use URP_UserProfile; use VirtualHost; @@ -223,7 +224,7 @@ class ItopDataTestCase extends ItopTestCase */ protected function CreateTagData($sClass, $sAttCode, $sTagCode, $sTagLabel, $sTagDescription = '') { - $sTagClass = MetaModel::GetTagDataClass($sClass, $sAttCode); + $sTagClass = TagSetFieldData::GetTagDataClassName($sClass, $sAttCode); $oTagData = $this->createObject($sTagClass, array( 'tag_code' => $sTagCode, 'tag_label' => $sTagLabel, @@ -248,7 +249,7 @@ class ItopDataTestCase extends ItopTestCase */ protected function RemoveTagData($sClass, $sAttCode, $sTagCode) { - $sTagClass = MetaModel::GetTagDataClass($sClass, $sAttCode); + $sTagClass = TagSetFieldData::GetTagDataClassName($sClass, $sAttCode); $this->RemoveObjects($sTagClass, "SELECT $sTagClass WHERE tag_code = '$sTagCode'"); } diff --git a/test/core/TagSetFieldDataTest.php b/test/core/TagSetFieldDataTest.php index 4ba862d46..83e989d36 100644 --- a/test/core/TagSetFieldDataTest.php +++ b/test/core/TagSetFieldDataTest.php @@ -129,7 +129,7 @@ class TagSetFieldDataTest extends ItopDataTestCase */ public function testComputeValues() { - $sTagClass = \MetaModel::GetTagDataClass(TAG_CLASS, TAG_ATTCODE); + $sTagClass = TagSetFieldData::GetTagDataClassName(TAG_CLASS, TAG_ATTCODE); $oTagData = $this->createObject($sTagClass, array( 'tag_code' => 'tag1', 'tag_label' => 'First',