GetFeature.php 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <?php
  2. Lib::loadClass('Api_WfsGeomTypeConverter');
  3. class Api_Wfs_GetFeature {
  4. // TODO: add $contextAcl and context xpath to check for special perms by contextAcl
  5. public static function printXmlFeatureRecurse($xmlWriter, $acl, $item, $tagName, $attrs = [], $showAdvancedAttrs = false, $schemaCache = [], $printedFidLog = []) {
  6. $dbgFid = V::get('fid', 0, $attrs);
  7. if ($dbgFid) $printedFidLog[] = $dbgFid;
  8. if(V::get('DBG_XML', '', $_GET))$xmlWriter->writeComment("DBG: printXmlFeatureRecurse... '{$tagName}'" . ( $dbgFid ? " fid='{$dbgFid}'" : "" )); // TODO: DBG
  9. DBG::log($acl, 'array', "DBG: printXmlFeatureRecurse( ... {$tagName}, \$acl)" . ( $dbgFid ? " fid='{$dbgFid}'" : "" ));
  10. DBG::log($item, 'array', "DBG: printXmlFeatureRecurse( ... {$tagName}, \$item)" . ( $dbgFid ? " fid='{$dbgFid}'" : "" ));
  11. DBG::log([$attrs, $showAdvancedAttrs, array_keys($schemaCache), $printedFidLog], 'array', "DBG: printXmlFeatureRecurse( ... {$tagName}, \$attrs, \$showAdvancedAttrs, keys(\$schemaCache), \$printedFidLog)");
  12. // $rootWfsNs = 'p5';
  13. list($itemPrefix, $localName) = explode(':', $tagName);
  14. if (1 === count($item) && !empty($item['xlink'])) {
  15. // @example 'xlink' => 'https://biuro.biall-net.pl/wfs/default_db/CRM_PROCES#PROCES.857'
  16. $xlink = $item['xlink'];
  17. list($xlinkUrl, $xlinkFid) = explode('#', $xlink);
  18. // } else if (1 == count($item[$fldName]) && !empty($item[$fldName][0]['xlink'])) {
  19. // $xmlWriter->writeComment("TODO: xlinks for '{$fldName}'"); // TODO: DBG
  20. DBG::log($item[$fldName], 'array', "TODO: xlinks for '{$tagName}'");
  21. // $xlink = $item[$fldName][0]['xlink'];
  22. // $xlinkParts = explode(':', $xlink);
  23. // if (2 != count($xlinkParts)) throw new Exception("Error Processing Request - wrong xlink format for ".$acl->getName().".{$itemKey}/{$fldName}");
  24. // $xlinkParts[0] = Api_WfsNs::getNsUri($xlinkParts[0]);
  25. // $xlink = implode('#', $xlinkParts);
  26. $xmlWriter->startElement($tagName);
  27. foreach ($attrs as $name => $value) {
  28. $xmlWriter->writeAttribute($name, $value);
  29. }
  30. if ($showAdvancedAttrs && !$acl->canReadObjectField($fldName, (object)$item)) {
  31. $xmlWriter->writeAttribute("p5:allow_read", "false");
  32. }
  33. if ($showAdvancedAttrs && $acl->canWriteObjectField($fldName, (object)$item)) {
  34. $xmlWriter->writeAttribute("p5:allow_write", "true");
  35. }
  36. $xmlWriter->writeAttribute('xlink:href', $xlink);
  37. $xmlWriter->endElement();// {$itemPrefix}:{$fldName}
  38. return;
  39. }
  40. $xmlWriter->startElement($tagName);
  41. foreach ($attrs as $name => $value) {
  42. $xmlWriter->writeAttribute($name, $value);
  43. }
  44. $fldList = $acl->getRealFieldListByIdZasob();
  45. $geomFld = null;
  46. foreach ($fldList as $fldName) {
  47. if ($acl->isGeomField($fldName)) {
  48. $geomFld = $fldName;
  49. }
  50. }
  51. DBG::log($fldList, 'array', ">>> loop start fields(".count($fldList).")");
  52. foreach ($fldList as $idZasob => $fldName) {
  53. DBG::log(">>> loop {$idZasob} => {$fldName}...");
  54. $fldType = $acl->getXsdFieldType($fldName);
  55. DBG::log(">>> loop '{$fldName}' xsdType: '{$fldType}'");
  56. if (!$acl->canReadObjectField($fldName, (object)$item)) if(V::get('DBG_XML', '', $_GET))$xmlWriter->writeComment("DBG: skip - !canReadObjectField('{$fldName}')"); // TODO: DBG
  57. if (!$acl->canReadObjectField($fldName, (object)$item)) continue;
  58. DBG::log(">>> loop '{$fldName}' can read...");
  59. if ($geomFld != null && $fldName == $geomFld) {
  60. $xmlWriter->startElement("{$itemPrefix}:{$fldName}");
  61. if ($showAdvancedAttrs && !$acl->canReadObjectField($fldName, (object)$item)) {
  62. $xmlWriter->writeAttribute("p5:allow_read", "false");
  63. }
  64. if ($showAdvancedAttrs && $acl->canWriteObjectField($fldName, (object)$item)) {
  65. $xmlWriter->writeAttribute("p5:allow_write", "true");
  66. }
  67. (new Api_WfsGeomTypeConverter())->createGmlFromWkt_xmlWriter($item[$fldName], $xmlWriter);
  68. $xmlWriter->endElement();// {$itemPrefix}:{$fldName}
  69. } else if (is_array($item[$fldName])) {// TODO: by struct - REF field
  70. DBG::log($item[$fldName], 'array', ">>> loop({$itemKey}) REF item[{$itemKey}][{$fldName}]");
  71. if (empty($item[$fldName])) { // SKIP empty fields
  72. if(V::get('DBG_XML', '', $_GET))$xmlWriter->writeComment("DBG: skip empty field '{$fldName}'"); // TODO: DBG
  73. // $xmlWriter->h($fldName);
  74. } else {
  75. if(V::get('DBG_XML', '', $_GET))$xmlWriter->writeComment("DBG: TODO: array field... '{$fldName}'"); // TODO: DBG
  76. // $xmlWriter->writeComment("TODO: ".$acl->getName().".{$itemKey}/{$fldName} ...");
  77. $fieldNs = str_replace(['__x3A__', ':'], '/', $fldName); // substr($xsdType, 4));
  78. if (!array_key_exists($fieldNs, $schemaCache)) {
  79. DBG::log($schemaCache, 'array', "Error Processing Request - field is not ref or missing acl ".$acl->getName().".{$itemKey}/{$fldName}");
  80. if(V::get('DBG_XML', '', $_GET))$xmlWriter->writeComment("Error Processing Request - field is not ref or missing acl ".$acl->getName().".{$itemKey}/{$fldName}");
  81. } else {
  82. DBG::log($schemaCache[$fieldNs], 'array', "TODO: xxxxxxx ".$acl->getName().".{$itemKey}/{$fldName}");
  83. $childAcl = Core_AclHelper::getAclByNamespace($schemaCache[$fieldNs]['namespace'], false, $schemaCache[$fieldNs]);
  84. $childName = $schemaCache[$fieldNs]['name'];
  85. foreach ($item[$fldName] as $childItem) {
  86. $childPK = V::get($childAcl->getPrimaryKeyField(), '', $childItem);
  87. self::printXmlFeatureRecurse($xmlWriter, $childAcl, $childItem, $fldName, ($childPK) ? [ 'fid' => "{$childName}.{$childPK}" ] : [], $showAdvancedAttrs, $schemaCache, $printedFidLog);
  88. }
  89. // foreach ($item[$fldName] as $refItem) {
  90. // DBG::log($refItem, 'array', "\$refItem fld({$fldName})");
  91. // if (1 == count($refItem) && !empty($refItem['xlink'])) {
  92. // $xmlWriter->startElement($schemaCache[$fieldNs]['typeName']);
  93. // $xmlWriter->writeAttribute("xlink:href", $refItem['xlink']);
  94. // $xmlWriter->endElement();
  95. // } else {
  96. // $xmlWriter->writeComment("DBG: array field ref ... '{$fldName}'"); // TODO: DBG
  97. // $xmlWriter->startElement($schemaCache[$fieldNs]['typeName']);
  98. // foreach ($schemaCache[$fieldNs]['field'] as $field) {
  99. // if (array_key_exists($field['fieldNamespace'], $refItem)) {
  100. // $xmlWriter->writeComment("REF field ({$field['fieldNamespace']}) value({$refItem[$field['fieldNamespace']]}) TODO: get xsdType - TODO: recurse");
  101. // DBG::log($refItem[$field['fieldNamespace']], 'array', "REF field ({$field['fieldNamespace']}) TODO: get xsdType - TODO: recurse");
  102. // if (false !== strpos($field['fieldNamespace'], ':')) { // is ref - TODO: better check by xsdType
  103. // $xmlWriter->startElement($field['fieldNamespace']);
  104. // $xmlWriter->writeComment("TODO: recurse ...");
  105. // // $xmlWriter->text($refItem[$field['fieldNamespace']]);
  106. // $xmlWriter->endElement();
  107. // } else {
  108. // $xmlWriter->startElement("{$schemaCache[$fieldNs]['nsPrefix']}:{$field['fieldNamespace']}");
  109. // $xmlWriter->text($refItem[$field['fieldNamespace']]);
  110. // $xmlWriter->endElement();
  111. // }
  112. // }
  113. // }
  114. // $xmlWriter->endElement();
  115. // }
  116. // }
  117. }
  118. }
  119. } else if ('xsd:base64Binary' === $acl->getXsdFieldType($fldName)) {
  120. if (empty($item[$fldName]) && '0' !== $item[$fldName]) continue;
  121. $xmlWriter->startElement("{$itemPrefix}:{$fldName}");
  122. if ($showAdvancedAttrs && !$acl->canReadObjectField($fldName, (object)$item)) {
  123. $xmlWriter->writeAttribute("p5:allow_read", "false");
  124. }
  125. if ($showAdvancedAttrs && $acl->canWriteObjectField($fldName, (object)$item)) {
  126. $xmlWriter->writeAttribute("p5:allow_write", "true");
  127. }
  128. $xmlWriter->text(base64_encode($item[$fldName]));
  129. $xmlWriter->endElement();// {$itemPrefix}:{$fldName}
  130. } else {
  131. $value = str_replace('&', '&amp;', $item[$fldName]);
  132. if (empty($value) && '0' !== $value) {
  133. continue;
  134. } else {
  135. $xmlWriter->startElement("{$itemPrefix}:{$fldName}");
  136. if ($showAdvancedAttrs && !$acl->canReadObjectField($fldName, (object)$item)) {
  137. $xmlWriter->writeAttribute("p5:allow_read", "false");
  138. }
  139. if ($showAdvancedAttrs && $acl->canWriteObjectField($fldName, (object)$item)) {
  140. $xmlWriter->writeAttribute("p5:allow_write", "true");
  141. }
  142. $xmlWriter->text($value);
  143. $xmlWriter->endElement();// {$itemPrefix}:{$fldName}
  144. }
  145. }
  146. }
  147. $xmlWriter->endElement();
  148. }
  149. }