Bladeren bron

added dbg for GetFeature nested obj

Piotr Labudda 8 jaren geleden
bovenliggende
commit
e01a60676b
1 gewijzigde bestanden met toevoegingen van 37 en 4 verwijderingen
  1. 37 4
      SE/se-lib/Api/WfsDataServer.php

+ 37 - 4
SE/se-lib/Api/WfsDataServer.php

@@ -217,6 +217,7 @@ class Api_WfsDataServer extends Api_WfsServerBase {
 					return $field['isLocal'];
 				}));
 			};
+			DBG::log($args, 'array', "\$args");
 			DBG::log($acl->getFields(), 'array', "\$contextFieldList ACL fields");
 			if (empty($args['filterFields'])) { // get all local fields
 				// $contextFieldList = $acl__getLocalFieldNames($acl->getFields());
@@ -249,6 +250,27 @@ class Api_WfsDataServer extends Api_WfsServerBase {
 					} else {
 						$fieldName = trim($fieldXPath, '*/');
 						DBG::log(['$fieldXPath'=>$fieldXPath, '$fieldName'=>$fieldName], 'array', "\$contextFieldList TODO");
+						if (false !== strpos($fieldName, '/')) {
+							$xpathParts = explode('/', $fieldName);
+							DBG::log($xpathParts, 'array', "\$xpathParts recurse TODO");
+							$localFieldName = array_shift($xpathParts);
+							DBG::log($localFieldName, 'array', "\$xpathParts recurse TODO \$localFieldName");
+							if ('*' === end($xpathParts)) array_pop($xpathParts);
+							if (!empty($xpathParts)) {
+								foreach ($xpathParts as $part) {
+									if (false !== strpos($part, ':')) {
+										$fieldNs = str_replace(['__x3A__', ':'], '/', $part);
+										if (!array_key_exists($fieldNs, $schemaCache)) {
+											$schemaCache[$fieldNs] = SchemaFactory::loadDefaultObject('SystemObject')->getItem($fieldNs, [ 'propertyName' => '*,field' ]);
+											DBG::log($schemaCache[$fieldNs], 'array', "\$schemaCache[{$fieldNs}] recurse TODO");
+										}
+									}
+								}
+								$contextFieldList[] = $localFieldName . "/" . implode("/", $xpathParts) . "/*";
+							}
+							// 'default_db__x3A__CRM_PROCES:PROCES/ID',
+							// 'default_db__x3A__CRM_PROCES:PROCES/default_db__x3A__CRM_WSKAZNIK:CRM_WSKAZNIK/*',
+						}
 					}
 				}
 			}
@@ -325,6 +347,7 @@ class Api_WfsDataServer extends Api_WfsServerBase {
 							$xmlWriter->endElement();// {$wfsNs}:{$fldName}
 						} else if (is_array($item[$fldName])) {// TODO: by struct - REF field
 							DBG::log([ 'msg'=>">>> loop({$itemKey}) REF item[{$itemKey}][{$fldName}]", '$item'=>$item[$fldName] ]);
+							$xmlWriter->writeComment("DBG: array field... '{$fldName}'"); // TODO: DBG
 							if (empty($item[$fldName])) {
 								$xmlWriter->h($fldName);
 							// } else if (1 == count($item[$fldName]) && !empty($item[$fldName][0]['xlink'])) {
@@ -346,6 +369,7 @@ class Api_WfsDataServer extends Api_WfsServerBase {
 								// $xmlWriter->writeComment("TODO: ".$acl->getName().".{$itemKey}/{$fldName} ...");
 								$fieldNs = str_replace(['__x3A__', ':'], '/', $fldName); // substr($xsdType, 4));
 								if (!array_key_exists($fieldNs, $schemaCache)) {
+									DBG::log($schemaCache, 'array', "Error Processing Request - field is not ref ".$acl->getName().".{$itemKey}/{$fldName}");
 									$xmlWriter->writeComment("Error Processing Request - field is not ref ".$acl->getName().".{$itemKey}/{$fldName}");
 								} else {
 									foreach ($item[$fldName] as $refItem) {
@@ -355,13 +379,22 @@ class Api_WfsDataServer extends Api_WfsServerBase {
 											$xmlWriter->writeAttribute("xlink:href", $refItem['xlink']);
 											$xmlWriter->endElement();
 										} else {
+											$xmlWriter->writeComment("DBG: array field ref ... '{$fldName}'"); // TODO: DBG
 											$xmlWriter->startElement($schemaCache[$fieldNs]['typeName']);
 											foreach ($schemaCache[$fieldNs]['field'] as $field) {
-												// $xmlWriter->writeComment("REF field ({$field['fieldNamespace']}) value({$refItem[$field['fieldNamespace']]})");
 												if (array_key_exists($field['fieldNamespace'], $refItem)) {
-													$xmlWriter->startElement("{$schemaCache[$fieldNs]['nsPrefix']}:{$field['fieldNamespace']}");
-													$xmlWriter->text($refItem[$field['fieldNamespace']]);
-													$xmlWriter->endElement();
+													$xmlWriter->writeComment("REF field ({$field['fieldNamespace']}) value({$refItem[$field['fieldNamespace']]}) TODO: get xsdType - TODO: recurse");
+													DBG::log($refItem[$field['fieldNamespace']], 'array', "REF field ({$field['fieldNamespace']}) TODO: get xsdType - TODO: recurse");
+													if (false !== strpos($field['fieldNamespace'], ':')) { // is ref - TODO: better check by xsdType
+														$xmlWriter->startElement($field['fieldNamespace']);
+														$xmlWriter->writeComment("TODO: recurse ...");
+														// $xmlWriter->text($refItem[$field['fieldNamespace']]);
+														$xmlWriter->endElement();
+													} else {
+														$xmlWriter->startElement("{$schemaCache[$fieldNs]['nsPrefix']}:{$field['fieldNamespace']}");
+														$xmlWriter->text($refItem[$field['fieldNamespace']]);
+														$xmlWriter->endElement();
+													}
 												}
 											}
 											$xmlWriter->endElement();