DaPortal

<?php //$Id$
//Copyright (c) 2015-2016 Pierre Pronchery <khorben@defora.org>
//This file is part of DeforaOS Web DaPortal
//
//This program 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, version 3 of the License.
//
//This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
//JSONFormat
class JSONFormat extends PlainFormat
{
//protected
//properties
protected $print = FALSE;
protected $id;
//methods
//essential
//JSONFormat::match
protected function match(Engine $engine, $type = FALSE)
{
if(!function_exists('json_encode'))
return 0;
switch($type)
{
case 'application/json':
return 100;
default:
return 0;
}
}
//JSONFormat::attach
protected function attach(Engine $engine, $type = FALSE)
{
}
//public
//methods
//rendering
//JSONFormat::render
public function render(Engine $engine, PageElement $page,
$filename = FALSE)
{
//FIXME ignore filename for the moment
if($page === FALSE)
$page = new Page;
$this->id = 1;
$this->engine = $engine;
$this->separator = '';
$this->_print('{', TRUE);
$this->renderElement($page);
$this->_print('}', TRUE);
$this->engine = FALSE;
}
//protected
//methods
//printing
//JSONFormat::print
protected function _print($string, $force = FALSE)
{
if($force || $this->print)
print($string);
}
//JSONFormat::printScalar
protected function printScalar($variable, $force = FALSE)
{
if($force || $this->print)
//FIXME report errors
if(($res = json_encode($variable)) !== FALSE)
print($res);
}
//rendering
//JSONFormat::renderElement
protected function renderElement(PageElement $e)
{
switch($e->getType())
{
case 'treeview':
return $this->renderTreeview($e);
default:
return parent::renderElement($e);
}
}
//JSONFormat::renderTreeview
protected function renderTreeview(PageElement $e)
{
$this->print = TRUE;
if(($columns = $e->get('columns')) === FALSE)
$columns = array('title' => 'Title');
$keys = array_keys($columns);
if(count($keys) == 0)
return;
$this->printScalar('rows'.$this->id++);
$this->_print(':[');
$sep1 = '';
$children = $e->getChildren($e);
foreach($children as $c)
{
if($c->getType() != 'row')
continue;
$this->_print("$sep1\n\t{");
$sep1 = ',';
//print each column of the current row
$sep2 = '';
foreach($keys as $k)
{
$this->_print("$sep2\n\t\t");
$this->printScalar($k);
$this->_print(':');
$sep2 = ',';
if(($e = $c->get($k)) !== FALSE)
{
if(is_scalar($e))
$this->printScalar($e);
else
$this->renderElement($e);
}
}
$this->_print("\n\t}");
}
$this->_print("\n]");
$this->print = FALSE;
}
}
?>