#112 Implicit search filter declaration

SVN:trunk[404]
This commit is contained in:
Romain Quetiez
2010-05-14 10:06:07 +00:00
parent d527b56340
commit 2e07f73122
23 changed files with 92 additions and 670 deletions

View File

@@ -847,11 +847,28 @@ abstract class MetaModel
}
foreach (self::GetClasses() as $sClass)
{
// Compute the fields that will be used to display a pointer to another object
//
self::$m_aExtKeyFriends[$sClass] = array();
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];
}
// Compute the fields that will be used to display a pointer to another object
//
if ($oAttDef->IsExternalKey(EXTKEY_ABSOLUTE))
{
// oAttDef is either
@@ -1088,86 +1105,6 @@ abstract class MetaModel
$oAtt->SetHostClass($sTargetClass);
}
public static function Init_InheritFilters($sSourceClass = null)
{
$sTargetClass = self::GetCallersPHPClass("Init");
if (empty($sSourceClass))
{
// Default: inherit from parent class
$sSourceClass = self::GetParentPersistentClass($sTargetClass);
if (empty($sSourceClass)) return; // no filters for the mother of all classes
}
if (isset(self::$m_aFilterDefs[$sSourceClass]))
{
if (!isset(self::$m_aFilterDefs[$sTargetClass]))
{
self::$m_aFilterDefs[$sTargetClass] = array();
self::$m_aFilterOrigins[$sTargetClass] = array();
}
foreach (self::$m_aFilterDefs[$sSourceClass] as $sFltCode=>$oFilter)
{
if ($oFilter instanceof FilterFromAttribute)
{
// In that case, cloning is not enough:
// we must ensure that we will point to the correct
// attribute definition (in case some properties are overloaded)
$oAttDef1 = $oFilter->__GetRefAttribute();
$oAttDef2 = self::GetAttributeDef($sTargetClass, $oAttDef1->GetCode());
$oNewFilter = new FilterFromAttribute($oAttDef2);
}
else
{
$oNewFilter = clone $oFilter;
}
self::$m_aFilterDefs[$sTargetClass][$sFltCode] = $oNewFilter;
}
self::$m_aFilterOrigins[$sTargetClass] = array_merge(self::$m_aFilterOrigins[$sTargetClass], self::$m_aFilterOrigins[$sSourceClass]);
}
}
public static function Init_OverloadFilterParams($sFltCode, $aParams)
{
$sTargetClass = self::GetCallersPHPClass("Init");
if (!self::IsValidFilterCode($sTargetClass, $sFltCode))
{
throw new CoreException("Could not overload '$sFltCode', expecting a code from {".implode(", ", self::GetFiltersList($sTargetClass))."}");
}
self::$m_aFilterDefs[$sTargetClass][$sFltCode]->OverloadParams($aParams);
}
public static function Init_AddFilter(FilterDefinition $oFilter)
{
$sTargetClass = self::GetCallersPHPClass("Init");
self::$m_aFilterDefs[$sTargetClass][$oFilter->GetCode()] = $oFilter;
self::$m_aFilterOrigins[$sTargetClass][$oFilter->GetCode()] = $sTargetClass;
// Note: it looks redundant to put targetclass there, but a mix occurs when inheritance is used
}
public static function Init_AddFilterFromAttribute($sAttCode)
{
$sTargetClass = self::GetCallersPHPClass("Init");
$oAttDef = self::GetAttributeDef($sTargetClass, $sAttCode);
$sFilterCode = $sAttCode;
$oNewFilter = new FilterFromAttribute($oAttDef);
self::$m_aFilterDefs[$sTargetClass][$sFilterCode] = $oNewFilter;
if ($oAttDef->IsExternalField())
{
$sKeyAttCode = $oAttDef->GetKeyAttCode();
$oKeyDef = self::GetAttributeDef($sTargetClass, $sKeyAttCode);
self::$m_aFilterOrigins[$sTargetClass][$sFilterCode] = $oKeyDef->GetTargetClass();
}
else
{
self::$m_aFilterOrigins[$sTargetClass][$sFilterCode] = $sTargetClass;
}
// Note: it looks redundant to put targetclass there, but a mix occurs when inheritance is used
}
public static function Init_SetZListItems($sListCode, $aItems)
{
MyHelpers::CheckKeyInArray('list code', $sListCode, self::$m_aListInfos);