Skip to content
Snippets Groups Projects
Select Git revision
  • b458ae3a370e2e9eaa8dc0a203723d3f0fe2d8ca
  • main default protected
  • studip-rector
  • ci-opt
  • course-members-export-as-word
  • data-vue-app
  • pipeline-improvements
  • webpack-optimizations
  • rector
  • icon-renewal
  • http-client-and-factories
  • jsonapi-atomic-operations
  • vueify-messages
  • tic-2341
  • 135-translatable-study-areas
  • extensible-sorm-action-parameters
  • sorm-configuration-trait
  • jsonapi-mvv-routes
  • docblocks-for-magic-methods
19 results

ExternModuleTemplatePersondetails.class.php

Blame
  • Forked from Stud.IP / Stud.IP
    Source project has a limited visibility.
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    ExternModuleTemplatePersondetails.class.php 41.91 KiB
    <?
    # Lifter002: TODO
    # Lifter007: TODO
    # Lifter010: TODO
    /**
    * ExternModuleTemplatePersondetails.class.php
    *
    *
    *
    *
    * @author       Peter Thienel <thienel@data-quest.de>, Suchi & Berg GmbH <info@data-quest.de>
    * @access       public
    * @modulegroup  extern
    * @module       ExternModuleTemplatePersondetails
    * @package  studip_extern
    */
    
    // +---------------------------------------------------------------------------+
    // This file is part of Stud.IP
    // ExternModuleTemplatePersondetails.class.php
    //
    // Copyright (C) 2007 Peter Thienel <pthienel@web.de>,
    // Suchi & Berg GmbH <info@data-quest.de>
    // +---------------------------------------------------------------------------+
    // 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 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.
    // +---------------------------------------------------------------------------+
    
    
    require_once 'lib/user_visible.inc.php';
    require_once 'lib/statusgruppe.inc.php';
    require_once 'lib/dates.inc.php';
    require_once 'lib/extern/views/extern_html_templates.inc.php';
    
    class ExternModuleTemplatePersondetails extends ExternModule {
    
        public $markers = [];
        private $user_id;
        private $user_perm;
        private $visibilities;
    
        /**
        *
        */
        public function __construct ($range_id, $module_name, $config_id = NULL, $set_config = NULL, $global_id = NULL) {
            $this->data_fields = [];
            if (Config::get()->CALENDAR_ENABLE) {
                $this->registered_elements = [
                    'PersondetailsLectures' => 'PersondetailsLecturesTemplate',
                    'LinkInternLecturedetails' => 'LinkInternTemplate',
                    'TemplateMain' => 'TemplateGeneric',
                    'TemplateLectures' => 'TemplateGeneric',
                    'TemplateNews' => 'TemplateGeneric',
                    'TemplateAppointments' => 'TemplateGeneric',
                    'TemplateOwnCategories' => 'TemplateGeneric'
                ];
            } else {
                $this->registered_elements = [
                    'PersondetailsLectures' => 'PersondetailsLecturesTemplate',
                    'LinkInternLecturedetails' => 'LinkInternTemplate',
                    'TemplateMain' => 'TemplateGeneric',
                    'TemplateLectures' => 'TemplateGeneric',
                    'TemplateNews' => 'TemplateGeneric',
                    'TemplateOwnCategories' => 'TemplateGeneric'
                ];
            }
            if (in_array(get_object_type($range_id), ['global'])) {
                array_unshift($this->registered_elements, 'SelectInstitutes');
            }
            $this->field_names = [];
            $this->args = ['username', 'seminar_id', 'group_id'];
    
            parent::__construct($range_id, $module_name, $config_id, $set_config, $global_id);
    
        }
    
        public function setup () {
    
            // setup module properties
            $this->elements['LinkInternLecturedetails']->real_name = _("Link zum Modul Veranstaltungsdetails");
            $this->elements['LinkInternLecturedetails']->link_module_type = [4, 13];
            $this->elements['PersondetailsLectures']->real_name = _("Einstellungen für Lehrveranstaltungen");
            $this->elements['TemplateMain']->real_name = _("Haupttemplate");
            $this->elements['TemplateLectures']->real_name = _("Template für Lehrveranstaltungen");
            $this->elements['TemplateNews']->real_name = _("Template für News");
            if (Config::get()->CALENDAR_ENABLE) {
                $this->elements['TemplateAppointments']->real_name = _("Template für Termine");
            }
            $this->elements['TemplateOwnCategories']->real_name = _("Template für eigene Kategorien");
            if (in_array(get_object_type($this->config->range_id), ['global'])) {
                $this->elements['SelectInstitutes']->real_name = _("Einschränkung auf Institute/Einrichtungen");
            }
        }
    
        public function toStringEdit ($open_elements = '', $post_vars = '',
                $faulty_values = '', $anker = '') {
    
            $this->updateGenericDatafields('TemplateMain', 'user');
            $this->updateGenericDatafields('TemplateMain', 'userinstrole');
            $this->elements['TemplateMain']->markers = $this->getMarkerDescription('TemplateMain');
            $this->elements['TemplateLectures']->markers = $this->getMarkerDescription('TemplateLectures');
            if (Config::get()->CALENDAR_ENABLE) {
                $this->elements['TemplateAppointments']->markers = $this->getMarkerDescription('TemplateAppointments');
            }
            $this->elements['TemplateNews']->markers = $this->getMarkerDescription('TemplateNews');
            $this->elements['TemplateOwnCategories']->markers = $this->getMarkerDescription('TemplateOwnCategories');
    
            return parent::toStringEdit($open_elements, $post_vars, $faulty_values, $anker);
    
        }
    
        public function getMarkerDescription ($element_name) {
            $markers['TemplateMain'][] = ['__GLOBAL__', _("Globale Variablen (gültig im gesamten Template).")];
            $markers['TemplateMain'][] = ['###STUDIP-EDIT-HREF###', ''];
    
            $markers['TemplateMain'][] = ['<!-- BEGIN PERSONDETAILS -->', ''];
            $markers['TemplateMain'][] = ['###FULLNAME###', ''];
            $markers['TemplateMain'][] = ['###LASTNAME###', ''];
            $markers['TemplateMain'][] = ['###FIRSTNAME###', ''];
            $markers['TemplateMain'][] = ['###TITLEFRONT###', ''];
            $markers['TemplateMain'][] = ['###TITLEREAR###', ''];
            $markers['TemplateMain'][] = ['###USERNAME###', ''];
            $markers['TemplateMain'][] = ['###STATUSGROUPS###', _("Kommaseparierte Liste mit Statusgruppen")];
            $markers['TemplateMain'][] = ['###IMAGE-HREF###', ''];
            $markers['TemplateMain'][] = ['###INST-NAME###', ''];
            $markers['TemplateMain'][] = ['###INST-HREF###', ''];
            $markers['TemplateMain'][] = ['###STREET###', ''];
            $markers['TemplateMain'][] = ['###ZIPCODE###', ''];
            $markers['TemplateMain'][] = ['###EMAIL###', ''];
            $markers['TemplateMain'][] = ['###EMAIL-LOCAL###', _("Der local-part der E-Mail-Adresse (vor dem @-Zeichen)")];
            $markers['TemplateMain'][] = ['###EMAIL-DOMAIN###', _("Der domain-part der E-Mail-Adresse (nach dem @-Zeichen)")];
            $markers['TemplateMain'][] = ['###ROOM###', ''];
            $markers['TemplateMain'][] = ['###PHONE###', ''];
            $markers['TemplateMain'][] = ['###FAX###', ''];
            $markers['TemplateMain'][] = ['###HOMEPAGE-HREF###', ''];
            $markers['TemplateMain'][] = ['###OFFICE-HOURS###', ''];
            $markers['TemplateMain'][] = ['###RESEARCH-INTERESTS###', ''];
            $markers['TemplateMain'][] = ['###CV###', _("Lebenslauf")];
            $markers['TemplateMain'][] = ['###PUBLICATIONS###', ''];
            $markers['TemplateMain'][] = ['###OFFICE-HOURS###', ''];
    
            $markers['TemplateMain'][] = ['<!-- BEGIN ALL-INST -->', ''];
            $markers['TemplateMain'][] = ['<!-- BEGIN SINGLE-INST -->', ''];
            $markers['TemplateMain'][] = ['###SINGLE-INST-NAME###', ''];
            $markers['TemplateMain'][] = ['###SINGLE-INST-HREF###', ''];
            $markers['TemplateMain'][] = ['###SINGLE-INST-STREET###', ''];
            $markers['TemplateMain'][] = ['###SINGLE-INST-ZIPCODE###', ''];
            $markers['TemplateMain'][] = ['###SINGLE-INST-EMAIL###', ''];
            $markers['TemplateMain'][] = ['###SINGLE-INST-EMAIL-LOCAL###', _("Der local-part der E-Mail-Adresse (vor dem @-Zeichen)")];
            $markers['TemplateMain'][] = ['###SINGLE-INST-EMAIL-DOMAIN###', _("Der domain-part der E-Mail-Adresse (nach dem @-Zeichen)")];
            $markers['TemplateMain'][] = ['###SINGLE-INST-ROOM###', ''];
            $markers['TemplateMain'][] = ['###SINGLE-INST-PHONE###', ''];
            $markers['TemplateMain'][] = ['###SINGLE-INST-FAX###', ''];
            $markers['TemplateMain'][] = ['###SINGLE-INST-HOMEPAGE-HREF###', ''];
            $markers['TemplateMain'][] = ['###SINGLE-INST-OFFICE-HOURS###', ''];
            $markers['TemplateMain'][] = ['###SINGLE-INST-RESEARCH-INTERESTS###', ''];
            $markers['TemplateMain'][] = ['###SINGLE-INST-CV###', _("Lebenslauf")];
            $markers['TemplateMain'][] = ['###SINGLE-INST-PUBLICATIONS###', ''];
            $markers['TemplateMain'][] = ['###SINGLE-INST-OFFICE-HOURS###', ''];
            $markers['TemplateMain'][] = ['<!-- END SINGLE-INST -->', ''];
            $markers['TemplateMain'][] = ['<!-- END ALL-INST -->', ''];
    
            $this->insertDatafieldMarkers('user', $markers, 'TemplateMain');
            $this->insertDatafieldMarkers('userinstrole', $markers, 'TemplateMain');
            $this->insertPluginMarkers('HomepagePlugin', $markers, 'TemplateMain');
            $markers['TemplateMain'][] = ['###LECTURES###', _("Inhalt aus dem Template für Veranstaltungen")];
            $markers['TemplateMain'][] = ['###NEWS###', _("Inhalt aus dem Template für News")];
            $markers['TemplateMain'][] = ['###APPOINTMENTS###', _("Inhalt aus dem Template für Termine")];
            $markers['TemplateMain'][] = ['###OWNCATEGORIES###', _("Inhalt aus dem Template für eigene Kategorien")];
            $markers['TemplateMain'][] = ['<!-- END PERSONDETAILS -->', ''];
    
            $markers['TemplateLectures'][] = ['<!-- BEGIN LECTURES -->', ''];
            $markers['TemplateLectures'][] = ['<!-- BEGIN SEMESTER -->', ''];
            $markers['TemplateLectures'][] = ['###NAME###', ''];
            $markers['TemplateLectures'][] = ['<!-- BEGIN LECTURE -->', ''];
            $markers['TemplateLectures'][] = ['###TITLE###', ''];
            $markers['TemplateLectures'][] = ['###SUBTITLE###', ''];
            $markers['TemplateLectures'][] = ['###NUMBER###', _("Die Veranstaltungsnummer")];
            $markers['TemplateLectures'][] = ['###LECTUREDETAILS-HREF###', ''];
            $markers['TemplateLectures'][] = ['<!-- END LECTURE -->', ''];
            $markers['TemplateLectures'][] = ['<!-- END SEMESTER -->', ''];
            $markers['TemplateLectures'][] = ['<!-- END LECTURES -->', ''];
    
            $markers['TemplateNews'][] = ['<!-- BEGIN NEWS -->', ''];
            $markers['TemplateNews'][] = ['<!-- BEGIN NO-NEWS -->', ''];
            $markers['TemplateNews'][] = ['###NEWS_NO-NEWS-TEXT###', ''];
            $markers['TemplateNews'][] = ['<!-- END NO-NEWS -->', ''];
            $markers['TemplateNews'][] = ['<!-- BEGIN ALL-NEWS -->', ''];
            $markers['TemplateNews'][] = ['<!-- BEGIN SINGLE-NEWS -->', ''];
            $markers['TemplateNews'][] = ['###NEWS_TOPIC###', ''];
            $markers['TemplateNews'][] = ['###NEWS_BODY###', ''];
            $markers['TemplateNews'][] = ['###NEWS_DATE###', ''];
            $markers['TemplateNews'][] = ['###NEWS_ADMIN-MESSAGE###', ''];
            $markers['TemplateNews'][] = ['###NEWS_NO###', ''];
            $markers['TemplateNews'][] = ['<!-- END SINGLE-NEWS -->', ''];
            $markers['TemplateNews'][] = ['<!-- END ALL-NEWS -->', ''];
            $markers['TemplateNews'][] = ['<!-- END NEWS -->', ''];
    
            if (Config::get()->CALENDAR_ENABLE) {
                $markers['TemplateAppointments'][] = ['<!-- BEGIN APPOINTMENTS -->', ''];
                $markers['TemplateAppointments'][] = ['###LIST-START###', _("Startdatum der Terminliste")];
                $markers['TemplateAppointments'][] = ['###LIST-END###', _("Enddatum der Terminliste")];
                $markers['TemplateAppointments'][] = ['<!-- BEGIN NO-APPOINTMENTS -->', ''];
                $markers['TemplateAppointments'][] = ['###NO-APPOINTMENTS-TEXT###', ''];
                $markers['TemplateAppointments'][] = ['<!-- END NO-APPOINTMENTS -->', ''];
                $markers['TemplateAppointments'][] = ['<!-- BEGIN ALL-APPOINTMENTS -->', ''];
                $markers['TemplateAppointments'][] = ['<!-- BEGIN SINGLE-APPOINTMENT -->', ''];
                $markers['TemplateAppointments'][] = ['###DATE###', _("Start und Endzeit oder ganztägig")];
                $markers['TemplateAppointments'][] = ['###BEGIN###', ''];
                $markers['TemplateAppointments'][] = ['###END###', ''];
                $markers['TemplateAppointments'][] = ['###TITLE###', ''];
                $markers['TemplateAppointments'][] = ['###DESCRIPTION###', ''];
                $markers['TemplateAppointments'][] = ['###LOCATION###', ''];
                $markers['TemplateAppointments'][] = ['###REPETITION###', ''];
                $markers['TemplateAppointments'][] = ['###CATEGORY###', ''];
                $markers['TemplateAppointments'][] = ['###PRIORITY###', ''];
                $markers['TemplateAppointments'][] = ['<!-- END SINGLE-APPOINTMENT -->', ''];
                $markers['TemplateAppointments'][] = ['<!-- END ALL-APPOINTMENTS -->', ''];
                $markers['TemplateAppointments'][] = ['<!-- END APPOINTMENTS -->', ''];
            }
    
            $markers['TemplateOwnCategories'][] = ['<!-- BEGIN OWNCATEGORIES -->', ''];
            $markers['TemplateOwnCategories'][] = ['<!-- BEGIN OWNCATEGORY -->', ''];
            $markers['TemplateOwnCategories'][] = ['###OWNCATEGORY_TITLE###', ''];
            $markers['TemplateOwnCategories'][] = ['###OWNCATEGORY_CONTENT###', ''];
            $markers['TemplateOwnCategories'][] = ['###OWNCATEGORY_NO###', _("Laufende Nummer")];
            $markers['TemplateOwnCategories'][] = ['<!-- END OWNCATEGORY -->', ''];
            $markers['TemplateOwnCategories'][] = ['<!-- END OWNCATEGORIES -->', ''];
    
            return $markers[$element_name];
        }
    
        private function getContent ($args = NULL, $raw = FALSE) {
            $instituts_id = $this->config->range_id;
            $username = $args['username'];
            $sem_id = $args['seminar_id'];
            $group_id = $args['group_id'];
    
            if (!$nameformat = $this->config->getValue('Main', 'nameformat')) {
                $nameformat = 'full';
            }
    
            $row = false;
            $global_view = false;
            $dbv = new DbView();
            if (in_array(get_object_type($this->config->range_id), ['global'])) {
                $global_view = true;
                $selected_item_ids = $this->config->getValue('SelectInstitutes', 'institutesselected');
                // at least one institute has to be selected in the configuration
                if (!is_array($selected_item_ids)) {
                    // default to always show user for now
                } else if ($this->config->getValue('Main', 'onlylecturers')) {
                    // is user lecturer ?
                    $current_semester = get_sem_num(time());
                    $stm = DBManager::get()->prepare(sprintf(
                        "SELECT aum.user_id "
                        . "FROM auth_user_md5 aum "
                        . "LEFT JOIN seminar_user su USING(user_id) "
                        . "LEFT JOIN seminare s USING (seminar_id) "
                        . "LEFT JOIN user_inst ui ON aum.user_id = ui.user_id "
                        . "WHERE aum.username = ? "
                        . "AND su.status = 'dozent' "
                        . "AND s.visible = 1 "
                        . "AND ((%s) = %s OR ((%s) <= %s  AND ((%s) >= %s OR (%s) = -1))) "
                        . "AND ui.Institut_id IN ('%s') "
                        . "AND ui.inst_perms = 'dozent' "
                        . "AND ui.externdefault = 1 "
                        . "AND %s",
                        $dbv->sem_number_sql,
                        $current_semester,
                        $dbv->sem_number_sql,
                        $current_semester,
                        $dbv->sem_number_end_sql,
                        $current_semester,
                        $dbv->sem_number_end_sql,
                        implode("','", $selected_item_ids),
                        get_ext_vis_query()));
                    $stm->execute([$username]);
                    // user is not a lecturer
                    if (!$row = $stm->fetch()) {
                        return [];
                    }
                } else {
                    // have user the status dozent at an institute in the list of accepted institutes
                    $stm = DBManager::get()->prepare(sprintf(
                        "SELECT aum.user_id "
                        . "FROM auth_user_md5 aum "
                        . "LEFT JOIN user_inst ui USING(user_id) "
                        . "WHERE aum.username = ? "
                        . "AND ui.Institut_id IN ('%s') "
                        . "AND ui.externdefault = 1 "
                        . "AND %s",
                        implode("','", $selected_item_ids), get_ext_vis_query()));
                    $stm->execute([$username]);
                    // user is not dozent at an institute that is in the list of accepted institutes
                    if (!$row = $stm->fetch()) {
                        return [];
                    }
                }
            }
    
            $row = false;
    
            // Mitarbeiter/in am Institut
            $stm_inst = DBManager::get()->prepare(
                "SELECT i.Institut_id "
                . "FROM Institute i "
                . "LEFT JOIN user_inst ui USING(Institut_id) "
                . "LEFT JOIN auth_user_md5 aum USING(user_id) "
                . "WHERE i.Institut_id = ? "
                . "AND aum.username = ? AND ui.inst_perms IN ('autor','tutor','dozent') AND " . get_ext_vis_query());
            $stm_inst->execute([$instituts_id, $username]);
    
            // Mitarbeiter/in am Heimatinstitut des Seminars
            if (!$row = $stm_inst->fetch(PDO::FETCH_ASSOC) && $sem_id) {
                $stm_inst = DBManager::get()->prepare(
                    "SELECT s.Institut_id "
                    . "FROM seminare s "
                    . "LEFT JOIN user_inst ui USING(Institut_id) "
                    . "LEFT JOIN auth_user_md5 aum USING(user_id) "
                    . "WHERE s.Seminar_id = ? "
                    . "AND aum.username = ? AND ui.inst_perms = 'dozent' AND " . get_ext_vis_query());
                $stm_inst->execute([$sem_id, $username]);
                if ($row = $stm_inst->fetch(PDO::FETCH_ASSOC)) {
                    $instituts_id = $row['Institut_id'];
                }
            }
    
            // an beteiligtem Institut Dozent(in)
            if (!$row && $sem_id) {
                $stm_inst = DBManager::get()->prepare(
                    "SELECT si.institut_id "
                    . "FROM seminare s "
                    . "LEFT JOIN seminar_inst si ON(s.Seminar_id = si.seminar_id) "
                    . "LEFT JOIN user_inst ui ON(si.institut_id = ui.Institut_id) "
                    . "LEFT JOIN auth_user_md5 aum USING(user_id) "
                    . "WHERE s.Seminar_id = ? "
                    . "AND si.institut_id != ? AND ui.inst_perms = 'dozent' AND aum.username = ? AND " . get_ext_vis_query());
                $stm_inst->execute([$sem_id, $intituts_id, $username]);
                if ($row = $stm_inst->fetch(PDO::FETCH_ASSOC)) {
                    $instituts_id = $row['institut_id'];
                }
            }
    
            // ist zwar global Dozent, aber an keinem Institut eingetragen
            if (!$row && $sem_id) {
                $stm = DBManager::get()->prepare(sprintf(
                    "SELECT aum.*, %s AS fullname "
                    . "FROM auth_user_md5 aum "
                    . "LEFT JOIN user_info USING(user_id) "
                    . "LEFT JOIN seminar_user su "
                    . "WHERE username = ? "
                    . "AND perms = 'dozent' AND su.seminar_id = ? AND su.status = 'dozent' AND %s"
                    , $GLOBALS['_fullname_sql'][$nameformat], get_ext_vis_query()));
                $stm->execute([$username, $sem_id]);
                $row = $stm->fetch(PDO::FETCH_ASSOC);
            } elseif ($global_view || $this->config->getValue('Main', 'defaultaddr')) {
                $stm = DBManager::get()->prepare(sprintf(
                    "SELECT i.Institut_id, i.Name, i.Strasse, i.Plz, i.url, ui.*, aum.*, "
                    . "%s AS fullname, uin.user_id, uin.lebenslauf, uin.publi, uin.schwerp, "
                    . "uin.Home, uin.title_front, uin.title_rear "
                    . "FROM Institute i "
                    . "LEFT JOIN user_inst ui USING(Institut_id) "
                    . "LEFT JOIN auth_user_md5 aum USING(user_id) "
                    . "LEFT JOIN user_info uin USING (user_id) "
                    . "WHERE ui.inst_perms IN ('autor','tutor','dozent') "
                    . "AND aum.username = ? AND ui.externdefault = 1 AND %s"
                    , $GLOBALS['_fullname_sql'][$nameformat], get_ext_vis_query()));
                $stm->execute([$username]);
                $row = $stm->fetch(PDO::FETCH_ASSOC);
                if (!$row) {
                    $stm = DBManager::get()->prepare(sprintf(
                        "SELECT i.Institut_id, i.Name, i.Strasse, i.Plz, i.url, ui.*, aum.*, "
                        . "%s AS fullname, uin.user_id, uin.lebenslauf, uin.publi, uin.schwerp, "
                        . "uin.Home, uin.title_front, uin.title_rear "
                        . "FROM Institute i "
                        . "LEFT JOIN user_inst ui USING(Institut_id) "
                        . "LEFT JOIN auth_user_md5 aum USING(user_id) "
                        . "LEFT JOIN user_info uin USING (user_id) "
                        . "WHERE ui.inst_perms IN ('autor','tutor','dozent') "
                        . "AND aum.username = ? AND i.Institut_id = ? AND %s"
                        , $GLOBALS['_fullname_sql'][$nameformat], get_ext_vis_query()));
                    $stm->execute([$username, $instituts_id]);
                    $row = $stm->fetch(PDO::FETCH_ASSOC);
                } else {
                    $instituts_id = $row['Institut_id'];
                }
            } else {
                $stm = DBManager::get()->prepare(sprintf(
                    "SELECT i.Institut_id, i.Name, i.Strasse, i.Plz, i.url, ui.*, aum.*, "
                    . "%s AS fullname, uin.user_id, uin.lebenslauf, uin.publi, uin.schwerp, "
                    . "uin.Home, uin.title_front, uin.title_rear "
                    . "FROM Institute i "
                    . "LEFT JOIN user_inst ui USING(Institut_id) "
                    . "LEFT JOIN auth_user_md5 aum USING(user_id) "
                    . "LEFT JOIN user_info uin USING (user_id) "
                    . "WHERE ui.inst_perms IN ('autor','tutor','dozent') "
                    . "AND aum.username = ? AND i.Institut_id = ? AND %s"
                    , $GLOBALS['_fullname_sql'][$nameformat], get_ext_vis_query()));
                $stm->execute([$username, $instituts_id]);
                $row = $stm->fetch(PDO::FETCH_ASSOC);
            }
    
            // the user with the given username does not fulfill the conditions above
            if (!$row) {
                return [];
            }
    
            // Alle Einrichtungen hohlen
            $stm = DBManager::get()->prepare(sprintf(
                    "SELECT i.Institut_id, i.Name, i.Strasse, i.Plz, i.url, ui.*, aum.*, "
                    . "%s AS fullname, uin.user_id, uin.lebenslauf, uin.publi, uin.schwerp, "
                    . "uin.Home, uin.title_front, uin.title_rear "
                    . "FROM Institute i "
                    . "LEFT JOIN user_inst ui USING(Institut_id) "
                    . "LEFT JOIN auth_user_md5 aum USING(user_id) "
                    . "LEFT JOIN user_info uin USING (user_id) "
                    . "WHERE ui.inst_perms IN ('autor','tutor','dozent') "
                    . "AND aum.username = ? "
                    . "AND ui.`visible` = 1 "
                    . "ORDER BY ui.`externdefault` DESC, ui. `priority` ASC, i.`Name` ASC"
                    , $GLOBALS['_fullname_sql'][$nameformat]));
            $stm->execute([$username]);
            $allRows = $stm->fetchAll();
    
            $this->user_id = $row['user_id'];
    
            $this->user_perm = $visibilities['perms'];
    
            $content['__GLOBAL__']['STUDIP-EDIT-HREF'] = "{$GLOBALS['ABSOLUTE_URI_STUDIP']}dispatch.php/settings/account?username=$username&login=yes";
    
            $content['PERSONDETAILS']['FULLNAME'] = ExternModule::ExtHtmlReady($row['fullname']);
            $content['PERSONDETAILS']['LASTNAME'] = ExternModule::ExtHtmlReady($row['Nachname']);
            $content['PERSONDETAILS']['FIRSTNAME'] = ExternModule::ExtHtmlReady($row['Vorname']);
            $content['PERSONDETAILS']['TITLEFRONT'] = ExternModule::ExtHtmlReady($row['title_front']);
            $content['PERSONDETAILS']['TITLEREAR'] = ExternModule::ExtHtmlReady($row['title_rear']);
            if ($statusgroups = Statusgruppen::getUserRoles($instituts_id, $this->user_id)) {
                $content['PERSONDETAILS']['STATUSGROUPS'] = ExternModule::ExtHtmlReady(join(', ', array_values($statusgroups)));
            }
            $content['PERSONDETAILS']['USERNAME'] = $row['username'];
    
            $content['PERSONDETAILS']['IMAGE-HREF'] = Avatar::getAvatar($this->user_id)->getURL(Avatar::NORMAL);
    
            $gruppen = GetRoleNames(GetAllStatusgruppen($this->config->range_id, $row['user_id'])) ?? [];
            if ($gruppen) {
                for ($i = 0; $i < count($gruppen); $i++) {
                    $content['PERSONDETAILS']['GROUPS'][$i]['GROUP'] = ExternModule::ExtHtmlReady($gruppen[$i]);
                }
            }
    
            $content['PERSONDETAILS']['INST-NAME'] = ExternModule::ExtHtmlReady($row['Name']);
            $content['PERSONDETAILS']['INST-HREF'] = ExternModule::ExtHtmlReady(trim($row['url']));
            $content['PERSONDETAILS']['STREET'] = ExternModule::ExtHtmlReady($row['Strasse']);
            $content['PERSONDETAILS']['ZIPCODE'] = ExternModule::ExtHtmlReady($row['Plz']);
            $email = get_visible_email($this->user_id);
            $content['PERSONDETAILS']['EMAIL'] = ExternModule::ExtHtmlReady($email);
            $emails = explode('@', $content['PERSONDETAILS']['EMAIL']);
            $content['PERSONDETAILS']['EMAIL-LOCAL'] = array_shift($emails);
            $emails = explode('@', $content['PERSONDETAILS']['EMAIL']);
            $content['PERSONDETAILS']['EMAIL-DOMAIN'] = array_pop($emails);
            $content['PERSONDETAILS']['ROOM'] = ExternModule::ExtHtmlReady($row['raum']);
            $content['PERSONDETAILS']['PHONE'] = ExternModule::ExtHtmlReady($row['Telefon']);
            $content['PERSONDETAILS']['FAX'] = ExternModule::ExtHtmlReady($row['Fax']);
            if (Visibility::verify('homepage', $this->user_id)) {
                $content['PERSONDETAILS']['HOMEPAGE-HREF'] = ExternModule::ExtHtmlReady(trim($row['Home']));
            }
            $content['PERSONDETAILS']['OFFICE-HOURS'] = ExternModule::ExtHtmlReady($row['sprechzeiten']);
    
            $j = 0;
            foreach($allRows as $curRow)
            {
                $content['PERSONDETAILS']['ALL-INST']['SINGLE-INST'][$j]['SINGLE-INST-NAME'] = ExternModule::ExtHtmlReady($curRow['Name']);
                $content['PERSONDETAILS']['ALL-INST']['SINGLE-INST'][$j]['SINGLE-INST-HREF'] = ExternModule::ExtHtmlReady(trim($curRow['url']));
                $content['PERSONDETAILS']['ALL-INST']['SINGLE-INST'][$j]['SINGLE-INST-STREET'] = ExternModule::ExtHtmlReady($curRow['Strasse']);
                $content['PERSONDETAILS']['ALL-INST']['SINGLE-INST'][$j]['SINGLE-INST-ZIPCODE'] = ExternModule::ExtHtmlReady($curRow['Plz']);
                $content['PERSONDETAILS']['ALL-INST']['SINGLE-INST'][$j]['SINGLE-INST-EMAIL'] = ExternModule::ExtHtmlReady($curRow['Email']);
                $emails = explode('@', $content['PERSONDETAILS']['ALL-INST']['SINGLE-INST'][$j]['SINGLE-INST-EMAIL']);
                $content['PERSONDETAILS']['ALL-INST']['SINGLE-INST'][$j]['SINGLE-INST-EMAIL-LOCAL'] = array_shift($emails);
                $emails = explode('@', $content['PERSONDETAILS']['ALL-INST']['SINGLE-INST'][$j]['SINGLE-INST-EMAIL']);
                $content['PERSONDETAILS']['ALL-INST']['SINGLE-INST'][$j]['SINGLE-INST-EMAIL-DOMAIN'] = array_pop($emails);
                $content['PERSONDETAILS']['ALL-INST']['SINGLE-INST'][$j]['SINGLE-INST-ROOM'] = ExternModule::ExtHtmlReady($curRow['raum']);
                $content['PERSONDETAILS']['ALL-INST']['SINGLE-INST'][$j]['SINGLE-INST-PHONE'] = ExternModule::ExtHtmlReady($curRow['Telefon']);
                $content['PERSONDETAILS']['ALL-INST']['SINGLE-INST'][$j]['SINGLE-INST-FAX'] = ExternModule::ExtHtmlReady($curRow['Fax']);
                $content['PERSONDETAILS']['ALL-INST']['SINGLE-INST'][$j]['SINGLE-INST-HOMEPAGE-HREF'] = ExternModule::ExtHtmlReady(trim($curRow['Home']));
                $content['PERSONDETAILS']['ALL-INST']['SINGLE-INST'][$j]['SINGLE-INST-OFFICE-HOURS'] = ExternModule::ExtHtmlReady($curRow['sprechzeiten']);
                $j++;
            }
    
            // generic data fields
            if ($generic_datafields = $this->config->getValue('TemplateMain', 'genericdatafields')) {
                $localEntries = DataFieldEntry::getDataFieldEntries($this->user_id, 'user');
                $k = 1;
                foreach ($generic_datafields as $datafield) {
                    if (isset($localEntries[$datafield]) &&
                            is_object($localEntries[$datafield]) &&
                            Visibility::verify($localEntries[$datafield]->getId(), $this->user_id)) {
                        if ($localEntries[$datafield]->getType() == 'link') {
                            $localEntry = ExternModule::extHtmlReady($localEntries[$datafield]->getValue());
                        } else {
                            $localEntry = $localEntries[$datafield]->getDisplayValue();
                        }
                        if ($localEntry) {
                            $content['PERSONDETAILS']["DATAFIELD_$k"] = $localEntry;
                        }
                    }
                    $k++;
                }
    
                $localEntries = DataFieldEntry::getDataFieldEntries([$this->user_id, $instituts_id], 'userinstrole');
                if (isset($group_id)) {
                    $roleEntries = DataFieldEntry::getDataFieldEntries([$this->user_id, $group_id], 'userinstrole');
                    $roleEntries = array_filter($roleEntries, function($val) { return $val->getValue() !== 'default_value'; });
                    $localEntries = $roleEntries + $localEntries;
                }
                $k = 1;
                foreach ($generic_datafields as $datafield) {
                    if (isset($localEntries[$datafield]) &&
                            is_object($localEntries[$datafield])) {
                        $localEntry = $localEntries[$datafield]->getDisplayValue();
                        if ($localEntry) {
                            $content['PERSONDETAILS']["DATAFIELD_$k"] = $localEntry;
                        }
                    }
                    $k++;
                }
            }
    
            // homepage plugins
            $plugins = PluginEngine::getPlugins('HomepagePlugin');
    
            foreach ($plugins as $plugin) {
                $template = $plugin->getHomepageTemplate($this->user_id);
    
                if ($template) {
                    $keyname = 'PLUGIN_' . mb_strtoupper($plugin->getPluginName());
                    $content['PERSONDETAILS'][$keyname] = $template->render();
                }
            }
    
            if (Visibility::verify('lebenslauf', $this->user_id)) {
                $content['PERSONDETAILS']['CV'] = ExternModule::ExtFormatReady($row['lebenslauf']);
            }
            if (Visibility::verify('schwerp', $this->user_id)) {
                $content['PERSONDETAILS']['RESEARCH-INTERESTS'] = ExternModule::ExtFormatReady($row['schwerp']);
            }
            if (Visibility::verify('publi', $this->user_id)) {
                $content['PERSONDETAILS']['PUBLICATIONS'] = ExternModule::ExtFormatReady($row['publi']);
            }
    
            $content['PERSONDETAILS']['LECTURES'] = $this->elements['TemplateLectures']->toString(['content' => $this->getContentLectures(), 'subpart' => 'LECTURES']);
            if (Visibility::verify('news', $this->user_id)) {
                $content['PERSONDETAILS']['NEWS'] = $this->elements['TemplateNews']->toString(['content' => $this->getContentNews(), 'subpart' => 'NEWS']);
            }
            if (Visibility::verify('dates', $this->user_id)) {
                $content['PERSONDETAILS']['APPOINTMENTS'] = $this->elements['TemplateAppointments']->toString(['content' => $this->getContentAppointments(), 'subpart' => 'APPOINTMENTS']);
            }
            $content['PERSONDETAILS']['OWNCATEGORIES'] = $this->elements['TemplateOwnCategories']->toString(['content' => $this->getContentOwnCategories(), 'subpart' => 'OWNCATEGORIES']);
    
            return $content;
        }
    
        private function getContentOwnCategories () {
            $stm = DBManager::get()->prepare(
                "SELECT kategorie_id, name, content "
                . "FROM kategorien "
                . "WHERE range_id = ? "
                . "ORDER BY priority");
            $stm->execute([$this->user_id]);
            $i = 0;
            while ($row = $stm->fetch(PDO::FETCH_ASSOC)) {
                if (Visibility::verify('kat_'.$row['kategorie_id'], $this->user_id)) {
                    $content['OWNCATEGORIES']['OWNCATEGORY'][$i]['OWNCATEGORY_TITLE'] = ExternModule::ExtHtmlReady($row['name']);
                    $content['OWNCATEGORIES']['OWNCATEGORY'][$i]['OWNCATEGORY_CONTENT'] = ExternModule::ExtFormatReady($row['content']);
                    $content['OWNCATEGORIES']['OWNCATEGORY'][$i]['OWNCATEGORY_NO'] = $i + 1;
                    $i++;
                }
            }
            return $content;
        }
    
        private function getContentNews () {
            $dateform = $this->config->getValue('Main', 'dateformat');
    
            $news = StudipNews::GetNewsByRange($this->user_id, TRUE);
            if (!count($news)) {
                $content['NEWS']['NO-NEWS']['NEWS_NO-NEWS-TEXT'] = $this->config->getValue('Main', 'nodatatext');
            } else {
                $i = 0;
                foreach ($news as $news_id => $news_detail) {
                    $content['NEWS']['ALL-NEWS']['SINGLE-NEWS'][$i]['NEWS_BODY'] = ExternModule::ExtFormatReady((string) $news_detail->body);
                    $content['NEWS']['ALL-NEWS']['SINGLE-NEWS'][$i]['NEWS_DATE'] = strftime($dateform, $news_detail->date);
                    $content['NEWS']['ALL-NEWS']['SINGLE-NEWS'][$i]['NEWS_TOPIC'] = ExternModule::ExtHtmlReady((string) $news_detail->topic);
                    $content['NEWS']['ALL-NEWS']['SINGLE-NEWS'][$i]['NEWS_NO'] = $i + 1;
                    $i++;
                }
            }
            return $content;
        }
    
        private function getContentAppointments () {
            if (Config::get()->CALENDAR_ENABLE) {
                $events = SingleCalendar::getEventList($this->user_id, time(), time() + 60 * 60 * 24 * 7, null, ['class' => 'PUBLIC'], ['CalendarEvent']);
                $content['APPOINTMENTS']['LIST-START'] = ExternModule::ExtHtmlReady(strftime($this->config->getValue('Main', 'dateformat') . ' %X', time()));
                $content['APPOINTMENTS']['LIST-END'] = ExternModule::ExtHtmlReady(strftime($this->config->getValue('Main', 'dateformat') . ' %X', time() + 60 * 60 * 24 * 7));
                if (sizeof($events)) {
                    $i = 0;
                    foreach ($events as $event) {
                        if ($event->isDayEvent()) {
                            $content['APPOINTMENTS']['ALL-APPOINTMENTS']['SINGLE-APPOINTMENT'][$i]['DATE'] = ExternModule::ExtHtmlReady(strftime($this->config->getValue('Main', 'dateformat'), $event->getStart()) . ' (' . _("ganztägig") . ')');
                        } else {
                            $content['APPOINTMENTS']['ALL-APPOINTMENTS']['SINGLE-APPOINTMENT'][$i]['DATE'] = ExternModule::ExtHtmlReady(strftime($this->config->getValue('Main', 'dateformat') . " %X", $event->getStart()));
                            if (date("dmY", $event->getStart()) == date("dmY", $event->getEnd())) {
                                $content['APPOINTMENTS']['ALL-APPOINTMENTS']['SINGLE-APPOINTMENT'][$i]['DATE'] .= ExternModule::ExtHtmlReady(strftime(" - %X", $event->getEnd()));
                            } else {
                                $content['APPOINTMENTS']['ALL-APPOINTMENTS']['SINGLE-APPOINTMENT'][$i]['DATE'] .= ExternModule::ExtHtmlReady(strftime(" - " . $this->config->getValue('Main', 'dateformat') . " %X", $event->getEnd()));
                            }
                        }
                        $content['APPOINTMENTS']['ALL-APPOINTMENTS']['SINGLE-APPOINTMENT'][$i]['TITLE'] = ExternModule::ExtHtmlReady($event->getTitle());
                        $content['APPOINTMENTS']['ALL-APPOINTMENTS']['SINGLE-APPOINTMENT'][$i]['DESCRIPTION'] = ExternModule::ExtHtmlReady($event->getDescription());
                        $content['APPOINTMENTS']['ALL-APPOINTMENTS']['SINGLE-APPOINTMENT'][$i]['LOCATION'] = ExternModule::ExtHtmlReady($event->getLocation());
                        $content['APPOINTMENTS']['ALL-APPOINTMENTS']['SINGLE-APPOINTMENT'][$i]['REPETITION'] = ExternModule::ExtHtmlReady($event->toStringRecurrence());
                        $content['APPOINTMENTS']['ALL-APPOINTMENTS']['SINGLE-APPOINTMENT'][$i]['CATEGORY'] = ExternModule::ExtHtmlReady($event->toStringCategories());
                        $content['APPOINTMENTS']['ALL-APPOINTMENTS']['SINGLE-APPOINTMENT'][$i]['PRIORITY'] = ExternModule::ExtHtmlReady($event->toStringPriority());
                        $content['APPOINTMENTS']['ALL-APPOINTMENTS']['SINGLE-APPOINTMENT'][$i]['START'] = ExternModule::ExtHtmlReady(strftime($this->config->getValue('Main', 'dateformat') . " %X", $event->getStart()));
                        $content['APPOINTMENTS']['ALL-APPOINTMENTS']['SINGLE-APPOINTMENT'][$i]['END'] = ExternModule::ExtHtmlReady(strftime($this->config->getValue('Main', 'dateformat') . " %X", $event->getEnd()));
                        $i++;
                    }
                } else {
                    $content['APPOINTMENTS']['NO-APPOINTMENTS']['NO-APPOINTMENTS_TEXT'] = $this->config->getValue('Main', 'noappointmentstext');
                }
                return $content;
            }
            return NULL;
        }
    
        private function getContentLectures () {
            global $attr_text_td, $end, $start;
    
            $all_semester = Semester::findAllVisible(false);
            // old hard coded $SEMESTER-array starts with index 1
            array_unshift($all_semester, 0);
    
            $types = [];
            $semclass = $this->config->getValue('PersondetailsLectures', 'semclass');
            if (is_null($semclass)) {
                $semclass = [1];
            }
    
            // Is a semester switch defined?
            $week_offset = $this->config->getValue('PersondetailsLectures', 'semswitch');
            if (ctype_digit($week_offset)) {
                $switch_time = strtotime("+{$week_offset} weeks 0:00:00");
            } else {
                $switch_time = strtotime('0:00:00');
            }
    
            // get current semester
            $current_sem = get_sem_num($switch_time) + 1;
    
            switch ($this->config->getValue("PersondetailsLectures", "semstart")) {
                case "previous" :
                    if (isset($all_semester[$current_sem - 1])) {
                        $current_sem--;
                    }
                    break;
                case "next" :
                    if (isset($all_semester[$current_sem + 1])) {
                        $current_sem++;
                    }
                    break;
                case "current" :
                    break;
                default :
                    if (isset($all_semester[$this->config->getValue("PersondetailsLectures", "semstart")])) {
                        $current_sem = $this->config->getValue("PersondetailsLectures", "semstart");
                    }
            }
    
            $last_sem = $current_sem - 1;
    
            $sem_offset = $this->config->getValue("PersondetailsLectures", "semrange");
            if ($sem_offset && ctype_digit($sem_offset)) {
                $last_sem += $sem_offset;
            }
    
            if ($last_sem < $current_sem) {
                $last_sem = $current_sem;
            }
            if (!isset($all_semester[$last_sem])) {
                $last_sem = sizeof($all_semester) - 1;
            }
    
            $types = [];
            $semclass = $this->config->getValue('PersondetailsLectures', 'semclass');
            if (is_null($semclass)) {
                $semclass = [1];
            }
            foreach ($GLOBALS["SEM_TYPE"] as $key => $type) {
                if (in_array($type["class"], $semclass)) {
                    $types[] = $key;
                }
            }
            $stm = DBManager::get()->prepare(
                "SELECT s.Name, s.Seminar_id, s.Untertitel, s.VeranstaltungsNummer "
                . "FROM seminar_user su "
                . "LEFT JOIN seminare s USING(seminar_id) "
                . "LEFT JOIN semester_courses ON (semester_courses.course_id = s.Seminar_id) "
                . "WHERE user_id = ? "
                . "AND su.status LIKE 'dozent' "
                . "AND start_time <= ? AND (semester_courses.semester_id IS NULL OR semester_courses.semester_id = ?) "
                . "AND s.status IN (?) AND s.visible = 1 "
                . "ORDER BY Name");
    
            $i = 0;
            for (;$current_sem <= $last_sem; $last_sem--) {
                $stm->execute([$this->user_id, $all_semester[$last_sem]['beginn'], $all_semester[$last_sem]['semester_id'], $types ?: '']);
                $result = $stm->fetchAll();
    
                if ($result && sizeof($result)) {
                    if (!($this->config->getValue('PersondetailsLectures', 'semstart') == 'current' && $this->config->getValue('PersondetailsLectures', 'semrange') == 1)) {
                        $month = date('n', $all_semester[$last_sem]['beginn']);
                        if ($month > 9) {
                            $content['LECTURES']['SEMESTER'][$i]['NAME'] = $this->config->getValue('PersondetailsLectures', 'aliaswise') . date(' Y/', $all_semester[$last_sem]['beginn']) . date('y', $all_semester[$last_sem]['ende']);
                        } else if ($month > 3 && $month < 10) {
                            $content['LECTURES']['SEMESTER'][$i]['NAME'] = $this->config->getValue('PersondetailsLectures', 'aliassose') . date(' Y', $all_semester[$last_sem]['beginn']);
                        }
                    }
                    $k = 0;
                    foreach ($result as $row) {
                        $content['LECTURES']['SEMESTER'][$i]['LECTURE'][$k]['TITLE'] = ExternModule::ExtHtmlReady($row['Name']);
                        $content['LECTURES']['SEMESTER'][$i]['LECTURE'][$k]['LECTUREDETAILS-HREF'] = $this->elements['LinkInternLecturedetails']->createUrl(['link_args' => 'seminar_id=' . $row['Seminar_id']]);
                        if (trim($row['Untertitel']) != '') {
                            $content['LECTURES']['SEMESTER'][$i]['LECTURE'][$k]['SUBTITLE'] = ExternModule::ExtHtmlReady($row['Untertitel']);
                        }
                        if (trim($row['VeranstaltungsNummer']) != '') {
                            $content['LECTURES']['SEMESTER'][$i]['LECTURE'][$k]['NUMBER'] = ExternModule::ExtHtmlReady($row['VeranstaltungsNummer']);
                        }
                        $k++;
                    }
                }
                $i++;
            }
            return $content;
        }
    
        public function printout ($args) {
            if (!$language = $this->config->getValue("Main", "language"))
                $language = "de_DE";
            init_i18n($language);
    
            echo $this->elements['TemplateMain']->toString(['content' => $this->getContent($args), 'subpart' => 'PERSONDETAILS']);
    
        }
    
        public function printoutPreview () {
            if (!$language = $this->config->getValue("Main", "language"))
                $language = "de_DE";
            init_i18n($language);
    
            echo $this->elements['TemplateMain']->toString(['content' => $this->getContent(), 'subpart' => 'PERSONDETAILS', 'hide_markers' => FALSE]);
    
        }
    
    }
    ?>