Advanced Search: Hidden criterion

SVN:b1162[5456]
This commit is contained in:
Eric Espié
2018-03-19 10:45:34 +00:00
parent e628c68f09
commit 0fdf6bfbb2
5 changed files with 58 additions and 26 deletions

View File

@@ -289,6 +289,23 @@ class UILinksWidgetDirect
{ {
$sHtml = "<div class=\"wizContainer\" style=\"vertical-align:top;\">\n"; $sHtml = "<div class=\"wizContainer\" style=\"vertical-align:top;\">\n";
$oHiddenFilter = new DBObjectSearch($this->sLinkedClass);
if (($oCurrentObj != null) && MetaModel::IsSameFamilyBranch($this->sLinkedClass, $this->sClass))
{
// Prevent linking to self if the linked object is of the same family
// and already present in the database
if (!$oCurrentObj->IsNew())
{
$oHiddenFilter->AddCondition('id', $oCurrentObj->GetKey(), '!=');
}
}
if (count($aAlreadyLinked) > 0)
{
$oHiddenFilter->AddCondition('id', $aAlreadyLinked, 'NOTIN');
}
$oHiddenCriteria = $oHiddenFilter->GetCriteria();
$sHiddenCriteria = $oHiddenCriteria->Render();
$oLinkSetDef = MetaModel::GetAttributeDef($this->sClass, $this->sAttCode); $oLinkSetDef = MetaModel::GetAttributeDef($this->sClass, $this->sAttCode);
$valuesDef = $oLinkSetDef->GetValuesDef(); $valuesDef = $oLinkSetDef->GetValuesDef();
if ($valuesDef === null) if ($valuesDef === null)
@@ -303,25 +320,11 @@ class UILinksWidgetDirect
} }
$oFilter = DBObjectSearch::FromOQL($valuesDef->GetFilterExpression()); $oFilter = DBObjectSearch::FromOQL($valuesDef->GetFilterExpression());
} }
if ($oCurrentObj != null) if ($oCurrentObj != null)
{ {
$this->SetSearchDefaultFromContext($oCurrentObj, $oFilter); $this->SetSearchDefaultFromContext($oCurrentObj, $oFilter);
}
if (($oCurrentObj != null) && MetaModel::IsSameFamilyBranch($this->sLinkedClass, $this->sClass))
{
// Prevent linking to self if the linked object is of the same family
// and already present in the database
if (!$oCurrentObj->IsNew())
{
$oFilter->AddCondition('id', $oCurrentObj->GetKey(), '!=');
}
}
if (count($aAlreadyLinked) > 0)
{
$oFilter->AddCondition('id', $aAlreadyLinked, 'NOTIN');
}
if ($oCurrentObj != null)
{
$aArgs = array_merge($oCurrentObj->ToArgs('this'), $oFilter->GetInternalParams()); $aArgs = array_merge($oCurrentObj->ToArgs('this'), $oFilter->GetInternalParams());
$oFilter->SetInternalParams($aArgs); $oFilter->SetInternalParams($aArgs);
} }
@@ -335,6 +338,7 @@ class UILinksWidgetDirect
'table_inner_id' => "ResultsToAdd_{$this->sInputid}", 'table_inner_id' => "ResultsToAdd_{$this->sInputid}",
'cssCount' => "#count_{$this->sInputid}", 'cssCount' => "#count_{$this->sInputid}",
'query_params' => $oFilter->GetInternalParams(), 'query_params' => $oFilter->GetInternalParams(),
'hidden_criteria' => $sHiddenCriteria,
) )
); );
$sHtml .= "<form id=\"ObjectsAddForm_{$this->sInputid}\">\n"; $sHtml .= "<form id=\"ObjectsAddForm_{$this->sInputid}\">\n";

View File

@@ -397,11 +397,20 @@ EOF
{ {
$bOpen = MetaModel::GetConfig()->Get('legacy_search_drawer_open'); $bOpen = MetaModel::GetConfig()->Get('legacy_search_drawer_open');
$sHtml = "<div class=\"wizContainer\" style=\"vertical-align:top;\">\n"; $sHtml = "<div class=\"wizContainer\" style=\"vertical-align:top;\">\n";
$oFilter = new DBObjectSearch($this->m_sRemoteClass);
$oAlreadyLinkedFilter = new DBObjectSearch($this->m_sRemoteClass);
if (!$this->m_bDuplicatesAllowed && count($aAlreadyLinkedIds) > 0) if (!$this->m_bDuplicatesAllowed && count($aAlreadyLinkedIds) > 0)
{ {
$oFilter->AddCondition('id', $aAlreadyLinkedIds, 'NOTIN'); $oAlreadyLinkedFilter->AddCondition('id', $aAlreadyLinkedIds, 'NOTIN');
$oAlreadyLinkedExpression = $oAlreadyLinkedFilter->GetCriteria();
$sAlreadyLinkedExpression = $oAlreadyLinkedExpression->Render();
} }
else
{
$sAlreadyLinkedExpression = '';
}
$oFilter = new DBObjectSearch($this->m_sRemoteClass);
if ($oCurrentObj != null) if ($oCurrentObj != null)
{ {
$this->SetSearchDefaultFromContext($oCurrentObj, $oFilter); $this->SetSearchDefaultFromContext($oCurrentObj, $oFilter);
@@ -418,6 +427,7 @@ EOF
'json' => $sJson, 'json' => $sJson,
'cssCount' => '#count_'.$this->m_sAttCode.$this->m_sNameSuffix, 'cssCount' => '#count_'.$this->m_sAttCode.$this->m_sNameSuffix,
'query_params' => $oFilter->GetInternalParams(), 'query_params' => $oFilter->GetInternalParams(),
'hidden_criteria' => $sAlreadyLinkedExpression,
)); ));
$sHtml .= "<form id=\"ObjectsAddForm_{$this->m_sAttCode}{$this->m_sNameSuffix}\">\n"; $sHtml .= "<form id=\"ObjectsAddForm_{$this->m_sAttCode}{$this->m_sNameSuffix}\">\n";
$sHtml .= "<div id=\"SearchResultsToAdd_{$this->m_sAttCode}{$this->m_sNameSuffix}\" style=\"vertical-align:top;background: #fff;height:100%;overflow:auto;padding:0;border:0;\">\n"; $sHtml .= "<div id=\"SearchResultsToAdd_{$this->m_sAttCode}{$this->m_sNameSuffix}\" style=\"vertical-align:top;background: #fff;height:100%;overflow:auto;padding:0;border:0;\">\n";

View File

@@ -50,12 +50,20 @@ try
$oPage->no_cache(); $oPage->no_cache();
$oPage->SetContentType('text/html'); $oPage->SetContentType('text/html');
$aParams = json_decode($sParams, true);
$oFilter = CriterionParser::Parse($aParams['base_oql'], $aParams['criterion']);
$oDisplayBlock = new DisplayBlock($oFilter, 'list', false);
$sListParams = utils::ReadParam('list_params', '{}', false, 'raw_data'); $sListParams = utils::ReadParam('list_params', '{}', false, 'raw_data');
$aListParams = (array) json_decode($sListParams, true); $aListParams = (array)json_decode($sListParams, true);
$aParams = json_decode($sParams, true);
if (array_key_exists('hidden_criteria', $aListParams))
{
$sHiddenCriteria = $aListParams['hidden_criteria'];
}
else
{
$sHiddenCriteria = '';
}
$oFilter = CriterionParser::Parse($aParams['base_oql'], $aParams['criterion'], $sHiddenCriteria);
$oDisplayBlock = new DisplayBlock($oFilter, 'list', false);
foreach($aListParams as $key => $value) foreach($aListParams as $key => $value)
{ {

View File

@@ -31,6 +31,7 @@ namespace Combodo\iTop\Application\Search;
use Combodo\iTop\Application\Search\CriterionConversion\CriterionToOQL; use Combodo\iTop\Application\Search\CriterionConversion\CriterionToOQL;
use DBObjectSearch; use DBObjectSearch;
use Expression;
use IssueLog; use IssueLog;
use OQLException; use OQLException;
@@ -40,10 +41,11 @@ class CriterionParser
/** /**
* @param $sBaseOql * @param $sBaseOql
* @param $aCriterion * @param $aCriterion
* @param $sHiddenCriteria
* *
* @return \DBSearch * @return \DBSearch
*/ */
public static function Parse($sBaseOql, $aCriterion) public static function Parse($sBaseOql, $aCriterion, $sHiddenCriteria = null)
{ {
$aExpression = array(); $aExpression = array();
$aOr = $aCriterion['or']; $aOr = $aCriterion['or'];
@@ -60,14 +62,21 @@ class CriterionParser
try try
{ {
$oSearch = DBObjectSearch::FromOQL($sBaseOql); $oSearch = DBObjectSearch::FromOQL($sBaseOql);
if (!empty($sHiddenCriteria))
{
$oHiddenCriteriaExpression = Expression::FromOQL($sHiddenCriteria);
$oSearch->AddConditionExpression($oHiddenCriteriaExpression);
}
if (empty($aExpression)) if (empty($aExpression))
{ {
return $oSearch; return $oSearch;
} }
$oExpression = \Expression::FromOQL(implode(" OR ", $aExpression)); $oExpression = Expression::FromOQL(implode(" OR ", $aExpression));
$oSearch->AddConditionExpression($oExpression); $oSearch->AddConditionExpression($oExpression);
return $oSearch; return $oSearch;
} catch (OQLException $e) } catch (OQLException $e)
{ {

View File

@@ -146,6 +146,7 @@ class SearchForm
{ {
$aListParams['table_inner_id'] = uniqid('table_inner_id_'); $aListParams['table_inner_id'] = uniqid('table_inner_id_');
} }
// When table_id is different of result_list_outer_selector
if (array_key_exists('table_id2', $aExtraParams)) if (array_key_exists('table_id2', $aExtraParams))
{ {
$aListParams['table_id'] = $aExtraParams['table_id2']; $aListParams['table_id'] = $aExtraParams['table_id2'];