Skip to content
This repository has been archived by the owner on Jun 25, 2024. It is now read-only.

Custom template #31

Closed
daliborjanak opened this issue Jun 13, 2014 · 3 comments
Closed

Custom template #31

daliborjanak opened this issue Jun 13, 2014 · 3 comments
Assignees
Milestone

Comments

@daliborjanak
Copy link
Collaborator

Is it possible to allow TileServer to use a custom template by default? Idea: Set path to template in config variable e.g. $config['template'] = 'leaflet.php';
If it's not set TileServer will use default viewer.

In template will be added PHP variables for custom use:
$baseUrls (array) - url to tileserver from config variable
$serverTitle (string) - Title from config variable
$maps (array) - with metadata about layers

@daliborjanak daliborjanak added this to the 2.0 milestone Jun 13, 2014
@klokan
Copy link
Member

klokan commented Jun 19, 2014

It is a nice idea. This development should happen in a separate branch - with a sample viewer.

@daliborjanak daliborjanak self-assigned this Jul 16, 2014
daliborjanak added a commit that referenced this issue Mar 7, 2016
@daliborjanak
Copy link
Collaborator Author

Implemented. If is in $config['template'] url to file provided then Tilesever will on / include this file if file exists. In this file could be used variables from PHP:
$baseUrls - array with urls to server
$serverTitle - string with name of server from config
$maps - array with metadata about each layer

So the simple example with leaflet of template could be:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.2/leaflet.css" />
    <script src="http://cdn.leafletjs.com/leaflet-0.7.2/leaflet.js"></script>
    <style type="text/css">
      html, body { height: 100%; margin: 0; padding: 0; position: fixed; font-family: Verdana, Geneva, sans-serif; font-size: 12pt; color: #666666;}
      h1{margin: 0; padding: 0; font-size: 24pt;}
      label{font-size: 11pt; cursor: pointer;}
      header{position: fixed; top: 10px; right: 10px; z-index: 1000;}
      #map{position: fixed; width: 100%; height: 100%; margin: 0; padding: 0;}
      #sliders{position: fixed; bottom: 10px; left: 10px; z-index: 1000;}
      .bg{background-color: #fff; opacity: 0.9; padding: 10px 15px}
    </style>
    <title><?php echo $serverTitle ?></title>
  </head>
  <body>
    <div id="page">
      <div id="map"></div>
      <script type="text/javascript">
         <?php foreach ($maps as $map) { ?>
         var <?php echo $map['basename'] ?>Bounds = new L.LatLngBounds(
                  new L.LatLng(<?php echo $map['bounds'][1] . ',' . $map['bounds'][0] ?>),
                  new L.LatLng(<?php echo $map['bounds'][3] . ',' . $map['bounds'][2] ?>));

         var <?php echo $map['basename'] ?> = L.tileLayer(
                  '<?php echo 'http://' . $baseUrls[0] . '/' . $map['basename'] . '/{z}/{x}/{y}.' . $map['format'] ?>', {
                    minZoom: <?php echo $map['minzoom']; ?>,
                    maxZoom: <?php echo $map['maxzoom']; ?>,
                    opacity: 1,
                    bounds: <?php echo $map['basename'] ?>Bounds,
                    zIndex: 1
                  });
        <?php } ?>
        var OSM = L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
          attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a>'
        });

        var layers = [OSM
        <?php
          foreach ($maps as $map) {
              echo ','.$map['basename'];
          }
        ?>
        ];
        var map = L.map('map', {
          center: [50.2311, 17.24],
          zoom: 12,
          layers: layers
        });

        function updateOpacity(layer, value) {
          layer.setOpacity(value);
        }

        function updateVisibility(layer, zIndex, checked) {
          if (checked) {
            layer.addTo(map);
            layer.setZIndex(zIndex);
          } else {
            map.removeLayer(layer);
          }
        }

        function fitBounds(layer) {
          map.fitBounds(layer.options.bounds);
          layer.bringToFront();
        }
      </script>
      <div id="control">
        <header class="bg">
          <h1><?php echo $serverTitle ?></h1>
        </header>
        <div id="sliders" class="bg">
          <?php foreach ($maps as $map) { ?>
            <input type="checkbox" name="layerchecker" 
                   onclick="updateVisibility(<?php echo $map['basename'] ?>, 1, this.checked);" checked>
            <label onclick="fitBounds(<?php echo $map['basename'] ?>)"><?php echo $map['name'] ?></label><br>
            <input id="slide" type="range" min="0" max="1" step="0.1" value="1" 
                   onchange="updateOpacity(<?php echo $map['basename'] ?>, this.value)">
            <br>
          <?php } ?>
        </div>
      </div>
    </div>
  </body>
</html>

@klokan
Copy link
Member

klokan commented May 4, 2016

The documentation is available at:
https://github.com/klokantech/tileserver-php/wiki/Template

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Development

No branches or pull requests

2 participants