diff --git a/application/ui.linksdirectwidget.class.inc.php b/application/ui.linksdirectwidget.class.inc.php index d41916813..d8e3deffa 100644 --- a/application/ui.linksdirectwidget.class.inc.php +++ b/application/ui.linksdirectwidget.class.inc.php @@ -289,6 +289,23 @@ class UILinksWidgetDirect { $sHtml = "
\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); $valuesDef = $oLinkSetDef->GetValuesDef(); if ($valuesDef === null) @@ -303,25 +320,11 @@ class UILinksWidgetDirect } $oFilter = DBObjectSearch::FromOQL($valuesDef->GetFilterExpression()); } + if ($oCurrentObj != null) { $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()); $oFilter->SetInternalParams($aArgs); } @@ -335,6 +338,7 @@ class UILinksWidgetDirect 'table_inner_id' => "ResultsToAdd_{$this->sInputid}", 'cssCount' => "#count_{$this->sInputid}", 'query_params' => $oFilter->GetInternalParams(), + 'hidden_criteria' => $sHiddenCriteria, ) ); $sHtml .= "
sInputid}\">\n"; diff --git a/application/ui.linkswidget.class.inc.php b/application/ui.linkswidget.class.inc.php index 48d0d22ce..cd9f96f63 100644 --- a/application/ui.linkswidget.class.inc.php +++ b/application/ui.linkswidget.class.inc.php @@ -397,11 +397,20 @@ EOF { $bOpen = MetaModel::GetConfig()->Get('legacy_search_drawer_open'); $sHtml = "
\n"; - $oFilter = new DBObjectSearch($this->m_sRemoteClass); + + $oAlreadyLinkedFilter = new DBObjectSearch($this->m_sRemoteClass); 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) { $this->SetSearchDefaultFromContext($oCurrentObj, $oFilter); @@ -418,6 +427,7 @@ EOF 'json' => $sJson, 'cssCount' => '#count_'.$this->m_sAttCode.$this->m_sNameSuffix, 'query_params' => $oFilter->GetInternalParams(), + 'hidden_criteria' => $sAlreadyLinkedExpression, )); $sHtml .= "m_sAttCode}{$this->m_sNameSuffix}\">\n"; $sHtml .= "
m_sAttCode}{$this->m_sNameSuffix}\" style=\"vertical-align:top;background: #fff;height:100%;overflow:auto;padding:0;border:0;\">\n"; diff --git a/pages/ajax.searchform.php b/pages/ajax.searchform.php index 0933fda06..6094a0a55 100644 --- a/pages/ajax.searchform.php +++ b/pages/ajax.searchform.php @@ -50,12 +50,20 @@ try $oPage->no_cache(); $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'); - $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) { diff --git a/sources/application/search/criterionparser.class.inc.php b/sources/application/search/criterionparser.class.inc.php index 0c8365a22..903bb7b71 100644 --- a/sources/application/search/criterionparser.class.inc.php +++ b/sources/application/search/criterionparser.class.inc.php @@ -31,6 +31,7 @@ namespace Combodo\iTop\Application\Search; use Combodo\iTop\Application\Search\CriterionConversion\CriterionToOQL; use DBObjectSearch; +use Expression; use IssueLog; use OQLException; @@ -40,10 +41,11 @@ class CriterionParser /** * @param $sBaseOql * @param $aCriterion + * @param $sHiddenCriteria * * @return \DBSearch */ - public static function Parse($sBaseOql, $aCriterion) + public static function Parse($sBaseOql, $aCriterion, $sHiddenCriteria = null) { $aExpression = array(); $aOr = $aCriterion['or']; @@ -60,14 +62,21 @@ class CriterionParser try { $oSearch = DBObjectSearch::FromOQL($sBaseOql); + + if (!empty($sHiddenCriteria)) + { + $oHiddenCriteriaExpression = Expression::FromOQL($sHiddenCriteria); + $oSearch->AddConditionExpression($oHiddenCriteriaExpression); + } + if (empty($aExpression)) { return $oSearch; } - $oExpression = \Expression::FromOQL(implode(" OR ", $aExpression)); + $oExpression = Expression::FromOQL(implode(" OR ", $aExpression)); $oSearch->AddConditionExpression($oExpression); - + return $oSearch; } catch (OQLException $e) { diff --git a/sources/application/search/searchform.class.inc.php b/sources/application/search/searchform.class.inc.php index bff97eb51..a49d86639 100644 --- a/sources/application/search/searchform.class.inc.php +++ b/sources/application/search/searchform.class.inc.php @@ -146,6 +146,7 @@ class SearchForm { $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)) { $aListParams['table_id'] = $aExtraParams['table_id2'];