1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/webtrees_ynh.git synced 2024-09-03 18:26:37 +02:00
webtrees_ynh/sources/reportengine.php

285 lines
9.5 KiB
PHP

<?php
/**
* webtrees: online genealogy
* Copyright (C) 2016 webtrees development team
* 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, either version 3 of the License, or
* (at your option) any later version.
* 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/>.
*/
namespace Fisharebest\Webtrees;
use Fisharebest\Webtrees\Controller\PageController;
use Fisharebest\Webtrees\Functions\FunctionsPrint;
use Fisharebest\Webtrees\Report\ReportHtml;
use Fisharebest\Webtrees\Report\ReportParserGenerate;
use Fisharebest\Webtrees\Report\ReportParserSetup;
use Fisharebest\Webtrees\Report\ReportPdf;
/**
* Defined in session.php
*
* @global Tree $WT_TREE
*/
global $WT_TREE;
define('WT_SCRIPT_NAME', 'reportengine.php');
require './includes/session.php';
$controller = new PageController;
$famid = Filter::get('famid', WT_REGEX_XREF);
$pid = Filter::get('pid', WT_REGEX_XREF);
$action = Filter::get('action', 'choose|setup|run', 'choose');
$report = Filter::get('report');
$output = Filter::get('output', 'HTML|PDF', 'PDF');
$vars = Filter::get('vars');
$varnames = Filter::get('varnames');
$type = Filter::get('type');
if (!is_array($vars)) {
$vars = array();
}
if (!is_array($varnames)) {
$varnames = array();
}
if (!is_array($type)) {
$type = array();
}
//-- setup the arrays
$newvars = array();
foreach ($vars as $name => $var) {
$newvars[$name]['id'] = $var;
if (!empty($type[$name])) {
switch ($type[$name]) {
case 'INDI':
$record = Individual::getInstance($var, $WT_TREE);
if ($record && $record->canShowName()) {
$newvars[$name]['gedcom'] = $record->privatizeGedcom(Auth::accessLevel($WT_TREE));
} else {
$action = 'setup';
}
break;
case 'FAM':
$record = Family::getInstance($var, $WT_TREE);
if ($record && $record->canShowName()) {
$newvars[$name]['gedcom'] = $record->privatizeGedcom(Auth::accessLevel($WT_TREE));
} else {
$action = 'setup';
}
break;
case 'SOUR':
$record = Source::getInstance($var, $WT_TREE);
if ($record && $record->canShowName()) {
$newvars[$name]['gedcom'] = $record->privatizeGedcom(Auth::accessLevel($WT_TREE));
} else {
$action = 'setup';
}
break;
default:
break;
}
}
}
$vars = $newvars;
foreach ($varnames as $name) {
if (!isset($vars[$name])) {
$vars[$name]['id'] = '';
}
}
$reports = array();
foreach (Module::getActiveReports($WT_TREE) as $rep) {
$menu = $rep->getReportMenu();
if (preg_match('/report=(' . preg_quote(WT_MODULES_DIR, '/') . '[a-z0-9_]+\/[a-z0-9_]+\.xml)/', $menu->getLink(), $match)) {
$reports[$match[1]] = $menu->getLabel();
}
}
if (!empty($report)) {
if (!array_key_exists($report, $reports)) {
$action = 'choose';
}
}
//-- choose a report to run
switch ($action) {
case 'choose':
$controller
->setPageTitle(I18N::translate('Choose a report to run'))
->pageHeader();
echo '<div id="reportengine-page">
<h2 class="center">', I18N::translate('Choose a report to run'), '</h2>
<form name="choosereport" method="get" action="reportengine.php">
<input type="hidden" name="action" value="setup">
<input type="hidden" name="output" value="', Filter::escapeHtml($output), '">
<table class="facts_table width40">
<tr><td class="descriptionbox wrap width33 vmiddle">', I18N::translate('Report'), '</td>
<td class="optionbox"><select name="report">';
foreach ($reports as $file => $report) {
echo '<option value="', Filter::escapeHtml($file), '">', Filter::escapeHtml($report), '</option>';
}
echo '</select></td></tr>
<tr><td class="topbottombar" colspan="2"><input type="submit" value="', I18N::translate('continue'), '"></td></tr>
</table></form></div>';
break;
case 'setup':
$report_setup = new ReportParserSetup($report);
$report_array = $report_setup->reportProperties();
$controller
->setPageTitle($report_array['title'])
->pageHeader()
->addExternalJavascript(WT_AUTOCOMPLETE_JS_URL)
->addInlineJavascript('autocomplete();');
FunctionsPrint::initializeCalendarPopup();
echo '<div id="reportengine-page">
<h2 class="center">', $report_array['title'], '</h2>
<form name="setupreport" method="get" action="reportengine.php">
<input type="hidden" name="action" value="run">
<input type="hidden" name="report" value="', Filter::escapeHtml($report), '">
<table class="facts_table width50">
<tr><td class="descriptionbox width30 wrap">', I18N::translate('Report'), '</td><td class="optionbox">', $report_array['description'], '</td></tr>';
if (!isset($report_array['inputs'])) {
$report_array['inputs'] = array();
}
foreach ($report_array['inputs'] as $input) {
echo '<tr><td class="descriptionbox wrap">';
echo '<input type="hidden" name="varnames[]" value="', Filter::escapeHtml($input["name"]), '">';
echo I18N::translate($input['value']), '</td><td class="optionbox">';
if (!isset($input['type'])) {
$input['type'] = 'text';
}
if (!isset($input['default'])) {
$input['default'] = '';
}
if (!isset($input['lookup'])) {
$input['lookup'] = '';
}
if ($input['type'] == 'text') {
echo '<input';
switch ($input['lookup']) {
case 'INDI':
echo ' data-autocomplete-type="INDI"';
if (!empty($pid)) {
$input['default'] = $pid;
} else {
$input['default'] = $controller->getSignificantIndividual()->getXref();
}
break;
case 'FAM':
echo ' data-autocomplete-type="FAM"';
if (!empty($famid)) {
$input['default'] = $famid;
} else {
$input['default'] = $controller->getSignificantFamily()->getXref();
}
break;
case 'SOUR':
echo ' data-autocomplete-type="SOUR"';
if (!empty($sid)) {
$input['default'] = $sid;
}
break;
case 'DATE':
if (isset($input['default'])) {
$input['default'] = strtoupper($input['default']);
}
break;
}
echo ' type="text" name="vars[', Filter::escapeHtml($input['name']), ']" id="', Filter::escapeHtml($input['name']), '" value="', Filter::escapeHtml($input['default']), '" style="direction: ltr;">';
}
if ($input['type'] == 'checkbox') {
echo '<input type="checkbox" name="vars[', Filter::escapeHtml($input['name']), ']" id="', Filter::escapeHtml($input['name']), '" value="1" ';
echo $input['default'] == '1' ? 'checked' : '';
echo '>';
}
if ($input['type'] == 'select') {
echo '<select name="vars[', Filter::escapeHtml($input['name']), ']" id="', Filter::escapeHtml($input['name']), '_var">';
$options = preg_split('/[|]+/', $input['options']);
foreach ($options as $option) {
$opt = explode('=>', $option);
list($value, $display) = $opt;
if (preg_match('/^I18N::number\((.+?)(,([\d+]))?\)$/', $display, $match)) {
$display = I18N::number($match[1], isset($match[3]) ? $match[3] : 0);
} elseif (preg_match('/^I18N::translate\(\'(.+)\'\)$/', $display, $match)) {
$display = I18N::translate($match[1]);
} elseif (preg_match('/^I18N::translateContext\(\'(.+)\', *\'(.+)\'\)$/', $display, $match)) {
$display = I18N::translateContext($match[1], $match[2]);
}
echo '<option value="', Filter::escapeHtml($value), '" ';
if ($opt[0] == $input['default']) {
echo 'selected';
}
echo '>', Filter::escapeHtml($display), '</option>';
}
echo '</select>';
}
if (isset($input['lookup'])) {
echo '<input type="hidden" name="type[', Filter::escapeHtml($input['name']), ']" value="', Filter::escapeHtml($input['lookup']), '">';
if ($input['lookup'] == 'INDI') {
echo FunctionsPrint::printFindIndividualLink('pid');
} elseif ($input['lookup'] == 'PLAC') {
echo FunctionsPrint::printFindPlaceLink($input['name']);
} elseif ($input['lookup'] == 'FAM') {
echo FunctionsPrint::printFindFamilyLink('famid');
} elseif ($input['lookup'] == 'SOUR') {
echo FunctionsPrint::printFindSourceLink($input['name']);
} elseif ($input['lookup'] == 'DATE') {
echo ' <a href="#" onclick="cal_toggleDate(\'div_', Filter::escapeJs($input['name']), '\', \'', Filter::escapeJs($input['name']), '\'); return false;" class="icon-button_calendar" title="', I18N::translate('Select a date'), '"></a>';
echo '<div id="div_', Filter::escapeHtml($input['name']), '" style="position:absolute;visibility:hidden;background-color:white;"></div>';
}
}
echo '</td></tr>';
}
echo '<tr>
<td colspan="2" class="optionbox">
<div class="report-type">
<div>
<label for="PDF"><i class="icon-mime-application-pdf"></i></label>
<p><input type="radio" name="output" value="PDF" id="PDF" checked></p>
</div>
<div>
<label for="HTML"><i class="icon-mime-text-html"></i></label>
<p><input type="radio" name="output" id="HTML" value="HTML"></p>
</div>
</div>
</td>
</tr>
<tr><td class="topbottombar" colspan="2">
<input type="submit" value="', I18N::translate('continue'), '">
</td></tr></table></form></div>';
break;
case 'run':
if (strstr($report, 'report_singlepage.xml') !== false) {
// This is a custom module?
new \ReportPedigree;
break;
}
switch ($output) {
case 'HTML':
header('Content-type: text/html; charset=UTF-8');
new ReportParserGenerate($report, new ReportHtml, $vars);
break;
case 'PDF':
new ReportParserGenerate($report, new ReportPdf, $vars);
break;
}
}