/** * Helper to make an output value for a given attribute * * @param DBObject $oObject The object being reported * @param string $sAttCode The attribute code (must be valid) * @param boolean $bExtendedOutput Output all of the link set attributes ? * @return string A scalar representation of the value */ protected function MakeResultValue(DBObject $oObject, $sAttCode, $bExtendedOutput = false) { if ($sAttCode == 'id') { $value = $oObject->GetKey(); } else { $sClass = get_class($oObject); $oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode); if ($oAttDef instanceof AttributeLinkedSet) { // Iterate on the set and build an array of array of attcode=>value $oSet = $oObject->Get($sAttCode); $value = array(); while ($oLnk = $oSet->Fetch()) { $sLnkRefClass = $bExtendedOutput ? get_class($oLnk) : $oAttDef->GetLinkedClass(); $aLnkValues = array(); foreach (MetaModel::ListAttributeDefs($sLnkRefClass) as $sLnkAttCode => $oLnkAttDef) { // Skip attributes pointing to the current object (redundant data) if ($sLnkAttCode == $oAttDef->GetExtKeyToMe()) { continue; } // Skip any attribute of the link that points to the current object $oLnkAttDef = MetaModel::GetAttributeDef($sLnkRefClass, $sLnkAttCode); if (method_exists($oLnkAttDef, 'GetKeyAttCode')) { if ($oLnkAttDef->GetKeyAttCode() == $oAttDef->GetExtKeyToMe()) { continue; } } $aLnkValues[$sLnkAttCode] = $this->MakeResultValue($oLnk, $sLnkAttCode, $bExtendedOutput); } $value[] = $aLnkValues; } } else { $value = $oAttDef->GetForJSON($oObject->Get($sAttCode)); } } return $value; }
protected function GetSampleKey(DBObject $oObj) { if ($oObj == null) { return ''; } return $oObj->GetKey(); }
public function AddObject(DBObject $oObj) { $this->aObjects[$oObj->GetKey()] = $oObj; }
/** * 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 }