mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-06-01 12:19:28 +00:00
s&d
This commit is contained in:
@@ -61,6 +61,8 @@ $route['api/v1/organisation/[O|o]rganisationseinheit/(:any)'] = 'api/v1/organisa
|
|||||||
$route['api/v1/ressource/[B|b]etriebsmittelperson/(:any)'] = 'api/v1/ressource/betriebsmittelperson2/$1';
|
$route['api/v1/ressource/[B|b]etriebsmittelperson/(:any)'] = 'api/v1/ressource/betriebsmittelperson2/$1';
|
||||||
$route['api/v1/system/[S|s]prache/(:any)'] = 'api/v1/system/sprache2/$1';
|
$route['api/v1/system/[S|s]prache/(:any)'] = 'api/v1/system/sprache2/$1';
|
||||||
|
|
||||||
|
$route['cis'] = 'cis/dashboard';
|
||||||
|
|
||||||
// load routes from extensions
|
// load routes from extensions
|
||||||
$subdir = 'application/config/extensions';
|
$subdir = 'application/config/extensions';
|
||||||
$dirlist = scandir($subdir);
|
$dirlist = scandir($subdir);
|
||||||
|
|||||||
@@ -0,0 +1,120 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class Cms extends Auth_Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct(
|
||||||
|
array(
|
||||||
|
'content' => 'user:r'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Loads WidgetLib
|
||||||
|
$this->load->library('WidgetLib');
|
||||||
|
|
||||||
|
// Load Models
|
||||||
|
$this->load->model('content/Content_model', 'ContentModel');
|
||||||
|
$this->load->model('content/Contentgruppe_model', 'ContentgruppeModel');
|
||||||
|
$this->load->model('content/Template_model', 'TemplateModel');
|
||||||
|
if (defined('LOG_CONTENT') && LOG_CONTENT)
|
||||||
|
$this->load->model('system/Webservicelog_model', 'WebservicelogModel');
|
||||||
|
|
||||||
|
// Loads phrases system
|
||||||
|
$this->loadPhrases(
|
||||||
|
array()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Public methods
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $content_id
|
||||||
|
* @param int $version
|
||||||
|
* @param string $sprache
|
||||||
|
* @param boolean $sichtbar
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function content($content_id, $version = null, $sprache = null, $sichtbar = true)
|
||||||
|
{
|
||||||
|
if(!is_numeric($content_id))
|
||||||
|
return $this->load->view('cis/Error.php', ['error' => 'ContentID ist ungueltig']);
|
||||||
|
|
||||||
|
if ($sprache === null)
|
||||||
|
$sprache = getUserLanguage();
|
||||||
|
|
||||||
|
$islocked = $this->ContentgruppeModel->loadWhere(['content_id' => $content_id]);
|
||||||
|
if (isError($islocked))
|
||||||
|
return $this->load->view('cis/Error.php', ['error' => getError($islocked)]);
|
||||||
|
|
||||||
|
if (getData($islocked)) {
|
||||||
|
$uid = getAuthUID();
|
||||||
|
$isberechtigt = $this->ContentgruppeModel->berechtigt($content_id, $uid);
|
||||||
|
if (isError($isberechtigt))
|
||||||
|
return $this->load->view('cis/Error.php', ['error' => getError($isberechtigt)]);
|
||||||
|
|
||||||
|
if (!getData($isberechtigt))
|
||||||
|
return $this->load->view('cis/Error.php', ['error' => 'global/keineBerechtigungFuerDieseSeite']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$content = $this->ContentModel->getContent($content_id, $sprache, $version, $sichtbar, true);
|
||||||
|
|
||||||
|
if (isError($content))
|
||||||
|
return $this->load->view('cis/Error.php', ['error' => getError($content)]);
|
||||||
|
|
||||||
|
// Legt einen Logeintrag für die Klickstatistik an
|
||||||
|
if (defined('LOG_CONTENT') && LOG_CONTENT)
|
||||||
|
{
|
||||||
|
// Nur eingeloggte User werden geloggt, das sonst auch alle Infoscreenaufrufe und dgl. mitgeloggt werden
|
||||||
|
if (isLogged())
|
||||||
|
{
|
||||||
|
$request_data = 'content_id=' . $content_id;
|
||||||
|
if ($version !== null)
|
||||||
|
$request_data .= '&version=' . $version;
|
||||||
|
if ($sichtbar !== true)
|
||||||
|
$request_data .= '&sichtbar=' . $sichtbar;
|
||||||
|
$this->WebservicelogModel->insert([
|
||||||
|
'webservicetyp_kurzbz' => 'content',
|
||||||
|
'request_id' => $content_id,
|
||||||
|
'beschreibung' => 'content',
|
||||||
|
'request_data' => $request_data . '&sprache=' . $sprache,
|
||||||
|
'execute_time' => 'now()',
|
||||||
|
'execute_user' => getAuthUID()
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$content = getData($content);
|
||||||
|
|
||||||
|
//XSLT Vorlage laden
|
||||||
|
$template = $this->TemplateModel->load($content->template_kurzbz);
|
||||||
|
if (isError($template))
|
||||||
|
return $this->load->view('cis/Error.php', ['error' => getError($template)]);
|
||||||
|
$template = current(getData($template));
|
||||||
|
|
||||||
|
$XML = new \DOMDocument();
|
||||||
|
$XML->loadXML($content->content);
|
||||||
|
|
||||||
|
$xsltemplate = new \DOMDocument();
|
||||||
|
$xsltemplate->loadXML($template->xslt_xhtml_c4);
|
||||||
|
|
||||||
|
//Transformation
|
||||||
|
$processor = new \XSLTProcessor();
|
||||||
|
$processor->importStylesheet($xsltemplate);
|
||||||
|
|
||||||
|
$content = $processor->transformToXML($XML);
|
||||||
|
$content = str_replace('dms.php', APP_ROOT . 'cms/dms.php', $content);
|
||||||
|
|
||||||
|
$this->load->view('cis/cms/Content.php', ['content' => $content]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class Dashboard extends Auth_Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct(
|
||||||
|
array(
|
||||||
|
'index' => 'user:r'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Public methods
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
$this->load->view('cis/Dashboard.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -11,4 +11,167 @@ class Content_model extends DB_Model
|
|||||||
$this->dbTable = 'campus.tbl_content';
|
$this->dbTable = 'campus.tbl_content';
|
||||||
$this->pk = 'content_id';
|
$this->pk = 'content_id';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Laedt den Content in der angegebenen Sprache
|
||||||
|
* Sollte der Content in dieser Sprache nicht vorhanden sein, wird der Content in der Default Sprache geladen
|
||||||
|
*
|
||||||
|
* @param integer $content_id
|
||||||
|
* @param string $sprache optional
|
||||||
|
* @param integer $version optional
|
||||||
|
* @param boolean | null $sichtbar optional
|
||||||
|
*
|
||||||
|
* @return stdClass
|
||||||
|
*/
|
||||||
|
public function getContent($content_id, $sprache=DEFAULT_LANGUAGE, $version=null, $sichtbar=null, $load_default_language=false)
|
||||||
|
{
|
||||||
|
$this->load->model('content/Contentsprache_model', 'ContentspracheModel');
|
||||||
|
$spracheExists = $this->ContentspracheModel->exists($content_id, $sprache, $version, $sichtbar);
|
||||||
|
if (isError($spracheExists))
|
||||||
|
return $spracheExists;
|
||||||
|
|
||||||
|
if(!getData($spracheExists))
|
||||||
|
{
|
||||||
|
if($load_default_language)
|
||||||
|
$sprache = DEFAULT_LANGUAGE;
|
||||||
|
else
|
||||||
|
return error('Der Content existiert in dieser Sprache nicht ');
|
||||||
|
}
|
||||||
|
|
||||||
|
$condition = ['content_id' => $content_id, 'sprache' => $sprache];
|
||||||
|
|
||||||
|
if ($sichtbar === true || $sichtbar === false)
|
||||||
|
$condition['sichtbar'] = $sichtbar;
|
||||||
|
if ($version)
|
||||||
|
$condition['version'] = $version;
|
||||||
|
|
||||||
|
$this->addSelect(['*', 'tbl_contentsprache.insertamum', 'tbl_contentsprache.insertvon', 'tbl_contentsprache.updateamum', 'tbl_contentsprache.updatevon']);
|
||||||
|
$this->addJoin('campus.tbl_contentsprache', 'content_id');
|
||||||
|
$this->addOrder('version', 'DESC');
|
||||||
|
$this->addLimit(1);
|
||||||
|
|
||||||
|
$result = $this->loadWhere($condition);
|
||||||
|
|
||||||
|
if (isError($result))
|
||||||
|
return $result;
|
||||||
|
if (!getData($result))
|
||||||
|
return error('Dieser Eintrag wurde nicht gefunden');
|
||||||
|
|
||||||
|
return success(current(getData($result)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Laedt alle Content Eintraege unterhalb eines Contents
|
||||||
|
* (Ohne Newseintraege)
|
||||||
|
*
|
||||||
|
* @param integer $root_content_id
|
||||||
|
* @param string $uid
|
||||||
|
* @param string $sprache optional
|
||||||
|
*
|
||||||
|
* @return stdClass on success an array with menu objects
|
||||||
|
*/
|
||||||
|
public function getMenu($root_content_id, $uid, $sprache=DEFAULT_LANGUAGE)
|
||||||
|
{
|
||||||
|
$sql = "
|
||||||
|
SELECT
|
||||||
|
c.content_id,
|
||||||
|
c.template_kurzbz,
|
||||||
|
s.titel,
|
||||||
|
s.content,
|
||||||
|
"./*c.oe_kurzbz,
|
||||||
|
s.sprache,
|
||||||
|
s.contentsprache_id,
|
||||||
|
s.version,
|
||||||
|
s.sichtbar,
|
||||||
|
s.reviewvon,
|
||||||
|
s.reviewamum,
|
||||||
|
s.updateamum,
|
||||||
|
s.updatevon,
|
||||||
|
s.insertamum,
|
||||||
|
s.insertvon, */"
|
||||||
|
c.menu_open,
|
||||||
|
c.aktiv,
|
||||||
|
"./*s.gesperrt_uid,
|
||||||
|
c.beschreibung,*/"
|
||||||
|
k.child_content_id,
|
||||||
|
k.sort FROM (
|
||||||
|
SELECT
|
||||||
|
c.content_id,
|
||||||
|
s.contentsprache_id
|
||||||
|
FROM
|
||||||
|
campus.tbl_content c
|
||||||
|
JOIN (SELECT s5.content_id, s5.contentsprache_id FROM (SELECT content_id, sprache, MAX(version) AS version FROM (SELECT c1.content_id, COALESCE(s1.sprache, ?) AS sprache FROM campus.tbl_content c1 LEFT JOIN campus.tbl_contentsprache s1 ON c1.content_id=s1.content_id AND s1.sprache=? WHERE sichtbar=true) s2 LEFT JOIN campus.tbl_contentsprache s3 USING(content_id, sprache) WHERE sichtbar=true GROUP BY content_id, sprache) s4 LEFT JOIN campus.tbl_contentsprache s5 USING(content_id, sprache, version) WHERE version IS NOT NULL) t USING (content_id)
|
||||||
|
JOIN
|
||||||
|
campus.tbl_contentsprache s USING (contentsprache_id)
|
||||||
|
WHERE
|
||||||
|
c.template_kurzbz<>'news'
|
||||||
|
AND
|
||||||
|
c.content_id IN (
|
||||||
|
WITH RECURSIVE childs(content_id, child_content_id) as
|
||||||
|
(
|
||||||
|
SELECT content_id, child_content_id FROM campus.tbl_contentchild
|
||||||
|
WHERE content_id=?
|
||||||
|
UNION ALL
|
||||||
|
SELECT cc.child_content_id, null FROM campus.tbl_contentchild cc, childs
|
||||||
|
WHERE cc.content_id=childs.content_id
|
||||||
|
)
|
||||||
|
SELECT content_id
|
||||||
|
FROM childs
|
||||||
|
GROUP BY content_id
|
||||||
|
)
|
||||||
|
GROUP BY c.content_id,
|
||||||
|
s.contentsprache_id
|
||||||
|
) m
|
||||||
|
JOIN
|
||||||
|
campus.tbl_content c USING(content_id)
|
||||||
|
JOIN
|
||||||
|
campus.tbl_contentsprache s USING(contentsprache_id)
|
||||||
|
LEFT JOIN
|
||||||
|
campus.tbl_contentchild k ON(m.content_id=k.content_id)
|
||||||
|
ORDER BY content_id, sort";
|
||||||
|
|
||||||
|
#DEFAULT_LANGUAGE, $sprache, $root_content_id
|
||||||
|
$result = $this->execQuery($sql, [DEFAULT_LANGUAGE, $sprache, $root_content_id]);
|
||||||
|
|
||||||
|
if (isError($result))
|
||||||
|
return $result;
|
||||||
|
|
||||||
|
$contents = getData($result) ?? [];
|
||||||
|
$result = [];
|
||||||
|
foreach ($contents as $content) {
|
||||||
|
if (!isset($result[$content->content_id])) {
|
||||||
|
$result[$content->content_id] = clone($content);
|
||||||
|
unset($result[$content->content_id]->child_content_id);
|
||||||
|
unset($result[$content->content_id]->sort);
|
||||||
|
$result[$content->content_id]->childs = [];
|
||||||
|
}
|
||||||
|
if ($content->child_content_id !== null)
|
||||||
|
$result[$content->content_id]->childs[] = $content->child_content_id;
|
||||||
|
}
|
||||||
|
foreach ($result as $content) {
|
||||||
|
foreach ($content->childs as $k => $v) {
|
||||||
|
if (isset($result[$v])) {
|
||||||
|
$content->childs[$k] = $result[$v];
|
||||||
|
} else {
|
||||||
|
unset($content->childs[$k]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return success($result[$root_content_id]);
|
||||||
|
|
||||||
|
# !LOCKED ||
|
||||||
|
$berechtigt = "SELECT
|
||||||
|
1
|
||||||
|
FROM
|
||||||
|
campus.tbl_contentgruppe
|
||||||
|
JOIN public.vw_gruppen USING(gruppe_kurzbz)
|
||||||
|
WHERE
|
||||||
|
(tbl_contentgruppe.content_id=$content_id
|
||||||
|
OR NOT EXISTS (SELECT 1 FROM campus.tbl_contentgruppe WHERE content_id=$content_id))
|
||||||
|
AND vw_gruppen.uid=$uid";
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,4 +11,50 @@ class Contentgruppe_model extends DB_Model
|
|||||||
$this->dbTable = 'campus.tbl_contentgruppe';
|
$this->dbTable = 'campus.tbl_contentgruppe';
|
||||||
$this->pk = array('gruppe_kurzbz', 'content_id');
|
$this->pk = array('gruppe_kurzbz', 'content_id');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prueft ob der Zugriff auf den Content eingeschraenkt ist auf
|
||||||
|
* eine bestimmte Benutzergruppe
|
||||||
|
*
|
||||||
|
* @param int $content_id
|
||||||
|
*
|
||||||
|
* @return stdClass success(true) wenn eingeschraenkt sonst success(false)
|
||||||
|
*/
|
||||||
|
public function islocked($content_id)
|
||||||
|
{
|
||||||
|
$islocked = $this->loadWhere(['content_id' => $content_id]);
|
||||||
|
|
||||||
|
if (isError($islocked))
|
||||||
|
return $islocked;
|
||||||
|
return success(!!getData($islocked));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prueft ob ein User die Berechtigung fuer das Anzeigen des
|
||||||
|
* Contents besitzt
|
||||||
|
*
|
||||||
|
* @param int $content_id ID des Contents
|
||||||
|
* @param string $uid User der versucht auf den Content zuzugreifen
|
||||||
|
*
|
||||||
|
* @return stdClass
|
||||||
|
*/
|
||||||
|
public function berechtigt($content_id, $uid)
|
||||||
|
{
|
||||||
|
$islocked = $this->islocked($content_id);
|
||||||
|
if (isError($islocked))
|
||||||
|
return $islocked;
|
||||||
|
|
||||||
|
$condition = ['uid' => $uid];
|
||||||
|
if (getData($islocked)) {
|
||||||
|
$condition['content_id'] = $content_id;
|
||||||
|
}
|
||||||
|
$this->addJoin('public.vw_gruppen', 'gruppe_kurzbz');
|
||||||
|
|
||||||
|
$result = $this->loadWhere($condition);
|
||||||
|
|
||||||
|
if (isError($result))
|
||||||
|
return $result;
|
||||||
|
return success(!!getData($result));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,4 +11,32 @@ class Contentsprache_model extends DB_Model
|
|||||||
$this->dbTable = 'campus.tbl_contentsprache';
|
$this->dbTable = 'campus.tbl_contentsprache';
|
||||||
$this->pk = 'contentsprache_id';
|
$this->pk = 'contentsprache_id';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prueft ob der Content in der angegeben Sprache vorhanden ist
|
||||||
|
*
|
||||||
|
* @param int $content_id
|
||||||
|
* @param string $sprache
|
||||||
|
* @param int | null $version (optional)
|
||||||
|
* @param boolean | null $sichtbar (optional)
|
||||||
|
* @return stdClass
|
||||||
|
*/
|
||||||
|
public function exists($content_id, $sprache, $version=null, $sichtbar=null)
|
||||||
|
{
|
||||||
|
$condition = ['content_id' => $content_id, 'sprache' => $sprache];
|
||||||
|
|
||||||
|
if ($version)
|
||||||
|
$condition['version'] = $version;
|
||||||
|
|
||||||
|
if ($sichtbar !== null)
|
||||||
|
$condition['sichtbar'] = $sichtbar;
|
||||||
|
|
||||||
|
$result = $this->loadWhere($condition);
|
||||||
|
|
||||||
|
if (isError($result))
|
||||||
|
return $result;
|
||||||
|
|
||||||
|
return success(!!getData($result));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
$includesArray = array(
|
||||||
|
'customJSModules' => ['public/js/apps/Dashboard/Fhc.js'],
|
||||||
|
'customCSSs' => [
|
||||||
|
'public/css/components/dashboard.css'
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->load->view('templates/CIS-Header', $includesArray);
|
||||||
|
?>
|
||||||
|
|
||||||
|
<div id="content">
|
||||||
|
<fhc-dashboard dashboard="CIS"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php $this->load->view('templates/CIS-Footer', $includesArray); ?>
|
||||||
|
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
<?php
|
||||||
|
$includesArray = array(
|
||||||
|
'title' => 'FH-Complete',
|
||||||
|
'bootstrap5' => true,
|
||||||
|
'fontawesome6' => true,
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->load->view('templates/FHC-Header', $includesArray);
|
||||||
|
?>
|
||||||
|
|
||||||
|
<div id="wrapper">
|
||||||
|
<div class="alert alert-primary" role="alert">
|
||||||
|
<?= $error; ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php $this->load->view('templates/FHC-Footer', $includesArray); ?>
|
||||||
|
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
$includesArray = array(
|
||||||
|
'customCSSs' => [
|
||||||
|
'public/css/Cis4/Cms.css',
|
||||||
|
#'skin/style.css.php'
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->load->view('templates/CIS-Header', $includesArray);
|
||||||
|
?>
|
||||||
|
|
||||||
|
<div id="cms">
|
||||||
|
<?= $content; ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php $this->load->view('templates/CIS-Footer', $includesArray); ?>
|
||||||
|
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
$includesArray = array(
|
||||||
|
'title' => $title ?? 'FH-Complete',
|
||||||
|
'vue3' => true,
|
||||||
|
'bootstrap5' => true,
|
||||||
|
'fontawesome6' => true,
|
||||||
|
'axios027' => true,
|
||||||
|
'customJSModules' => array_merge([
|
||||||
|
'public/js/apps/Cis.js'
|
||||||
|
], $customJSModules ?? []),
|
||||||
|
'customCSSs' => array_merge([
|
||||||
|
'public/css/Cis4/Cis.css'
|
||||||
|
], $customCSSs ?? [])
|
||||||
|
);
|
||||||
|
?>
|
||||||
|
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php $this->load->view('templates/FHC-Footer', $includesArray); ?>
|
||||||
@@ -0,0 +1,161 @@
|
|||||||
|
<?php
|
||||||
|
$includesArray = array(
|
||||||
|
'title' => $title ?? 'FH-Complete',
|
||||||
|
'vue3' => true,
|
||||||
|
'bootstrap5' => true,
|
||||||
|
'fontawesome6' => true,
|
||||||
|
'axios027' => true,
|
||||||
|
'customJSModules' => array_merge([
|
||||||
|
'public/js/apps/Cis.js'
|
||||||
|
], $customJSModules ?? []),
|
||||||
|
'customCSSs' => array_merge([
|
||||||
|
'public/css/Cis4/Cis.css'
|
||||||
|
], $customCSSs ?? [])
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->load->view('templates/FHC-Header', $includesArray);
|
||||||
|
|
||||||
|
|
||||||
|
$ci =& get_instance(); // get CI instance
|
||||||
|
$ci->load->model('content/Content_model', 'ContentModel');
|
||||||
|
$result = $ci->ContentModel->getMenu(6739, null);
|
||||||
|
$menu = getData($result) ?? (object)['childs' => []];
|
||||||
|
|
||||||
|
?>
|
||||||
|
|
||||||
|
<div id="cis4">
|
||||||
|
<header>
|
||||||
|
<div id="cis-navigation-top" class="navbar navbar-expand-lg fixed-top navbar-dark bg-primary p-0">
|
||||||
|
<button class="navbar-toggler border-0" type="button" data-bs-toggle="offcanvas" data-bs-target="#cis-navigation-top-offcanvas">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
<a class="navbar-brand col-auto col-lg-2 px-3 py-0 m-0" href="<?= site_url('cis'); ?>">
|
||||||
|
<img src="<?= base_url('/public/images/logo-300x160.png'); ?>" width="90">
|
||||||
|
</a>
|
||||||
|
<div id="cis-navigation-top-offcanvas" class="offcanvas offcanvas-start align-items-stretch mt-lg-0 w-100 px-3 px-lg-0 d-flex flex-column flex-lg-row bg-dark border-0 pt-3 pt-lg-0" tabindex="-1" data-bs-backdrop="false">
|
||||||
|
<fhc-searchbar class="fhc-searchbar w-100" :searchoptions="{types:[],actions:{}}" :searchfunction="search"></fhc-searchbar>
|
||||||
|
<ul class="navbar-nav flex-grow-1">
|
||||||
|
<!-- TODO(chris): foreach menu -->
|
||||||
|
<li class="nav-item d-lg-none">
|
||||||
|
<a class="nav-link" href="#">Mein CIS</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item d-lg-none">
|
||||||
|
<a class="nav-link" href="#">FHTW Campus</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item d-lg-none">
|
||||||
|
<a class="nav-link" href="#">FHTW Services</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item d-lg-none">
|
||||||
|
<a class="nav-link" href="<?= site_url('cis/cms/content/10012'); ?>">COVID 19</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<div class="dropdown pe-lg-3">
|
||||||
|
<a class="nav-link" href="#" id="dropdown01" data-bs-toggle="dropdown" data-bs-reference="parent" aria-expanded="false">
|
||||||
|
<img src="<?= base_url('/cis/public/bild.php?src=person&person_id=' . getAuthPersonId()); ?>" class="avatar rounded-circle" width="45" height="45"/>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu dropdown-menu-dark dropdown-menu-end m-0" aria-labelledby="dropdown01">
|
||||||
|
<!-- TODO(chris): foreach menu -->
|
||||||
|
<li><a class="dropdown-item" href="#" id="menu-profil">Profil</a></li>
|
||||||
|
<li><a class="dropdown-item" href="#">Ampeln</a></li>
|
||||||
|
<li><hr class="dropdown-divider"></li>
|
||||||
|
<li><a class="dropdown-item" href="#">Logout</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="container-fluid px-0 flex-grow-1 row mx-0">
|
||||||
|
<nav id="cis-navigation-left" class="d-none d-lg-block position-sticky col-lg-2 px-0 bg-secondary">
|
||||||
|
<div class="btn btn-dark text-muted rounded-0 w-100 text-start"><small>MAIN MENU</small></div>
|
||||||
|
<?php foreach($menu->childs as $entry)
|
||||||
|
$this->load->view('templates/CIS-Menu/Entry', ['entry' => $entry, 'menu_id' => 'menu']);
|
||||||
|
?>
|
||||||
|
</nav>
|
||||||
|
<!--nav class="list-group list-group-flush d-none d-lg-block position-sticky col-lg-2 px-0">
|
||||||
|
< !-- Separator with title -- >
|
||||||
|
<div class="list-group-item sidebar-separator-title text-muted d-flex align-items-center menu-collapsed">
|
||||||
|
<small>MAIN MENU</small>
|
||||||
|
</div>
|
||||||
|
< !-- /end Separator -- >
|
||||||
|
<a href="#submenu1" data-bs-toggle="collapse" aria-expanded="true" class="bg-primary text-white list-group-item list-group-item-action flex-column align-items-start">
|
||||||
|
<div class="d-flex w-100 justify-content-start align-items-center">
|
||||||
|
<i class="fa fa-user fa-fw me-3"></i>
|
||||||
|
<span class="menu-collapsed">Mein CIS</span>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
<div id='submenu1' class="collapse show sidebar-submenu">
|
||||||
|
<a href="#" class="list-group-item list-group-item-action list-group-item-dark active" id="menu-mein-bereich">
|
||||||
|
<span class="menu-collapsed">Mein Bereich</span>
|
||||||
|
</a>
|
||||||
|
<a href="#" class="list-group-item list-group-item-action list-group-item-dark">
|
||||||
|
<span class="menu-collapsed">Studium</span>
|
||||||
|
</a>
|
||||||
|
<a href="#" class="list-group-item list-group-item-action list-group-item-dark" id="menu-lvplan">
|
||||||
|
<span class="menu-collapsed">LV Plan</span>
|
||||||
|
</a>
|
||||||
|
<a href="#" class="list-group-item list-group-item-action list-group-item-dark">
|
||||||
|
<span class="menu-collapsed">Campus Life</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<a href="#submenu2" data-bs-toggle="collapse" aria-expanded="false" class="bg-primary text-white list-group-item list-group-item-action flex-column align-items-start">
|
||||||
|
<div class="d-flex w-100 justify-content-start align-items-center">
|
||||||
|
<i class="fa fa-user fa-fw me-3"></i>
|
||||||
|
<span class="menu-collapsed">FHTW Hochschule</span>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
<div id='submenu2' class="collapse sidebar-submenu">
|
||||||
|
<a href="#" class="list-group-item list-group-item-action list-group-item-dark" id="menu-organisation">
|
||||||
|
<span class="menu-collapsed">Organisation</span>
|
||||||
|
</a>
|
||||||
|
<a href="#" class="list-group-item list-group-item-action list-group-item-dark">
|
||||||
|
<span class="menu-collapsed">Studiengänge</span>
|
||||||
|
</a>
|
||||||
|
<a href="#" class="list-group-item list-group-item-action list-group-item-dark">
|
||||||
|
<span class="menu-collapsed">Forschung & Entwicklung</span>
|
||||||
|
</a>
|
||||||
|
<a href="#" class="list-group-item list-group-item-action list-group-item-dark">
|
||||||
|
<span class="menu-collapsed">Technikum Wien Acadamy</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<a href="#submenu3" data-bs-toggle="collapse" aria-expanded="false" class="bg-primary text-white list-group-item flex-column align-items-start">
|
||||||
|
<div class="d-flex w-100 justify-content-start align-items-center">
|
||||||
|
<i class="fa fa-user fa-fw me-3"></i>
|
||||||
|
<span class="menu-collapsed">FHTW Services</span>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
<div id='submenu3' class="collapse sidebar-submenu">
|
||||||
|
<a href="#" class="list-group-item list-group-item-action list-group-item-dark">
|
||||||
|
<span class="menu-collapsed">Teaching & Learning Center</span>
|
||||||
|
</a>
|
||||||
|
<a href="#" class="list-group-item list-group-item-action list-group-item-dark">
|
||||||
|
<span class="menu-collapsed">International Office</span>
|
||||||
|
</a>
|
||||||
|
<a href="#" class="list-group-item list-group-item-action list-group-item-dark">
|
||||||
|
<span class="menu-collapsed">Bibliothek</span>
|
||||||
|
</a>
|
||||||
|
<a href="#" class="list-group-item list-group-item-action list-group-item-dark">
|
||||||
|
<span class="menu-collapsed">IT-Services</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<a href="#submenu4" data-bs-toggle="collapse" aria-expanded="false" class="bg-primary text-white list-group-item flex-column align-items-start">
|
||||||
|
<div class="d-flex w-100 justify-content-start align-items-center">
|
||||||
|
<i class="fa fa-user fa-fw me-3"></i>
|
||||||
|
<span class="menu-collapsed">Links & Downloads</span>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
<div class="list-group-item sidebar-separator-title text-muted d-flex align-items-center menu-collapsed">
|
||||||
|
<small>AKTUELL</small>
|
||||||
|
</div>
|
||||||
|
<a href="<?= site_url('cis/cms/content/10012'); ?>" class="bg-primary text-white list-group-item">
|
||||||
|
<div class="d-flex w-100 justify-content-start align-items-center">
|
||||||
|
<i class="fa fa-medkit fa-fw me-3"></i>
|
||||||
|
<span class="menu-collapsed">COVID 19</span>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
<div class="list-group-item sidebar-separator menu-collapsed"></div>
|
||||||
|
</ul>
|
||||||
|
</nav-->
|
||||||
|
<main class="ms-sm-auto col-lg-10 px-md-4 p-4 overflow-hidden">
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
<?php
|
||||||
|
$menu_id .= '-' . $entry->content_id;
|
||||||
|
|
||||||
|
switch ($entry->template_kurzbz) {
|
||||||
|
case 'redirect': {
|
||||||
|
$url = '';
|
||||||
|
$target = '';
|
||||||
|
$xml = new DOMDocument();
|
||||||
|
if($entry->content!='')
|
||||||
|
{
|
||||||
|
$xml->loadXML($entry->content);
|
||||||
|
if ($xml->getElementsByTagName('url')->item(0))
|
||||||
|
$url = $xml->getElementsByTagName('url')->item(0)->nodeValue;
|
||||||
|
// TODO(chris): get params
|
||||||
|
if (isset($params) && is_array($params))
|
||||||
|
foreach ($params as $key=>$value)
|
||||||
|
$url = str_replace('$' . $key, addslashes($value), $url);
|
||||||
|
if ($xml->getElementsByTagName('target')->item(0))
|
||||||
|
$target = $xml->getElementsByTagName('target')->item(0)->nodeValue;
|
||||||
|
|
||||||
|
if (strpos($url, '../') === 0)
|
||||||
|
$url = APP_ROOT . substr($url, 3);
|
||||||
|
}
|
||||||
|
if ($target == 'content')
|
||||||
|
$target = '';
|
||||||
|
|
||||||
|
$this->load->view('templates/CIS-Menu/EntryBase', ['entry' => $entry, 'menu_id' => $menu_id, 'link' => $url, 'target' => $target]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'include': {
|
||||||
|
$this->load->view('templates/CIS-Menu/EntryInclude', ['entry' => $entry, 'menu_id' => $menu_id . '-' . $entry->content_id]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
$this->load->view('templates/CIS-Menu/EntryBase', ['entry' => $entry, 'menu_id' => $menu_id, 'link' => APP_ROOT . 'index.ci.php/cis/cms/content/' . $entry->content_id]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
<?php if ($entry->childs) { ?>
|
||||||
|
<?php if (substr($link, 0, 1) == '#') { ?>
|
||||||
|
<a href="#<?= $menu_id; ?>" data-bs-toggle="collapse" aria-expanded="<?= $entry->menu_open ? 'true' : 'false'; ?>" class="btn btn-default rounded-0 w-100 text-start dropdown-toggle btn-level-<?= substr_count($menu_id, '-'); ?><?= $entry->menu_open ? '' : ' collapsed'; ?>">
|
||||||
|
<span><?= htmlspecialchars($entry->titel); ?></span>
|
||||||
|
</a>
|
||||||
|
<?php } else { ?>
|
||||||
|
<div class="btn-group w-100">
|
||||||
|
<a<?= $link ? ' href="' . $link . '"' : ''; ?><?= $target ? ' target="' . $target . '"' : ''; ?> class="btn btn-default rounded-0 text-start btn-level-<?= substr_count($menu_id, '-'); ?>">
|
||||||
|
<?= htmlspecialchars($entry->titel); ?>
|
||||||
|
</a>
|
||||||
|
<a href="#<?= $menu_id; ?>" data-bs-toggle="collapse" aria-expanded="<?= $entry->menu_open ? 'true' : 'false'; ?>"class="btn btn-default rounded-0 dropdown-toggle dropdown-toggle-split flex-grow-0<?= $entry->menu_open ? '' : ' collapsed'; ?>" >
|
||||||
|
<span class="visually-hidden">Toggle Dropdown</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<?php } ?>
|
||||||
|
<ul id="<?= $menu_id; ?>" class="nav w-100 collapse<?= $entry->menu_open ? ' show' : ''; ?>">
|
||||||
|
<?php foreach ($entry->childs as $child)
|
||||||
|
$this->load->view('templates/CIS-Menu/Entry', ['entry' => $child, 'menu_id' => $menu_id]);
|
||||||
|
?>
|
||||||
|
</ul>
|
||||||
|
<?php } else { ?>
|
||||||
|
<a<?= $link ? ' href="' . $link . '"' : ''; ?><?= $target ? ' target="' . $target . '"' : ''; ?> class="btn btn-default rounded-0 w-100 text-start btn-level-<?= substr_count($menu_id, '-'); ?>">
|
||||||
|
<?= htmlspecialchars($entry->titel); ?>
|
||||||
|
</a>
|
||||||
|
<?php } ?>
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
<div>
|
||||||
|
INCLUDE
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,117 @@
|
|||||||
|
@import '../components/searchbar.css';
|
||||||
|
|
||||||
|
#cis-navigation-top .fhc-searchbar > .input-group {
|
||||||
|
margin: 0!important;
|
||||||
|
}
|
||||||
|
#cis-navigation-top .fhc-searchbar > .input-group > * {
|
||||||
|
border-radius: 0!important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.avatar {
|
||||||
|
object-fit: cover;
|
||||||
|
height: 45px;
|
||||||
|
width: 45px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cis4 {
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
#cis4 > header {
|
||||||
|
height: 48px;
|
||||||
|
}
|
||||||
|
/*body {
|
||||||
|
padding-top: 48px;
|
||||||
|
}*/
|
||||||
|
#cis-navigation-top.navbar-expand-lg .offcanvas {
|
||||||
|
margin-top: 48px;
|
||||||
|
}
|
||||||
|
@media (min-width: 992px) {
|
||||||
|
#cis4 > header {
|
||||||
|
height: 61px;
|
||||||
|
}
|
||||||
|
/*body {
|
||||||
|
padding-top: 61px;
|
||||||
|
}*/
|
||||||
|
#cis-navigation-top.navbar-expand-lg .offcanvas {
|
||||||
|
background-color: transparent!important;
|
||||||
|
position: initial;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#cis-navigation-left {
|
||||||
|
--fhc-menu-level-1-bg: #0d6efd;
|
||||||
|
--fhc-menu-level-1-color: #fff;
|
||||||
|
--fhc-menu-level-1-border: #0d6efd;
|
||||||
|
--fhc-menu-level-1-hover-bg: #0b5ed7;
|
||||||
|
--fhc-menu-level-1-hover-color: #fff;
|
||||||
|
--fhc-menu-level-1-hover-border: #0a58ca;
|
||||||
|
--fhc-menu-level-2-bg: #6c757d;
|
||||||
|
--fhc-menu-level-2-color: #fff;
|
||||||
|
--fhc-menu-level-2-border: #6c757d;
|
||||||
|
--fhc-menu-level-2-hover-bg: #5c636a;
|
||||||
|
--fhc-menu-level-2-hover-color: #fff;
|
||||||
|
--fhc-menu-level-2-hover-border: #565e64;
|
||||||
|
--fhc-menu-level-3-bg: #212529;
|
||||||
|
--fhc-menu-level-3-color: #fff;
|
||||||
|
--fhc-menu-level-3-border: #212529;
|
||||||
|
--fhc-menu-level-3-hover-bg: #1c1f23;
|
||||||
|
--fhc-menu-level-3-hover-color: #fff;
|
||||||
|
--fhc-menu-level-3-hover-border: #1a1e21;
|
||||||
|
}
|
||||||
|
#cis-navigation-left .btn-level-1,
|
||||||
|
#cis-navigation-left .btn-level-1 + .btn {
|
||||||
|
color: var(--fhc-menu-level-1-color);
|
||||||
|
border-color: var(--fhc-menu-level-1-border);
|
||||||
|
background-color: var(--fhc-menu-level-1-bg);
|
||||||
|
}
|
||||||
|
#cis-navigation-left .btn-level-1:hover,
|
||||||
|
#cis-navigation-left .btn-level-1:focus,
|
||||||
|
#cis-navigation-left .btn-level-1 + .btn:hover,
|
||||||
|
#cis-navigation-left .btn-level-1 + .btn:focus {
|
||||||
|
color: var(--fhc-menu-level-1-hover-color);
|
||||||
|
border-color: var(--fhc-menu-level-1-hover-border);
|
||||||
|
background-color: var(--fhc-menu-level-1-hover-bg);
|
||||||
|
}
|
||||||
|
#cis-navigation-left .btn-level-2,
|
||||||
|
#cis-navigation-left .btn-level-2 + .btn {
|
||||||
|
color: var(--fhc-menu-level-2-color);
|
||||||
|
border-color: var(--fhc-menu-level-2-border);
|
||||||
|
background-color: var(--fhc-menu-level-2-bg);
|
||||||
|
}
|
||||||
|
#cis-navigation-left .btn-level-2:hover,
|
||||||
|
#cis-navigation-left .btn-level-2:focus,
|
||||||
|
#cis-navigation-left .btn-level-2 + .btn:hover,
|
||||||
|
#cis-navigation-left .btn-level-2 + .btn:focus {
|
||||||
|
color: var(--fhc-menu-level-2-hover-color);
|
||||||
|
border-color: var(--fhc-menu-level-2-hover-border);
|
||||||
|
background-color: var(--fhc-menu-level-2-hover-bg);
|
||||||
|
}
|
||||||
|
#cis-navigation-left .btn-level-3,
|
||||||
|
#cis-navigation-left .btn-level-3 + .btn {
|
||||||
|
color: var(--fhc-menu-level-3-color);
|
||||||
|
border-color: var(--fhc-menu-level-3-border);
|
||||||
|
background-color: var(--fhc-menu-level-3-bg);
|
||||||
|
}
|
||||||
|
#cis-navigation-left .btn-level-3:hover,
|
||||||
|
#cis-navigation-left .btn-level-3:focus,
|
||||||
|
#cis-navigation-left .btn-level-3 + .btn:hover,
|
||||||
|
#cis-navigation-left .btn-level-3 + .btn:focus {
|
||||||
|
color: var(--fhc-menu-level-3-hover-color);
|
||||||
|
border-color: var(--fhc-menu-level-3-hover-border);
|
||||||
|
background-color: var(--fhc-menu-level-3-hover-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
#cis-navigation-left .btn.dropdown-toggle {
|
||||||
|
padding-right: .5625rem;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
#cis-navigation-left .dropdown-toggle:after {
|
||||||
|
transition: all .2s ease-in-out;
|
||||||
|
}
|
||||||
|
#cis-navigation-left .dropdown-toggle.collapsed:after {
|
||||||
|
transform: rotate(-90deg);
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,7 @@
|
|||||||
|
import FhcSearchbar from "../components/searchbar/searchbar.js";
|
||||||
|
|
||||||
|
Vue.createApp({
|
||||||
|
components: {
|
||||||
|
FhcSearchbar
|
||||||
|
}
|
||||||
|
}).mount('#cis-navigation-top');
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
import {CoreNavigationCmpt} from '../../components/navigation/Navigation.js';
|
||||||
|
import DashboardAdmin from '../../components/Dashboard/Admin.js';
|
||||||
|
|
||||||
|
Vue.createApp({
|
||||||
|
data: () => ({
|
||||||
|
appSideMenuEntries: {}
|
||||||
|
}),
|
||||||
|
components: {
|
||||||
|
CoreNavigationCmpt,
|
||||||
|
DashboardAdmin
|
||||||
|
}
|
||||||
|
}).mount('#main');
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
import FhcDashboard from '../../components/Dashboard/Dashboard.js';
|
||||||
|
|
||||||
|
Vue.createApp({
|
||||||
|
data: () => ({
|
||||||
|
appSideMenuEntries: {}
|
||||||
|
}),
|
||||||
|
components: {
|
||||||
|
FhcDashboard
|
||||||
|
}
|
||||||
|
}).mount('#content');
|
||||||
@@ -350,6 +350,8 @@ $tabellen=array(
|
|||||||
"wawi.tbl_aufteilung_default" => array("aufteilung_id","kostenstelle_id","oe_kurzbz","anteil","insertamum","insertvon","updateamum","updatevon"),
|
"wawi.tbl_aufteilung_default" => array("aufteilung_id","kostenstelle_id","oe_kurzbz","anteil","insertamum","insertvon","updateamum","updatevon"),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
require_once('dbupdate_3.4/25999_cis4_cms.php');
|
||||||
|
|
||||||
$tabs=array_keys($tabellen);
|
$tabs=array_keys($tabellen);
|
||||||
//print_r($tabs);
|
//print_r($tabs);
|
||||||
$i=0;
|
$i=0;
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
if (! defined('DB_NAME')) exit('No direct script access allowed');
|
||||||
|
|
||||||
|
// Add index to system.tbl_log
|
||||||
|
if(!$result = @$db->db_query("SELECT xslt_xhtml_c4 FROM campus.tbl_template LIMIT 1"))
|
||||||
|
{
|
||||||
|
$qry = "ALTER TABLE campus.tbl_template ADD COLUMN xslt_xhtml_c4 xml;";
|
||||||
|
|
||||||
|
if(!$db->db_query($qry))
|
||||||
|
echo '<strong>campus.tbl_template: '.$db->db_last_error().'</strong><br>';
|
||||||
|
else
|
||||||
|
echo '<br>campus.tbl_template: Spalte xslt_xhtml_c4 hinzugefuegt';
|
||||||
|
|
||||||
|
// TODO(chris): add default values
|
||||||
|
}
|
||||||
|
|
||||||
|
$tabellen['campus.tbl_template'][] = 'xslt_xhtml_c4';
|
||||||
Reference in New Issue
Block a user