. */ namespace Volkszaehler\Controller; use Volkszaehler\Definition; use Volkszaehler\Util; use Volkszaehler\Model; use Doctrine\ORM; /** * Entity controller * * @author Steffen Vogel * @package default */ class EntityController extends Controller { /** * Get entity * * @param string $identifier */ public function get($uuid = NULL) { if (isset($uuid)) { // single entity if (!Util\UUID::validate($uuid)) { throw new \Exception('Invalid UUID: ' . $uuid); } $dql = 'SELECT a, p FROM Volkszaehler\Model\Entity a LEFT JOIN a.properties p WHERE a.uuid = :uuid'; $q = $this->em->createQuery($dql); $q->setParameter('uuid', $uuid); try { return $q->getSingleResult(); } catch (\Doctrine\ORM\NoResultException $e) { throw new \Exception('No entity found with UUID: ' . $uuid, 404); } } else { // public entities return array('entities' => $this->filter(array('public' => TRUE))); } } /** * Delete entity by uuid */ public function delete($identifier) { $entity = $this->get($identifier); if ($entity instanceof Model\Channel) { $entity->clearData($this->em); } $this->em->remove($entity); $this->em->flush(); } /** * Edit entity properties */ public function edit($identifier) { $entity = $this->get($identifier); $this->setProperties($entity, $this->view->request->getParameters()); $this->em->flush(); return $entity; } /** * Update/set/delete properties of entities */ protected function setProperties(Model\Entity $entity, $parameters) { foreach ($parameters as $key => $value) { if (in_array($key, array('operation', 'type'))) { continue; // skip generic parameters } else if (!Definition\PropertyDefinition::exists($key)) { throw new \Exception('Unknown property'); } if ($value == '') { // dont use empty() because it also matches 0 $entity->deleteProperty($key); } else { $entity->setProperty($key, $value); } } $entity->checkProperties(); } /** * Filter entites by properties * * @todo improve performance * @param array of property => value filters * @return array of entities */ public function filter(array $properties) { $dql = 'SELECT a, p FROM Volkszaehler\Model\Entity a LEFT JOIN a.properties p'; $i = 0; $sqlWhere = array(); $sqlParams = array(); foreach ($properties as $key => $value) { switch (Definition\PropertyDefinition::get($key)->getType()) { case 'string': case 'text': case 'multiple': $value = "'" . $value . "'"; break; case 'boolean': $value = (int) $value; } $sqlWhere[] = 'EXISTS (SELECT p' . $i . ' FROM \Volkszaehler\Model\Property p' . $i . ' WHERE p' . $i . '.key = :key' . $i . ' AND p' . $i . '.value = :value' . $i . ' AND p' . $i . '.entity = a)'; $sqlParams += array( 'key' . $i => $key, 'value' . $i => $value ); $i++; } if (count($sqlWhere) > 0) { $dql .= ' WHERE ' . implode(' AND ', $sqlWhere); } $q = $this->em->createQuery($dql); return $q->execute($sqlParams); } } ?>