瀏覽代碼

Export/XML: documented options (no_localize / linksets) + added external fields and friendly name for the external keys, both on the exported objects and the links (linkets=1)

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@3697 a333f486-631f-4898-b8df-5754b55c2be0
romainq 9 年之前
父節點
當前提交
e4f8231d99
共有 2 個文件被更改,包括 35 次插入19 次删除
  1. 3 2
      core/attributedef.class.inc.php
  2. 32 17
      core/xmlbulkexport.class.inc.php

+ 3 - 2
core/attributedef.class.inc.php

@@ -749,8 +749,9 @@ class AttributeLinkedSet extends AttributeDefinition
 						}
 					}
 					if ($sAttCode == $this->GetExtKeyToMe()) continue;
-					if ($oAttDef->IsExternalField()) continue;
-					if (!$oAttDef->IsDirectField()) continue;
+					if ($oAttDef->IsExternalField() && ($oAttDef->GetKeyAttCode() == $this->GetExtKeyToMe())) continue;
+					if (($oAttDef instanceof AttributeFriendlyName) && ($oAttDef->GetKeyAttCode() == $this->GetExtKeyToMe())) continue;
+					if (($oAttDef instanceof AttributeFriendlyName) && ($oAttDef->GetKeyAttCode() == 'id')) continue;
 					if (!$oAttDef->IsScalar()) continue;
 					$sAttValue = $oObj->GetAsXML($sAttCode, $bLocalize);
 					$sRes .= "<$sAttCode>$sAttValue</$sAttCode>\n";

+ 32 - 17
core/xmlbulkexport.class.inc.php

@@ -28,7 +28,8 @@ class XMLBulkExport extends BulkExport
 	public function DisplayUsage(Page $oP)
 	{
 		$oP->p(" * xml format options:");
-		$oP->p(" *\tThere are no options for the XML format.");
+		$oP->p(" *\tno_localize: set to 1 to retrieve non-localized values (for instance for ENUM values). Default is 0 (= localized values)");
+		$oP->p(" *\tlinksets: set to 1 to retrieve links to related objects (1-N or N-N relations). Default is 0 (= only scalar fields)");
 	}
 
 	public function EnumFormParts()
@@ -86,7 +87,7 @@ class XMLBulkExport extends BulkExport
 		$oSet = new DBObjectSet($this->oSearch);
 		$this->aStatusInfo['position'] = 0;
 		$this->aStatusInfo['total'] = $oSet->Count();
-		$sData = "<"."?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Set>\n";
+		$sData = "<"."?xml version=\"1.0\" encoding=\"UTF-8\"?".">\n<Set>\n";
 		return $sData;
 	}
 
@@ -105,16 +106,39 @@ class XMLBulkExport extends BulkExport
 		
 		$aClasses = $this->oSearch->GetSelectedClasses();
 		$aAuthorizedClasses = array();
+		$aClass2Attributes = array();
 		foreach($aClasses as $sAlias => $sClassName)
 		{
 			if (UserRights::IsActionAllowed($sClassName, UR_ACTION_BULK_READ, $oSet) && (UR_ALLOWED_YES || UR_ALLOWED_DEPENDS))
 			{
 				$aAuthorizedClasses[$sAlias] = $sClassName;
+				$aAttributes = array();
+				foreach(MetaModel::ListAttributeDefs($sClassName) as $sAttCode=>$oAttDef)
+				{
+					if ($oAttDef->IsLinkSet() && !$this->aStatusInfo['linksets'])
+					{
+						continue;
+					}
+					if (!$oAttDef->IsWritable())
+					{
+						continue;
+					}
+					$aAttributes[$sAttCode] = $oAttDef;
+					if ($oAttDef->IsExternalKey())
+					{
+						foreach(MetaModel::ListAttributeDefs($sClassName) as $sSubAttCode=>$oSubAttDef)
+						{
+							if ($oSubAttDef->IsExternalField() && ($oSubAttDef->GetKeyAttCode() == $sAttCode))
+							{
+								$aAttributes[$sAttCode.'_friendlyname'] = MetaModel::GetAttributeDef($sClassName, $sAttCode.'_friendlyname');
+								$aAttributes[$sSubAttCode] = $oSubAttDef;
+							}
+						}
+					}
+				}
+				$aClass2Attributes[$sAlias] = $aAttributes;
 			}
 		}
-		$aAttribs = array();
-		$aList = array();
-		$aList[$sAlias] = MetaModel::GetZListItems($sClassName, 'details');
 		
 		$iPreviousTimeLimit = ini_get('max_execution_time');
 		$iLoopTimeLimit = MetaModel::GetConfig()->Get('max_execution_time_per_loop');
@@ -138,25 +162,16 @@ class XMLBulkExport extends BulkExport
 					$sClassName = get_class($oObj);
 					$sData .= "<$sClassName alias=\"$sAlias\" id=\"".$oObj->GetKey()."\">\n";
 				}
-				foreach(MetaModel::ListAttributeDefs($sClassName) as $sAttCode=>$oAttDef)
+				foreach($aClass2Attributes[$sAlias] as $sAttCode=>$oAttDef)
 				{
-					if ($oAttDef->IsLinkSet() && !$this->aStatusInfo['linksets'])
-					{
-						// Skip link sets
-						continue;
-					}
-
 					if (is_null($oObj))
 					{
 						$sData .= "<$sAttCode>null</$sAttCode>\n";
 					}
 					else
 					{
-						if ($oAttDef->IsWritable() )
-						{
-							$sValue = $oObj->GetAsXML($sAttCode, $bLocalize);
-							$sData .= "<$sAttCode>$sValue</$sAttCode>\n";
-						}
+						$sValue = $oObj->GetAsXML($sAttCode, $bLocalize);
+						$sData .= "<$sAttCode>$sValue</$sAttCode>\n";
 					}
 				}
 				$sData .= "</$sClassName>\n";