Store layer relations in extra table.

This commit is contained in:
David Molineus
2015-01-09 22:33:57 +01:00
parent c7f37238d9
commit ff2c3fb8c3
12 changed files with 307 additions and 29 deletions

View File

@@ -13,11 +13,24 @@ namespace Netzmacht\Contao\Leaflet\Dca;
use Netzmacht\Contao\DevTools\Dca\Options\OptionsBuilder;
use Netzmacht\Contao\DevTools\ServiceContainerTrait;
use Netzmacht\Contao\Leaflet\Model\ControlModel;
use Netzmacht\Contao\Leaflet\Model\LayerModel;
class Control
{
use ServiceContainerTrait;
/**
* @var \Database
*/
private $database;
public function __construct()
{
$this->database = static::getService('database.connection');
}
public function generateRow($row)
{
return sprintf(
@@ -47,4 +60,74 @@ class Control
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;
}
}

View 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;
}
}

View File

@@ -13,6 +13,7 @@ namespace Netzmacht\Contao\Leaflet\Mapper\Control;
use Netzmacht\Contao\Leaflet\Mapper\DefinitionMapper;
use Netzmacht\Contao\Leaflet\Model\ControlModel;
use Netzmacht\Contao\Leaflet\Model\LayerModel;
use Netzmacht\LeafletPHP\Definition\Type\LatLngBounds;
@@ -45,12 +46,12 @@ class LayersControlMapper extends AbstractControlMapper
$arguments[1] = array();
$arguments[2] = array();
$definition = $this->getLayersDefinition($model);
$collection = LayerModel::findMultipleByIds(array_keys($definition));
/** @var ControlModel $model */
$collection = $model->findLayers();
if ($collection) {
foreach ($collection as $layer) {
$argument = ($definition[$layer->id] === 'overlay') ? 2 : 1;
$argument = ($layer->controlMode === 'overlay') ? 2 : 1;
$arguments[$argument][] = $mapper->handle($layer, $bounds);
}
@@ -58,25 +59,4 @@ class LayersControlMapper extends AbstractControlMapper
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;
}
}

View File

@@ -127,8 +127,7 @@ class MapMapper extends AbstractMapper
*/
private function buildLayers(Map $map, MapModel $model, DefinitionMapper $mapper, LatLngBounds $bounds = null)
{
$ids = deserialize($model->layers, true);
$collection = LayerModel::findMultipleByIds($ids);
$collection = $model->findLayers();
if ($collection) {
foreach ($collection as $layer) {

View File

@@ -14,4 +14,17 @@ namespace Netzmacht\Contao\Leaflet\Model;
class ControlModel extends AbstractActiveModel
{
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');
}
}

View File

@@ -16,4 +16,16 @@ class MapModel extends \Model
{
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');
}
}