forked from Snck3rs/contao-leaflet-maps
Store layer relations in extra table.
This commit is contained in:
@@ -255,6 +255,12 @@ $GLOBALS['TL_DCA']['tl_leaflet_control'] = array
|
|||||||
'label' => &$GLOBALS['TL_LANG']['tl_leaflet_control']['layers'],
|
'label' => &$GLOBALS['TL_LANG']['tl_leaflet_control']['layers'],
|
||||||
'exclude' => true,
|
'exclude' => true,
|
||||||
'inputType' => 'multiColumnWizard',
|
'inputType' => 'multiColumnWizard',
|
||||||
|
'load_callback' => array(
|
||||||
|
array('Netzmacht\Contao\Leaflet\Dca\Control', 'loadLayerRelations'),
|
||||||
|
),
|
||||||
|
'save_callback' => array(
|
||||||
|
array('Netzmacht\Contao\Leaflet\Dca\Control', 'saveLayerRelations'),
|
||||||
|
),
|
||||||
'eval' => array
|
'eval' => array
|
||||||
(
|
(
|
||||||
'tl_class' => 'clr',
|
'tl_class' => 'clr',
|
||||||
|
|||||||
43
module/dca/tl_leaflet_control_layer.php
Normal file
43
module/dca/tl_leaflet_control_layer.php
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
$GLOBALS['TL_DCA']['tl_leaflet_control_layer'] = array
|
||||||
|
(
|
||||||
|
'config' => array(
|
||||||
|
'dataContainer' => 'Table',
|
||||||
|
'sql' => array
|
||||||
|
(
|
||||||
|
'keys' => array
|
||||||
|
(
|
||||||
|
'id' => 'primary',
|
||||||
|
'cid,lid' => 'unique',
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
|
||||||
|
'fields' => array
|
||||||
|
(
|
||||||
|
'id' => array
|
||||||
|
(
|
||||||
|
'sql' => "int(10) unsigned NOT NULL auto_increment"
|
||||||
|
),
|
||||||
|
'tstamp' => array
|
||||||
|
(
|
||||||
|
'sql' => "int(10) unsigned NOT NULL default '0'"
|
||||||
|
),
|
||||||
|
'sorting' => array(
|
||||||
|
'sql' => "int(10) unsigned NOT NULL default '0'"
|
||||||
|
),
|
||||||
|
'cid' => array
|
||||||
|
(
|
||||||
|
'sql' => "int(10) unsigned NOT NULL default '0'"
|
||||||
|
),
|
||||||
|
'lid' => array
|
||||||
|
(
|
||||||
|
'sql' => "int(10) unsigned NOT NULL default '0'"
|
||||||
|
),
|
||||||
|
'mode' => array
|
||||||
|
(
|
||||||
|
'sql' => "varchar(16) NOT NULL default ''"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
@@ -163,9 +163,15 @@ $GLOBALS['TL_DCA']['tl_leaflet_map'] = array
|
|||||||
'exclude' => true,
|
'exclude' => true,
|
||||||
'inputType' => 'checkboxWizard',
|
'inputType' => 'checkboxWizard',
|
||||||
'options_callback' => array('Netzmacht\Contao\Leaflet\Dca\Leaflet', 'getLayers'),
|
'options_callback' => array('Netzmacht\Contao\Leaflet\Dca\Leaflet', 'getLayers'),
|
||||||
'default' => '',
|
'load_callback' => array(
|
||||||
|
array('Netzmacht\Contao\Leaflet\Dca\Map', 'loadLayerRelations'),
|
||||||
|
),
|
||||||
|
'save_callback' => array(
|
||||||
|
array('Netzmacht\Contao\Leaflet\Dca\Map', 'saveLayerRelations'),
|
||||||
|
),
|
||||||
'eval' => array(
|
'eval' => array(
|
||||||
'multiple' => true,
|
'multiple' => true,
|
||||||
|
'doNotSaveEmpty' => true,
|
||||||
),
|
),
|
||||||
'sql' => "mediumblob NULL"
|
'sql' => "mediumblob NULL"
|
||||||
),
|
),
|
||||||
|
|||||||
39
module/dca/tl_leaflet_map_layer.php
Normal file
39
module/dca/tl_leaflet_map_layer.php
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
$GLOBALS['TL_DCA']['tl_leaflet_map_layer'] = array
|
||||||
|
(
|
||||||
|
'config' => array(
|
||||||
|
'dataContainer' => 'Table',
|
||||||
|
'sql' => array
|
||||||
|
(
|
||||||
|
'keys' => array
|
||||||
|
(
|
||||||
|
'id' => 'primary',
|
||||||
|
'mid,lid' => 'unique',
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
|
||||||
|
'fields' => array
|
||||||
|
(
|
||||||
|
'id' => array
|
||||||
|
(
|
||||||
|
'sql' => "int(10) unsigned NOT NULL auto_increment"
|
||||||
|
),
|
||||||
|
'tstamp' => array
|
||||||
|
(
|
||||||
|
'sql' => "int(10) unsigned NOT NULL default '0'"
|
||||||
|
),
|
||||||
|
'sorting' => array(
|
||||||
|
'sql' => "int(10) unsigned NOT NULL default '0'"
|
||||||
|
),
|
||||||
|
'mid' => array
|
||||||
|
(
|
||||||
|
'sql' => "int(10) unsigned NOT NULL default '0'"
|
||||||
|
),
|
||||||
|
'lid' => array
|
||||||
|
(
|
||||||
|
'sql' => "int(10) unsigned NOT NULL default '0'"
|
||||||
|
),
|
||||||
|
)
|
||||||
|
);
|
||||||
@@ -37,9 +37,9 @@ $GLOBALS['TL_DCA']['tl_leaflet_vector'] = array
|
|||||||
),
|
),
|
||||||
'global_operations' => array
|
'global_operations' => array
|
||||||
(
|
(
|
||||||
'style' => array
|
'styles' => array
|
||||||
(
|
(
|
||||||
'label' => &$GLOBALS['TL_LANG']['tl_leaflet_vector']['style'],
|
'label' => &$GLOBALS['TL_LANG']['tl_leaflet_vector']['styles'],
|
||||||
'href' => 'table=tl_leaflet_style',
|
'href' => 'table=tl_leaflet_style',
|
||||||
'icon' => 'system/modules/leaflet/assets/img/style.png',
|
'icon' => 'system/modules/leaflet/assets/img/style.png',
|
||||||
'attributes' => 'onclick="Backend.getScrollOffset();"'
|
'attributes' => 'onclick="Backend.getScrollOffset();"'
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ $GLOBALS['TL_LANG']['tl_leaflet_vector']['cut'][0] = 'Move vector';
|
|||||||
$GLOBALS['TL_LANG']['tl_leaflet_vector']['cut'][1] = 'Move vector ID %s';
|
$GLOBALS['TL_LANG']['tl_leaflet_vector']['cut'][1] = 'Move vector ID %s';
|
||||||
$GLOBALS['TL_LANG']['tl_leaflet_vector']['toggle'][0] = 'Toggle activation';
|
$GLOBALS['TL_LANG']['tl_leaflet_vector']['toggle'][0] = 'Toggle activation';
|
||||||
$GLOBALS['TL_LANG']['tl_leaflet_vector']['toggle'][1] = 'Toggle vector ID %s activation';
|
$GLOBALS['TL_LANG']['tl_leaflet_vector']['toggle'][1] = 'Toggle vector ID %s activation';
|
||||||
|
$GLOBALS['TL_LANG']['tl_leaflet_vector']['styles'][0] = 'Manage styles';
|
||||||
|
$GLOBALS['TL_LANG']['tl_leaflet_vector']['styles'][1] = 'Manage vector styles';
|
||||||
|
|
||||||
$GLOBALS['TL_LANG']['tl_leaflet_vector']['title'][0] = 'Title';
|
$GLOBALS['TL_LANG']['tl_leaflet_vector']['title'][0] = 'Title';
|
||||||
$GLOBALS['TL_LANG']['tl_leaflet_vector']['title'][1] = 'Title of the vector.';
|
$GLOBALS['TL_LANG']['tl_leaflet_vector']['title'][1] = 'Title of the vector.';
|
||||||
|
|||||||
@@ -13,11 +13,24 @@ namespace Netzmacht\Contao\Leaflet\Dca;
|
|||||||
|
|
||||||
|
|
||||||
use Netzmacht\Contao\DevTools\Dca\Options\OptionsBuilder;
|
use Netzmacht\Contao\DevTools\Dca\Options\OptionsBuilder;
|
||||||
|
use Netzmacht\Contao\DevTools\ServiceContainerTrait;
|
||||||
use Netzmacht\Contao\Leaflet\Model\ControlModel;
|
use Netzmacht\Contao\Leaflet\Model\ControlModel;
|
||||||
use Netzmacht\Contao\Leaflet\Model\LayerModel;
|
use Netzmacht\Contao\Leaflet\Model\LayerModel;
|
||||||
|
|
||||||
class Control
|
class Control
|
||||||
{
|
{
|
||||||
|
use ServiceContainerTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \Database
|
||||||
|
*/
|
||||||
|
private $database;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->database = static::getService('database.connection');
|
||||||
|
}
|
||||||
|
|
||||||
public function generateRow($row)
|
public function generateRow($row)
|
||||||
{
|
{
|
||||||
return sprintf(
|
return sprintf(
|
||||||
@@ -47,4 +60,74 @@ class Control
|
|||||||
|
|
||||||
return OptionsBuilder::fromCollection($collection, 'id', 'title')->getOptions();
|
return OptionsBuilder::fromCollection($collection, 'id', 'title')->getOptions();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function loadLayerRelations($value, $dataContainer)
|
||||||
|
{
|
||||||
|
$result = $this->database
|
||||||
|
->prepare('SELECT lid As layer, mode FROM tl_leaflet_control_layer WHERE cid=? ORDER BY sorting')
|
||||||
|
->execute($dataContainer->id);
|
||||||
|
|
||||||
|
return $result->fetchAllAssoc();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function saveLayerRelations($layers, $dataContainer)
|
||||||
|
{
|
||||||
|
$new = deserialize($layers, true);
|
||||||
|
$values = array();
|
||||||
|
$result = $this->database
|
||||||
|
->prepare('SELECT * FROM tl_leaflet_control_layer WHERE cid=? order BY sorting')
|
||||||
|
->execute($dataContainer->id);
|
||||||
|
|
||||||
|
while ($result->next()) {
|
||||||
|
$values[$result->lid] = $result->row();
|
||||||
|
}
|
||||||
|
|
||||||
|
$sorting = 0;
|
||||||
|
|
||||||
|
foreach ($new as $layer) {
|
||||||
|
if (!isset($values[$layer['layer']]) || $values[$layer['layer']]['mode'] != $layer['mode']) {
|
||||||
|
$this->database
|
||||||
|
->prepare('INSERT INTO tl_leaflet_control_layer %s')
|
||||||
|
->set(
|
||||||
|
array(
|
||||||
|
'tstamp' => time(),
|
||||||
|
'lid' => $layer['layer'],
|
||||||
|
'cid' => $dataContainer->id,
|
||||||
|
'mode' => $layer['mode'],
|
||||||
|
'sorting' => $sorting
|
||||||
|
)
|
||||||
|
)
|
||||||
|
->execute();
|
||||||
|
|
||||||
|
$sorting += 128;
|
||||||
|
} else {
|
||||||
|
$this->database
|
||||||
|
->prepare('UPDATE tl_leaflet_control_layer %s WHERE id=?')
|
||||||
|
->set(
|
||||||
|
array(
|
||||||
|
'tstamp' => time(),
|
||||||
|
'sorting' => $sorting,
|
||||||
|
'mode' => $layer['mode']
|
||||||
|
)
|
||||||
|
)
|
||||||
|
->execute($values[$layer['layer']]['id']);
|
||||||
|
|
||||||
|
$sorting += 128;
|
||||||
|
unset ($values[$layer['layer']]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$ids = array_map(
|
||||||
|
function ($item) {
|
||||||
|
return $item['id'];
|
||||||
|
},
|
||||||
|
$values
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($ids) {
|
||||||
|
$this->database->query('DELETE FROM tl_leaflet_control_layer WHERE id IN(' . implode(',', $ids) . ')');
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
95
src/Netzmacht/Contao/Leaflet/Dca/Map.php
Normal file
95
src/Netzmacht/Contao/Leaflet/Dca/Map.php
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package dev
|
||||||
|
* @author David Molineus <david.molineus@netzmacht.de>
|
||||||
|
* @copyright 2015 netzmacht creative David Molineus
|
||||||
|
* @license LGPL 3.0
|
||||||
|
* @filesource
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Netzmacht\Contao\Leaflet\Dca;
|
||||||
|
|
||||||
|
|
||||||
|
use Netzmacht\Contao\DevTools\ServiceContainerTrait;
|
||||||
|
|
||||||
|
class Map
|
||||||
|
{
|
||||||
|
use ServiceContainerTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \Database
|
||||||
|
*/
|
||||||
|
private $database;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->database = static::getService('database.connection');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function loadLayerRelations($value, $dataContainer)
|
||||||
|
{
|
||||||
|
$result = $this->database
|
||||||
|
->prepare('SELECT lid FROM tl_leaflet_map_layer WHERE mid=? ORDER BY sorting')
|
||||||
|
->execute($dataContainer->id);
|
||||||
|
|
||||||
|
return $result->fetchEach('lid');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function saveLayerRelations($layerId, $dataContainer)
|
||||||
|
{
|
||||||
|
$new = deserialize($layerId, true);
|
||||||
|
$values = array();
|
||||||
|
$result = $this->database
|
||||||
|
->prepare('SELECT * FROM tl_leaflet_map_layer WHERE mid=? order BY sorting')
|
||||||
|
->execute($dataContainer->id);
|
||||||
|
|
||||||
|
while ($result->next()) {
|
||||||
|
$values[$result->lid] = $result->row();
|
||||||
|
}
|
||||||
|
|
||||||
|
$sorting = 0;
|
||||||
|
|
||||||
|
foreach ($new as $layerId) {
|
||||||
|
if (!isset($values[$layerId])) {
|
||||||
|
$this->database
|
||||||
|
->prepare('INSERT INTO tl_leaflet_map_layer %s')
|
||||||
|
->set(
|
||||||
|
array(
|
||||||
|
'tstamp' => time(),
|
||||||
|
'lid' => $layerId,
|
||||||
|
'mid' => $dataContainer->id,
|
||||||
|
'sorting' => $sorting
|
||||||
|
)
|
||||||
|
)
|
||||||
|
->execute();
|
||||||
|
|
||||||
|
$sorting += 128;
|
||||||
|
} else {
|
||||||
|
if ($values[$layerId]['sorting'] <= ($sorting - 128) || $values[$layerId]['sorting'] >= ($sorting + 128)) {
|
||||||
|
$this->database
|
||||||
|
->prepare('UPDATE tl_leaflet_map_layer %s WHERE id=?')
|
||||||
|
->set(array('tstamp' => time(), 'sorting' => $sorting))
|
||||||
|
->execute($values[$layerId]['id']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$sorting += 128;
|
||||||
|
unset ($values[$layerId]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$ids = array_map(
|
||||||
|
function ($item) {
|
||||||
|
return $item['id'];
|
||||||
|
},
|
||||||
|
$values
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($ids) {
|
||||||
|
$this->database->query('DELETE FROM tl_leaflet_map_layer WHERE id IN(' . implode(',', $ids) . ')');
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -13,6 +13,7 @@ namespace Netzmacht\Contao\Leaflet\Mapper\Control;
|
|||||||
|
|
||||||
|
|
||||||
use Netzmacht\Contao\Leaflet\Mapper\DefinitionMapper;
|
use Netzmacht\Contao\Leaflet\Mapper\DefinitionMapper;
|
||||||
|
use Netzmacht\Contao\Leaflet\Model\ControlModel;
|
||||||
use Netzmacht\Contao\Leaflet\Model\LayerModel;
|
use Netzmacht\Contao\Leaflet\Model\LayerModel;
|
||||||
use Netzmacht\LeafletPHP\Definition\Type\LatLngBounds;
|
use Netzmacht\LeafletPHP\Definition\Type\LatLngBounds;
|
||||||
|
|
||||||
@@ -45,12 +46,12 @@ class LayersControlMapper extends AbstractControlMapper
|
|||||||
$arguments[1] = array();
|
$arguments[1] = array();
|
||||||
$arguments[2] = array();
|
$arguments[2] = array();
|
||||||
|
|
||||||
$definition = $this->getLayersDefinition($model);
|
/** @var ControlModel $model */
|
||||||
$collection = LayerModel::findMultipleByIds(array_keys($definition));
|
$collection = $model->findLayers();
|
||||||
|
|
||||||
if ($collection) {
|
if ($collection) {
|
||||||
foreach ($collection as $layer) {
|
foreach ($collection as $layer) {
|
||||||
$argument = ($definition[$layer->id] === 'overlay') ? 2 : 1;
|
$argument = ($layer->controlMode === 'overlay') ? 2 : 1;
|
||||||
|
|
||||||
$arguments[$argument][] = $mapper->handle($layer, $bounds);
|
$arguments[$argument][] = $mapper->handle($layer, $bounds);
|
||||||
}
|
}
|
||||||
@@ -58,25 +59,4 @@ class LayersControlMapper extends AbstractControlMapper
|
|||||||
|
|
||||||
return $arguments;
|
return $arguments;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get layers definition from the control model.
|
|
||||||
*
|
|
||||||
* @param \Model $model The control model.
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
protected function getLayersDefinition(\Model $model)
|
|
||||||
{
|
|
||||||
$layers = deserialize($model->layers, true);
|
|
||||||
$definition = array();
|
|
||||||
|
|
||||||
foreach ($layers as $layer) {
|
|
||||||
if ($layer['layer']) {
|
|
||||||
$definition[$layer['layer']] = $layer['mode'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $definition;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -127,8 +127,7 @@ class MapMapper extends AbstractMapper
|
|||||||
*/
|
*/
|
||||||
private function buildLayers(Map $map, MapModel $model, DefinitionMapper $mapper, LatLngBounds $bounds = null)
|
private function buildLayers(Map $map, MapModel $model, DefinitionMapper $mapper, LatLngBounds $bounds = null)
|
||||||
{
|
{
|
||||||
$ids = deserialize($model->layers, true);
|
$collection = $model->findLayers();
|
||||||
$collection = LayerModel::findMultipleByIds($ids);
|
|
||||||
|
|
||||||
if ($collection) {
|
if ($collection) {
|
||||||
foreach ($collection as $layer) {
|
foreach ($collection as $layer) {
|
||||||
|
|||||||
@@ -14,4 +14,17 @@ namespace Netzmacht\Contao\Leaflet\Model;
|
|||||||
class ControlModel extends AbstractActiveModel
|
class ControlModel extends AbstractActiveModel
|
||||||
{
|
{
|
||||||
protected static $strTable = 'tl_leaflet_control';
|
protected static $strTable = 'tl_leaflet_control';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return \Model\Collection
|
||||||
|
*/
|
||||||
|
public function findLayers()
|
||||||
|
{
|
||||||
|
$query = 'SELECT l.*, c.mode as controlMode FROM tl_leaflet_layer l LEFT JOIN tl_leaflet_control_layer c ON l.id = c.lid WHERE c.cid=?';
|
||||||
|
$result = \Database::getInstance()
|
||||||
|
->prepare($query)
|
||||||
|
->execute($this->id);
|
||||||
|
|
||||||
|
return \Model\Collection::createFromDbResult($result, 'tl_leaflet_layer');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,4 +16,16 @@ class MapModel extends \Model
|
|||||||
{
|
{
|
||||||
protected static $strTable = 'tl_leaflet_map';
|
protected static $strTable = 'tl_leaflet_map';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return \Model\Collection
|
||||||
|
*/
|
||||||
|
public function findLayers()
|
||||||
|
{
|
||||||
|
$query = 'SELECT l.* FROM tl_leaflet_layer l LEFT JOIN tl_leaflet_map_layer m ON l.id = m.lid WHERE m.mid=?';
|
||||||
|
$result = \Database::getInstance()
|
||||||
|
->prepare($query)
|
||||||
|
->execute($this->id);
|
||||||
|
|
||||||
|
return \Model\Collection::createFromDbResult($result, 'tl_leaflet_layer');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user