/** * Search for objects to be linked to the current object (i.e "remote" objects) * @param WebPage $oP The page used for the output (usually an AjaxWebPage) * @param string $sRemoteClass Name of the "remote" class to perform the search on, must be a derived class of $this->sLinkedClass * @param array $aAlreadyLinked Array of indentifiers of objects which are already linke to the current object (or about to be linked) * @param DBObject $oCurrentObj The object currently being edited... if known... */ public function SearchObjectsToAdd(WebPage $oP, $sRemoteClass = '', $aAlreadyLinked = array(), $oCurrentObj = null) { if ($sRemoteClass == '') { $sRemoteClass = $this->sLinkedClass; } $oLinksetDef = MetaModel::GetAttributeDef($this->sClass, $this->sAttCode); $valuesDef = $oLinksetDef->GetValuesDef(); if ($valuesDef === null) { $oFilter = new DBObjectSearch($this->sLinkedClass); } else { if (!$valuesDef instanceof ValueSetObjects) { throw new Exception('Error: only ValueSetObjects are supported for "allowed_values" in AttributeLinkedSet (' . $this->sClass . '/' . $this->sAttCode . ').'); } $oFilter = DBObjectSearch::FromOQL($valuesDef->GetFilterExpression()); } if ($oCurrentObj != null && MetaModel::IsSameFamilyBranch($sRemoteClass, $this->sClass)) { // Prevent linking to self if the linked object is of the same family // and laready 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); } $oBlock = new DisplayBlock($oFilter, 'list', false); $oBlock->Display($oP, "ResultsToAdd_{$this->sInputid}", array('menu' => false, 'cssCount' => '#count_' . $this->sInputid, 'selection_mode' => true, 'table_id' => 'add_' . $this->sInputid)); // Don't display the 'Actions' menu on the results }