combined view classes and added interface
This commit is contained in:
parent
13456028a1
commit
1f85026c09
15 changed files with 291 additions and 426 deletions
|
@ -33,19 +33,23 @@ use \Volkszaehler\Model;
|
|||
*/
|
||||
class ChannelController extends Controller {
|
||||
|
||||
// TODO authentification/indentification
|
||||
/**
|
||||
* get channels by filter
|
||||
*
|
||||
* @todo authentification/indentification
|
||||
*/
|
||||
public function get() {
|
||||
$dql = 'SELECT c FROM Volkszaehler\Model\Channel c';
|
||||
|
||||
if ($this->view->request->getParameter('uuid')) {
|
||||
if ($uuid = $this->view->request->getParameter('uuid')) {
|
||||
// TODO add conditions
|
||||
}
|
||||
|
||||
if ($this->view->request->getParameter('ugid')) {
|
||||
if ($ugid = $this->view->request->getParameter('ugid')) {
|
||||
// TODO add conditions
|
||||
}
|
||||
|
||||
if ($this->view->request->getParameter('indicator')) {
|
||||
if ($indicator = $this->view->request->getParameter('indicator')) {
|
||||
// TODO add conditions
|
||||
}
|
||||
|
||||
|
@ -53,7 +57,7 @@ class ChannelController extends Controller {
|
|||
$channels = $q->getResult();
|
||||
|
||||
foreach ($channels as $channel) {
|
||||
$this->view->add($channel);
|
||||
$this->view->addChannel($channel);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -63,7 +67,7 @@ class ChannelController extends Controller {
|
|||
* @todo validate input and throw exceptions
|
||||
*/
|
||||
public function add() {
|
||||
$channel = new Model\Channel\Meter($this->view->request->getParameter('indicator'));
|
||||
$channel = new Model\Channel($this->view->request->getParameter('indicator'));
|
||||
|
||||
$channel->setName($this->view->request->getParameter('name'));
|
||||
$channel->setDescription($this->view->request->getParameter('description'));
|
||||
|
@ -74,7 +78,7 @@ class ChannelController extends Controller {
|
|||
$this->em->persist($channel);
|
||||
$this->em->flush();
|
||||
|
||||
$this->view->add($channel);
|
||||
$this->view->addChannel($channel);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -84,7 +88,7 @@ class ChannelController extends Controller {
|
|||
*/
|
||||
public function delete() {
|
||||
$ucid = $this->view->request->getParameter('ucid');
|
||||
$channel = $this->em->getRepository('Volkszaehler\Model\Channel\Channel')->findOneBy(array('uuid' => $ucid));
|
||||
$channel = $this->em->getRepository('Volkszaehler\Model\Channel')->findOneBy(array('uuid' => $ucid));
|
||||
|
||||
$this->em->remove($channel);
|
||||
$this->em->flush();
|
||||
|
|
|
@ -48,7 +48,7 @@ abstract class Controller {
|
|||
*/
|
||||
public function run($action) {
|
||||
if (!method_exists($this, $action)) {
|
||||
throw new \InvalidArgumentException('\'' . $action . '\' is not a valid controller action');
|
||||
throw new \Exception('\'' . $action . '\' is not a valid controller action');
|
||||
}
|
||||
|
||||
$this->$action();
|
||||
|
|
|
@ -50,7 +50,7 @@ class DataController extends Controller {
|
|||
|
||||
foreach ($channels as $channel) {
|
||||
$interpreter = $channel->getInterpreter($this->em);
|
||||
$this->view->add($channel, $interpreter->getValues($from, $to, $groupBy));
|
||||
$this->view->addChannel($channel, $interpreter->getValues($from, $to, $groupBy));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -29,29 +29,53 @@ namespace Volkszaehler\Controller;
|
|||
* @author Steffen Vogel (info@steffenvogel.de)
|
||||
* @package default
|
||||
*/
|
||||
use Volkszaehler\Model;
|
||||
|
||||
class GroupController extends Controller {
|
||||
|
||||
/**
|
||||
*
|
||||
* get groups by filter
|
||||
*/
|
||||
public function get() {
|
||||
// TODO get groups from entitymanager according to API specs
|
||||
$dql = 'SELECT g FROM Volkszaehler\Model\Group g';
|
||||
|
||||
$recursion = $this->view->request->getParameter('recursion');
|
||||
|
||||
if ($uuid = $this->view->request->getParameter('uuid')) {
|
||||
// TODO add conditions
|
||||
}
|
||||
|
||||
if ($ugid = $this->view->request->getParameter('ugid')) {
|
||||
// TODO add conditions
|
||||
}
|
||||
|
||||
$q = $this->em->createQuery($dql);
|
||||
$groups = $q->getResult();
|
||||
|
||||
foreach ($groups as $group) {
|
||||
$this->view->addGroup($group);
|
||||
$this->view->addGroup($group, $recursion);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* add new group as child of a parent group
|
||||
*/
|
||||
public function add() {
|
||||
$group = new Group();
|
||||
$ugid = $this->view->request->getParameter('ugid');
|
||||
$parent = $this->em->getRepository('Volkszaehler\Model\Group')->findOneBy(array('uuid' => $ugid));
|
||||
|
||||
$group->name = $this->view->request->getParameter('name');
|
||||
$group->description = $this->view->request->getParameter('description');
|
||||
if ($parent === FALSE) {
|
||||
throw new \Exception('every group needs a parent');
|
||||
}
|
||||
|
||||
$group = new Model\Group();
|
||||
|
||||
$group->setName($this->view->request->getParameter('name'));
|
||||
$group->setDescription($this->view->request->getParameter('description'));
|
||||
|
||||
$this->em->persist($group);
|
||||
$parent->addGroup($group);
|
||||
|
||||
$this->em->flush();
|
||||
|
||||
$this->view->add($group);
|
||||
|
@ -61,7 +85,8 @@ class GroupController extends Controller {
|
|||
* @todo authentification/indentification
|
||||
*/
|
||||
public function delete() {
|
||||
$group = Group::getByUuid($this->view->request->getParameter('ugid'));
|
||||
$ugid = $this->view->request->getParameter('ugid');
|
||||
$group = $this->em->getRepository('Volkszaehler\Model\Group')->findOneBy(array('uuid' => $ugid));
|
||||
|
||||
$this->em->remove($group);
|
||||
$this->em->flush();
|
||||
|
@ -74,7 +99,7 @@ class GroupController extends Controller {
|
|||
*/
|
||||
public function edit() {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
|
@ -75,33 +75,38 @@ class Dispatcher {
|
|||
$request = new HTTP\Request();
|
||||
$response = new HTTP\Response();
|
||||
|
||||
$format = ($request->getParameter('format')) ? $request->getParameter('format') : 'json'; // default view
|
||||
$controller = $request->getParameter('controller');
|
||||
if (!($format = $request->getParameter('format'))) {
|
||||
$format = 'json'; // default view
|
||||
}
|
||||
|
||||
if (!($controller = $request->getParameter('controller'))) {
|
||||
throw new \Exception('no controller specified');
|
||||
}
|
||||
|
||||
// initialize entity manager
|
||||
$this->em = Dispatcher::createEntityManager();
|
||||
|
||||
// staring debugging
|
||||
if (($request->getParameter('debug') && $request->getParameter('debug') > 0) || Util\Configuration::read('debug')) {
|
||||
// starting debugging
|
||||
if (($debug = $request->getParameter('debug')) && (int) $debug > 0) {
|
||||
$this->debug = new Util\Debug($request->getParameter('debug'));
|
||||
$this->em->getConnection()->getConfiguration()->setSQLLogger($this->debug);
|
||||
}
|
||||
// TODO debug controll via configuration file
|
||||
|
||||
// initialize view
|
||||
switch ($format) {
|
||||
case 'png':
|
||||
case 'jpeg':
|
||||
case 'gif':
|
||||
$this->view = new View\JpGraphView($request, $response, $format);
|
||||
$this->view = new View\JpGraph($request, $response, $format);
|
||||
break;
|
||||
|
||||
case 'json':
|
||||
case 'xml':
|
||||
$controller = 'channel';
|
||||
case 'csv':
|
||||
$viewClassName = 'Volkszaehler\View\\' . strtoupper($format) . '\\' . strtoupper($format) . ucfirst($controller) . 'View';
|
||||
$viewClassName = 'Volkszaehler\View\\' . strtoupper($format);
|
||||
if (!(Util\ClassLoader::classExists($viewClassName)) || !is_subclass_of($viewClassName, '\Volkszaehler\View\View')) {
|
||||
throw new \InvalidArgumentException('\'' . $viewClassName . '\' is not a valid View');
|
||||
throw new \Exception('\'' . $viewClassName . '\' is not a valid View');
|
||||
}
|
||||
|
||||
$this->view = new $viewClassName($request, $response);
|
||||
|
@ -114,9 +119,9 @@ class Dispatcher {
|
|||
}
|
||||
|
||||
// initialize controller
|
||||
$controllerClassName = 'Volkszaehler\Controller\\' . ucfirst(strtolower($request->getParameter('controller'))) . 'Controller';
|
||||
$controllerClassName = 'Volkszaehler\Controller\\' . ucfirst($request->getParameter('controller')) . 'Controller';
|
||||
if (!(Util\ClassLoader::classExists($controllerClassName)) || !is_subclass_of($controllerClassName, '\Volkszaehler\Controller\Controller')) {
|
||||
throw new \InvalidArgumentException('\'' . $controllerClassName . '\' is not a valid controller');
|
||||
throw new \Exception('\'' . $controllerClassName . '\' is not a valid controller');
|
||||
}
|
||||
$this->controller = new $controllerClassName($this->view, $this->em);
|
||||
}
|
||||
|
@ -141,7 +146,7 @@ class Dispatcher {
|
|||
$this->view->addDebug($this->debug);
|
||||
}
|
||||
|
||||
$this->view->render(); // render view & send http response
|
||||
$this->view->sendResponse(); // render view & send http response
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -21,10 +21,9 @@
|
|||
* along with volkszaehler.org. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
namespace Volkszaehler\View\CSV;
|
||||
namespace Volkszaehler\View;
|
||||
|
||||
use Volkszaehler\View\HTTP;
|
||||
use Volkszaehler\View;
|
||||
use Volkszaehler\Util;
|
||||
|
||||
/**
|
||||
|
@ -35,11 +34,7 @@ use Volkszaehler\Util;
|
|||
* @author Steffen Vogel <info@steffenvogel.de>
|
||||
* @package default
|
||||
*/
|
||||
abstract class CSVView extends View\View {
|
||||
protected $csv = array();
|
||||
protected $header = array();
|
||||
protected $footer = array();
|
||||
|
||||
class CSV extends View {
|
||||
protected $delimiter = ';';
|
||||
protected $enclosure = '"';
|
||||
|
||||
|
@ -49,33 +44,57 @@ abstract class CSVView extends View\View {
|
|||
public function __construct(HTTP\Request $request, HTTP\Response $response) {
|
||||
parent::__construct($request, $response);
|
||||
|
||||
$this->header[] = 'source: volkszaehler.org';
|
||||
$this->header[] = 'version: ' . \Volkszaehler\VERSION;
|
||||
echo 'source: volkszaehler.org' . PHP_EOL;
|
||||
echo 'version: ' . \Volkszaehler\VERSION . PHP_EOL;
|
||||
|
||||
$this->response->setHeader('Content-type', 'text/csv');
|
||||
$this->response->setHeader('Content-Disposition', 'attachment; filename="data.csv"');
|
||||
}
|
||||
|
||||
public function render() {
|
||||
foreach ($this->header as $line) {
|
||||
echo $line . PHP_EOL;
|
||||
public function addChannel(Model\Channel $channel, array $data = NULL) {
|
||||
$this->csv = array_merge($this->csv, $data);
|
||||
}
|
||||
|
||||
public function addGroup(Model\Group $group) {
|
||||
|
||||
}
|
||||
|
||||
public function addDebug(Util\Debug $debug) {
|
||||
|
||||
}
|
||||
|
||||
protected function renderResponse() {
|
||||
|
||||
}
|
||||
|
||||
protected function addException(\Exception $e) {
|
||||
|
||||
}
|
||||
|
||||
public function renderResponse() {
|
||||
// channel data
|
||||
foreach ($this->channels as $channel) {
|
||||
foreach ($channel[1] as $reading) {
|
||||
$array = array_map(array($this, 'escape'), );
|
||||
|
||||
echo implode($this->delimiter, $array) . PHP_EOL;
|
||||
}
|
||||
}
|
||||
|
||||
echo PHP_EOL;
|
||||
|
||||
foreach ($this->csv as $array) {
|
||||
$array = array_map(array($this, 'escape'), $array);
|
||||
// debug
|
||||
echo 'time: ' . $debug->getExecutionTime() . PHP_EOL;
|
||||
echo 'database: ' . Util\Configuration::read('db.driver') . PHP_EOL;
|
||||
|
||||
echo implode($this->delimiter, $array) . PHP_EOL;
|
||||
foreach ($debug->getMessages() as $message) {
|
||||
echo 'message: ' . $message['message'] . PHP_EOL; // TODO add more information
|
||||
}
|
||||
|
||||
echo PHP_EOL;
|
||||
|
||||
foreach ($this->footer as $line) {
|
||||
echo $line . PHP_EOL;
|
||||
foreach ($debug->getQueries() as $query) {
|
||||
echo 'query: ' . $query['sql'] . PHP_EOL;
|
||||
echo ' parameters: ' . implode(', ', $query['parameters']) . PHP_EOL;
|
||||
}
|
||||
|
||||
parent::render();
|
||||
}
|
||||
|
||||
protected function escape($value) {
|
||||
|
@ -89,24 +108,6 @@ abstract class CSVView extends View\View {
|
|||
return (string) $value;
|
||||
}
|
||||
}
|
||||
|
||||
public function addDebug(Util\Debug $debug) {
|
||||
$this->footer[] = 'time: ' . $debug->getExecutionTime();
|
||||
$this->footer[] = 'database: ' . Util\Configuration::read('db.driver');
|
||||
|
||||
foreach ($debug->getMessages() as $message) {
|
||||
$this->footer[] = 'message: ' . $message['message']; // TODO add more information
|
||||
}
|
||||
|
||||
foreach ($debug->getQueries() as $query) {
|
||||
$this->footer[] = 'query: ' . $query['sql'];
|
||||
$this->footer[] = ' parameters: ' . implode(', ', $query['parameters']);
|
||||
}
|
||||
}
|
||||
|
||||
public function addException(\Exception $exception) {
|
||||
echo $exception;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
|
@ -1,38 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2010, The volkszaehler.org project
|
||||
* @package default
|
||||
* @license http://www.opensource.org/licenses/gpl-license.php GNU Public License
|
||||
*/
|
||||
/*
|
||||
* This file is part of volkzaehler.org
|
||||
*
|
||||
* volkzaehler.org is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* any later version.
|
||||
*
|
||||
* volkzaehler.org is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with volkszaehler.org. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
namespace Volkszaehler\View\CSV;
|
||||
|
||||
/**
|
||||
* CSV data view
|
||||
*
|
||||
* @author Steffen Vogel <info@steffenvogel.de>
|
||||
* @package default
|
||||
*/
|
||||
class CSVDataView extends CSVView {
|
||||
public function add($obj, $data) {
|
||||
$this->csv = array_merge($this->csv, $data);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
|
@ -21,12 +21,11 @@
|
|||
* along with volkszaehler.org. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
namespace Volkszaehler\View\JSON;
|
||||
namespace Volkszaehler\View;
|
||||
|
||||
use Volkszaehler\View\HTTP;
|
||||
|
||||
use Volkszaehler\View;
|
||||
use Volkszaehler\Util;
|
||||
use Volkszaehler\Model;
|
||||
|
||||
/**
|
||||
* JSON view
|
||||
|
@ -36,9 +35,11 @@ use Volkszaehler\Util;
|
|||
* @package default
|
||||
* @author Steffen Vogel <info@steffenvogel.de>
|
||||
*/
|
||||
abstract class JSONView extends View\View {
|
||||
class JSON extends View {
|
||||
protected $json = array();
|
||||
|
||||
protected $padding = FALSE;
|
||||
|
||||
/**
|
||||
* constructor
|
||||
*/
|
||||
|
@ -51,16 +52,89 @@ abstract class JSONView extends View\View {
|
|||
$this->response->setHeader('Content-type', 'application/json');
|
||||
}
|
||||
|
||||
public function render() {
|
||||
public function setPadding($padding) { $this->padding = $padding; }
|
||||
|
||||
public function addChannel(Model\Channel $channel, array &$data = NULL) {
|
||||
$jsonChannel['uuid'] = (string) $channel->getUuid();
|
||||
$jsonChannel['indicator'] = $channel->getIndicator();
|
||||
$jsonChannel['unit'] = $channel->getUnit();
|
||||
$jsonChannel['name'] = $channel->getName();
|
||||
$jsonChannel['description'] = $channel->getDescription();
|
||||
$jsonChannel['resolution'] = (int) $channel->getResolution();
|
||||
$jsonChannel['cost'] = (float) $channel->getCost();
|
||||
|
||||
if (isset($data)) {
|
||||
$jsonChannel['data'] = array();
|
||||
|
||||
foreach ($data as $reading) {
|
||||
$jsonChannel['data'][] = array($reading['timestamp'], $reading['value'], $reading['count']);
|
||||
}
|
||||
}
|
||||
|
||||
$this->json['channels'][] = $jsonChannel;
|
||||
}
|
||||
|
||||
public function addGroup(Model\Group $group, $recursive = FALSE) {
|
||||
$this->json['groups'][] = $this->toJson($group, $recursive);
|
||||
}
|
||||
|
||||
public function addDebug(Util\Debug $debug) {
|
||||
$this->json['debug'] = array(
|
||||
'time' => $debug->getExecutionTime(),
|
||||
'messages' => $debug->getMessages(),
|
||||
'database' => array(
|
||||
'driver' => Util\Configuration::read('db.driver'),
|
||||
'queries' => $debug->getQueries()
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
protected function addException(\Exception $exception) {
|
||||
$this->json['exception'] = array(
|
||||
'type' => get_class($exception),
|
||||
'message' => $exception->getMessage(),
|
||||
'code' => $exception->getCode(),
|
||||
'file' => $exception->getFile(),
|
||||
'line' => $exception->getLine(),
|
||||
'trace' => $exception->getTrace()
|
||||
);
|
||||
}
|
||||
|
||||
protected function toJson(Model\Group $group, $recursive = FALSE) {
|
||||
$jsonGroup = array();
|
||||
|
||||
$jsonGroup['uuid'] = (string) $group->getUuid();
|
||||
$jsonGroup['name'] = $group->getName();
|
||||
$jsonGroup['description'] = $group->getDescription();
|
||||
$jsonGroup['channels'] = array();
|
||||
|
||||
foreach ($group->getChannels() as $channel) {
|
||||
$jsonGroup['channels'][] = (string) $channel->getUuid();
|
||||
}
|
||||
|
||||
if ($recursive) {
|
||||
$jsonGroup['children'] = array();
|
||||
|
||||
foreach ($group->getSubGroups() as $subGroup) {
|
||||
$jsonGroup['children'][] = $this->toJson($subGroup); // recursion
|
||||
}
|
||||
}
|
||||
|
||||
return $jsonGroup;
|
||||
}
|
||||
|
||||
public function renderResponse() {
|
||||
$json = json_encode($this->json);
|
||||
|
||||
if (Util\Debug::isActivated()) {
|
||||
$json = self::format($json);
|
||||
}
|
||||
|
||||
echo $json;
|
||||
if ($this->padding) {
|
||||
$json = $this->padding . '(' . $json . ')';
|
||||
}
|
||||
|
||||
parent::render();
|
||||
echo $json;
|
||||
}
|
||||
|
||||
protected static function format($json) {
|
||||
|
@ -112,28 +186,6 @@ abstract class JSONView extends View\View {
|
|||
|
||||
return $formatted;
|
||||
}
|
||||
|
||||
public function addDebug(Util\Debug $debug) {
|
||||
$this->json['debug'] = array(
|
||||
'time' => $debug->getExecutionTime(),
|
||||
'messages' => $debug->getMessages(),
|
||||
'database' => array(
|
||||
'driver' => Util\Configuration::read('db.driver'),
|
||||
'queries' => $debug->getQueries()
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
public function addException(\Exception $exception) {
|
||||
$this->json['exception'] = array(
|
||||
'type' => get_class($exception),
|
||||
'message' => $exception->getMessage(),
|
||||
'code' => $exception->getCode(),
|
||||
'file' => $exception->getFile(),
|
||||
'line' => $exception->getLine(),
|
||||
'trace' => $exception->getTrace()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
|
@ -1,60 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2010, The volkszaehler.org project
|
||||
* @package default
|
||||
* @license http://www.opensource.org/licenses/gpl-license.php GNU Public License
|
||||
*/
|
||||
/*
|
||||
* This file is part of volkzaehler.org
|
||||
*
|
||||
* volkzaehler.org is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* any later version.
|
||||
*
|
||||
* volkzaehler.org is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with volkszaehler.org. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
namespace Volkszaehler\View\JSON;
|
||||
|
||||
/**
|
||||
* JSON channel view
|
||||
*
|
||||
* also used for data
|
||||
*
|
||||
* @author Steffen Vogel <info@steffenvogel.de>
|
||||
* @package default
|
||||
*/
|
||||
class JSONChannelView extends JSONView {
|
||||
|
||||
public function add(\Volkszaehler\Model\Channel $obj, array $data = NULL) {
|
||||
$channel['uuid'] = (string) $obj->getUuid();
|
||||
$channel['indicator'] = $obj->getIndicator();
|
||||
$channel['unit'] = $obj->getUnit();
|
||||
$channel['name'] = $obj->getName();
|
||||
$channel['description'] = $obj->getDescription();
|
||||
|
||||
// TODO adapt to new indicator style
|
||||
if (is_subclass_of($obj, '\Volkszaehler\Model\Channel\Meter')) {
|
||||
$channel['resolution'] = (int) $obj->getResolution();
|
||||
$channel['cost'] = (float) $obj->getCost();
|
||||
}
|
||||
|
||||
if (isset($data)) {
|
||||
$channel['data'] = array();
|
||||
foreach ($data as $reading) {
|
||||
$channel['data'][] = array($reading['timestamp'], $reading['value'], $reading['count']);
|
||||
}
|
||||
}
|
||||
|
||||
$this->json['channels'][] = $channel;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
|
@ -1,52 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2010, The volkszaehler.org project
|
||||
* @package default
|
||||
* @license http://www.opensource.org/licenses/gpl-license.php GNU Public License
|
||||
*/
|
||||
/*
|
||||
* This file is part of volkzaehler.org
|
||||
*
|
||||
* volkzaehler.org is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* any later version.
|
||||
*
|
||||
* volkzaehler.org is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with volkszaehler.org. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
namespace Volkszaehler\View\JSON;
|
||||
|
||||
/**
|
||||
* JSON group view
|
||||
*
|
||||
* @author Steffen Vogel <info@steffenvogel.de>
|
||||
* @package default
|
||||
*/
|
||||
class JSONGroupView extends JSONView {
|
||||
|
||||
public function add(\Volkszaehler\Model\Group $obj, $recursive = FALSE) {
|
||||
$group['uuid'] = (string) $obj->getUuid();
|
||||
$group['name'] = $obj->getName();
|
||||
$group['description'] = $obj->getDescription();
|
||||
|
||||
if ($recursive) { // TODO add nested groups in json view
|
||||
$children = $obj->getChildren();
|
||||
|
||||
foreach ($children as $child) {
|
||||
$this->addGroup($child, $recursive);
|
||||
}
|
||||
}
|
||||
|
||||
$this->json['groups'][] = $group;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -23,6 +23,9 @@
|
|||
|
||||
namespace Volkszaehler\View;
|
||||
|
||||
use Volkszaehler\Model;
|
||||
use Volkszaehler\Util;
|
||||
|
||||
require_once \Volkszaehler\BACKEND_DIR . '/lib/vendor/JpGraph/jpgraph.php';
|
||||
require_once \Volkszaehler\BACKEND_DIR . '/lib/vendor/JpGraph/jpgraph_scatter.php';
|
||||
require_once \Volkszaehler\BACKEND_DIR . '/lib/vendor/JpGraph/jpgraph_date.php';
|
||||
|
@ -37,7 +40,7 @@ require_once \Volkszaehler\BACKEND_DIR . '/lib/vendor/JpGraph/jpgraph_date.php';
|
|||
* @link http://jpgraph.net/
|
||||
* @todo add caching
|
||||
*/
|
||||
class JpGraphView extends View {
|
||||
class JpGraph extends View {
|
||||
/**
|
||||
* indicator => ynaxis[n] mapping
|
||||
*/
|
||||
|
@ -90,7 +93,7 @@ class JpGraphView extends View {
|
|||
* @param $obj
|
||||
* @param $data
|
||||
*/
|
||||
public function add(\Volkszaehler\Model\Channel $obj, array $data) {
|
||||
public function addChannel(Model\Channel $channel, array $data = NULL){
|
||||
$count = count($this->channels);
|
||||
$xData = $yData = array();
|
||||
foreach ($data as $reading) {
|
||||
|
@ -101,7 +104,7 @@ class JpGraphView extends View {
|
|||
// Create the scatter plot
|
||||
$plot = new \ScatterPlot($yData, $xData);
|
||||
|
||||
$plot->setLegend($obj->getName() . ': ' . $obj->getDescription() . ' [' . $obj->getUnit() . ']');
|
||||
$plot->setLegend($channel->getName() . ': ' . $channel->getDescription() . ' [' . $channel->getUnit() . ']');
|
||||
$plot->SetLinkPoints(TRUE, self::$colors[$count]);
|
||||
|
||||
$plot->mark->SetColor(self::$colors[$count]);
|
||||
|
@ -109,7 +112,7 @@ class JpGraphView extends View {
|
|||
$plot->mark->SetType(MARK_DIAMOND);
|
||||
$plot->mark->SetWidth(1);
|
||||
|
||||
$axis = $this->getAxisIndex($obj);
|
||||
$axis = $this->getAxisIndex($channel);
|
||||
if ($axis >= 0) {
|
||||
$this->graph->AddY($axis, $plot);
|
||||
}
|
||||
|
@ -117,7 +120,31 @@ class JpGraphView extends View {
|
|||
$this->graph->Add($plot);
|
||||
}
|
||||
|
||||
$this->channels[] = $obj;
|
||||
$this->channels[] = $channel;
|
||||
}
|
||||
|
||||
/**
|
||||
* adds all channel of group as new plots to the graph
|
||||
*
|
||||
* @param Model\Group $group
|
||||
*/
|
||||
public function addGroup(Model\Group $group) {
|
||||
foreach ($group->getChannels() as $child) {
|
||||
$this->addChannel($child);
|
||||
}
|
||||
}
|
||||
|
||||
public function addDebug(Util\Debug $debug) {
|
||||
throw new \Exception(get_class($this) . ' cant show debugging information');
|
||||
}
|
||||
|
||||
/**
|
||||
* shows exception
|
||||
* @todo avoid graph plotting and set content-type to text/plain
|
||||
* @param \Exception $exception
|
||||
*/
|
||||
protected function addException(\Exception $exception) {
|
||||
echo $exception;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -157,13 +184,11 @@ class JpGraphView extends View {
|
|||
*
|
||||
* headers has been set automatically
|
||||
*/
|
||||
public function render() {
|
||||
protected function renderResponse() {
|
||||
$this->graph->SetMargin(75, (count($this->axes) - 1) * 65 + 10, 20, 90);
|
||||
|
||||
// Display the graph
|
||||
$this->graph->Stroke();
|
||||
|
||||
parent::render();
|
||||
}
|
||||
}
|
||||
|
|
@ -23,9 +23,22 @@
|
|||
|
||||
namespace Volkszaehler\View;
|
||||
|
||||
use Volkszaehler\Model;
|
||||
use Volkszaehler\View\HTTP;
|
||||
use Volkszaehler\Util;
|
||||
|
||||
/**
|
||||
* Interface for all View classes
|
||||
*
|
||||
* @author Steffen Vogel <info@steffenvogel.de>
|
||||
* @package default
|
||||
*/
|
||||
interface ViewInterface {
|
||||
public function addChannel(Model\Channel $channel, array $data = NULL);
|
||||
function addGroup(Model\Group $group);
|
||||
function addDebug(Util\Debug $debug);
|
||||
}
|
||||
|
||||
/**
|
||||
* superclass for all view classes
|
||||
*
|
||||
|
@ -33,7 +46,7 @@ use Volkszaehler\Util;
|
|||
* @author Steffen Vogel <info@steffenvogel.de>
|
||||
*
|
||||
*/
|
||||
abstract class View {
|
||||
abstract class View implements ViewInterface {
|
||||
public $request;
|
||||
protected $response;
|
||||
|
||||
|
@ -56,26 +69,21 @@ abstract class View {
|
|||
final public function exceptionHandler(\Exception $exception) {
|
||||
$this->addException($exception);
|
||||
|
||||
//$this->status = STATUS_EXCEPTION; // TODO add status reporting to API
|
||||
|
||||
$code = ($exception->getCode() == 0 && HTTP\Response::getCodeDescription($exception->getCode())) ? 400 : $exception->getCode();
|
||||
$this->response->setCode($code);
|
||||
|
||||
$this->render();
|
||||
$this->renderResponse();
|
||||
die();
|
||||
}
|
||||
|
||||
public function render() {
|
||||
public function sendResponse() {
|
||||
$this->renderResponse();
|
||||
|
||||
$this->response->send();
|
||||
}
|
||||
|
||||
public function addException(\Exception $e) {
|
||||
echo $e;
|
||||
}
|
||||
|
||||
public function addDebug(Util\Debug $debug) {
|
||||
|
||||
}
|
||||
protected abstract function renderResponse();
|
||||
protected abstract function addException(\Exception $exception);
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
|
@ -21,10 +21,9 @@
|
|||
* along with volkszaehler.org. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
namespace Volkszaehler\View\XML;
|
||||
namespace Volkszaehler\View;
|
||||
|
||||
use Volkszaehler\View\HTTP;
|
||||
use Volkszaehler\View;
|
||||
use Volkszaehler\Util;
|
||||
|
||||
/**
|
||||
|
@ -33,10 +32,10 @@ use Volkszaehler\Util;
|
|||
* @author Steffen Vogel <info@steffenvogel.de>
|
||||
* @package default
|
||||
*/
|
||||
abstract class XMLView extends View\View {
|
||||
class XML extends View {
|
||||
protected $xmlDoc;
|
||||
|
||||
public function __construct(HTTP\Request $request, HTTP\Response $response) {
|
||||
public function __construct(HTTP\Request $request, HTTP\Response $response) {
|
||||
parent::__construct($request, $response);
|
||||
|
||||
$this->xmlDoc = new \DOMDocument('1.0', 'UTF-8');
|
||||
|
@ -49,22 +48,45 @@ abstract class XMLView extends View\View {
|
|||
$this->response->setHeader('Content-type', 'application/xml; charset=UTF-8');
|
||||
}
|
||||
|
||||
public function render() {
|
||||
$this->xmlDoc->appendChild($this->xmlRoot);
|
||||
echo $this->xmlDoc->saveXML();
|
||||
public function addChannel(Model\Channel $channel, array $data = NULL) {
|
||||
$xmlChannel = $this->xmlDoc->createElement('channel');
|
||||
$xmlChannel->setAttribute('uuid', $obj->getUuid());
|
||||
|
||||
parent::render();
|
||||
$xmlChannel->appendChild($this->xmlDoc->createElement('indicator', $obj->getIndicator()));
|
||||
$xmlChannel->appendChild($this->xmlDoc->createElement('unit', $obj->getUnit()));
|
||||
$xmlChannel->appendChild($this->xmlDoc->createElement('name', $obj->getName()));
|
||||
$xmlChannel->appendChild($this->xmlDoc->createElement('description', $obj->getDescription()));
|
||||
$xmlChannel->appendChild($this->xmlDoc->createElement('resolution', (int) $obj->getResolution()));
|
||||
$xmlChannel->appendChild($this->xmlDoc->createElement('cost', (float) $obj->getCost()));
|
||||
|
||||
if (isset($data)) {
|
||||
$xmlData = $this->xmlDoc->createElement('data');
|
||||
|
||||
foreach ($data as $reading) {
|
||||
$xmlReading = $this->xmlDoc->createElement('reading');
|
||||
|
||||
$xmlReading->setAttribute('timestamp', $reading['timestamp']); // hardcoded data fields for performance optimization
|
||||
$xmlReading->setAttribute('value', $reading['value']);
|
||||
$xmlReading->setAttribute('count', $reading['count']);
|
||||
|
||||
$xmlData->appendChild($xmlReading);
|
||||
}
|
||||
|
||||
$xmlChannel->appendChild($xmlData);
|
||||
}
|
||||
|
||||
$this->xml->appendChild($xmlChannel);
|
||||
}
|
||||
|
||||
public function addException(\Exception $exception) {
|
||||
$xmlException = $this->xmlDoc->createElement('exception');
|
||||
$xmlException->setAttribute('code', $exception->getCode());
|
||||
$xmlException->appendChild($this->xmlDoc->createElement('message', $exception->getMessage()));
|
||||
$xmlException->appendChild($this->xmlDoc->createElement('line', $exception->getLine()));
|
||||
$xmlException->appendChild($this->xmlDoc->createElement('file', $exception->getFile()));
|
||||
$xmlException->appendChild($this->fromTrace($exception->getTrace()));
|
||||
public function addGroup(Model\Group $group) {
|
||||
$xmlGroup = $this->xmlDoc->createElement('group');
|
||||
$xmlGroup->setAttribute('uuid', $obj->getUuid());
|
||||
$xmlGroup->appendChild($this->xmlDoc->createElement('name', $obj->getName()));
|
||||
$xmlGroup->appendChild($this->xmlDoc->createElement('description', $obj->getDescription()));
|
||||
|
||||
$this->xmlRoot->appendChild($xmlException);
|
||||
// TODO include sub groups?
|
||||
|
||||
$this->xml->appendChild($xmlGroup);
|
||||
}
|
||||
|
||||
public function addDebug(Util\Debug $debug) {
|
||||
|
@ -79,6 +101,21 @@ abstract class XMLView extends View\View {
|
|||
$this->xmlRoot->appendChild($xmlDebug);
|
||||
}
|
||||
|
||||
protected function addException(\Exception $e) {
|
||||
$xmlException = $this->xmlDoc->createElement('exception');
|
||||
$xmlException->setAttribute('code', $exception->getCode());
|
||||
$xmlException->appendChild($this->xmlDoc->createElement('message', $exception->getMessage()));
|
||||
$xmlException->appendChild($this->xmlDoc->createElement('line', $exception->getLine()));
|
||||
$xmlException->appendChild($this->xmlDoc->createElement('file', $exception->getFile()));
|
||||
$xmlException->appendChild($this->fromTrace($exception->getTrace()));
|
||||
|
||||
$this->xmlRoot->appendChild($xmlException);
|
||||
}
|
||||
|
||||
protected function renderResponse() {
|
||||
|
||||
}
|
||||
|
||||
private function fromTrace($traces) {
|
||||
$xmlTraces = $this->xmlDoc->createElement('backtrace');
|
||||
|
|
@ -1,81 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2010, The volkszaehler.org project
|
||||
* @package default
|
||||
* @license http://www.opensource.org/licenses/gpl-license.php GNU Public License
|
||||
*/
|
||||
/*
|
||||
* This file is part of volkzaehler.org
|
||||
*
|
||||
* volkzaehler.org is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* any later version.
|
||||
*
|
||||
* volkzaehler.org is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with volkszaehler.org. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
namespace Volkszaehler\View\XML;
|
||||
|
||||
use Volkszaehler\View\HTTP;
|
||||
|
||||
/**
|
||||
* XML channel view
|
||||
*
|
||||
* also used for data
|
||||
*
|
||||
* @author Steffen Vogel <info@steffenvogel.de>
|
||||
* @package default
|
||||
*/
|
||||
class XMLChannelView extends XMLView {
|
||||
|
||||
public function __construct(HTTP\Request $request, HTTP\Response $response) {
|
||||
parent::__construct($request, $response);
|
||||
|
||||
$this->xml = $this->xmlDoc->createElement('channels');
|
||||
}
|
||||
|
||||
public function add(\Volkszaehler\Model\Channel $obj, array $data = NULL) {
|
||||
$xmlChannel = $this->xmlDoc->createElement('channel');
|
||||
$xmlChannel->setAttribute('uuid', $obj->getUuid());
|
||||
|
||||
$xmlChannel->appendChild($this->xmlDoc->createElement('indicator', $obj->getIndicator()));
|
||||
$xmlChannel->appendChild($this->xmlDoc->createElement('unit', $obj->getUnit()));
|
||||
$xmlChannel->appendChild($this->xmlDoc->createElement('name', $obj->getName()));
|
||||
$xmlChannel->appendChild($this->xmlDoc->createElement('description', $obj->getDescription()));
|
||||
$xmlChannel->appendChild($this->xmlDoc->createElement('resolution', (int) $obj->getResolution()));
|
||||
$xmlChannel->appendChild($this->xmlDoc->createElement('cost', (float) $obj->getCost()));
|
||||
|
||||
if (isset($data)) {
|
||||
$xmlData = $this->xmlDoc->createElement('data');
|
||||
|
||||
foreach ($data as $reading) {
|
||||
$xmlReading = $this->xmlDoc->createElement('reading');
|
||||
|
||||
$xmlReading->setAttribute('timestamp', $reading['timestamp']); // hardcoded data fields for performance optimization
|
||||
$xmlReading->setAttribute('value', $reading['value']);
|
||||
$xmlReading->setAttribute('count', $reading['count']);
|
||||
|
||||
$xmlData->appendChild($xmlReading);
|
||||
}
|
||||
|
||||
$xmlChannel->appendChild($xmlData);
|
||||
}
|
||||
|
||||
$this->xml->appendChild($xmlChannel);
|
||||
}
|
||||
|
||||
public function render() {
|
||||
$this->xmlRoot->appendChild($this->xml);
|
||||
|
||||
parent::render();
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
|
@ -1,61 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2010, The volkszaehler.org project
|
||||
* @package default
|
||||
* @license http://www.opensource.org/licenses/gpl-license.php GNU Public License
|
||||
*/
|
||||
/*
|
||||
* This file is part of volkzaehler.org
|
||||
*
|
||||
* volkzaehler.org is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* any later version.
|
||||
*
|
||||
* volkzaehler.org is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with volkszaehler.org. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
namespace Volkszaehler\View\XML;
|
||||
|
||||
use Volkszaehler\View\HTTP;
|
||||
|
||||
/**
|
||||
* XML group view
|
||||
*
|
||||
* @author Steffen Vogel <info@steffenvogel.de>
|
||||
* @package default
|
||||
*/
|
||||
class XMLGroupView extends XMLView {
|
||||
protected $xml;
|
||||
|
||||
public function __construct(HTTP\Request $request, HTTP\Request $response) {
|
||||
parent::__construct($request, $response);
|
||||
|
||||
$this->xml = $this->xmlDoc->createElement('groups');
|
||||
}
|
||||
|
||||
public function add(\Volkszaehler\Model\Group $obj) {
|
||||
$xmlGroup = $this->xmlDoc->createElement('group');
|
||||
$xmlGroup->setAttribute('uuid', $obj->getUuid());
|
||||
$xmlGroup->appendChild($this->xmlDoc->createElement('name', $obj->getName()));
|
||||
$xmlGroup->appendChild($this->xmlDoc->createElement('description', $obj->getDescription()));
|
||||
|
||||
// TODO include sub groups?
|
||||
|
||||
$this->xml->appendChild($xmlGroup);
|
||||
}
|
||||
|
||||
public function render() {
|
||||
$this->xmlRoot->appendChild($this->xml);
|
||||
|
||||
parent::render();
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
Loading…
Add table
Reference in a new issue