Compare commits

...

21 Commits

Author SHA1 Message Date
Paolo 2127823af5 Merge branch 'master' into feature-40315/Diagramme_generieren 2026-04-27 13:03:13 +02:00
Paolo 4bb41746dd Merge branch 'master' into feature-40315/Diagramme_generieren 2026-03-24 09:36:38 +01:00
Paolo baaa9ece89 Merge branch 'master' into feature-40315/Diagramme_generieren 2026-02-23 13:36:35 +01:00
Paolo dea9c38936 Added docx format to include/dokument_export.class.php 2025-10-27 11:51:52 +01:00
Paolo 4d109c05cb Merge branch 'master' into feature-40315/Diagramme_generieren 2025-10-27 09:13:22 +01:00
Paolo 7ae8f67fd3 - Moved Drawio XML generation from application/libraries/DrawIoLib.php to application/models/CL/Drawio_model.php
- Changed application/libraries/DocsboxLib.php to bettere handle output files
- Jobs Modulgrafik and Organigramm now they generates PNGs from the Drawio XML
2024-11-26 12:50:36 +01:00
Paolo 242c74e912 Changed application/libraries/DocsboxLib.php to use more formats 2024-11-25 14:24:15 +01:00
Paolo af9af625d4 Merge branch 'master' into feature-40315/Diagramme_generieren 2024-11-25 14:23:58 +01:00
Harald Bamberger 6bbc09442c first guess modulgrafik has to be improved 2024-09-25 17:32:45 +02:00
Harald Bamberger ff539568c2 Merge branch 'master' into feature-40315/Diagramme_generieren 2024-09-25 17:31:40 +02:00
Harald Bamberger 77a3157c3d Merge branch 'master' into feature-40315/Diagramme_generieren 2024-09-25 09:46:31 +02:00
Harald Bamberger 2252ab1996 refactor code, use Lib for DrawIO XML generating functions, start work on Modulgrafik 2024-07-26 12:58:10 +02:00
Harald Bamberger b2b9846f10 finetune fhtw diagram 2024-07-04 15:42:28 +02:00
Harald Bamberger 977fa5b0f0 add option to only render selected childs 2024-07-04 11:25:39 +02:00
Harald Bamberger c27bbc52c0 sizes, spacing, offsets finetuning 2024-07-04 09:45:47 +02:00
Harald Bamberger 209840e940 render faculties as separate diagram 2024-07-04 08:27:28 +02:00
Harald Bamberger c9b31b1795 render childs vertically if they are only of type Lehrgang or Studiengang an have no childs themselves 2024-07-04 08:13:05 +02:00
Harald Bamberger 8fde7d3268 work on placement 2024-06-27 22:09:49 +02:00
Harald Bamberger 129cf2769c refactor, work on placement 2024-06-26 09:49:15 +02:00
Harald Bamberger c1b80cf9a7 work on placement 2024-06-25 08:31:40 +02:00
Harald Bamberger 07af177cc1 first guess, generates oes and edges, pacement to be improved 2024-06-25 07:38:56 +02:00
5 changed files with 726 additions and 9 deletions
@@ -0,0 +1,196 @@
<?php
/* Copyright (C) 2024 fhcomplete.net
*
* 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 2 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, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
*/
if (!defined("BASEPATH")) exit("No direct script access allowed");
class Modulgrafik extends JOB_Controller
{
const DEFAULT_XOFFSET = 40;
const DEFAULT_YOFFSET = 30;
const DEFAULT_WIDTH = 160;
const DEFAULT_SEMESTER_LABEL_WIDTH = 80;
const DEFAULT_ECTS_WIDTH = 40;
const DEFAULT_HEIGHT = 50;
const DEFAULT_SPACING = 40;
const DEFAULT_FONTSIZE = 8;
protected $curx;
protected $cury;
public function __construct()
{
parent::__construct();
$this->load->model('organisation/Studienplan_model', 'StudienplanModel');
$this->load->model('CL/Drawio_model', 'DrawioModel');
$this->load->library('DocsboxLib', null, 'DocsboxLib');
}
public function drawModulGrafik($studienplan_id)
{
$sql = <<<EOSQL
SELECT
sl.studienplan_lehrveranstaltung_id,
sl.lehrveranstaltung_id,
sl.studienplan_lehrveranstaltung_id_parent,
COALESCE(sl.studienplan_lehrveranstaltung_id_parent, sl.studienplan_lehrveranstaltung_id) AS lvgrp,
sl.semester,
lv.bezeichnung,
lv.ects,
lv.lehrtyp_kurzbz
FROM
lehre.tbl_studienplan_lehrveranstaltung sl
JOIN
lehre.tbl_lehrveranstaltung lv USING(lehrveranstaltung_id)
WHERE
sl.studienplan_id = {$studienplan_id}
AND
ects > '0.00'
ORDER BY
sl.semester ASC,
lvgrp ASC,
lv.lehrtyp_kurzbz DESC
EOSQL;
$result = $this->StudienplanModel->execReadOnlyQuery($sql);
$lvs = getData($result);
$errors = array();
$assoclvs = array();
$semester = array();
if($lvs)
{
ob_start();
foreach($lvs as &$lv)
{
if( !isset($semester[$lv->semester]) ) {
$semester[$lv->semester] = array();
}
$lv->parent = null;
$lv->childs = array();
$assoclvs[$lv->studienplan_lehrveranstaltung_id] = $lv;
}
foreach($assoclvs as &$assoclv)
{
if( $assoclv->studienplan_lehrveranstaltung_id_parent === NULL )
{
$semester[$assoclv->semester][] = $assoclv;
}
else
{
if( isset($assoclvs[$assoclv->studienplan_lehrveranstaltung_id_parent]) )
{
$assoclv->parent = $assoclvs[$assoclv->studienplan_lehrveranstaltung_id_parent];
$assoclvs[$assoclv->studienplan_lehrveranstaltung_id_parent]->childs[] = $assoclv;
}
else
{
$errors[] = "ERROR: Missing parent lv " . $assoclv->studienplan_lehrveranstaltung_id_parent . "\n";
}
}
}
function printchilds($childs, $level) {
if( count($childs) < 1 )
{
return;
}
foreach($childs as $child)
{
echo $level . $child->bezeichnung . " (" . $child->ects . ") " . $child->lehrtyp_kurzbz . "\n";
printchilds($child->childs, $level . "\t");
}
}
echo "<!--\n\n";
foreach($semester as $sem => $mods)
{
echo $sem . ". Semester: \n";
foreach($mods as $mod)
{
$level = "\t";
echo $level . $mod->bezeichnung . " (" . $mod->ects . ") " . $mod->lehrtyp_kurzbz . "\n";
printchilds($mod->childs, $level . "\t");
}
}
echo "-->\n\n";
if (count($errors) === 0)
{
$this->DrawioModel->renderFileStart();
$this->maxxoffset = self::DEFAULT_XOFFSET;
$this->DrawioModel->renderDiagramStart($studienplan_id, 'Modulgrafik');
$this->renderSemester($semester);
$this->DrawioModel->renderDiagramEnd();
$this->DrawioModel->renderFileEnd();
}
else
{
foreach ($errors as $error)
{
echo $error;
}
}
$output = ob_get_clean();
file_put_contents(sys_get_temp_dir().'/Modulgrafik.xml', $output);
$ret = DocsboxLib::convert(sys_get_temp_dir().'/Modulgrafik.xml', sys_get_temp_dir().'/Modulgrafik.png', 'png');
echo 'File: '.sys_get_temp_dir().'/Modulgrafik.png'."\n";
}
else
{
echo "Keine LVs gefunden.\n";
}
}
protected function renderSemester($semester)
{
$cury = self::DEFAULT_YOFFSET;
foreach($semester as $sem => $mods)
{
$curx = self::DEFAULT_XOFFSET;
$id = uniqid();
$ects = 30; //TODO calc
$this->DrawioModel->renderSemesterLabel($id, $sem, $ects, self::DEFAULT_XOFFSET, $cury, self::DEFAULT_SEMESTER_LABEL_WIDTH, self::DEFAULT_HEIGHT);
$curx += self::DEFAULT_SEMESTER_LABEL_WIDTH + self::DEFAULT_SPACING;
$maxmodulheight = 0;
foreach($mods as $mod)
{
$modid = uniqid();
$size = $this->DrawioModel->renderModulList($modid, $mod, $curx, $cury, self::DEFAULT_ECTS_WIDTH, self::DEFAULT_HEIGHT);
$curx += $size->width + self::DEFAULT_SPACING;
if( $size->height > $maxmodulheight)
{
$maxmodulheight = $size->height;
}
}
$cury += $maxmodulheight + self::DEFAULT_SPACING;
}
}
}
@@ -0,0 +1,339 @@
<?php
/* Copyright (C) 2024 fhcomplete.net
*
* 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 2 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, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
*/
if (!defined("BASEPATH")) exit("No direct script access allowed");
class Organigramm extends JOB_Controller
{
const DEFAULT_XOFFSET = 40;
const DEFAULT_YOFFSET = 30;
const DEFAULT_WIDTH = 160;
const DEFAULT_HEIGHT = 50;
const DEFAULT_SPACING = 40;
const DEFAULT_FONTSIZE = 8;
const RENDER_CHILDS_HORIZONTAL = 1;
const RENDER_CHILDS_VERTICAL = 2;
protected $maxxoffset;
protected $donotrenderchildsoftype;
public function __construct()
{
parent::__construct();
$this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
$this->load->model('CL/Drawio_model', 'DrawioModel');
$this->load->library('DocsboxLib', null, 'DocsboxLib');
$this->maxxoffset = self::DEFAULT_XOFFSET;
$this->donotrenderchildsoftype = array();
}
public function getAllActiveOes()
{
$sql = <<<EOSQL
SELECT
oe.oe_kurzbz,
CASE
WHEN oe.oe_parent_kurzbz = 'atw' THEN 'gst'
WHEN oe.oe_parent_kurzbz = 'etw' THEN 'gst'
ELSE oe.oe_parent_kurzbz
END AS oe_parent_kurzbz,
oe.bezeichnung,
oe.organisationseinheittyp_kurzbz,
STRING_AGG(
DISTINCT p.vorname || ' ' || p.nachname,
', '
) AS leitung_uid
FROM
"public"."tbl_organisationseinheit" oe
LEFT JOIN public.tbl_benutzerfunktion bf ON bf.oe_kurzbz = oe.oe_kurzbz
AND (
bf.datum_bis IS NULL
OR bf.datum_bis > NOW() :: date
)
AND (
bf.funktion_kurzbz IS NULL
OR bf.funktion_kurzbz = 'Leitung'
)
LEFT JOIN public.tbl_benutzer b USING(uid)
LEFT JOIN public.tbl_person p USING(person_id)
WHERE
oe.aktiv = true
AND oe.oe_kurzbz NOT IN ('betriebsrat', 'oeh', 'FUEWahl', 'atw', 'etw', 'gf20')
GROUP BY
oe.oe_kurzbz,
oe.oe_parent_kurzbz,
oe.bezeichnung,
oe.organisationseinheittyp_kurzbz
ORDER BY
oe.oe_parent_kurzbz ASC NULLS FIRST,
oe.oe_kurzbz ASC;
EOSQL;
$result = $this->OrganisationseinheitModel->execReadOnlyQuery($sql);
$oes = getData($result);
$errors = array();
$assocoes = array();
$roots = array();
if($oes)
{
ob_start();
foreach($oes as &$oe)
{
$oe->parent = NULL;
$oe->childs = array();
$oe->renderchilds = self::RENDER_CHILDS_HORIZONTAL;
$oe->childstorender = array();
$oe->donotrenderchildsoftype = array();
$assocoes[$oe->oe_kurzbz] = $oe;
}
foreach($assocoes as &$assocoe)
{
if( $assocoe->oe_parent_kurzbz === NULL )
{
$roots[$assocoe->oe_kurzbz] = $assocoe;
$assocoe->donotrenderchildsoftype = array(
'Team',
'Lehrgang',
'Studiengang',
'Kompetenzfeld',
'Forschungsfeld',
'Container'
);
}
else
{
if( isset($assocoes[$assocoe->oe_parent_kurzbz]) )
{
$assocoe->parent = $assocoes[$assocoe->oe_parent_kurzbz];
$assocoes[$assocoe->oe_parent_kurzbz]->childs[] = $assocoe;
if( $assocoe->organisationseinheittyp_kurzbz === 'Fakultaet' )
{
$roots[$assocoe->oe_kurzbz] = $assocoe;
}
}
else
{
$errors[] = "ERROR: Missing parent oe " . $assocoe->oe_parent_kurzbz . "\n";
}
}
}
if(count($errors) === 0)
{
$pages = count($roots);
$this->DrawioModel->renderFileStart($pages);
foreach($roots AS &$root)
{
$this->maxxoffset = self::DEFAULT_XOFFSET;
$this->donotrenderchildsoftype = $root->donotrenderchildsoftype;
$this->prepareChildsToRender($root);
$this->DrawioModel->renderDiagramStart($root->oe_kurzbz, $root->bezeichnung);
$this->renderOE($root, 0, 0);
$this->DrawioModel->renderDiagramEnd();
}
$this->DrawioModel->renderFileEnd();
}
else
{
foreach ($errors as $error)
{
echo $error;
}
}
$output = ob_get_clean();
file_put_contents(sys_get_temp_dir().'/Organigramm.xml', $output);
$ret = DocsboxLib::convert(sys_get_temp_dir().'/Organigramm.xml', sys_get_temp_dir().'/Organigramm.png', 'png');
echo 'File: '.sys_get_temp_dir().'//Organigramm.png'."\n";
}
else
{
echo "Keine Oes gefunden.\n";
}
}
protected function prepareChildsToRender(&$oe)
{
$oe->childstorender = array();
$oe->renderchilds = self::RENDER_CHILDS_HORIZONTAL;
if( isset($oe->childsxoffset) )
{
unset($oe->childsxoffset);
}
foreach($oe->childs AS &$oechild )
{
$this->prepareChildsToRender($oechild);
if( !in_array($oechild->organisationseinheittyp_kurzbz, $this->donotrenderchildsoftype) )
{
$oe->childstorender[] = $oechild;
}
}
$nurLehrgaengeOderStudiengaengeOhneKinder = true;
foreach($oe->childstorender AS &$oechildtorender )
{
if( !(count($oechildtorender->childstorender) === 0) )
{
$nurLehrgaengeOderStudiengaengeOhneKinder = false;
}
}
if( $nurLehrgaengeOderStudiengaengeOhneKinder && $oe->parent !== NULL )
{
$oe->renderchilds = self::RENDER_CHILDS_VERTICAL;
}
}
protected function renderOE($oe, $level, $parentrenderedchildcount)
{
$width = self::DEFAULT_WIDTH;
$height = self::DEFAULT_HEIGHT;
$spacing = self::DEFAULT_SPACING;
$fontsize = self::DEFAULT_FONTSIZE;
$nextlevel = $level + 1;
$renderedchildcount = 0;
$curxoffset = $this->maxxoffset;
if( count($oe->childstorender) > 0 )
{
if( !isset($oe->childsxoffset) )
{
$oe->childsxoffset = (object) array(
'min' => $curxoffset,
'max' => $curxoffset
);
}
foreach($oe->childstorender AS $child)
{
$ret = $this->renderOE($child, $nextlevel, $renderedchildcount);
$renderedchildcount++;
if( $renderedchildcount === 1 )
{
$oe->childsxoffset->min = $ret->minx;
}
$oe->childsxoffset->max = $ret->maxx;
}
if( count($oe->childstorender) === $renderedchildcount )
{
$curxoffset = $oe->childsxoffset->min +
floor((($oe->childsxoffset->max - $oe->childsxoffset->min) / 2)) -
floor((($width + $spacing) / 2));
}
}
if( $oe->parent !== null && $oe->parent->renderchilds === self::RENDER_CHILDS_VERTICAL )
{
$x = $curxoffset;
$y = self::DEFAULT_YOFFSET
+ (($level - 1) * ($height + $spacing))
+ (($parentrenderedchildcount + 1) * ($height + floor($spacing / 2)));
}
else
{
$x = $curxoffset;
$y = self::DEFAULT_YOFFSET + ($level * ($height + $spacing));
}
$bezeichnung = htmlspecialchars($oe->bezeichnung);
$leitung = ($oe->leitung_uid !== null) ? htmlspecialchars($oe->leitung_uid) : 'N.N.';
$fillcolors = array(
'Team' => '#ffe6cc',
'Abteilung' => '#e6ffcc',
'Studiengang' => '#cce6ff',
'Lehrgang' => '#e6ccff',
'Fakultaet' => '#f8cecc',
'Department' => '#fff2cc',
'Forschungsfeld' => '#e1d5e7',
'Kompetenzfeld' => '#f5f5f5'
);
$fillcolor = (isset($fillcolors[$oe->organisationseinheittyp_kurzbz])) ? $fillcolors[$oe->organisationseinheittyp_kurzbz] : '#ffffff';
$value = <<<EOVAL
&lt;font style=&quot;font-size: {$fontsize}px;&quot;&gt;&lt;div style=&quot;&quot;&gt;[{$oe->organisationseinheittyp_kurzbz}]&lt;/div&gt;&lt;b style=&quot;&quot;&gt;{$bezeichnung}&lt;/b&gt;&lt;div&gt;({$leitung})&lt;/div&gt;&lt;/font&gt;" style="whiteSpace=wrap;html=1;align=center;verticalAlign=middle;treeFolding=1;treeMoving=1;newEdgeStyle={&quot;edgeStyle&quot;:&quot;elbowEdgeStyle&quot;,&quot;startArrow&quot;:&quot;none&quot;,&quot;endArrow&quot;:&quot;none&quot;};fillColor={$fillcolor};
EOVAL;
$this->DrawioModel->renderCell($oe->oe_kurzbz, $value, $x, $y, $width, $height);
if( $oe->oe_parent_kurzbz !== NULL )
{
$exitX = '0.5';
$exitY = '1';
$entryX = '0.5';
$entryY = '0';
$points = array();
if( $oe->parent !== null && $oe->parent->renderchilds === self::RENDER_CHILDS_VERTICAL)
{
$exitX = '0';
$exitY = '0.5';
$entryX = '0';
$entryY = '0.5';
$points = array(
(object) array(
'x' => ($x - floor($spacing / 2)),
'y' => ($y + floor($height / 2))
)
);
}
$this->DrawioModel->renderEdge($oe->oe_parent_kurzbz, $oe->oe_kurzbz, $exitX, $exitY, $entryX, $entryY, $points);
}
if( $oe->parent !== null && $oe->parent->renderchilds === self::RENDER_CHILDS_VERTICAL )
{
if( count($oe->parent->childstorender) === ($parentrenderedchildcount + 1) )
{
if( $this->maxxoffset < ($x + $width + $spacing) )
{
$this->maxxoffset = ($x + $width + $spacing);
}
return (object) array(
'minx' => $curxoffset,
'maxx' => ($x + $width + $spacing)
);
}
return (object) array(
'minx' => $curxoffset,
'maxx' => $x
);
}
if( $this->maxxoffset < ($x + $width + $spacing) )
{
$this->maxxoffset = ($x + $width + $spacing);
}
return (object) array(
'minx' => $curxoffset,
'maxx' => ($x + $width + $spacing)
);
}
}
+15 -9
View File
@@ -1,5 +1,5 @@
<?php
/* Copyright (C) 2022 fhcomplete.net
/* Copyright (C) 2024 fhcomplete.net
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
@@ -32,7 +32,7 @@ class DocsboxLib
const STATUS_QUEUED = 'queued'; // Docsbox status when a file has been queued for the conversion
const STATUS_STARTED = 'started'; // Docsbox status when a file has started being worked
const STATUS_WORKING = 'working'; // Docsbox status when a file is being converted
const OUTPUT_FILENAME = 'out.zip.pdf'; // File name used by docsbox to save a converted document
const JSON_FORMATS = '{"formats": ["%s"]}'; // JSON object to be sent to docsbox to specify the file format
const DEFAULT_FORMAT = 'pdf'; // Default supported format
@@ -50,7 +50,7 @@ class DocsboxLib
if (($format == null) || ($format != null && ctype_space($format) === true)) $format = self::DEFAULT_FORMAT;
// Posts the file to docsbox
$queueId = self::_postFile($inputFileName);
$queueId = self::_postFile($inputFileName, $format);
// If an error occurred
if ($queueId == null) return self::ERROR;
@@ -60,7 +60,7 @@ class DocsboxLib
if ($resultUrl == null) return self::ERROR;
// Download and rename the converted file
$downloaded = self::_downloadFile($resultUrl, $outputFileName);
$downloaded = self::_downloadFile($inputFileName, $resultUrl, $outputFileName, $format);
// If an error occurred
if (!$downloaded) return self::ERROR;
@@ -74,7 +74,7 @@ class DocsboxLib
* Posts the given file to a Docsboxserver and checks the response to return a valid queue id
* On failure it returns a null value
*/
private static function _postFile($inputFileName)
private static function _postFile($inputFileName, $format)
{
$queueId = null;
@@ -82,8 +82,14 @@ class DocsboxLib
{
// Posts the given file and expects a response in JSON format
$postFileResponse = \Httpful\Request::post(DOCSBOX_SERVER.DOCSBOX_PATH_API)
->attach(array('file' => $inputFileName))
->sendsType(\Httpful\Mime::FORM)
->expectsJson()
->body(
array(
'options' => sprintf(self::JSON_FORMATS, $format)
)
)
->attach(array('file' => $inputFileName))
->send();
// Checks that:
@@ -221,7 +227,7 @@ class DocsboxLib
/**
* Download the converted file using the provided URL, unzip it, and renames it into the provided file name
*/
private static function _downloadFile($resultUrl, $outputFileName)
private static function _downloadFile($inputFileName, $resultUrl, $outputFileName, $format)
{
$downloaded = false; // pessimistic assumption
@@ -253,7 +259,7 @@ class DocsboxLib
// Opened, extracted and closed!
// Rename the extracted file to the given output file name
if (rename($outputDirectory.'/'.self::OUTPUT_FILENAME, $outputFileName))
if (@rename($inputFileName.'.'.$format, $outputFileName))
{
$downloaded = true;
}
@@ -261,7 +267,7 @@ class DocsboxLib
{
error_log(
'An error occurred while renaming the extracted file: '.
$outputDirectory.'/'.self::OUTPUT_FILENAME.' into: '.
$inputFileName.'.'.$format.' into: '.
$outputFileName
);
}
+170
View File
@@ -0,0 +1,170 @@
<?php
/* Copyright (C) 2024 fhcomplete.net
*
* 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 2 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, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
*/
class Drawio_model extends CI_Model
{
/**
*
*/
public function renderFileStart($pages=1, $agent='FH-Complete', $timemodified='now')
{
$modified = (new DateTime($timemodified, new DateTimeZone('UTC')))->format(DateTime::ATOM);
echo <<<HEADER
<mxfile modified="{$modified}" host="Electron" agent="{$agent}" type="device" pages="{$pages}">
HEADER;
}
/**
*
*/
public function renderFileEnd()
{
echo <<<FOOTER
</mxfile>
FOOTER;
}
/**
*
*/
public function renderDiagramStart($diagram_id, $diagram_bezeichnung)
{
$bezeichnung = htmlspecialchars($diagram_bezeichnung);
echo <<<STARTDIAGRAMM
<diagram id="diagram_{$diagram_id}" name="{$bezeichnung}">
<mxGraphModel dx="1177" dy="687" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
STARTDIAGRAMM;
}
/**
*
*/
public function renderDiagramEnd()
{
echo <<<ENDDIAGRAMM
</root>
</mxGraphModel>
</diagram>
ENDDIAGRAMM;
}
/**
*
*/
public function renderCell($id, $value, $x, $y, $width, $height)
{
echo <<<OE
<mxCell id="{$id}" value="{$value}" parent="1" vertex="1">
<mxGeometry x="{$x}" y="{$y}" width="{$width}" height="{$height}" as="geometry" />
</mxCell>
OE;
}
/**
*
*/
public function renderEdge($source, $target, $exitX, $exitY, $entryX, $entryY, $points=array())
{
if( count($points) > 0 )
{
$pointsxml = '';
foreach($points as $point)
{
$pointsxml .= <<<EOPOINT
<mxPoint x="{$point->x}" y="{$point->y}" />
EOPOINT;
}
$edgegeom = <<<EDGEPOINTS
<mxGeometry relative="1" as="geometry">
<Array as="points">
{$pointsxml}
</Array>
</mxGeometry>
EDGEPOINTS;
}
else
{
$edgegeom = ' <mxGeometry relative="1" as="geometry" />';
}
echo <<<EDGE
<mxCell id="edge_{$source}_{$target}" value="" style="edgeStyle=elbowEdgeStyle;elbow=vertical;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;startArrow=none;endArrow=none;rounded=0;curved=0;exitX={$exitX};exitY={$exitY};exitDx=0;exitDy=0;entryX={$entryX};entryY={$entryY};entryDx=0;entryDy=0;" parent="1" source="{$source}" target="{$target}" edge="1">
{$edgegeom}
</mxCell>
EDGE;
}
/**
*
*/
public function renderSemesterLabel($id, $sem, $ects, $x, $y, $width, $height)
{
echo <<<RENDERSEM
<mxCell id="{$id}" value="&lt;b&gt;{$sem}. Semester&lt;br&gt;&lt;/b&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: initial;&quot;&gt;{$ects} ECTS&lt;/span&gt;&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="{$x}" y="{$y}" width="{$width}" height="{$height}" as="geometry" />
</mxCell>
RENDERSEM;
}
/**
*
*/
public function renderModulList($listid, $mod, $x, $y, $ects_width, $lv_height)
{
$width = ceil($mod->ects * $ects_width);
$height = (count($mod->childs) + 1) * $lv_height;
$modul_ects = (int) $mod->ects;
echo <<<RENDERMOD
<mxCell id="{$listid}" value="{$mod->bezeichnung} ({$modul_ects})" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize={$lv_height};horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="{$x}" y="{$y}" width="{$width}" height="{$height}" as="geometry">
<mxRectangle x="{$x}" y="{$y}" width="{$width}" height="{$height}" as="alternateBounds" />
</mxGeometry>
</mxCell>
RENDERMOD;
$childnumber = 0;
foreach ($mod->childs as $child)
{
$childnumber++;
$childid = uniqid();
$childheight = $childnumber * $lv_height;
$child_ects = (int) $child->ects;
echo <<<RENDERMODFOR
<mxCell id="{$childid}" value="{$child->bezeichnung} ({$child_ects})" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="{$listid}">
<mxGeometry y="{$childheight}" width="{$width}" height="{$lv_height}" as="geometry" />
</mxCell>
RENDERMODFOR;
}
return (object) array(
'width' => $width,
'height' => $height
);
}
}
+6
View File
@@ -287,6 +287,7 @@ class dokument_export
{
case 'pdf':
case 'doc':
case 'docx':
$ret = 0;
$this->temp_filename = $this->temp_folder . '/out.' . $this->outputformat;
@@ -369,6 +370,11 @@ class dokument_export
header('Content-Disposition: attachment; filename="'.$this->filename.'.doc"');
header('Content-Length: '.$fsize);
break;
case 'docx':
header('Content-type: application/vnd.ms-word');
header('Content-Disposition: attachment; filename="'.$this->filename.'.docx"');
header('Content-Length: '.$fsize);
break;
case 'odt':
header('Content-type: application/vnd.oasis.opendocument.text');