|
|
|
|
@@ -1119,9 +1119,7 @@ abstract class MetaModel
|
|
|
|
|
return self::$m_aAttribOrigins[$sClass][$sAttCode];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @deprecated do not use : dead code, will be removed in the future
|
|
|
|
|
*
|
|
|
|
|
/** *
|
|
|
|
|
* @param string $sClass
|
|
|
|
|
* @param string $sAttCode
|
|
|
|
|
*
|
|
|
|
|
@@ -1130,9 +1128,11 @@ abstract class MetaModel
|
|
|
|
|
*/
|
|
|
|
|
final public static function GetFilterCodeOrigin($sClass, $sAttCode)
|
|
|
|
|
{
|
|
|
|
|
self::_check_subclass($sClass);
|
|
|
|
|
if ($sAttCode == 'id') {
|
|
|
|
|
return MetaModel::GetRootClass($sClass);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return self::$m_aFilterOrigins[$sClass][$sAttCode];
|
|
|
|
|
return MetaModel::GetAttributeOrigin($sClass, self::$m_aFilterAttribList[$sClass][$sAttCode]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@@ -1481,7 +1481,6 @@ abstract class MetaModel
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @deprecated do not use : dead code, will be removed in the future
|
|
|
|
|
*
|
|
|
|
|
* @param string $sClass
|
|
|
|
|
*
|
|
|
|
|
@@ -1490,11 +1489,9 @@ abstract class MetaModel
|
|
|
|
|
*/
|
|
|
|
|
final public static function GetFiltersList($sClass)
|
|
|
|
|
{
|
|
|
|
|
// cannot notify depreciation for now as this is still MASSIVELY used in iTop core !
|
|
|
|
|
//DeprecatedCallsLog::NotifyDeprecatedPhpMethod('do not use : dead code, will be removed in the future');
|
|
|
|
|
self::_check_subclass($sClass);
|
|
|
|
|
|
|
|
|
|
return array_keys(self::$m_aFilterDefs[$sClass]);
|
|
|
|
|
return array_keys(self::$m_aFilterAttribList[$sClass]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@@ -1564,9 +1561,7 @@ abstract class MetaModel
|
|
|
|
|
$oKeyAttDef = MetaModel::GetAttributeDef($sClass, $sExtKeyAttCode);
|
|
|
|
|
$sRemoteClass = $oKeyAttDef->GetTargetClass();
|
|
|
|
|
$bRes = MetaModel::IsValidAttCode($sRemoteClass, $sRemoteAttCode, true);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
} else {
|
|
|
|
|
$bRes = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -1591,7 +1586,6 @@ abstract class MetaModel
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @deprecated do not use : dead code, will be removed in the future
|
|
|
|
|
*
|
|
|
|
|
* @param string $sClass
|
|
|
|
|
* @param string $sFilterCode
|
|
|
|
|
@@ -1600,13 +1594,11 @@ abstract class MetaModel
|
|
|
|
|
*/
|
|
|
|
|
final public static function IsValidFilterCode($sClass, $sFilterCode)
|
|
|
|
|
{
|
|
|
|
|
// cannot notify depreciation for now as this is still MASSIVELY used in iTop core !
|
|
|
|
|
//DeprecatedCallsLog::NotifyDeprecatedPhpMethod('do not use : dead code, will be removed in the future');
|
|
|
|
|
if (!array_key_exists($sClass, self::$m_aFilterDefs)) {
|
|
|
|
|
if (!array_key_exists($sClass, self::$m_aFilterAttribList)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (array_key_exists($sFilterCode, self::$m_aFilterDefs[$sClass]));
|
|
|
|
|
return (array_key_exists($sFilterCode, self::$m_aFilterAttribList[$sClass]));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@@ -1880,31 +1872,21 @@ abstract class MetaModel
|
|
|
|
|
public static function GetDescription($sClass, $sAttCode)
|
|
|
|
|
{
|
|
|
|
|
$oAttDef = self::GetAttributeDef($sClass, $sAttCode);
|
|
|
|
|
if ($oAttDef)
|
|
|
|
|
{
|
|
|
|
|
if ($oAttDef) {
|
|
|
|
|
return $oAttDef->GetDescription();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Filters of a given class may contain filters defined in a parent class
|
|
|
|
|
* - Some filters are a copy of the definition
|
|
|
|
|
* - Some filters correspond to the upper class table definition (compound objects)
|
|
|
|
|
* (see also attributes definition)
|
|
|
|
|
*
|
|
|
|
|
* @deprecated do not use : dead code, will be removed in the future
|
|
|
|
|
* @var array array of ("classname" => array filterdef)
|
|
|
|
|
* @var array array of (FilterCode => AttributeCode)
|
|
|
|
|
*/
|
|
|
|
|
private static $m_aFilterDefs = array();
|
|
|
|
|
/**
|
|
|
|
|
* @deprecated do not use : dead code, will be removed in the future
|
|
|
|
|
* @var array array of ("classname" => array of ("attcode"=>"sourceclass"))
|
|
|
|
|
*/
|
|
|
|
|
private static $m_aFilterOrigins = array();
|
|
|
|
|
private static $m_aFilterAttribList = array();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @deprecated do not use : dead code, will be removed in the future
|
|
|
|
|
* @deprecated 3.0.0 do not use : dead code, will be removed in the future N°4690 - Deprecate "FilterCodes"
|
|
|
|
|
* instead of array_keys(MetaModel::GetClassFilterDefs($sClass)); use MetaModel::GetFiltersList($sClass)
|
|
|
|
|
*
|
|
|
|
|
* @param string $sClass
|
|
|
|
|
*
|
|
|
|
|
@@ -1914,34 +1896,25 @@ abstract class MetaModel
|
|
|
|
|
public static function GetClassFilterDefs($sClass)
|
|
|
|
|
{
|
|
|
|
|
// cannot notify depreciation for now as this is still MASSIVELY used in iTop core !
|
|
|
|
|
//DeprecatedCallsLog::NotifyDeprecatedPhpMethod('do not use : dead code, will be removed in the future');
|
|
|
|
|
self::_check_subclass($sClass);
|
|
|
|
|
DeprecatedCallsLog::NotifyDeprecatedPhpMethod('do not use MetaModel::GetClassFilterDefs: dead code, will be removed in the future. Use MetaModel::GetFiltersList or MetaModel::GetFiltersAttributes');
|
|
|
|
|
|
|
|
|
|
return self::$m_aFilterDefs[$sClass];
|
|
|
|
|
return self::$m_aFilterAttribList[$sClass];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @deprecated do not use : dead code, will be removed in the future
|
|
|
|
|
*
|
|
|
|
|
* @param string $sClass
|
|
|
|
|
* @param string $sFilterCode
|
|
|
|
|
*
|
|
|
|
|
* @return mixed
|
|
|
|
|
* @return array ($sFilterCode=>$sAttributeCode) + id=>id
|
|
|
|
|
* @throws \CoreException
|
|
|
|
|
*/
|
|
|
|
|
final public static function GetClassFilterDef($sClass, $sFilterCode)
|
|
|
|
|
public static function GetFilterAttribList($sClass)
|
|
|
|
|
{
|
|
|
|
|
DeprecatedCallsLog::NotifyDeprecatedPhpMethod('do not use : dead code, will be removed in the future');
|
|
|
|
|
self::_check_subclass($sClass);
|
|
|
|
|
if (!array_key_exists($sFilterCode, self::$m_aFilterDefs[$sClass])) {
|
|
|
|
|
throw new CoreException("Unknown filter code '$sFilterCode' for class '$sClass'");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return self::$m_aFilterDefs[$sClass][$sFilterCode];
|
|
|
|
|
return self::$m_aFilterAttribList[$sClass];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @deprecated do not use : dead code, will be removed in the future
|
|
|
|
|
* @deprecated 3.0.0 do not use : dead code, will be removed in the future use GetLabel instead N°4690 - Deprecate "FilterCodes"
|
|
|
|
|
*
|
|
|
|
|
* @param string $sClass
|
|
|
|
|
* @param string $sFilterCode
|
|
|
|
|
@@ -1951,103 +1924,9 @@ abstract class MetaModel
|
|
|
|
|
*/
|
|
|
|
|
public static function GetFilterLabel($sClass, $sFilterCode)
|
|
|
|
|
{
|
|
|
|
|
DeprecatedCallsLog::NotifyDeprecatedPhpMethod('do not use : dead code, will be removed in the future');
|
|
|
|
|
$oFilter = self::GetClassFilterDef($sClass, $sFilterCode);
|
|
|
|
|
if ($oFilter) {
|
|
|
|
|
return $oFilter->GetLabel();
|
|
|
|
|
}
|
|
|
|
|
DeprecatedCallsLog::NotifyDeprecatedPhpMethod('do not use MetaModel::GetFilterLabel : dead code, will be removed in the future. Use MetaModel::GetLabel instead');
|
|
|
|
|
|
|
|
|
|
return "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @deprecated do not use : dead code, will be removed in the future
|
|
|
|
|
* @param string $sClass
|
|
|
|
|
* @param string $sFilterCode
|
|
|
|
|
*
|
|
|
|
|
* @return string
|
|
|
|
|
* @throws \CoreException
|
|
|
|
|
*/
|
|
|
|
|
public static function GetFilterDescription($sClass, $sFilterCode)
|
|
|
|
|
{
|
|
|
|
|
DeprecatedCallsLog::NotifyDeprecatedPhpMethod('do not use : dead code, will be removed in the future');
|
|
|
|
|
$oFilter = self::GetClassFilterDef($sClass, $sFilterCode);
|
|
|
|
|
if ($oFilter) {
|
|
|
|
|
return $oFilter->GetDescription();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @deprecated do not use : dead code, will be removed in the future
|
|
|
|
|
* @param string $sClass
|
|
|
|
|
* @param string $sFilterCode
|
|
|
|
|
*
|
|
|
|
|
* @return array
|
|
|
|
|
* @throws \CoreException
|
|
|
|
|
*/
|
|
|
|
|
public static function GetFilterOperators($sClass, $sFilterCode)
|
|
|
|
|
{
|
|
|
|
|
DeprecatedCallsLog::NotifyDeprecatedPhpMethod('do not use : dead code, will be removed in the future');
|
|
|
|
|
$oFilter = self::GetClassFilterDef($sClass, $sFilterCode);
|
|
|
|
|
if ($oFilter) {
|
|
|
|
|
return $oFilter->GetOperators();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return array();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @deprecated do not use : dead code, will be removed in the future
|
|
|
|
|
* @param string $sClass
|
|
|
|
|
* @param string $sFilterCode
|
|
|
|
|
*
|
|
|
|
|
* @return array
|
|
|
|
|
* @throws \CoreException
|
|
|
|
|
*/
|
|
|
|
|
public static function GetFilterLooseOperator($sClass, $sFilterCode)
|
|
|
|
|
{
|
|
|
|
|
DeprecatedCallsLog::NotifyDeprecatedPhpMethod('do not use : dead code, will be removed in the future');
|
|
|
|
|
$oFilter = self::GetClassFilterDef($sClass, $sFilterCode);
|
|
|
|
|
if ($oFilter) {
|
|
|
|
|
return $oFilter->GetLooseOperator();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return array();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @deprecated do not use : dead code, will be removed in the future
|
|
|
|
|
* @param string $sClass
|
|
|
|
|
* @param string $sFilterCode
|
|
|
|
|
* @param string $sOpCode
|
|
|
|
|
*
|
|
|
|
|
* @return string
|
|
|
|
|
* @throws \CoreException
|
|
|
|
|
*/
|
|
|
|
|
public static function GetFilterOpDescription($sClass, $sFilterCode, $sOpCode)
|
|
|
|
|
{
|
|
|
|
|
DeprecatedCallsLog::NotifyDeprecatedPhpMethod('do not use : dead code, will be removed in the future');
|
|
|
|
|
$oFilter = self::GetClassFilterDef($sClass, $sFilterCode);
|
|
|
|
|
if ($oFilter) {
|
|
|
|
|
return $oFilter->GetOpDescription($sOpCode);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @deprecated do not use : dead code, will be removed in the future
|
|
|
|
|
* @param string $sFilterCode
|
|
|
|
|
*
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
|
|
|
|
public static function GetFilterHTMLInput($sFilterCode)
|
|
|
|
|
{
|
|
|
|
|
DeprecatedCallsLog::NotifyDeprecatedPhpMethod('do not use : dead code, will be removed in the future');
|
|
|
|
|
|
|
|
|
|
return "<INPUT name=\"$sFilterCode\">";
|
|
|
|
|
return this::GetLabel($sClass, $sFilterCode);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@@ -2889,6 +2768,8 @@ abstract class MetaModel
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @deprecated 3.1.0 use GetAllowedValues_att N°4690 - Deprecate "FilterCodes"
|
|
|
|
|
*
|
|
|
|
|
* @param string $sClass
|
|
|
|
|
* @param string $sFltCode
|
|
|
|
|
* @param array $aArgs
|
|
|
|
|
@@ -2899,10 +2780,12 @@ abstract class MetaModel
|
|
|
|
|
*/
|
|
|
|
|
public static function GetAllowedValues_flt($sClass, $sFltCode, $aArgs = array(), $sContains = '')
|
|
|
|
|
{
|
|
|
|
|
$oFltDef = self::GetClassFilterDef($sClass, $sFltCode);
|
|
|
|
|
return $oFltDef->GetAllowedValues($aArgs, $sContains);
|
|
|
|
|
DeprecatedCallsLog::NotifyDeprecatedPhpMethod('do not use MetaModel::GetAllowedValues_flt: dead code, will be removed in the future. Use MetaModel::GetAllowedValues');
|
|
|
|
|
|
|
|
|
|
return self::GetAllowedValues_att($sClass, $sFltCode);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param string $sClass
|
|
|
|
|
* @param string $sAttCode
|
|
|
|
|
@@ -2969,17 +2852,14 @@ abstract class MetaModel
|
|
|
|
|
private static function AddMagicAttribute(AttributeDefinition $oAttribute, $sTargetClass, $sOriginClass = null)
|
|
|
|
|
{
|
|
|
|
|
$sCode = $oAttribute->GetCode();
|
|
|
|
|
if (is_null($sOriginClass))
|
|
|
|
|
{
|
|
|
|
|
if (is_null($sOriginClass)) {
|
|
|
|
|
$sOriginClass = $sTargetClass;
|
|
|
|
|
}
|
|
|
|
|
$oAttribute->SetHostClass($sTargetClass);
|
|
|
|
|
self::$m_aAttribDefs[$sTargetClass][$sCode] = $oAttribute;
|
|
|
|
|
self::$m_aAttribOrigins[$sTargetClass][$sCode] = $sOriginClass;
|
|
|
|
|
|
|
|
|
|
$oFlt = new FilterFromAttribute($oAttribute);
|
|
|
|
|
self::$m_aFilterDefs[$sTargetClass][$sCode] = $oFlt;
|
|
|
|
|
self::$m_aFilterOrigins[$sTargetClass][$sCode] = $sOriginClass;
|
|
|
|
|
self::$m_aFilterAttribList[$sTargetClass][$sCode] = $sCode;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@@ -3171,44 +3051,38 @@ abstract class MetaModel
|
|
|
|
|
self::$m_aClassParams[$sRootClass]["db_finalclass_field"] = 'finalclass';
|
|
|
|
|
}
|
|
|
|
|
$oClassAtt = new AttributeFinalClass('finalclass', array(
|
|
|
|
|
"sql" => $sDbFinalClassField,
|
|
|
|
|
"default_value" => $sRootClass,
|
|
|
|
|
"sql" => $sDbFinalClassField,
|
|
|
|
|
"default_value" => $sRootClass,
|
|
|
|
|
"is_null_allowed" => false,
|
|
|
|
|
"depends_on" => array()
|
|
|
|
|
"depends_on" => array(),
|
|
|
|
|
));
|
|
|
|
|
self::AddMagicAttribute($oClassAtt, $sRootClass);
|
|
|
|
|
|
|
|
|
|
$bObsoletable = array_key_exists($sRootClass, $aObsoletableRootClasses);
|
|
|
|
|
if ($bObsoletable && is_null(self::$m_aClassParams[$sRootClass]['obsolescence_expression']))
|
|
|
|
|
{
|
|
|
|
|
if ($bObsoletable && is_null(self::$m_aClassParams[$sRootClass]['obsolescence_expression'])) {
|
|
|
|
|
self::$m_aClassParams[$sRootClass]['obsolescence_expression'] = '0';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
foreach(self::EnumChildClasses($sRootClass, ENUM_CHILD_CLASSES_EXCLUDETOP) as $sChildClass)
|
|
|
|
|
{
|
|
|
|
|
if (array_key_exists('finalclass', self::$m_aAttribDefs[$sChildClass]))
|
|
|
|
|
{
|
|
|
|
|
foreach (self::EnumChildClasses($sRootClass, ENUM_CHILD_CLASSES_EXCLUDETOP) as $sChildClass) {
|
|
|
|
|
if (array_key_exists('finalclass', self::$m_aAttribDefs[$sChildClass])) {
|
|
|
|
|
throw new CoreException("Class $sChildClass, 'finalclass' is a reserved keyword, it cannot be used as an attribute code");
|
|
|
|
|
}
|
|
|
|
|
if (array_key_exists('finalclass', self::$m_aFilterDefs[$sChildClass]))
|
|
|
|
|
{
|
|
|
|
|
if (array_key_exists('finalclass', self::$m_aFilterAttribList[$sChildClass])) {
|
|
|
|
|
throw new CoreException("Class $sChildClass, 'finalclass' is a reserved keyword, it cannot be used as a filter code");
|
|
|
|
|
}
|
|
|
|
|
$oCloned = clone $oClassAtt;
|
|
|
|
|
$oCloned->SetFixedValue($sChildClass);
|
|
|
|
|
self::AddMagicAttribute($oCloned, $sChildClass, $sRootClass);
|
|
|
|
|
|
|
|
|
|
if ($bObsoletable && is_null(self::$m_aClassParams[$sChildClass]['obsolescence_expression']))
|
|
|
|
|
{
|
|
|
|
|
if ($bObsoletable && is_null(self::$m_aClassParams[$sChildClass]['obsolescence_expression'])) {
|
|
|
|
|
self::$m_aClassParams[$sChildClass]['obsolescence_expression'] = '0';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Add magic attributes to the classes
|
|
|
|
|
foreach(self::GetClasses() as $sClass)
|
|
|
|
|
{
|
|
|
|
|
foreach (self::GetClasses() as $sClass) {
|
|
|
|
|
$sRootClass = self::$m_aRootClasses[$sClass];
|
|
|
|
|
|
|
|
|
|
// Create the friendly name attribute
|
|
|
|
|
@@ -3216,40 +3090,35 @@ abstract class MetaModel
|
|
|
|
|
$oFriendlyName = new AttributeFriendlyName($sFriendlyNameAttCode);
|
|
|
|
|
self::AddMagicAttribute($oFriendlyName, $sClass);
|
|
|
|
|
|
|
|
|
|
if (self::$m_aClassParams[$sClass]["archive_root"])
|
|
|
|
|
{
|
|
|
|
|
if (self::$m_aClassParams[$sClass]["archive_root"]) {
|
|
|
|
|
// Create archive attributes on top the archivable hierarchy
|
|
|
|
|
$oArchiveFlag = new AttributeArchiveFlag('archive_flag');
|
|
|
|
|
self::AddMagicAttribute($oArchiveFlag, $sClass);
|
|
|
|
|
|
|
|
|
|
$oArchiveDate = new AttributeArchiveDate('archive_date', array('magic' => true, "allowed_values" => null, "sql" => 'archive_date', "default_value" => '', "is_null_allowed" => true, "depends_on" => array()));
|
|
|
|
|
self::AddMagicAttribute($oArchiveDate, $sClass);
|
|
|
|
|
}
|
|
|
|
|
elseif (self::$m_aClassParams[$sClass]["archive"])
|
|
|
|
|
{
|
|
|
|
|
} elseif (self::$m_aClassParams[$sClass]["archive"]) {
|
|
|
|
|
$sArchiveRoot = self::$m_aClassParams[$sClass]['archive_root_class'];
|
|
|
|
|
// Inherit archive attributes
|
|
|
|
|
$oArchiveFlag = clone self::$m_aAttribDefs[$sArchiveRoot]['archive_flag'];
|
|
|
|
|
$oArchiveFlag->SetHostClass($sClass);
|
|
|
|
|
self::$m_aAttribDefs[$sClass]['archive_flag'] = $oArchiveFlag;
|
|
|
|
|
self::$m_aAttribOrigins[$sClass]['archive_flag'] = $sArchiveRoot;
|
|
|
|
|
|
|
|
|
|
$oArchiveDate = clone self::$m_aAttribDefs[$sArchiveRoot]['archive_date'];
|
|
|
|
|
$oArchiveDate->SetHostClass($sClass);
|
|
|
|
|
self::$m_aAttribDefs[$sClass]['archive_date'] = $oArchiveDate;
|
|
|
|
|
self::$m_aAttribOrigins[$sClass]['archive_date'] = $sArchiveRoot;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
if (!is_null(self::$m_aClassParams[$sClass]['obsolescence_expression']))
|
|
|
|
|
{
|
|
|
|
|
if (!is_null(self::$m_aClassParams[$sClass]['obsolescence_expression'])) {
|
|
|
|
|
$oObsolescenceFlag = new AttributeObsolescenceFlag('obsolescence_flag');
|
|
|
|
|
self::AddMagicAttribute($oObsolescenceFlag, $sClass);
|
|
|
|
|
|
|
|
|
|
if (self::$m_aRootClasses[$sClass] == $sClass)
|
|
|
|
|
{
|
|
|
|
|
if (self::$m_aRootClasses[$sClass] == $sClass) {
|
|
|
|
|
$oObsolescenceDate = new AttributeObsolescenceDate('obsolescence_date', array('magic' => true, "allowed_values" => null, "sql" => 'obsolescence_date', "default_value" => '', "is_null_allowed" => true, "depends_on" => array()));
|
|
|
|
|
self::AddMagicAttribute($oObsolescenceDate, $sClass);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
} else {
|
|
|
|
|
$oObsolescenceDate = clone self::$m_aAttribDefs[$sRootClass]['obsolescence_date'];
|
|
|
|
|
$oObsolescenceDate->SetHostClass($sClass);
|
|
|
|
|
self::$m_aAttribDefs[$sClass]['obsolescence_date'] = $oObsolescenceDate;
|
|
|
|
|
@@ -3261,40 +3130,24 @@ abstract class MetaModel
|
|
|
|
|
// Prepare external fields and filters
|
|
|
|
|
// Add final class to external keys
|
|
|
|
|
// Add magic attributes to external keys (finalclass, friendlyname, archive_flag, obsolescence_flag)
|
|
|
|
|
foreach(self::GetClasses() as $sClass)
|
|
|
|
|
{
|
|
|
|
|
foreach(self::$m_aAttribDefs[$sClass] as $sAttCode => $oAttDef)
|
|
|
|
|
{
|
|
|
|
|
foreach (self::GetClasses() as $sClass) {
|
|
|
|
|
foreach (self::$m_aAttribDefs[$sClass] as $sAttCode => $oAttDef) {
|
|
|
|
|
// Compute the filter codes
|
|
|
|
|
//
|
|
|
|
|
foreach($oAttDef->GetFilterDefinitions() as $sFilterCode => $oFilterDef)
|
|
|
|
|
{
|
|
|
|
|
self::$m_aFilterDefs[$sClass][$sFilterCode] = $oFilterDef;
|
|
|
|
|
|
|
|
|
|
if ($oAttDef->IsExternalField())
|
|
|
|
|
{
|
|
|
|
|
$sKeyAttCode = $oAttDef->GetKeyAttCode();
|
|
|
|
|
$oKeyDef = self::GetAttributeDef($sClass, $sKeyAttCode);
|
|
|
|
|
self::$m_aFilterOrigins[$sClass][$sFilterCode] = $oKeyDef->GetTargetClass();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
self::$m_aFilterOrigins[$sClass][$sFilterCode] = self::$m_aAttribOrigins[$sClass][$sAttCode];
|
|
|
|
|
}
|
|
|
|
|
foreach ($oAttDef->GetFilterDefinitions() as $sFilterCode => $sCode) {
|
|
|
|
|
self::$m_aFilterAttribList[$sClass][$sFilterCode] = $sCode;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Compute the fields that will be used to display a pointer to another object
|
|
|
|
|
//
|
|
|
|
|
if ($oAttDef->IsExternalKey(EXTKEY_ABSOLUTE))
|
|
|
|
|
{
|
|
|
|
|
if ($oAttDef->IsExternalKey(EXTKEY_ABSOLUTE)) {
|
|
|
|
|
// oAttDef is either
|
|
|
|
|
// - an external KEY / FIELD (direct),
|
|
|
|
|
// - an external field pointing to an external KEY / FIELD
|
|
|
|
|
// - an external field pointing to an external field pointing to....
|
|
|
|
|
$sRemoteClass = $oAttDef->GetTargetClass(EXTKEY_ABSOLUTE);
|
|
|
|
|
|
|
|
|
|
if ($oAttDef->IsExternalField())
|
|
|
|
|
{
|
|
|
|
|
if ($oAttDef->IsExternalField()) {
|
|
|
|
|
// This is a key, but the value comes from elsewhere
|
|
|
|
|
// Create an external field pointing to the remote friendly name attribute
|
|
|
|
|
$sKeyAttCode = $oAttDef->GetKeyAttCode();
|
|
|
|
|
@@ -3302,24 +3155,21 @@ abstract class MetaModel
|
|
|
|
|
$sFriendlyNameAttCode = $sAttCode.'_friendlyname';
|
|
|
|
|
$oFriendlyName = new AttributeExternalField($sFriendlyNameAttCode, array("allowed_values" => null, "extkey_attcode" => $sKeyAttCode, "target_attcode" => $sRemoteAttCode, "depends_on" => array()));
|
|
|
|
|
self::AddMagicAttribute($oFriendlyName, $sClass, self::$m_aAttribOrigins[$sClass][$sKeyAttCode]);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
} else {
|
|
|
|
|
// Create the friendly name attribute
|
|
|
|
|
$sFriendlyNameAttCode = $sAttCode.'_friendlyname';
|
|
|
|
|
$oFriendlyName = new AttributeExternalField($sFriendlyNameAttCode, array('allowed_values' => null, 'extkey_attcode' => $sAttCode, "target_attcode" => 'friendlyname', 'depends_on' => array()));
|
|
|
|
|
self::AddMagicAttribute($oFriendlyName, $sClass, self::$m_aAttribOrigins[$sClass][$sAttCode]);
|
|
|
|
|
|
|
|
|
|
if (self::HasChildrenClasses($sRemoteClass))
|
|
|
|
|
{
|
|
|
|
|
if (self::HasChildrenClasses($sRemoteClass)) {
|
|
|
|
|
// First, create an external field attribute, that gets the final class
|
|
|
|
|
$sClassRecallAttCode = $sAttCode.'_finalclass_recall';
|
|
|
|
|
$oClassRecall = new AttributeExternalField($sClassRecallAttCode, array(
|
|
|
|
|
"allowed_values" => null,
|
|
|
|
|
"extkey_attcode" => $sAttCode,
|
|
|
|
|
"target_attcode" => "finalclass",
|
|
|
|
|
"allowed_values" => null,
|
|
|
|
|
"extkey_attcode" => $sAttCode,
|
|
|
|
|
"target_attcode" => "finalclass",
|
|
|
|
|
"is_null_allowed" => true,
|
|
|
|
|
"depends_on" => array()
|
|
|
|
|
"depends_on" => array(),
|
|
|
|
|
));
|
|
|
|
|
self::AddMagicAttribute($oClassRecall, $sClass, self::$m_aAttribOrigins[$sClass][$sAttCode]);
|
|
|
|
|
|
|
|
|
|
@@ -3350,18 +3200,14 @@ abstract class MetaModel
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (self::IsArchivable($sRemoteClass))
|
|
|
|
|
{
|
|
|
|
|
if (self::IsArchivable($sRemoteClass)) {
|
|
|
|
|
$sCode = $sAttCode.'_archive_flag';
|
|
|
|
|
if ($oAttDef->IsExternalField())
|
|
|
|
|
{
|
|
|
|
|
if ($oAttDef->IsExternalField()) {
|
|
|
|
|
// This is a key, but the value comes from elsewhere
|
|
|
|
|
// Create an external field pointing to the remote attribute
|
|
|
|
|
$sKeyAttCode = $oAttDef->GetKeyAttCode();
|
|
|
|
|
$sRemoteAttCode = $oAttDef->GetExtAttCode().'_archive_flag';
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
} else {
|
|
|
|
|
$sKeyAttCode = $sAttCode;
|
|
|
|
|
$sRemoteAttCode = 'archive_flag';
|
|
|
|
|
}
|
|
|
|
|
@@ -3369,18 +3215,14 @@ abstract class MetaModel
|
|
|
|
|
self::AddMagicAttribute($oMagic, $sClass, self::$m_aAttribOrigins[$sClass][$sKeyAttCode]);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
if (self::IsObsoletable($sRemoteClass))
|
|
|
|
|
{
|
|
|
|
|
if (self::IsObsoletable($sRemoteClass)) {
|
|
|
|
|
$sCode = $sAttCode.'_obsolescence_flag';
|
|
|
|
|
if ($oAttDef->IsExternalField())
|
|
|
|
|
{
|
|
|
|
|
if ($oAttDef->IsExternalField()) {
|
|
|
|
|
// This is a key, but the value comes from elsewhere
|
|
|
|
|
// Create an external field pointing to the remote attribute
|
|
|
|
|
$sKeyAttCode = $oAttDef->GetKeyAttCode();
|
|
|
|
|
$sRemoteAttCode = $oAttDef->GetExtAttCode().'_obsolescence_flag';
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
} else {
|
|
|
|
|
$sKeyAttCode = $sAttCode;
|
|
|
|
|
$sRemoteAttCode = 'obsolescence_flag';
|
|
|
|
|
}
|
|
|
|
|
@@ -3388,11 +3230,9 @@ abstract class MetaModel
|
|
|
|
|
self::AddMagicAttribute($oMagic, $sClass, self::$m_aAttribOrigins[$sClass][$sKeyAttCode]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if ($oAttDef instanceof AttributeMetaEnum)
|
|
|
|
|
{
|
|
|
|
|
if ($oAttDef instanceof AttributeMetaEnum) {
|
|
|
|
|
$aMappingData = $oAttDef->GetMapRule($sClass);
|
|
|
|
|
if ($aMappingData != null)
|
|
|
|
|
{
|
|
|
|
|
if ($aMappingData != null) {
|
|
|
|
|
$sEnumAttCode = $aMappingData['attcode'];
|
|
|
|
|
self::$m_aEnumToMeta[$sClass][$sEnumAttCode][$sAttCode] = $oAttDef;
|
|
|
|
|
}
|
|
|
|
|
@@ -3401,17 +3241,10 @@ abstract class MetaModel
|
|
|
|
|
|
|
|
|
|
// Add a 'id' filter
|
|
|
|
|
//
|
|
|
|
|
if (array_key_exists('id', self::$m_aAttribDefs[$sClass]))
|
|
|
|
|
{
|
|
|
|
|
if (array_key_exists('id', self::$m_aAttribDefs[$sClass])) {
|
|
|
|
|
throw new CoreException("Class $sClass, 'id' is a reserved keyword, it cannot be used as an attribute code");
|
|
|
|
|
}
|
|
|
|
|
if (array_key_exists('id', self::$m_aFilterDefs[$sClass]))
|
|
|
|
|
{
|
|
|
|
|
throw new CoreException("Class $sClass, 'id' is a reserved keyword, it cannot be used as a filter code");
|
|
|
|
|
}
|
|
|
|
|
$oFilter = new FilterPrivateKey('id', array('id_field' => self::DBGetKey($sClass)));
|
|
|
|
|
self::$m_aFilterDefs[$sClass]['id'] = $oFilter;
|
|
|
|
|
self::$m_aFilterOrigins[$sClass]['id'] = $sClass;
|
|
|
|
|
self::$m_aFilterAttribList[$sClass]['id'] = 'id';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -3571,8 +3404,7 @@ abstract class MetaModel
|
|
|
|
|
|
|
|
|
|
self::$m_aAttribDefs[$sClass] = array();
|
|
|
|
|
self::$m_aAttribOrigins[$sClass] = array();
|
|
|
|
|
self::$m_aFilterDefs[$sClass] = array();
|
|
|
|
|
self::$m_aFilterOrigins[$sClass] = array();
|
|
|
|
|
self::$m_aFilterAttribList[$sClass] = array();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@@ -3602,25 +3434,20 @@ abstract class MetaModel
|
|
|
|
|
public static function Init_InheritAttributes($sSourceClass = null)
|
|
|
|
|
{
|
|
|
|
|
$sTargetClass = self::GetCallersPHPClass("Init");
|
|
|
|
|
if (empty($sSourceClass))
|
|
|
|
|
{
|
|
|
|
|
if (empty($sSourceClass)) {
|
|
|
|
|
// Default: inherit from parent class
|
|
|
|
|
$sSourceClass = self::GetParentPersistentClass($sTargetClass);
|
|
|
|
|
if (empty($sSourceClass))
|
|
|
|
|
{
|
|
|
|
|
if (empty($sSourceClass)) {
|
|
|
|
|
return;
|
|
|
|
|
} // no attributes for the mother of all classes
|
|
|
|
|
}
|
|
|
|
|
if (isset(self::$m_aAttribDefs[$sSourceClass]))
|
|
|
|
|
{
|
|
|
|
|
if (!isset(self::$m_aAttribDefs[$sTargetClass]))
|
|
|
|
|
{
|
|
|
|
|
if (isset(self::$m_aAttribDefs[$sSourceClass])) {
|
|
|
|
|
if (!isset(self::$m_aAttribDefs[$sTargetClass])) {
|
|
|
|
|
self::$m_aAttribDefs[$sTargetClass] = array();
|
|
|
|
|
self::$m_aAttribOrigins[$sTargetClass] = array();
|
|
|
|
|
}
|
|
|
|
|
self::$m_aAttribDefs[$sTargetClass] = self::object_array_mergeclone(self::$m_aAttribDefs[$sTargetClass], self::$m_aAttribDefs[$sSourceClass]);
|
|
|
|
|
foreach(self::$m_aAttribDefs[$sTargetClass] as $sAttCode => $oAttDef)
|
|
|
|
|
{
|
|
|
|
|
foreach (self::$m_aAttribDefs[$sTargetClass] as $sAttCode => $oAttDef) {
|
|
|
|
|
$oAttDef->SetHostClass($sTargetClass);
|
|
|
|
|
}
|
|
|
|
|
self::$m_aAttribOrigins[$sTargetClass] = array_merge(self::$m_aAttribOrigins[$sTargetClass], self::$m_aAttribOrigins[$sSourceClass]);
|
|
|
|
|
@@ -3675,22 +3502,18 @@ abstract class MetaModel
|
|
|
|
|
*/
|
|
|
|
|
public static function Init_AddAttribute(AttributeDefinition $oAtt, $sTargetClass = null)
|
|
|
|
|
{
|
|
|
|
|
if (!$sTargetClass)
|
|
|
|
|
{
|
|
|
|
|
if (!$sTargetClass) {
|
|
|
|
|
$sTargetClass = self::GetCallersPHPClass("Init");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$sAttCode = $oAtt->GetCode();
|
|
|
|
|
if ($sAttCode == 'finalclass')
|
|
|
|
|
{
|
|
|
|
|
if ($sAttCode == 'finalclass') {
|
|
|
|
|
throw new Exception("Declaration of $sTargetClass: using the reserved keyword '$sAttCode' in attribute declaration");
|
|
|
|
|
}
|
|
|
|
|
if ($sAttCode == 'friendlyname')
|
|
|
|
|
{
|
|
|
|
|
if ($sAttCode == 'friendlyname') {
|
|
|
|
|
throw new Exception("Declaration of $sTargetClass: using the reserved keyword '$sAttCode' in attribute declaration");
|
|
|
|
|
}
|
|
|
|
|
if (array_key_exists($sAttCode, self::$m_aAttribDefs[$sTargetClass]))
|
|
|
|
|
{
|
|
|
|
|
if (array_key_exists($sAttCode, self::$m_aAttribDefs[$sTargetClass])) {
|
|
|
|
|
throw new Exception("Declaration of $sTargetClass: attempting to redeclare the inherited attribute '$sAttCode', originally declared in ".self::$m_aAttribOrigins[$sTargetClass][$sAttCode]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -3727,6 +3550,7 @@ abstract class MetaModel
|
|
|
|
|
{
|
|
|
|
|
// The corresponding external key has already been ignored
|
|
|
|
|
self::$m_aIgnoredAttributes[$sTargetClass][$oAtt->GetCode()] = self::$m_aIgnoredAttributes[$sTargetClass][$sExtKeyAttCode];
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
//TODO Check if the target attribute is still there
|
|
|
|
|
@@ -4989,18 +4813,6 @@ abstract class MetaModel
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
foreach(self::GetClassFilterDefs($sClass) as $sFltCode => $oFilterDef)
|
|
|
|
|
{
|
|
|
|
|
if (method_exists($oFilterDef, '__GetRefAttribute'))
|
|
|
|
|
{
|
|
|
|
|
$oAttDef = $oFilterDef->__GetRefAttribute();
|
|
|
|
|
if (!self::IsValidAttCode($sClass, $oAttDef->GetCode()))
|
|
|
|
|
{
|
|
|
|
|
$aErrors[$sClass][] = "Wrong attribute code '".$oAttDef->GetCode()."' (wrong class) for the \"basic\" filter $sFltCode";
|
|
|
|
|
$aSugFix[$sClass][] = "Expecting a value in {".implode(", ", self::GetAttributesList($sClass))."}";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Lifecycle
|
|
|
|
|
//
|
|
|
|
|
@@ -6619,16 +6431,14 @@ abstract class MetaModel
|
|
|
|
|
// classes have to be derived from cmdbabstract (to be editable in the UI)
|
|
|
|
|
require_once(APPROOT.'/application/cmdbabstract.class.inc.php');
|
|
|
|
|
|
|
|
|
|
if (!defined('MODULESROOT'))
|
|
|
|
|
{
|
|
|
|
|
if (!defined('MODULESROOT')) {
|
|
|
|
|
define('MODULESROOT', APPROOT.'env-'.self::$m_sEnvironment.'/');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
require_once(APPROOT.'core/autoload.php');
|
|
|
|
|
require_once(APPROOT.'env-'.self::$m_sEnvironment.'/autoload.php');
|
|
|
|
|
|
|
|
|
|
foreach(self::$m_oConfig->GetAddons() as $sModule => $sToInclude)
|
|
|
|
|
{
|
|
|
|
|
foreach (self::$m_oConfig->GetAddons() as $sModule => $sToInclude) {
|
|
|
|
|
self::IncludeModule($sToInclude, 'addons');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -6636,16 +6446,14 @@ abstract class MetaModel
|
|
|
|
|
$sTablePrefix = self::$m_oConfig->Get('db_subname');
|
|
|
|
|
$oKPI->ComputeAndReport('Load config');
|
|
|
|
|
|
|
|
|
|
if (self::$m_bUseAPCCache)
|
|
|
|
|
{
|
|
|
|
|
if (self::$m_bUseAPCCache) {
|
|
|
|
|
$oKPI = new ExecutionKPI();
|
|
|
|
|
// Note: For versions of APC older than 3.0.17, fetch() accepts only one parameter
|
|
|
|
|
//
|
|
|
|
|
$sOqlAPCCacheId = 'itop-'.MetaModel::GetEnvironmentId().'-metamodel';
|
|
|
|
|
$result = apc_fetch($sOqlAPCCacheId);
|
|
|
|
|
|
|
|
|
|
if (is_array($result))
|
|
|
|
|
{
|
|
|
|
|
if (is_array($result)) {
|
|
|
|
|
// todo - verifier que toutes les classes mentionnees ici sont chargees dans InitClasses()
|
|
|
|
|
self::$m_aExtensionClassNames = $result['m_aExtensionClassNames'];
|
|
|
|
|
self::$m_Category2Class = $result['m_Category2Class'];
|
|
|
|
|
@@ -6656,8 +6464,7 @@ abstract class MetaModel
|
|
|
|
|
self::$m_aAttribDefs = $result['m_aAttribDefs'];
|
|
|
|
|
self::$m_aAttribOrigins = $result['m_aAttribOrigins'];
|
|
|
|
|
self::$m_aIgnoredAttributes = $result['m_aIgnoredAttributes'];
|
|
|
|
|
self::$m_aFilterDefs = $result['m_aFilterDefs'];
|
|
|
|
|
self::$m_aFilterOrigins = $result['m_aFilterOrigins'];
|
|
|
|
|
self::$m_aFilterAttribList = $result['m_aFilterList'];
|
|
|
|
|
self::$m_aListInfos = $result['m_aListInfos'];
|
|
|
|
|
self::$m_aListData = $result['m_aListData'];
|
|
|
|
|
self::$m_aRelationInfos = $result['m_aRelationInfos'];
|
|
|
|
|
@@ -6693,8 +6500,7 @@ abstract class MetaModel
|
|
|
|
|
$aCache['m_aAttribDefs'] = self::$m_aAttribDefs; // array of ("classname" => array of attributes)
|
|
|
|
|
$aCache['m_aAttribOrigins'] = self::$m_aAttribOrigins; // array of ("classname" => array of ("attcode"=>"sourceclass"))
|
|
|
|
|
$aCache['m_aIgnoredAttributes'] = self::$m_aIgnoredAttributes; //array of ("classname" => array of ("attcode")
|
|
|
|
|
$aCache['m_aFilterDefs'] = self::$m_aFilterDefs; // array of ("classname" => array filterdef)
|
|
|
|
|
$aCache['m_aFilterOrigins'] = self::$m_aFilterOrigins; // array of ("classname" => array of ("attcode"=>"sourceclass"))
|
|
|
|
|
$aCache['m_aFilterList'] = self::$m_aFilterAttribList; // array of ("classname" => array filterdef)
|
|
|
|
|
$aCache['m_aListInfos'] = self::$m_aListInfos; // array of ("listcode" => various info on the list, common to every classes)
|
|
|
|
|
$aCache['m_aListData'] = self::$m_aListData; // array of ("classname" => array of "listcode" => list)
|
|
|
|
|
$aCache['m_aRelationInfos'] = self::$m_aRelationInfos; // array of ("relcode" => various info on the list, common to every classes)
|
|
|
|
|
|