diff --git a/backend/lib/Controller/AggregatorController.php b/backend/lib/Controller/AggregatorController.php index dd45e68..6aa543f 100644 --- a/backend/lib/Controller/AggregatorController.php +++ b/backend/lib/Controller/AggregatorController.php @@ -65,7 +65,7 @@ class AggregatorController extends EntityController { } else { // create new aggregator $aggregator = new Model\Aggregator('group'); // TODO support for other aggregator types - $this->setProperties($aggregator); + $this->setProperties($aggregator, $this->view->request->getParameters()); $this->em->persist($aggregator); if ($this->view->request->getParameter('setcookie')) { @@ -103,4 +103,4 @@ class AggregatorController extends EntityController { } } -?> \ No newline at end of file +?> diff --git a/backend/lib/Controller/ChannelController.php b/backend/lib/Controller/ChannelController.php index 6543603..ade8a6c 100644 --- a/backend/lib/Controller/ChannelController.php +++ b/backend/lib/Controller/ChannelController.php @@ -53,7 +53,7 @@ class ChannelController extends EntityController { */ public function add() { $channel = new Model\Channel($this->view->request->getParameter('type')); - $this->setProperties($channel); + $this->setProperties($channel, $this->view->request->getParameters()); $this->em->persist($channel); $this->em->flush(); @@ -65,4 +65,4 @@ class ChannelController extends EntityController { } } -?> \ No newline at end of file +?> diff --git a/backend/lib/Controller/EntityController.php b/backend/lib/Controller/EntityController.php index 62567cf..1f23e15 100644 --- a/backend/lib/Controller/EntityController.php +++ b/backend/lib/Controller/EntityController.php @@ -24,7 +24,6 @@ namespace Volkszaehler\Controller; use Volkszaehler\Definition; - use Volkszaehler\Util; use Volkszaehler\Model; @@ -46,9 +45,9 @@ class EntityController extends Controller { } $dql = 'SELECT a, p - FROM Volkszaehler\Model\Entity a - LEFT JOIN a.properties p - WHERE a.uuid = ?1'; + FROM Volkszaehler\Model\Entity a + LEFT JOIN a.properties p + WHERE a.uuid = ?1'; $q = $this->em->createQuery($dql); $q->setParameter(1, $uuid); @@ -75,7 +74,7 @@ class EntityController extends Controller { */ public function edit($identifier) { $entity = $this->get($identifier); - $this->setProperties($entity); + $this->setProperties($entity, $this->view->request->getParameters()); $this->em->flush(); return $entity; @@ -100,7 +99,7 @@ class EntityController extends Controller { $uuids->exchangeArray(array_unique($uuids->getArrayCopy())); // send new cookie to browser - setcookie('uuids', $uuids->encode(), 0, '/'); // TODO corrent path + setcookie('uuids', $uuids->encode(), 0, '/'); // TODO correct path } /** @@ -124,8 +123,11 @@ class EntityController extends Controller { setcookie('uuids', $uuids->encode(), 0, '/'); // TODO correct path } - protected function setProperties(Model\Entity $entity) { - foreach ($this->view->request->getParameters() as $parameter => $value) { + /** + * Update/set/delete properties of properties + */ + protected function setProperties(Model\Entity $entity, $parameters) { + foreach ($parameters as $parameter => $value) { if (Definition\PropertyDefinition::exists($parameter)) { if ($value == '') { $entity->unsetProperty($parameter, $this->em); @@ -136,6 +138,39 @@ class EntityController extends Controller { } } } -} -?> \ No newline at end of file + /** + * Filter entites by properties + */ + public function filter(array $properties) { + $dql = 'SELECT a, p + FROM Volkszaehler\Model\Entity a + LEFT JOIN a.properties p'; + + $sqlWhere = array(); + $i = 0; + foreach ($properties as $property => $value) { + switch (Definition\PropertyDefinition::get($property)->getType()) { + case 'string': + case 'text': + case 'multiple': + $value = "'" . $value . "'"; + break; + + case 'boolean': + $value = ($value) ? 1 : 0; + } + $sqlWhere[] = 'EXISTS (SELECT p' . $i . ' FROM \Volkszaehler\Model\Property p' . $i . ' WHERE p' . $i . '.key = \'' . $property . '\' AND p' . $i . '.value = ' . $value . ' AND p' . $i . '.entity = a)'; + $i++; + } + + if (count($sqlWhere) > 0) { + $dql .= ' WHERE ' . implode(' AND ', $sqlWhere); + } + + $q = $this->em->createQuery($dql); + return $q->getSingleResult(); + } +} + +?>