if ($sType == 'T') return 'way';
if ($sType == 'I') return 'way';
+ // not handled: P, L
+
return '';
}
return '';
}
-function detailsLink($aFeature, $sTitle = false)
+function detailsLink($aFeature, $sTitle = false, $sExtraProperties = false)
{
if (!$aFeature['place_id']) return '';
- return '<a href="details.php?place_id='.$aFeature['place_id'].'">'.($sTitle?$sTitle:$aFeature['place_id']).'</a>';
+ $sHtml = '<a ';
+ if ($sExtraProperties) {
+ $sHtml .= $sExtraProperties.' ';
+ }
+
+ $sHtml .= 'href="details.php?place_id='.$aFeature['place_id'].'">'.($sTitle?$sTitle:$aFeature['place_id']).'</a>';
+
+ return $sHtml;
}
-function detailsPermaLink($aFeature, $sRefText = false)
+function detailsPermaLink($aFeature, $sRefText = false, $sExtraProperties = false)
{
$sOSMType = formatOSMType($aFeature['osm_type'], false);
if ($sOSMType) {
- $sLabel = $sRefText ? $sRefText : $sOSMType.' '.$aFeature['osm_id'];
- return '<a href="details.php?osmtype='.$aFeature['osm_type'].'&osmid='.$aFeature['osm_id'].'&class='.$aFeature['class'].'">'.$sLabel.'</a>';
+ $sHtml = '<a ';
+ if ($sExtraProperties) {
+ $sHtml .= $sExtraProperties.' ';
+ }
+ $sHtml .= 'href="details.php?osmtype='.$aFeature['osm_type']
+ .'&osmid='.$aFeature['osm_id'].'&class='.$aFeature['class'].'">';
+
+ if ($sRefText) {
+ $sHtml .= $sRefText.'</a>';
+ } else {
+ $sHtml .= $sOSMType.' '.$aFeature['osm_id'].'</a>';
+ }
+
+ return $sHtml;
}
- return '';
+ return detailsLink($aFeature, $sRefText, $sExtraProperties);
}
else
echo ' <span class="type">('.ucwords(str_replace('_',' ',$aResult['type'])).')</span>';
echo '<p>'.$aResult['lat'].','.$aResult['lon'].'</p>';
- echo ' <a class="btn btn-default btn-xs details" href="details.php?osmtype='.$aResult['osm_type'].'&osmid='.$aResult['osm_id'].'&class='.$aResult['class'].'">details</a>';
+ echo detailsPermaLink($aResult, 'details', 'class="btn btn-default btn-xs details"');
echo '</div>';
?>
</div>
echo ' <span class="type">('.ucwords(str_replace('_',' ',$aResult['class'])).')</span>';
else
echo ' <span class="type">('.ucwords(str_replace('_',' ',$aResult['type'])).')</span>';
- echo ' <a class="btn btn-default btn-xs details" href="details.php?osmtype='.$aResult['osm_type'].'&osmid='.$aResult['osm_id'].'&class='.$aResult['class'].'">details</a>';
+ echo detailsPermaLink($aResult, 'details', 'class="btn btn-default btn-xs details"');
echo '</div>';
$i = $i+1;
}
--- /dev/null
+<?php
+
+namespace Nominatim;
+
+require_once(CONST_BasePath.'/lib/output.php');
+
+class OutputTest extends \PHPUnit\Framework\TestCase
+{
+ public function testDetailsPermaLinkNode()
+ {
+ $aFeature = array('osm_type' => 'N', 'osm_id'=> 38274, 'class' => 'place');
+ $this->assertSame(
+ detailsPermaLink($aFeature),
+ '<a href="details.php?osmtype=N&osmid=38274&class=place">node 38274</a>'
+ );
+ }
+
+ public function testDetailsPermaLinkWay()
+ {
+ $aFeature = array('osm_type' => 'W', 'osm_id'=> 65, 'class' => 'highway');
+ $this->assertSame(
+ detailsPermaLink($aFeature),
+ '<a href="details.php?osmtype=W&osmid=65&class=highway">way 65</a>'
+ );
+ }
+
+ public function testDetailsPermaLinkRelation()
+ {
+ $aFeature = array('osm_type' => 'R', 'osm_id'=> 9908, 'class' => 'waterway');
+ $this->assertSame(
+ detailsPermaLink($aFeature),
+ '<a href="details.php?osmtype=R&osmid=9908&class=waterway">relation 9908</a>'
+ );
+ }
+
+ public function testDetailsPermaLinkTiger()
+ {
+ $aFeature = array('osm_type' => 'T', 'osm_id'=> 2, 'place_id' => 334);
+ $this->assertSame(
+ detailsPermaLink($aFeature, 'foo'),
+ '<a href="details.php?place_id=334">foo</a>'
+ );
+ }
+
+ public function testDetailsPermaLinkInterpolation()
+ {
+ $aFeature = array('osm_type' => 'I', 'osm_id'=> 400, 'place_id' => 3);
+ $this->assertSame(
+ detailsPermaLink($aFeature, 'foo'),
+ '<a href="details.php?place_id=3">foo</a>'
+ );
+ }
+
+ public function testDetailsPermaLinkWithExtraPropertiesNode()
+ {
+ $aFeature = array('osm_type' => 'N', 'osm_id'=> 2, 'class' => 'amenity');
+ $this->assertSame(
+ detailsPermaLink($aFeature, 'something', 'class="xtype"'),
+ '<a class="xtype" href="details.php?osmtype=N&osmid=2&class=amenity">something</a>'
+ );
+ }
+
+ public function testDetailsPermaLinkWithExtraPropertiesTiger()
+ {
+ $aFeature = array('osm_type' => 'T', 'osm_id'=> 5, 'place_id' => 46);
+ $this->assertSame(
+ detailsPermaLink($aFeature, 'something', 'class="xtype"'),
+ '<a class="xtype" href="details.php?place_id=46">something</a>'
+ );
+ }
+}
$sSQL .= ' ORDER BY class ASC';
$sPlaceId = $oDB->getOne($sSQL, array(':type' => $sOsmType, ':id' => $iOsmId));
+
+ // Nothing? Maybe it's an interpolation.
+ // XXX Simply returns the first parent street it finds. It should
+ // get a house number and get the right interpolation.
+ if (!$sPlaceId && $sOsmType == 'W' && (!$sClass || $sClass == 'place')) {
+ $sSQL = 'SELECT place_id FROM location_property_osmline'
+ .' WHERE osm_id = :id LIMIT 1';
+ $sPlaceId = $oDB->getOne($sSQL, array(':id' => $iOsmId));
+ }
+
// Be nice about our error messages for broken geometry
if (!$sPlaceId) {