From 5f3080a62d1f8d17bf52c1fc3c2b847f9ad338de Mon Sep 17 00:00:00 2001 From: David Molineus Date: Wed, 14 Jan 2015 18:51:52 +0100 Subject: [PATCH] Implement an insert tag. --- module/config/autoload.php | 1 + module/config/config.php | 4 + module/templates/ce_leaflet_map.html5 | 5 -- module/templates/leaflet_map_html.html5 | 10 ++- .../Contao/Leaflet/Frontend/Hooks.php | 73 +++++++++++++++++++ .../Contao/Leaflet/Frontend/HybridTrait.php | 2 +- src/Netzmacht/Contao/Leaflet/MapService.php | 20 +++-- 7 files changed, 101 insertions(+), 14 deletions(-) create mode 100644 src/Netzmacht/Contao/Leaflet/Frontend/Hooks.php diff --git a/module/config/autoload.php b/module/config/autoload.php index a8f174a..1e379b5 100644 --- a/module/config/autoload.php +++ b/module/config/autoload.php @@ -13,6 +13,7 @@ TemplateLoader::addFiles( array( 'ce_leaflet_map' => 'system/modules/leaflet/templates', 'leaflet_map_js' => 'system/modules/leaflet/templates', + 'leaflet_map_html' => 'system/modules/leaflet/templates', 'mod_leaflet_map' => 'system/modules/leaflet/templates', 'be_leaflet_geocode' => 'system/modules/leaflet/templates', 'be_leaflet_credits' => 'system/modules/leaflet/templates', diff --git a/module/config/config.php b/module/config/config.php index 78271bd..44efa18 100644 --- a/module/config/config.php +++ b/module/config/config.php @@ -61,6 +61,10 @@ $GLOBALS['TL_CTE']['includes']['leaflet'] = 'Netzmacht\Contao\Leaflet\Frontend\M */ $GLOBALS['FE_MOD']['includes']['leaflet'] = 'Netzmacht\Contao\Leaflet\Frontend\MapModule'; +/* + * Hooks + */ +$GLOBALS['TL_HOOKS']['replaceInsertTags'][] = array('Netzmacht\Contao\Leaflet\Frontend\Hooks', 'replaceInsertTags'); /* * Models. diff --git a/module/templates/ce_leaflet_map.html5 b/module/templates/ce_leaflet_map.html5 index e88bc5b..df6a289 100644 --- a/module/templates/ce_leaflet_map.html5 +++ b/module/templates/ce_leaflet_map.html5 @@ -6,11 +6,6 @@
-map): ?> - - diff --git a/module/templates/leaflet_map_html.html5 b/module/templates/leaflet_map_html.html5 index e54a5a4..6d4a46d 100644 --- a/module/templates/leaflet_map_html.html5 +++ b/module/templates/leaflet_map_html.html5 @@ -1,4 +1,8 @@ -
+
+ - - +ContaoLeaflet.addMap('{$mapId}', function() { +{$javascript} +return { map: map, layers: layers, controls: controls, icons: icons }; +}()); +HTML; diff --git a/src/Netzmacht/Contao/Leaflet/Frontend/Hooks.php b/src/Netzmacht/Contao/Leaflet/Frontend/Hooks.php new file mode 100644 index 0000000..37c6004 --- /dev/null +++ b/src/Netzmacht/Contao/Leaflet/Frontend/Hooks.php @@ -0,0 +1,73 @@ + + * @copyright 2015 netzmacht creative David Molineus + * @license LGPL 3.0 + * @filesource + * + */ + +namespace Netzmacht\Contao\Leaflet\Frontend; + +use Netzmacht\Contao\DevTools\ServiceContainerTrait; +use Netzmacht\Contao\Leaflet\MapService; + +/** + * Class Hooks contains hooks for the frontend manipulation. + * + * @package Netzmacht\Contao\Leaflet\Frontend + */ +class Hooks +{ + use ServiceContainerTrait; + + /** + * Replace the leaflet insert tag and returns the generated map. + * + * By default it creates the html template, so the script and html are rendered. + * + * Supported formats are: + * - {{leaflet::id|alias}} The map id or alias. + * - {{leaflet::id::style}} The style attribute, useful to pass the height and width of the container. + * - {{leaflet::id::style::template}} Optional template. Look at leaflet_map_js and leaflet_map_html as example. + * + * @param string $tag The given insert tag. + * + * @return bool|string + * + * @throws \Exception If debug mode is enabled and anything went wrong. + */ + public function replaceInsertTags($tag) + { + $parts = explode('::', $tag); + + if ($parts[0] !== 'leaflet' || empty($parts[1])) { + return false; + } + + $mapService = $this->getMapService(); + $style = empty($parts[2]) ? 'width:400px;height:300px' : $parts[2]; + $template = empty($parts[3]) ? 'leaflet_map_html' : $parts[3]; + + try { + return $mapService->generate($parts[1], null, $parts[1], $template, $style); + } catch (\Exception $e) { + if (static::getService('config')->get('debugMode')) { + throw $e; + } + return false; + } + } + + /** + * Get the map service. + * + * @return MapService + */ + protected function getMapService() + { + return static::getService('leaflet.map.service'); + } +} diff --git a/src/Netzmacht/Contao/Leaflet/Frontend/HybridTrait.php b/src/Netzmacht/Contao/Leaflet/Frontend/HybridTrait.php index 02fc614..978cc94 100644 --- a/src/Netzmacht/Contao/Leaflet/Frontend/HybridTrait.php +++ b/src/Netzmacht/Contao/Leaflet/Frontend/HybridTrait.php @@ -103,7 +103,7 @@ trait HybridTrait try { RequestUrl::setFor($this->getIdentifier()); $mapId = 'map_' . ($this->cssID[0] ?: ('ce_' . $this->id)); - $map = $this->mapService->getJavascript($this->leaflet_map, null, $mapId); + $map = $this->mapService->generate($this->leaflet_map, null, $mapId); RequestUrl::setFor(null); $GLOBALS['TL_BODY'][] = ''; diff --git a/src/Netzmacht/Contao/Leaflet/MapService.php b/src/Netzmacht/Contao/Leaflet/MapService.php index be756c8..3b0e4b6 100644 --- a/src/Netzmacht/Contao/Leaflet/MapService.php +++ b/src/Netzmacht/Contao/Leaflet/MapService.php @@ -87,7 +87,7 @@ class MapService /** * Get map model. * - * @param int $mapId Model id. + * @param int|string $mapId Model id or alias. * * @return MapModel * @@ -95,7 +95,7 @@ class MapService */ public function getModel($mapId) { - $model = MapModel::findByPk($mapId); + $model = MapModel::findByIdOrAlias($mapId); if ($model === null) { throw new \InvalidArgumentException(sprintf('Model "%s" not found', $mapId)); @@ -110,17 +110,27 @@ class MapService * @param MapModel|int $mapId The map database id. MapModel accepted as well. * @param LatLngBounds $bounds Optional bounds where elements should be in. * @param string $elementId Optional element id. If none given the mapId or alias is used. + * @param string $template The template being used for generating. + * @param string $style Optional style attributes. * * @return string + * @throws \Exception */ - public function getJavascript($mapId, LatLngBounds $bounds = null, $elementId = null, $template = 'leaflet_map_js') - { + public function generate( + $mapId, + LatLngBounds $bounds = null, + $elementId = null, + $template = 'leaflet_map_js', + $style = '' + ) { $definition = $this->getDefinition($mapId, $bounds, $elementId); $assets = new ContaoAssets(); - $template = \Controller::getTemplate($template); + + // @codingStandardsIgnoreStart - Set for the template. $javascript = $this->leaflet->build($definition, $assets); $mapId = $definition->getId(); + // @codingStandardsIgnoreEnd ob_start(); include $template;