|
|
@@ -167,20 +167,24 @@ class Api_WfsDataServer extends Api_WfsServerBase {
|
|
|
if($DBG){echo 'getItems:';print_r($searchParams);echo "\n";}
|
|
|
$items = $acl->getItems($searchParams);
|
|
|
|
|
|
- $dom = new DOMDocument('1.0', 'utf-8');
|
|
|
- $dom->formatOutput = true;
|
|
|
- $dom->preserveWhiteSpace = false;
|
|
|
- $rootNode = $dom->createElementNS('http://www.opengis.net/wfs', 'wfs:FeatureCollection');
|
|
|
- $dom->appendChild($rootNode);
|
|
|
- $rootNode->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns', 'http://www.opengis.net/wfs');
|
|
|
- $rootNode->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:wfs', 'http://www.opengis.net/wfs');
|
|
|
- $rootNode->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:gml', 'http://www.opengis.net/gml');
|
|
|
- $rootNode->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
|
|
|
- $rootNode->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:xlink', 'http://www.w3.org/1999/xlink');
|
|
|
- $rootNode->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:' . $wfsNs, $wfsNsUri);
|
|
|
- if (!$simple) $rootNode->setAttributeNS('http://www.w3.org/2000/xmlns/', "xmlns:{$rootWfsNs}", $rootWfsNsUri);
|
|
|
- //$rootNode->setAttribute('xsi:schemaLocation', 'http://www.opengis.net/wfs');
|
|
|
- $rootNode->setAttribute('xsi:schemaLocation', "{$wfsNsUri} {$featureTypeUri}");
|
|
|
+ header('Content-type: application/xml; charset=utf-8');
|
|
|
+ $xmlWriter = new XMLWriter();
|
|
|
+ $xmlWriter->openUri('php://output');
|
|
|
+ // $xmlWriter->openMemory();// DBG
|
|
|
+ $xmlWriter->setIndent(true);
|
|
|
+ if (!$xmlWriter) throw new HttpException("Error no XMLWriter", 404);
|
|
|
+ $xmlWriter->startDocument('1.0','UTF-8');
|
|
|
+ //$xmlWriter->startElementNS('wfs', 'FeatureCollection', 'http://www.opengis.net/wfs');
|
|
|
+ $xmlWriter->startElement('wfs:FeatureCollection');
|
|
|
+// $xmlWriter->writeAttributeNS('xmlns', 'wfs', 'http://www.w3.org/2000/xmlns/', 'http://www.opengis.net/wfs');
|
|
|
+ $xmlWriter->writeAttribute('xmlns:wfs', 'http://www.opengis.net/wfs');
|
|
|
+ $xmlWriter->writeAttribute('xmlns', 'http://www.opengis.net/wfs');
|
|
|
+ $xmlWriter->writeAttribute('xmlns:gml', 'http://www.opengis.net/gml');
|
|
|
+ $xmlWriter->writeAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
|
|
|
+ $xmlWriter->writeAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');
|
|
|
+ $xmlWriter->writeAttribute("xmlns:{$wfsNs}", $wfsNsUri);
|
|
|
+ if (!$simple) $xmlWriter->writeAttribute("xmlns:{$rootWfsNs}", $rootWfsNsUri);
|
|
|
+ $xmlWriter->writeAttribute('xsi:schemaLocation', "{$wfsNsUri} {$featureTypeUri}");
|
|
|
|
|
|
if($DBG){echo '(geomFld: '.$geomFld.'):';print_r($acl->getFieldType($geomFld));echo "\n";}
|
|
|
if (empty($items)) {
|
|
|
@@ -197,21 +201,25 @@ class Api_WfsDataServer extends Api_WfsServerBase {
|
|
|
if($DBG && !empty($geomFld)){echo 'item['.$itemKey.'] ('.$geomFld.')isEmpty('.empty($item[$geomFld]).'):';print_r($item[$geomFld]);echo "\n";}
|
|
|
if($DBG_DS){echo ">>> loop({$itemKey}) item: ";print_r($item);echo "\n";}
|
|
|
|
|
|
- $featureMemberNode = $dom->createElementNS('http://www.opengis.net/gml', 'gml:featureMember');
|
|
|
- $rootNode->appendChild($featureMemberNode);
|
|
|
- $featureNode = $dom->createElementNS($wfsNsUri, "{$wfsNs}:{$type}");
|
|
|
- $featureMemberNode->appendChild($featureNode);
|
|
|
- $featureNode->setAttribute('fid', "{$type}.{$itemKey}");
|
|
|
- if (!$simple) $featureNode->setAttributeNS($rootWfsNsUri, "{$rootWfsNs}:web_link", Request::getPathUri() . "index.php?_route=ViewTableAjax&typeName=p5_{$sourceName}:{$tblName}#EDIT/{$itemKey}");
|
|
|
- foreach ($fldList as $fldName) {
|
|
|
+ $xmlWriter->startElement('gml:featureMember');
|
|
|
+ $xmlWriter->startElement("{$wfsNs}:{$type}");
|
|
|
+ $xmlWriter->writeAttribute('fid', "{$type}.{$itemKey}");
|
|
|
+ if (!$simple) $xmlWriter->writeAttribute("{$rootWfsNs}:web_link", Request::getPathUri() . "index.php?_route=ViewTableAjax&typeName=p5_{$sourceName}:{$tblName}#EDIT/{$itemKey}");
|
|
|
+ foreach ($fldList as $idZasob => $fldName) {
|
|
|
+ if($DBG_DS){echo ">>> loop({$itemKey}) item({$item['ID']}) fld({$fldName}): ";var_dump($item[$fldName]);echo"\n";}
|
|
|
$fldType = $acl->getXsdFieldType($fldName);
|
|
|
- $featureFldNode = $dom->createElementNS($wfsNsUri, "{$wfsNs}:{$fldName}");
|
|
|
- if($DBG_DS){echo">>> acl->canReadObjectField('{$fldName}', \$item) ...\n";}
|
|
|
- if ($acl->canReadObjectField($fldName, (object)$item)) {
|
|
|
- if ($geomFld != null && $geomFld == $fldName) {
|
|
|
- $geomNode = $this->_typeConverter->createGmlFromWkt($item[$fldName], $dom);
|
|
|
- if (!$geomNode) continue;
|
|
|
- $featureFldNode->appendChild($geomNode);
|
|
|
+ $canReadRecord = $acl->canReadObjectField($fldName, (object)$item);
|
|
|
+ if ($canReadRecord) {
|
|
|
+ if ($geomFld != null && $fldName == $geomFld) {
|
|
|
+ $xmlWriter->startElement("{$wfsNs}:{$fldName}");
|
|
|
+ if (!$simple && !$acl->canReadObjectField($fldName, (object)$item)) {
|
|
|
+ $xmlWriter->writeAttribute("{$rootWfsNs}:allow_read", "false");
|
|
|
+ }
|
|
|
+ if (!$simple && !$acl->canWriteObjectField($fldName, (object)$item)) {
|
|
|
+ $xmlWriter->writeAttribute("{$rootWfsNs}:allow_write", "true");
|
|
|
+ }
|
|
|
+ $this->_typeConverter->createGmlFromWkt_xmlWriter($item[$fldName], $xmlWriter);
|
|
|
+ $xmlWriter->endElement();// {$wfsNs}:{$fldName}
|
|
|
} else if (is_array($item[$fldName])) {// TODO: by struct - REF field
|
|
|
if($DBG_DS){echo">>> TODO({$fldName}) REF item[{$itemKey}][{$fldName}]: ";print_r($item[$fldName]);echo "\n";}
|
|
|
if (1 == count($item[$fldName])) {
|
|
|
@@ -220,34 +228,42 @@ class Api_WfsDataServer extends Api_WfsServerBase {
|
|
|
if (2 != count($xlinkParts)) throw new Exception("Error Processing Reques - wrong xlink format for ".$acl->getName().".{$itemKey}/{$fldName}");
|
|
|
$xlinkParts[0] = Api_WfsNs::getNsUri($xlinkParts[0]);
|
|
|
$xlink = implode('#', $xlinkParts);
|
|
|
- $featureFldNode->setAttribute('xlink:href', $xlink);
|
|
|
+ $xmlWriter->startElement("{$wfsNs}:{$fldName}");
|
|
|
+ if (!$simple && !$acl->canReadObjectField($fldName, (object)$item)) {
|
|
|
+ $xmlWriter->writeAttribute("{$rootWfsNs}:allow_read", "false");
|
|
|
+ }
|
|
|
+ if (!$simple && !$acl->canWriteObjectField($fldName, (object)$item)) {
|
|
|
+ $xmlWriter->writeAttribute("{$rootWfsNs}:allow_write", "true");
|
|
|
+ }
|
|
|
+ $xmlWriter->writeAttribute('xlink:href', $xlink);
|
|
|
+ $xmlWriter->endElement();// {$wfsNs}:{$fldName}
|
|
|
} else {
|
|
|
throw new Exception("Error Processing Request - too many refs for ".$acl->getName().".{$itemKey}/{$fldName}");
|
|
|
}
|
|
|
- // foreach ($item[$fldName] as $ref) {
|
|
|
- // $refNode = $dom->createElementNS($wfsNsUri, "{$wfsNs}:{$fldName}");
|
|
|
- // $featureFldNode->appendChild($refNode);
|
|
|
- // }
|
|
|
} else {
|
|
|
- $featureFldNode->nodeValue = str_replace('&', '&', $item[$fldName]);
|
|
|
- if (empty($featureFldNode->nodeValue) && '0' !== $featureFldNode->nodeValue) {
|
|
|
+ $value = str_replace('&', '&', $item[$fldName]);
|
|
|
+ if (empty($value) && '0' !== $value) {
|
|
|
continue;
|
|
|
+ } else {
|
|
|
+ $xmlWriter->startElement("{$wfsNs}:{$fldName}");
|
|
|
+ if (!$simple && !$acl->canReadObjectField($fldName, (object)$item)) {
|
|
|
+ $xmlWriter->writeAttribute("{$rootWfsNs}:allow_read", "false");
|
|
|
+ }
|
|
|
+ if (!$simple && !$acl->canWriteObjectField($fldName, (object)$item)) {
|
|
|
+ $xmlWriter->writeAttribute("{$rootWfsNs}:allow_write", "true");
|
|
|
+ }
|
|
|
+ $xmlWriter->text($value);
|
|
|
+ $xmlWriter->endElement();// {$wfsNs}:{$fldName}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- if (!$simple) {
|
|
|
- if (!$acl->canReadObjectField($fldName, (object)$item)) {
|
|
|
- $featureFldNode->setAttributeNS($rootWfsNsUri, "{$rootWfsNs}:allow_read", "false");
|
|
|
- }
|
|
|
- if ($acl->canWriteObjectField($fldName, (object)$item)) {
|
|
|
- $featureFldNode->setAttributeNS($rootWfsNsUri, "{$rootWfsNs}:allow_write", "true");
|
|
|
- }
|
|
|
- }
|
|
|
- $featureNode->appendChild($featureFldNode);
|
|
|
}
|
|
|
+ $xmlWriter->endElement();// {$wfsNs}:{$type}
|
|
|
+ $xmlWriter->endElement();// gml:featureMember
|
|
|
}
|
|
|
-
|
|
|
- return $dom->saveXml();
|
|
|
+ $xmlWriter->endElement();// wfs:FeatureCollection
|
|
|
+ $xmlWriter->endDocument();
|
|
|
+ exit;
|
|
|
}
|
|
|
|
|
|
public function describeFeatureTypeAction() {
|