diff --git a/application/dashboard.class.inc.php b/application/dashboard.class.inc.php index 764143fb7..5828a80f2 100644 --- a/application/dashboard.class.inc.php +++ b/application/dashboard.class.inc.php @@ -710,9 +710,9 @@ class RuntimeDashboard extends Dashboard */ public function Render($oPage, $bEditMode = false, $aExtraParams = array()) { - if (!isset($aExtraParams['query_params']) && isset($aExtraParams['class'])) + if (!isset($aExtraParams['query_params']) && isset($aExtraParams['this->class'])) { - $oObj = MetaModel::GetObject($aExtraParams['class'], $aExtraParams['id']); + $oObj = MetaModel::GetObject($aExtraParams['this->class'], $aExtraParams['this->id']); $aRenderParams = array('query_params' => $oObj->ToArgsForQuery()); } else @@ -726,7 +726,7 @@ class RuntimeDashboard extends Dashboard { /** @var \DBObject $oObj */ $oObj = $aExtraParams['query_params']['this->object()']; - $aAjaxParams = array('class' => get_class($oObj), 'id' => $oObj->GetKey()); + $aAjaxParams = array('this->class' => get_class($oObj), 'this->id' => $oObj->GetKey()); } else { @@ -938,9 +938,9 @@ EOF */ public function RenderEditor($oPage, $aExtraParams = array()) { - if (isset($aExtraParams['class'])) + if (isset($aExtraParams['this->class'])) { - $oObj = MetaModel::GetObject($aExtraParams['class'], $aExtraParams['id']); + $oObj = MetaModel::GetObject($aExtraParams['this->class'], $aExtraParams['this->id']); $aRenderParams = array('query_params' => $oObj->ToArgsForQuery()); } else diff --git a/application/dashlet.class.inc.php b/application/dashlet.class.inc.php index d98be77aa..a1672ee21 100644 --- a/application/dashlet.class.inc.php +++ b/application/dashlet.class.inc.php @@ -781,9 +781,9 @@ class DashletObjectList extends Dashlet { $aQueryParams = $aExtraParams['query_params']; } - elseif (isset($aExtraParams['class'])) + elseif (isset($aExtraParams['this->class'])) { - $oObj = MetaModel::GetObject($aExtraParams['class'], $aExtraParams['id']); + $oObj = MetaModel::GetObject($aExtraParams['this->class'], $aExtraParams['this->id']); $aQueryParams = $oObj->ToArgsForQuery(); } else @@ -1020,6 +1020,8 @@ abstract class DashletGroupBy extends Dashlet * @param bool $bEditMode * @param array $aExtraParams * + * @throws \ArchivedObjectException + * @throws \CoreException * @throws \OQLException */ public function Render($oPage, $bEditMode = false, $aExtraParams = array()) @@ -1033,9 +1035,9 @@ abstract class DashletGroupBy extends Dashlet { $aQueryParams = $aExtraParams['query_params']; } - elseif (isset($aExtraParams['class'])) + elseif (isset($aExtraParams['this->class'])) { - $oObj = MetaModel::GetObject($aExtraParams['class'], $aExtraParams['id']); + $oObj = MetaModel::GetObject($aExtraParams['this->class'], $aExtraParams['this->id']); $aQueryParams = $oObj->ToArgsForQuery(); } else @@ -1837,9 +1839,9 @@ class DashletHeaderDynamic extends Dashlet { $aQueryParams = $aExtraParams['query_params']; } - elseif (isset($aExtraParams['class'])) + elseif (isset($aExtraParams['this->class'])) { - $oObj = MetaModel::GetObject($aExtraParams['class'], $aExtraParams['id']); + $oObj = MetaModel::GetObject($aExtraParams['this->class'], $aExtraParams['this->id']); $aQueryParams = $oObj->ToArgsForQuery(); } else diff --git a/application/displayblock.class.inc.php b/application/displayblock.class.inc.php index 48a68c62d..ff670f5b2 100644 --- a/application/displayblock.class.inc.php +++ b/application/displayblock.class.inc.php @@ -472,7 +472,7 @@ class DisplayBlock { $aQueryParams = array(); } - $sFilter = urlencode($oSubsetSearch->serialize(false, $aQueryParams)); + $sFilter = $oSubsetSearch->serialize(false, $aQueryParams); $aData[] = array ('group' => $aLabels[$iRow], 'value' => "$iCount"); // TO DO: add the context information @@ -749,7 +749,7 @@ class DisplayBlock $this->m_oSet->SetShowObsoleteData($this->m_bShowObsoleteData); } $iCount = $this->m_oSet->Count(); - $sHyperlink = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search&'.$oAppContext->GetForLink().'&filter='.urlencode($this->m_oFilter->serialize()); + $sHyperlink = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search&'.$oAppContext->GetForLink().'&filter='.$this->m_oFilter->serialize(); $sHtml .= '

'; // Note: border set to 0 due to various browser interpretations (IE9 adding a 2px border) $sHtml .= MetaModel::GetClassIcon($sClass, true, 'float;left;margin-right:10px;border:0;'); @@ -838,7 +838,7 @@ class DisplayBlock } $sHyperlink = utils::GetAbsoluteUrlAppRoot() .'pages/UI.php?operation=search&'.$oAppContext->GetForLink() - .'&filter='.urlencode($oSingleGroupByValueFilter->serialize()); + .'&filter='.$oSingleGroupByValueFilter->serialize(); $aCounts[$sStateValue] = "{$aCounts[$sStateValue]}"; } } @@ -847,7 +847,7 @@ class DisplayBlock $sHtml .= ''.implode('', $aCounts).''; // Title & summary $iCount = $this->m_oSet->Count(); - $sHyperlink = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search&'.$oAppContext->GetForLink().'&filter='.urlencode($this->m_oFilter->serialize()); + $sHyperlink = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search&'.$oAppContext->GetForLink().'&filter='.$this->m_oFilter->serialize(); $sHtml .= '

'.Dict::S(str_replace('_', ':', $sTitle)).'

'; $sHtml .= ''.Dict::Format(str_replace('_', ':', $sLabel), $iCount).''; $sHtml .= '
'; @@ -858,7 +858,7 @@ class DisplayBlock $sCsvFile = strtolower($this->m_oFilter->GetClass()).'.csv'; $sDownloadLink = utils::GetAbsoluteUrlAppRoot().'webservices/export.php?expression='.urlencode($this->m_oFilter->ToOQL(true)).'&format=csv&filename='.urlencode($sCsvFile); - $sLinkToToggle = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search&'.$oAppContext->GetForLink().'&filter='.urlencode($this->m_oFilter->serialize()).'&format=csv'; + $sLinkToToggle = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search&'.$oAppContext->GetForLink().'&filter='.$this->m_oFilter->serialize().'&format=csv'; // Pass the parameters via POST, since expression may be very long $aParamsToPost = array( 'expression' => $this->m_oFilter->ToOQL(true), @@ -986,7 +986,7 @@ EOF $oSubsetSearch = $this->m_oFilter->DeepClone(); $oCondition = new BinaryExpression($oGroupByExp, '=', new ScalarExpression($sValue)); $oSubsetSearch->AddConditionExpression($oCondition); - $aURLs[] = utils::GetAbsoluteUrlAppRoot()."pages/UI.php?operation=search&format=html&filter=".urlencode($oSubsetSearch->serialize()).'&'.$sContextParam; + $aURLs[] = utils::GetAbsoluteUrlAppRoot()."pages/UI.php?operation=search&format=html&filter=".$oSubsetSearch->serialize().'&'.$sContextParam; } $sJSURLs = json_encode($aURLs); } diff --git a/application/ui.extkeywidget.class.inc.php b/application/ui.extkeywidget.class.inc.php index 780ed999c..6978a7cb4 100644 --- a/application/ui.extkeywidget.class.inc.php +++ b/application/ui.extkeywidget.class.inc.php @@ -332,7 +332,8 @@ EOF if ( ($oCurrObject != null) && ($this->sAttCode != '')) { $oAttDef = MetaModel::GetAttributeDef(get_class($oCurrObject), $this->sAttCode); - $aArgs = array('this' => $oCurrObject); + /** @var \DBObject $oCurrObject */ + $aArgs = $oCurrObject->ToArgsForQuery(); $aParams = array('query_params' => $aArgs); $oSet = $oAttDef->GetAllowedValuesAsObjectSet($aArgs); $oFilter = $oSet->GetFilter(); diff --git a/core/attributedef.class.inc.php b/core/attributedef.class.inc.php index 0de09da88..113680a03 100644 --- a/core/attributedef.class.inc.php +++ b/core/attributedef.class.inc.php @@ -9939,7 +9939,7 @@ class AttributeTagSet extends AttributeSet $oAppContext = new ApplicationContext(); $sContext = $oAppContext->GetForLink(); $sUIPage = cmdbAbstractObject::ComputeStandardUIPage($oFilter->GetClass()); - $sFilter = urlencode($oFilter->serialize()); + $sFilter = $oFilter->serialize(); $sUrl = utils::GetAbsoluteUrlAppRoot()."pages/$sUIPage?operation=search&filter=".$sFilter."&{$sContext}"; $sHtml .= ''.$sTagLabel.''; diff --git a/core/dbsearch.class.php b/core/dbsearch.class.php index 81533993a..0da1efbce 100644 --- a/core/dbsearch.class.php +++ b/core/dbsearch.class.php @@ -262,34 +262,63 @@ abstract class DBSearch if (isset($aContextParams[$sParamName.'->object()'])) { $sAttCode = substr($sParam, $iPos + 2); + /** @var \DBObject $oObj */ $oObj = $aContextParams[$sParamName.'->object()']; - if ($sAttCode == 'id') + if ($oObj->IsModified()) { - $aQueryParams[$sParam] = $oObj->GetKey(); + if ($sAttCode == 'id') + { + $aQueryParams[$sParam] = $oObj->GetKey(); + } + else + { + $aQueryParams[$sParam] = $oObj->Get($sAttCode); + } } else { - $aQueryParams[$sParam] = $oObj->Get($sAttCode); + unset($aQueryParams[$sParam]); + // For database objects, serialize only class, key + $aQueryParams[$sParamName.'->id'] = $oObj->GetKey(); + $aQueryParams[$sParamName.'->class'] = get_class($oObj); } } } } $sOql = $this->ToOql($bDevelopParams, $aContextParams); - return rawurlencode(base64_encode(serialize(array($sOql, $aQueryParams, $this->m_aModifierProperties)))); + return rawurlencode(json_encode(array($sOql, $aQueryParams, $this->m_aModifierProperties))); } /** * @param string $sValue Serialized OQL query * * @return \DBSearch + * @throws \ArchivedObjectException + * @throws \CoreException * @throws \OQLException */ static public function unserialize($sValue) { - $aData = unserialize(base64_decode(rawurldecode($sValue))); + $aData = json_decode(rawurldecode($sValue), true); $sOql = $aData[0]; $aParams = $aData[1]; + $aExtraParams = array(); + foreach($aParams as $sParam => $sValue) + { + if (($iPos = strpos($sParam, '->class')) !== false) + { + $sParamName = substr($sParam, 0, $iPos); + if (isset($aParams[$sParamName.'->id'])) + { + $sClass = $aParams[$sParamName.'->class']; + $iKey = $aParams[$sParamName.'->id']; + $oObj = MetaModel::GetObject($sClass, $iKey); + $aExtraParams[$sParamName.'->object()'] = $oObj; + } + } + } + $aParams = array_merge($aExtraParams, $aParams); // We've tried to use gzcompress/gzuncompress, but for some specific queries // it was not working at all (See Trac #193) // gzuncompress was issuing a warning "data error" and the return object was null diff --git a/test/testlist.inc.php b/test/testlist.inc.php index 88519843a..434bd5104 100644 --- a/test/testlist.inc.php +++ b/test/testlist.inc.php @@ -728,7 +728,7 @@ class TestQueriesOnFarm extends MyFarm $oFilter2 = DBObjectSearch::unserialize($sSerialize); try { - $sQuery2 = $oMyFilter2->MakeSelectQuery(); + $sQuery2 = $oFilter2->MakeSelectQuery(); } catch (Exception $e) {