diff --git a/business/itop.business.class.inc.php b/business/itop.business.class.inc.php index 9be25dd95..2c4ac2289 100644 --- a/business/itop.business.class.inc.php +++ b/business/itop.business.class.inc.php @@ -496,7 +496,7 @@ class lnkContactRealObject extends cmdbAbstractObject * can be part of an GroupInfra */ //////////////////////////////////////////////////////////////////////////////////// -class logInfra extends logRealObject +abstract class logInfra extends logRealObject { public static function Init() { diff --git a/core/metamodel.class.php b/core/metamodel.class.php index ca5660238..78801892c 100644 --- a/core/metamodel.class.php +++ b/core/metamodel.class.php @@ -331,7 +331,7 @@ abstract class MetaModel $aTables = array(); foreach (self::GetClasses() as $sClass) { - if (self::IsAbstract($sClass)) continue; + if (!self::HasTable($sClass)) continue; $sTable = self::DBGetTable($sClass); // Could be completed later with all the classes that are using a given table @@ -1262,10 +1262,16 @@ abstract class MetaModel return array(); } + public static function HasTable($sClass) + { + if (strlen(self::DBGetTable($sClass)) == 0) return false; + return true; + } + public static function IsAbstract($sClass) { - if (strlen(self::DBGetTable($sClass)) == 0) return true; - return false; + $oReflection = new ReflectionClass($sClass); + return $oReflection->isAbstract(); } protected static $m_aQueryStructCache = array(); @@ -1790,8 +1796,6 @@ abstract class MetaModel $aSugFix = array(); foreach (self::GetClasses() as $sClass) { - if (self::IsAbstract($sClass)) continue; - $sNameAttCode = self::GetNameAttributeCode($sClass); if (empty($sNameAttCode)) { @@ -1806,12 +1810,15 @@ abstract class MetaModel } foreach(self::GetReconcKeys($sClass) as $sReconcKeyAttCode) - if (!empty($sReconcKeyAttCode) && !self::IsValidAttCode($sClass, $sReconcKeyAttCode)) { - $aErrors[$sClass][] = "Unkown attribute code '".$sReconcKeyAttCode."' in the list of reconciliation keys"; - $aSugFix[$sClass][] = "Expecting a value in ".implode(", ", self::GetAttributesList($sClass)); + if (!empty($sReconcKeyAttCode) && !self::IsValidAttCode($sClass, $sReconcKeyAttCode)) + { + $aErrors[$sClass][] = "Unkown attribute code '".$sReconcKeyAttCode."' in the list of reconciliation keys"; + $aSugFix[$sClass][] = "Expecting a value in ".implode(", ", self::GetAttributesList($sClass)); + } } + $bHasWritableAttribute = false; foreach(self::ListAttributeDefs($sClass) as $sAttCode=>$oAttDef) { // It makes no sense to check the attributes again and again in the subclasses @@ -1872,6 +1879,7 @@ abstract class MetaModel // Check dependencies if ($oAttDef->IsWritable()) { + $bHasWritableAttribute = true; foreach ($oAttDef->GetPrerequisiteAttributes() as $sDependOnAttCode) { if (!self::IsValidAttCode($sClass, $sDependOnAttCode)) @@ -1959,6 +1967,16 @@ abstract class MetaModel } } + if ($bHasWritableAttribute) + { + if (!self::HasTable($sClass)) + { + $aErrors[$sClass][] = "No table has been defined for this class"; + $aSugFix[$sClass][] = "Either define a table name or move the attributes elsewhere"; + } + } + + // ZList // foreach(self::EnumZLists() as $sListCode) @@ -2186,7 +2204,7 @@ abstract class MetaModel $sRes .= "\n"; foreach (self::GetClasses($sCategory) as $sClass) { - if (self::IsAbstract($sClass)) continue; + if (!self::HasTable($sClass)) continue; $bNotInDico = false; @@ -2264,7 +2282,7 @@ abstract class MetaModel $aSugFix = array(); foreach (self::GetClasses() as $sClass) { - if (self::IsAbstract($sClass)) continue; + if (!self::HasTable($sClass)) continue; // Check that the table exists // @@ -2496,7 +2514,7 @@ abstract class MetaModel { foreach (self::GetClasses() as $sClass) { - if (self::IsAbstract($sClass)) continue; + if (!self::HasTable($sClass)) continue; $sRootClass = self::GetRootClass($sClass); $sTable = self::DBGetTable($sClass); $sKeyField = self::DBGetKey($sClass); @@ -2705,7 +2723,7 @@ abstract class MetaModel $aTable2ClassProp = array(); foreach (self::GetClasses() as $sClass) { - if (self::IsAbstract($sClass)) continue; + if (!self::HasTable($sClass)) continue; $sRootClass = self::GetRootClass($sClass); $sTable = self::DBGetTable($sClass); diff --git a/core/test.class.inc.php b/core/test.class.inc.php index 9924b11f9..d65364615 100644 --- a/core/test.class.inc.php +++ b/core/test.class.inc.php @@ -538,7 +538,7 @@ abstract class TestBizModelGeneric extends TestBizModel { foreach(MetaModel::GetClasses() as $sClassName) { - if (MetaModel::IsAbstract($sClassName)) continue; + if (MetaModel::HasTable($sClassName)) continue; $oNobody = MetaModel::GetObject($sClassName, 123); $oBaby = new $sClassName; diff --git a/pages/schema.php b/pages/schema.php index a49a68eeb..2682e1c5f 100644 --- a/pages/schema.php +++ b/pages/schema.php @@ -302,6 +302,14 @@ function DisplayClassesList($oPage) function DisplayClassDetails($oPage, $sClass) { $oPage->p("