You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

242 lines
6.9 KiB

<?php
/**
* @package tikiwiki
*/
// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
//
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
// $Id$
require_once('tiki-setup.php');
$sheetlib = TikiLib::lib('sheet');
require_once('lib/graph-engine/gd.php');
require_once('lib/graph-engine/pdflib.php');
require_once('lib/graph-engine/ps.php');
require_once('lib/graph-engine/graph.pie.php');
require_once('lib/graph-engine/graph.bar.php');
require_once('lib/graph-engine/graph.multiline.php');
/**
* @param $serie
* @param $sheet
* @return array
*/
function handle_series($serie, &$sheet)
{
if (! $range = $sheet->getRange($serie)) {
$range = array_map('trim', explode(',', $serie));
}
if (! is_array($range)) {
return [];
}
return $range;
}
// Various validations {{{1
$access->check_feature('feature_sheet');
$access->check_feature('feature_jquery_ui');
$info = $sheetlib->get_sheet_info($_REQUEST['sheetId']);
if (empty($info)) {
$smarty->assign('Incorrect parameter');
$smarty->display('error.tpl');
die;
}
$objectperms = Perms::get('sheet', $_REQUEST['sheetId']);
if ($tiki_p_admin != 'y' && ! $objectperms->view_sheet && ! ($user && $info['author'] == $user)) {
$smarty->assign('msg', tra('Permission denied'));
$smarty->display('error.tpl');
die;
}
// This condition will be removed when a php-based renderer will be written
if (! function_exists('pdf_new') && ! function_exists('imagepng')) {
$smarty->assign('msg', tra('No valid renderer found. GD or PDFLib required.'));
$smarty->display('error.tpl');
die;
}
if (! isset($_REQUEST['sheetId'])) {
$smarty->assign('msg', tra('No sheet specified.'));
$smarty->display('error.tpl');
die;
}
// }}}1
$valid_graphs = [ 'PieChartGraphic', 'MultilineGraphic', 'MultibarGraphic', 'BarStackGraphic' ];
$valid_renderers = [ 'PNG', 'JPEG', 'PDF', 'PS' ];
if (! empty($_REQUEST['graphic']) && ! in_array($_REQUEST['graphic'], $valid_graphs)) {
$smarty->assign('msg', tra('Unknown Graphic.'));
$smarty->display('error.tpl');
die;
}
if (! empty($_REQUEST['renderer']) && ! in_array($_REQUEST['renderer'], $valid_renderers)) {
$smarty->assign('msg', tra('Unknown Renderer.'));
$smarty->display('error.tpl');
die;
}
$smarty->assign('sheetId', $_REQUEST["sheetId"]);
$smarty->assign('title', $info['title']);
$smarty->assign('description', $info['description']);
$smarty->assign('page_mode', 'form');
// Process the insertion or modification of a gallery here
$sheetId = $_REQUEST['sheetId'];
if (isset($_REQUEST['title'])) {
$cache_file = 'temp/cache/tsge_' . md5($_SERVER['REQUEST_URI']);
switch ($_REQUEST['renderer']) {
case 'PNG':
$renderer = new GD_GRenderer($_REQUEST['width'], $_REQUEST['height'], 'png');
$ext = 'png';
break;
case 'JPEG':
$renderer = new GD_GRenderer($_REQUEST['width'], $_REQUEST['height'], 'jpg');
$ext = 'jpg';
break;
case 'PDF':
$renderer = new PDFLib_GRenderer($_REQUEST['format'], $_REQUEST['orientation']);
$ext = 'pdf';
break;
case 'PS':
$renderer = new PS_GRenderer($_REQUEST['format'], $_REQUEST['orientation']);
$ext = 'ps';
break;
default:
$smarty->assign('msg', tra('You must select a renderer.'));
$smarty->display('error.tpl');
die;
}
if (file_exists($cache_file) && time() - filemtime($cache_file) < 3600) {
$renderer->httpHeaders("graph.$ext");
readfile($cache_file);
exit;
}
$handler = new TikiSheetDatabaseHandler($sheetId);
$grid = new TikiSheet($_REQUEST['sheetId']);
$grid->import($handler);
$graph = $_REQUEST['graphic'];
$graph = new $graph();
// Create Output
$series = [];
foreach ($_REQUEST['series'] as $key => $value) {
if (! empty($value)) {
$s = handle_series($value, $grid);
if (count($s) > 0) {
$series[$key] = $s;
}
}
}
if (! $graph->setData($series)) {
$smarty->assign('msg', tra('Invalid Series for current graphic.'));
$smarty->display('error.tpl');
die;
}
if (! empty($_REQUEST['title'])) {
$graph->setTitle($_REQUEST['title']);
}
if (isset($_REQUEST['independant'])) {
$graph->setParam('grid-independant-location', $_REQUEST['independant']);
$graph->setParam('grid-vertical-position', $_REQUEST['vertical']);
$graph->setParam('grid-horizontal-position', $_REQUEST['horizontal']);
}
$graph->draw($renderer);
ob_start();
$renderer->httpOutput("graph.$ext");
$content = ob_get_contents();
ob_end_flush();
file_put_contents($cache_file, $content);
exit;
} else {
if (isset($_GET['graphic']) && in_array($_GET['graphic'], $valid_graphs)) {
$graph = $_GET['graphic'];
$g = new $graph();
$series = [];
foreach (array_keys($g->getRequiredSeries()) as $s) {
if ($s == 'y0') {
$series[] = 'y0';
$series[] = 'y1';
$series[] = 'y2';
$series[] = 'y3';
$series[] = 'y4';
} else {
$series[] = $s;
}
}
$smarty->assign('mode', 'param');
$smarty->assign('series', $series);
$smarty->assign('graph', $graph);
$smarty->assign('renderer', $_REQUEST['renderer']);
$handler = new TikiSheetDatabaseHandler($sheetId);
$grid = new TikiSheet($_REQUEST['sheetId']);
$grid->import($handler);
$dataGrid = $grid->getTableHtml(true);
require_once('lib/sheet/grid.php');
$sheetlib->setup_jquery_sheet();
$headerlib->add_jq_onready(
'$("div.tiki_sheet").sheet($.extend($.sheet.tikiOptions, {editable: false}));'
);
$smarty->assign('dataGrid', $dataGrid);
if (function_exists('pdf_new')) {
$smarty->assign('format', $_GET['format']);
$smarty->assign('orientation', $_GET['orientation']);
}
if (function_exists('imagepng')) {
$smarty->assign('im_width', $_GET['width']);
$smarty->assign('im_height', $_GET['height']);
}
if (is_a($g, 'GridBasedGraphic')) {
$smarty->assign('showgridparam', true);
}
} else {
$smarty->assign('mode', 'graph');
$smarty->assign('hasgd', function_exists('imagepng') && function_exists('imagejpeg'));
$smarty->assign('haspdflib', function_exists('pdf_new'));
$smarty->assign('hasps', function_exists('ps_new'));
}
}
// Display the template
$smarty->assign('mid', 'tiki-graph-sheets.tpl');
$smarty->display("tiki.tpl");