Error
Class "SeminarCatalog\Core\TwigComponents\Base\TwigComponent" not found Error thrown with message "Class "SeminarCatalog\Core\TwigComponents\Base\TwigComponent" not found" Stacktrace: #11 Error in /srv/www/bgphoenics2.invorbereitung.de/ilias/Core/TwigComponents/Classes/Components/Favourites.php:10 #10 include in /srv/www/bgphoenics2.invorbereitung.de/ilias/vendor/composer/ClassLoader.php:576 #9 Composer\Autoload\{closure} in /srv/www/bgphoenics2.invorbereitung.de/ilias/vendor/composer/ClassLoader.php:427 #8 Composer\Autoload\ClassLoader:loadClass in [internal]:0 #7 class_exists in /srv/www/bgphoenics2.invorbereitung.de/ilias/Core/Object/Classes/Manager/ObjectManager.php:36 #6 SeminarCatalog\Core\Object\Manager\ObjectManager:has in /srv/www/bgphoenics2.invorbereitung.de/ilias/classes/Service/Wrapper/TwigTemplate.php:71 #5 SeminarCatalog\Service\Wrapper\TwigTemplate:parseSemiTags in /srv/www/bgphoenics2.invorbereitung.de/ilias/classes/Service/Wrapper/TwigTemplate.php:50 #4 SeminarCatalog\Service\Wrapper\TwigTemplate:render in /srv/www/bgphoenics2.invorbereitung.de/ilias/vendor/twig/twig/src/TemplateWrapper.php:51 #3 Twig\TemplateWrapper:render in /srv/www/bgphoenics2.invorbereitung.de/ilias/Core/Catalog/Classes/Controller/CatalogController.php:888 #2 SeminarCatalog\Core\Catalog\Controller\CatalogController:seminarDetailsAction in /srv/www/bgphoenics2.invorbereitung.de/ilias/classes/Controller/BaseController.php:255 #1 SeminarCatalog\Controller\BaseController:handleCmd in /srv/www/bgphoenics2.invorbereitung.de/ilias/classes/SeminarCatalogKernel.php:91 #0 SeminarCatalogKernel:handleRequest in /srv/www/bgphoenics2.invorbereitung.de/ilias/index.php:23
Stack frames (12)
11
Error
/Core/TwigComponents/Classes/Components/Favourites.php:10
10
include
/vendor/composer/ClassLoader.php:576
9
Composer\Autoload\{closure}
/vendor/composer/ClassLoader.php:427
8
Composer\Autoload\ClassLoader loadClass
[internal]:0
7
class_exists
/Core/Object/Classes/Manager/ObjectManager.php:36
6
SeminarCatalog\Core\Object\Manager\ObjectManager has
/classes/Service/Wrapper/TwigTemplate.php:71
5
SeminarCatalog\Service\Wrapper\TwigTemplate parseSemiTags
/classes/Service/Wrapper/TwigTemplate.php:50
4
SeminarCatalog\Service\Wrapper\TwigTemplate render
/vendor/twig/twig/src/TemplateWrapper.php:51
3
Twig\TemplateWrapper render
/Core/Catalog/Classes/Controller/CatalogController.php:888
2
SeminarCatalog\Core\Catalog\Controller\CatalogController seminarDetailsAction
/classes/Controller/BaseController.php:255
1
SeminarCatalog\Controller\BaseController handleCmd
/classes/SeminarCatalogKernel.php:91
0
SeminarCatalogKernel handleRequest
/index.php:23
/srv/www/bgphoenics2.invorbereitung.de/ilias/Core/TwigComponents/Classes/Components/Favourites.php
<?php
 
namespace SeminarCatalog\Core\TwigComponents\Components;
 
use SeminarCatalog\Core\Object\Manager\ObjectManager;
use SeminarCatalog\Core\Seminar\Model\Seminar;
use SeminarCatalog\Core\TwigComponents\Base\TwigComponent;
use SeminarCatalog\Core\User\Model\CurrentUser;
 
class Favourites extends TwigComponent
{
    protected Seminar $seminar;
 
 
    public function getContext(): array
    {
        $favouriteList = ObjectManager::get(CurrentUser::class)->getFavouritesIdList();
        return [
            'id' => uniqid(),
            'seminar' => $this->seminar,
            'favouriteList' => $favouriteList,
        ];
    }
}
 
Arguments
  1. "Class "SeminarCatalog\Core\TwigComponents\Base\TwigComponent" not found"
    
/srv/www/bgphoenics2.invorbereitung.de/ilias/vendor/composer/ClassLoader.php
 
    /**
     * @return void
     */
    private static function initializeIncludeClosure()
    {
        if (self::$includeFile !== null) {
            return;
        }
 
        /**
         * Scope isolated include.
         *
         * Prevents access to $this/self from included files.
         *
         * @param  string $file
         * @return void
         */
        self::$includeFile = \Closure::bind(static function($file) {
            include $file;
        }, null, null);
    }
}
 
/srv/www/bgphoenics2.invorbereitung.de/ilias/vendor/composer/ClassLoader.php
    public function unregister()
    {
        spl_autoload_unregister(array($this, 'loadClass'));
 
        if (null !== $this->vendorDir) {
            unset(self::$registeredLoaders[$this->vendorDir]);
        }
    }
 
    /**
     * Loads the given class or interface.
     *
     * @param  string    $class The name of the class
     * @return true|null True if loaded, null otherwise
     */
    public function loadClass($class)
    {
        if ($file = $this->findFile($class)) {
            $includeFile = self::$includeFile;
            $includeFile($file);
 
            return true;
        }
 
        return null;
    }
 
    /**
     * Finds the path to the file where the class is defined.
     *
     * @param string $class The name of the class
     *
     * @return string|false The path if found, false otherwise
     */
    public function findFile($class)
    {
        // class map lookup
        if (isset($this->classMap[$class])) {
            return $this->classMap[$class];
        }
Arguments
  1. "/srv/www/bgphoenics2.invorbereitung.de/ilias/vendor/composer/../../Core/TwigComponents/Classes/Components/Favourites.php"
    
[internal]
Arguments
  1. "SeminarCatalog\Core\TwigComponents\Components\Favourites"
    
/srv/www/bgphoenics2.invorbereitung.de/ilias/Core/Object/Classes/Manager/ObjectManager.php
 */
class ObjectManager implements ObjectManagerInterface
{
 
 
    /**
     * @var array<class-string,Callable> $factories
     */
    protected static array $factories = [];
 
    /**
     * @var array<class-string,ObjectFactoryInterface> $factories
     */
    protected static array $factoriesInstance = [];
 
    protected static bool $testMode = false;
 
    public static function has(string $className) : bool {
        $className = self::mapClass($className);
        return class_exists($className) || interface_exists($className);
    }
 
    /**
     * @template Type
     * @param class-string<Type> $className
     * @param list<mixed> $constructorArguments
     * @return Type
     */
    public static function get(string $className, array $constructorArguments = []) {
        $className = self::mapClass($className);
 
        $instance = self::getInstanceVariable($className, $constructorArguments);
 
        if (method_exists($instance, '__inject')) {
            self::injectDependencies($instance);
        }
 
        return $instance;
    }
 
Arguments
  1. "SeminarCatalog\Core\TwigComponents\Components\Favourites"
    
/srv/www/bgphoenics2.invorbereitung.de/ilias/classes/Service/Wrapper/TwigTemplate.php
 
    public function renderBlock($name, array $context, array $blocks = [], $useBlocks = true): string
    {
        $template = $this->base->renderBlock($name, $context, $blocks, $useBlocks);
        return $this->parseSemiTags($template);
    }
 
    private function parseSemiTags(string $template): string
    {
        // modifier 's' makes, that the dot also matches newlines
        if (preg_match_all('/<xsem:(\S+)[^>]*>(.*?)<\/xsem:\1>/s', $template, $matches)) {
            for ($i = 0; $i < count($matches[0]); $i++) {
                $componentName = $matches[1][$i];
                $content = $matches[2][$i] ?? "";
                $completeTag = $matches[0][$i];
 
                $componentName = str_replace(':', '\\', $componentName);
 
                $class = '\SeminarCatalog\Core\TwigComponents\Components\\' . $componentName;
                if (!ObjectManager::has($class)) {
                    continue;
                }
 
                $component = ObjectManager::get($class, [ $this->twig->getGlobals()['controller'] ]);
                if (!$component instanceof TwigComponent) {
                    continue;
                }
 
                $arguments = $this->parseArguments($completeTag);
                $frontendArguments = [];
                foreach ($arguments as $argument) {
                    $key = $argument['key'];
                    $value = $argument['value'];
                    if (is_string($value) && str_starts_with($value, '_context_pass_')) {
                        $contextKey = substr($value, 14);
                        $value = $this->twig->getPassContext()[$contextKey];
                    }
                    $property = UtilityService::kebabToCamelCase($key);
                    if (property_exists($component, $property)) {
                        $setter = 'set' . ucfirst($property);
Arguments
  1. "SeminarCatalog\Core\TwigComponents\Components\Favourites"
    
/srv/www/bgphoenics2.invorbereitung.de/ilias/classes/Service/Wrapper/TwigTemplate.php
 
    public function getDebugInfo(): array
    {
        return $this->base->getDebugInfo();
    }
 
    public function getSourceContext(): Source
    {
        return $this->base->getSourceContext();
    }
 
    protected function doDisplay(array $context, array $blocks = []): Traversable|array
    {
        return $this->base->doDisplay($context, $blocks);
    }
 
    public function render(array $context = []): string
    {
        $template = $this->base->render($context);
        return $this->parseSemiTags($template);
    }
 
    public function renderBlock($name, array $context, array $blocks = [], $useBlocks = true): string
    {
        $template = $this->base->renderBlock($name, $context, $blocks, $useBlocks);
        return $this->parseSemiTags($template);
    }
 
    private function parseSemiTags(string $template): string
    {
        // modifier 's' makes, that the dot also matches newlines
        if (preg_match_all('/<xsem:(\S+)[^>]*>(.*?)<\/xsem:\1>/s', $template, $matches)) {
            for ($i = 0; $i < count($matches[0]); $i++) {
                $componentName = $matches[1][$i];
                $content = $matches[2][$i] ?? "";
                $completeTag = $matches[0][$i];
 
                $componentName = str_replace(':', '\\', $componentName);
 
                $class = '\SeminarCatalog\Core\TwigComponents\Components\\' . $componentName;
Arguments
  1. """
    \n
    \n
    \n
    <div class="catalog">\n
        <style>\n
        .tab-notice-danger {\n
            color: var(--il-danger-color);\n
        }\n
    \n
        .tab-notice-warning {\n
            color: var(--warning-color);\n
        }\n
        div.il_HeaderInner {\n
            /*Removes ilias header, since we render an semi header*/\n
            display: none !important;\n
        }\n
    \n
        #xsem.backend #xsemTopArea #xsemTopWrapper #xsemTabs .nav.nav-tabs > li#xsemMenuDropdownToggler div.xsem-menu-dropdown-menu {\n
            padding: 10px;\n
        }\n
    \n
        #xsem.backend #xsemTopArea #xsemTopWrapper #xsemTabs .nav.nav-tabs > li#xsemMenuDropdownToggler div.xsem-menu-dropdown-menu {\n
            display: none;\n
        }\n
        #xsem.backend #xsemTopArea #xsemTopWrapper #xsemTabs .nav.nav-tabs > li#xsemMenuDropdownToggler.show div.xsem-menu-dropdown-menu,\n
        #xsem.backend #xsemTopArea #xsemTopWrapper #xsemTabs .nav.nav-tabs > li#xsemMenuDropdownToggler.open div.xsem-menu-dropdown-menu {\n
            display: flex;\n
        }\n
    \n
        #xsem.backend #xsemTopArea #xsemTopWrapper #xsemTabs .nav.nav-tabs > li#xsemMenuDropdownToggler.active a {\n
            background-color: #fff;\n
            color: var(--main-color) !important;\n
        }\n
    \n
        #xsem.backend #xsemTopArea #xsemTopWrapper #xsemTabs .nav.nav-tabs > li#xsemMenuDropdownToggler.active a span.caret {\n
            color: var(--main-color) !important;\n
        }\n
    \n
        #xsem.backend #xsemTopArea #xsemTopWrapper #xsemTabs .nav.nav-tabs > li#xsemMenuDropdownToggler div.xsem-menu-dropdown-menu .dropdown-item {\n
            color: var(--darkblue) !important;\n
            display: block;\n
        }\n
    \n
        #xsem.backend #xsemTopArea #xsemTopWrapper #xsemTabs .nav.nav-tabs > li#xsemMenuDropdownToggler div.xsem-menu-dropdown-menu .dropdown-item:not(:first-child) {\n
            margin-top: 10px;\n
        }\n
    \n
        #xsem.backend #xsemTopArea #xsemTopWrapper #xsemTabs .nav.nav-tabs > li#xsemMenuDropdownToggler div.xsem-menu-dropdown-menu .dropdown-item.active {\n
            font-weight: bold;\n
        }\n
    </style>\n
        <svg width="20px" height="20px" viewBox="0 -0.5 33 33" display="none">\n
            <g id="Vivid.JS" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" transform="scale(1)">\n
                <g id="Vivid-Icons" transform="translate(-903.000000, -411.000000)" fill="currentColor">\n
                    <g id="Icons" transform="translate(37.000000, 169.000000)">\n
                        <g id="star" transform="translate(858.000000, 234.000000)">\n
                            <g transform="translate(7.000000, 8.000000)" id="Shape">\n
                                <polygon\n
                                        points="27.865 31.83 17.615 26.209 7.462 32.009 9.553 20.362 0.99 12.335 12.532 10.758 17.394 0 22.436 10.672 34 12.047 25.574 20.22">\n
                                </polygon>\n
                            </g>\n
                        </g>\n
                    </g>\n
                </g>\n
            </g>\n
        </svg>\n
    <div id="xsemTopArea" class="">\n
                    <nav aria-label="Brotkrumen" class="breadcrumb_wrapper xsem-breadcrumbs" data-a="seminarDetails"\n
             data-c="SeminarCatalog__Core__Catalog__Controller__CatalogController">\n
          <div class="breadcrumb">\n
                                <span class="crumb">\n
                    <a href="/kursangebot.html">Kursangebot</a>\n
                </span>\n
                                                <span class="crumb">\n
                                                                    <a href="/kursangebot/kurs/fachseminar-fuer-betriebselektrikerinnen-und-elektriker-28.html">Fachseminar für Betriebselektrikerinnen und -elektriker [1851 / FB]</a>\n
                        </span>\n
                                  </div>\n
        </nav>\n
      \n
            <div id="xsemTopWrapper" class="xsemHeaderNoTabs">\n
              <div id="xsemHeadline">\n
            <div class="headline">\n
                          <h1>\n
                                                    Fachseminar für Betriebselektrikerinnen und -elektriker [1851 / FB]\n
                                  \n
                                                                            </h1>\n
                                                                                                      \n
              \n
                                </div>\n
            <div class="headerContent">\n
                      </div>\n
          </div>\n
        \n
                                </div>\n
    \n
                  </div>\n
    \n
                <div id="xsemAlerts">\n
                \n
    \n
    \n
    \n
            </div>\n
        \n
    \n
    \n
    <div class="modal fade" id="xsem_header_object_modified_confirm_modal" tabindex="-1" role="dialog">\n
        <div class="modal-dialog modal-lg" role="document">\n
            <div class="modal-content">\n
                <div class="modal-header">\n
                    <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span></button>\n
                    <h4 class="modal-title">\n
                        Der Datensatz wurde geändert.\n
                    </h4>\n
                </div>\n
                <div class="modal-body">\n
                    <p>Dieser Datensatz wurde zwischenzeitlich zuletzt von <span id="xsem_header_object_modified_confirm_modal_user">N/A</span> vor <span id="xsem_header_object_modified_confirm_modal_time">N/A</span> geändert.</p>\n
                    <p>Es könnten wichtige Änderungen verloren gehen, möchten Sie trotzdem Ihre Änderungen übernehmen?</p>\n
                </div>\n
                <div class="modal-footer">\n
                    <button type="button" class="btn btn-default" data-dismiss="modal">Abbrechen</button>\n
                    <a type="button" class="btn btn-primary" id="xsem_header_object_modified_confirm_modal_btn">Bestätigen</a>\n
                </div>\n
            </div>\n
        </div>\n
    </div>\n
    \n
    <script type="text/javascript">\n
    \n
        const tabContainer = document.getElementById('xsemTabs');\n
        let realDropdownMenuBtnWidth = false;\n
        const dropdownMenuBtnWidthThreshold = 3;\n
        // Predicted width of dropdown btn, only for initialization, will be replaced later by automatic detection.\n
        let dropdownMenuBtnWidth = 99 + dropdownMenuBtnWidthThreshold;\n
        const dropdownMenuBtnLabel = "Mehr...";\n
        let previousWidth = 0;\n
        if (tabContainer) {\n
            previousWidth = tabContainer.getBoundingClientRect().width;\n
        }\n
    \n
        /**\n
         * Ensures that all tabs in the navigation bar are in one row only. Overflowing tabs are moved to a dropdown menu.\n
         *\n
         * Dynamically adjusts the contents of the dropdown based on the width of the navigation bar.\n
         * @author Justin Jansen <jjansen@databay.de>\n
         * @param init\n
         */\n
        function handleTabDropdown(init = false) {\n
            const availableWidth = tabContainer.getBoundingClientRect().width;\n
            // Important because ilias triggers several size changes due to the grid system\n
            if (!init && availableWidth === previousWidth) {\n
                return;\n
            }\n
            previousWidth = availableWidth;\n
    \n
            const tabList = tabContainer.querySelector('#xsemTabs .nav-tabs');\n
            const tabs = Array.from(tabList.children);\n
            let tabsToMove = [];\n
            tabsToMove = getTabsOverceedWidth(tabs, availableWidth, tabsToMove);\n
            const dropdownMenu = document.createElement('div');\n
            dropdownMenu.classList.add('xsem-menu-dropdown-menu', 'dropdown-menu');\n
    \n
            // Remove tabs from tab list and add them to dropdown menu\n
            let isDropTabActive = false;\n
            tabsToMove.forEach(tab => {\n
                const tabLink = tab.querySelector('a');\n
                if (tabLink) {\n
                    const dropdownTab = tabLink.cloneNode(true);\n
                    dropdownTab.classList.add('dropdown-item');\n
                    if (tab.classList.contains('active')) {\n
                        isDropTabActive = true;\n
                        dropdownTab.classList.add('active');\n
                    }\n
                    dropdownMenu.appendChild(dropdownTab);\n
                }\n
            });\n
    \n
            const dropdownBtn = document.getElementById('xsemMenuDropdownToggler');\n
            if (dropdownBtn) {\n
                dropdownBtn.remove()\n
            }\n
    \n
            if (tabsToMove.length > 0) {\n
                const dropdownBtn = document.createElement('li');\n
                dropdownBtn.classList.add('dropdown', 'pull-right');\n
                if (isDropTabActive) {\n
                    dropdownBtn.classList.add('active');\n
                }\n
                dropdownBtn.id = 'xsemMenuDropdownToggler';\n
                dropdownBtn.innerHTML = `\n
                <a href="#" class="dropdown-toggle" data-toggle="dropdown">` + dropdownMenuBtnLabel + ` <span class="caret"></span></a>\n
            `;\n
                dropdownBtn.appendChild(dropdownMenu);\n
                tabList.appendChild(dropdownBtn);\n
                if (!realDropdownMenuBtnWidth) {\n
                    getWidthOfDropdownBtn()\n
                }\n
            }\n
        }\n
    \n
        /**\n
         * Returns all tabs that exceed the specified available width.\n
         *\n
         * Uses a recursive solution to add only tabs that actually go over the available width without a dropdown button.\n
         * @author Justin Jansen <jjansen@databay.de>\n
         * @param tabs\n
         * @param availableWidth\n
         * @param overflowingTabs\n
         * @param initMove\n
         * @returns {*}\n
         */\n
        function getTabsOverceedWidth(tabs, availableWidth, overflowingTabs, initMove = false) {\n
            let totalWidth = 0;\n
    \n
            for (const tab of tabs) {\n
                totalWidth += getFullWidthOfTab(tab);\n
    \n
                if (tab.classList.contains('dropdown') || tab.classList.contains('xsem-menu-back-btn')) {\n
                    continue; // Skip certain tabs\n
                }\n
    \n
                if (totalWidth >= availableWidth) {\n
                    if (!initMove) {\n
                        return getTabsOverceedWidth(tabs, availableWidth - dropdownMenuBtnWidth, overflowingTabs, true);\n
                    }\n
                    overflowingTabs.push(tab);\n
                    tab.style.display = 'none';\n
                } else {\n
                    tab.style.display = 'inherit';\n
                    const index = overflowingTabs.indexOf(tab);\n
                    if (index > -1) {\n
                        overflowingTabs.splice(index, 1);\n
                    }\n
                }\n
            }\n
    \n
            return overflowingTabs;\n
        }\n
    \n
        /**\n
         * Fetches the complete width of the dropdown menu button, if any, and uses it for further calculations.\n
         *\n
         * An accurate solution if the button has a different size than originally intended (e.g. 90px) due to overriding styling.\n
         * The size is needed to give the dropdown menu button always enough space in the same row of the navigation bar and when the tabs have to disappear.\n
         * @author Justin Jansen <jjansen@databay.de>\n
         * @returns {number}\n
         */\n
        function getWidthOfDropdownBtn() {\n
            const dropdownBtn = document.getElementById('xsemMenuDropdownToggler');\n
    \n
            if (dropdownBtn) {\n
                realDropdownMenuBtnWidth = true;\n
                dropdownMenuBtnWidth = getFullWidthOfTab(dropdownBtn) + dropdownMenuBtnWidthThreshold;\n
            }\n
        }\n
    \n
        /**\n
         * Returns the complete width of the given element with margin, padding, border and offsetWidth included.\n
         * @author Justin Jansen <jjansen@databay.de>\n
         * @param element\n
         * @returns {number}\n
         */\n
        function getFullWidthOfTab(element) {\n
            const styles = getComputedStyle(element);\n
    \n
            const isHidden = styles.display === 'none';\n
    \n
            if (isHidden) {\n
                element.style.display = 'block';\n
            }\n
    \n
            // Get values of padding, border, and margin\n
            const paddingLeft = parseFloat(styles.paddingLeft);\n
            const paddingRight = parseFloat(styles.paddingRight);\n
            const borderLeft = parseFloat(styles.borderLeftWidth);\n
            const borderRight = parseFloat(styles.borderRightWidth);\n
            const marginLeft = parseFloat(styles.marginLeft);\n
            const marginRight = parseFloat(styles.marginRight);\n
    \n
            const fullWidth =\n
                element.offsetWidth +\n
                marginLeft + marginRight +\n
                paddingLeft + paddingRight +\n
                borderLeft + borderRight;\n
    \n
            if (isHidden) {\n
                element.style.display = 'none';\n
            }\n
    \n
            return fullWidth;\n
        }\n
    \n
        if (tabContainer) {\n
            $(function() {\n
                // Important because ilias triggers several size changes due to the grid system\n
                handleTabDropdown(true);\n
                // change debounce delay higher, it gets triggered to often\n
                const resizeObserver = new ResizeObserver(debounce(handleTabDropdown, 1));\n
                resizeObserver.observe(tabContainer);\n
            });\n
        }\n
    \n
            const fetchLastModifiedUrl = document.querySelector('[name="xsem-header-object-url"]')?.value;\n
    \n
    \n
    \n
    \n
    \n
        // add an event listener on every form submit and call fetchLastModified, then check with the data if the lastModifiedTime is bigger then modifiedTimestamp\n
        function submitForm(event) {\n
            setFormValidation(event.target, true);\n
            event.submitter.click();\n
        }\n
    \n
        function getCurrentLastModifiedTime() {\n
            let modifiedTimestamp = 0;\n
            const changeDate = document.querySelector('input[name="xsem-header-object-change-date"]');\n
            if (changeDate) {\n
                modifiedTimestamp = Number(changeDate.value);\n
            }\n
            return modifiedTimestamp;\n
        }\n
    \n
        let modifiedTimestamp = getCurrentLastModifiedTime();\n
        // if yes then show a confirm dialog if the user wants to leave the page\n
        if (modifiedTimestamp > 0) {\n
            document.addEventListener('submit', function (event) {\n
    \n
                const isValidated = isFormValidated(event.target);\n
                if (isValidated) {\n
                    return;\n
                }\n
    \n
                event.preventDefault();\n
                fetchLastObjectModified(fetchLastModifiedUrl)\n
                    .then(data => {\n
    \n
                        // if the fetch failed, just submit the form\n
                        if (!data.success) {\n
                            submitForm(event);\n
                            return;\n
                        }\n
                        let modifiedTimestamp = getCurrentLastModifiedTime();\n
                        const lastModifiedTime = Number(data.lastModifiedTime);\n
    \n
                        if (lastModifiedTime > modifiedTimestamp) {\n
                            initModal(event, data.lastModifiedBy, data.formattedLastModified);\n
                        } else {\n
                            submitForm(event);\n
                        }\n
                    });\n
            });\n
        }\n
    \n
        const initModal = (event, lastModifiedBy, formattedLastModified) => {\n
            const modal = document.getElementById('xsem_header_object_modified_confirm_modal');\n
            modal.querySelector('#xsem_header_object_modified_confirm_modal_user').innerText = lastModifiedBy;\n
            modal.querySelector('#xsem_header_object_modified_confirm_modal_time').innerText = formattedLastModified;\n
            const submitModalBtn = document.getElementById('xsem_header_object_modified_confirm_modal_btn');\n
            submitModalBtn.addEventListener('click', function () {\n
                submitForm(event);\n
            })\n
            $('#xsem_header_object_modified_confirm_modal').modal('show');\n
        }\n
    \n
        const setFormValidation = (form, isValidated) => {\n
            form.setAttribute('data-xsem-header-object-form-is-validate', isValidated ? '1' : '0');\n
        }\n
    \n
        const isFormValidated = (form) => {\n
            const value = form.getAttribute('data-xsem-header-object-form-is-validate',)\n
    \n
            return value === '1';\n
        }\n
    </script>\n
    \n
    \n
            <div id="seminarDetails" class="details">\n
                    <div class="row">\n
                            <div class="col-sm-12 col-md-9">\n
                    \n
                    \n
                    \n
                                        <div class="detailHeaderHeadline favourite-wrapper mb-l">\n
        <xsem:Favourites seminar="_context_pass_0" favouriteList="_context_pass_1"></xsem:Favourites>\n
                <h1>\n
                Fachseminar für Betriebselektrikerinnen und -elektriker\n
                <xsem:EditPencil\n
                        object="_context_pass_2"\n
                        link="/seminarverwaltung/kurse/28.html"\n
                        target="editSeminar"\n
                >\n
                </xsem:EditPencil>\n
            </h1>\n
                </div>\n
                    \n
                                        <div class="intro">\n
                            <p>Baustellen stellen besondere Anforderungen an den sicheren Umgang mit elektrischer Energie. Dieses Fachseminar richtet sich an Elektrofachkr&auml;fte, die im Bauwesen t&auml;tig sind und mit der Planung, Einrichtung und Kontrolle elektrischer Anlagen betraut sind. Die Teilnehmenden erhalten vertiefte Einblicke in rechtliche und technische Aspekte der Elektroinstallation auf Baustellen. Anhand typischer Fehlerquellen und praktischer Beispiele werden praxisrelevante Sicherheitsma&szlig;nahmen vermittelt &ndash; von der Auswahl elektrischer Betriebsmittel bis zur Zusammenarbeit mit Energieversorgern.</p>\n
                        </div>\n
                    \n
                                        <div class="description">\n
                            <p>Das Seminar vermittelt umfassende Kenntnisse &uuml;ber Gef&auml;hrdungen durch elektrische Energie auf Baustellen und deren sichere Beherrschung. Der Fokus liegt auf der Anwendung von Schutzma&szlig;nahmen, dem sicheren Betrieb von Maschinen und Betriebsmitteln sowie dem rechtssicheren Arbeiten unter Strom. Dar&uuml;ber hinaus werden Notfallma&szlig;nahmen bei Elektrounf&auml;llen behandelt. Neben der Theorie liegt ein besonderer Schwerpunkt auf dem Erfahrungsaustausch und der praxisnahen Umsetzung der Inhalte.</p>\n
                        </div>\n
                    \n
                                                                                        \n
    \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n
        <div class="seminarDetailsAccordion mt-l">\n
            <h2>Weitere Kursinformationen</h2>\n
    \n
            <div class="panel-group" id="accordionSeminarDetails" role="tablist" aria-multiselectable="true">\n
                                                                \t<div class="panel panel-accordion">\n
    \t\t<div id="headingContent"\n
    \t\t\t class="panel-heading collapsed"\n
    \t\t\t role="button"\n
    \t\t\t data-toggle="collapse"\n
    \t\t\t data-parent="#accordionSeminarDetails"\n
    \t\t\t href="#collapseContent"\n
    \t\t\t aria-expanded="true"\n
    \t\t\t aria-controls="collapseContent">\n
    \t\t\t<h4 class="panel-title">\n
    \t\t\t\tInhalte\n
    \t\t\t</h4>\n
    \t\t</div>\n
    \t\t<div id="collapseContent"\n
    \t\t\t class="panel-collapse collapse"\n
    \t\t\t role="tabpanel"\n
    \t\t\t aria-labelledby="headingContent">\n
    \t\t\t<div class="panel-body">\n
    \t\t\t\t\t\t\t\t\t<ul data-start="1728" data-end="2373">\r\n
    <li data-start="1728" data-end="1808">\r\n
    <p data-start="1730" data-end="1808">Verantwortung, Zust&auml;ndigkeiten und <strong data-start="1765" data-end="1776">Haftung</strong> im elektrotechnischen Bereich</p>\r\n
    </li>\r\n
    <li data-start="1809" data-end="1870">\r\n
    <p data-start="1811" data-end="1870">Analyse typischer <strong data-start="1829" data-end="1868">Elektrounf&auml;lle in der Bauwirtschaft</strong></p>\r\n
    </li>\r\n
    <li data-start="1871" data-end="1926">\r\n
    <p data-start="1873" data-end="1926">Sichere <strong data-start="1881" data-end="1924">Elektroenergieversorgung auf Baustellen</strong></p>\r\n
    </li>\r\n
    <li data-start="1927" data-end="1975">\r\n
    <p data-start="1929" data-end="1975">Schutzma&szlig;nahmen und <strong data-start="1949" data-end="1973">Anschlussbedingungen</strong></p>\r\n
    </li>\r\n
    <li data-start="1976" data-end="2032">\r\n
    <p data-start="1978" data-end="2032">Betrieb und Absicherung von <strong data-start="2006" data-end="2030">Ersatzstromerzeugern</strong></p>\r\n
    </li>\r\n
    <li data-start="2033" data-end="2097">\r\n
    <p data-start="2035" data-end="2097">Auswahl, Betrieb und Pr&uuml;fung elektrischer <strong data-start="2077" data-end="2095">Betriebsmittel</strong></p>\r\n
    </li>\r\n
    <li data-start="2098" data-end="2160">\r\n
    <p data-start="2100" data-end="2160">Umgang mit <strong data-start="2111" data-end="2158">Maschinen mit frequenzgesteuerten Antrieben</strong></p>\r\n
    </li>\r\n
    <li data-start="2161" data-end="2218">\r\n
    <p data-start="2163" data-end="2218"><strong data-start="2163" data-end="2184">Messen und Pr&uuml;fen</strong> elektrischer Anlagen und Ger&auml;te</p>\r\n
    </li>\r\n
    <li data-start="2219" data-end="2280">\r\n
    <p data-start="2221" data-end="2280">Risiken durch <strong data-start="2235" data-end="2278">Freileitungen und erdverlegte Leitungen</strong></p>\r\n
    </li>\r\n
    <li data-start="2281" data-end="2335">\r\n
    <p data-start="2283" data-end="2335">Koordination mit <strong data-start="2300" data-end="2333">Energieversorgungsunternehmen</strong></p>\r\n
    </li>\r\n
    <li data-start="2336" data-end="2373">\r\n
    <p data-start="2338" data-end="2373"><strong data-start="2338" data-end="2373">Erste Hilfe bei Elektrounf&auml;llen</strong></p>\r\n
    </li>\r\n
    </ul>\n
    \t\t\t\t\t\t\t</div>\n
    \t\t</div>\n
    \t</div>\n
    \t                                                                \t<div class="panel panel-accordion">\n
    \t\t<div id="headingTargetGroups"\n
    \t\t\t class="panel-heading collapsed"\n
    \t\t\t role="button"\n
    \t\t\t data-toggle="collapse"\n
    \t\t\t data-parent="#accordionSeminarDetails"\n
    \t\t\t href="#collapseTargetGroups"\n
    \t\t\t aria-expanded="true"\n
    \t\t\t aria-controls="collapseTargetGroups">\n
    \t\t\t<h4 class="panel-title">\n
    \t\t\t\tZielgruppen\n
    \t\t\t</h4>\n
    \t\t</div>\n
    \t\t<div id="collapseTargetGroups"\n
    \t\t\t class="panel-collapse collapse"\n
    \t\t\t role="tabpanel"\n
    \t\t\t aria-labelledby="headingTargetGroups">\n
    \t\t\t<div class="panel-body">\n
    \t\t\t\t\t\t\t\t\t<ul data-start="2418" data-end="2602">\r\n
    <li data-start="2418" data-end="2486">\r\n
    <p data-start="2420" data-end="2486"><strong data-start="2420" data-end="2441">Elektrofachkr&auml;fte</strong>, die in oder f&uuml;r Bauunternehmen t&auml;tig sind</p>\r\n
    </li>\r\n
    <li data-start="2487" data-end="2602">\r\n
    <p data-start="2489" data-end="2602">Personen, die mit der Planung, Pr&uuml;fung oder Inbetriebnahme elektrischer Einrichtungen auf Baustellen betraut sind</p>\r\n
    </li>\r\n
    </ul>\n
    \t\t\t\t\t\t\t</div>\n
    \t\t</div>\n
    \t</div>\n
    \t                                                                \t<div class="panel panel-accordion">\n
    \t\t<div id="headingRequirements"\n
    \t\t\t class="panel-heading collapsed"\n
    \t\t\t role="button"\n
    \t\t\t data-toggle="collapse"\n
    \t\t\t data-parent="#accordionSeminarDetails"\n
    \t\t\t href="#collapseRequirements"\n
    \t\t\t aria-expanded="true"\n
    \t\t\t aria-controls="collapseRequirements">\n
    \t\t\t<h4 class="panel-title">\n
    \t\t\t\tVoraussetzungen\n
    \t\t\t</h4>\n
    \t\t</div>\n
    \t\t<div id="collapseRequirements"\n
    \t\t\t class="panel-collapse collapse"\n
    \t\t\t role="tabpanel"\n
    \t\t\t aria-labelledby="headingRequirements">\n
    \t\t\t<div class="panel-body">\n
    \t\t\t\t\t\t\t\t\t<ul data-start="2633" data-end="2805">\r\n
    <li data-start="2633" data-end="2692">\r\n
    <p data-start="2635" data-end="2692">Es sind <strong data-start="2643" data-end="2677">keine Teilnahmevoraussetzungen</strong> erforderlich</p>\r\n
    </li>\r\n
    <li data-start="2693" data-end="2805">\r\n
    <p data-start="2695" data-end="2805">Eine elektrotechnische Ausbildung wird vorausgesetzt, da sich das Seminar ausschlie&szlig;lich an Fachkr&auml;fte richtet</p>\r\n
    </li>\r\n
    </ul>\n
    \t\t\t\t\t\t\t</div>\n
    \t\t</div>\n
    \t</div>\n
    \t                                                                \t<div class="panel panel-accordion">\n
    \t\t<div id="headingAgenda"\n
    \t\t\t class="panel-heading collapsed"\n
    \t\t\t role="button"\n
    \t\t\t data-toggle="collapse"\n
    \t\t\t data-parent="#accordionSeminarDetails"\n
    \t\t\t href="#collapseAgenda"\n
    \t\t\t aria-expanded="true"\n
    \t\t\t aria-controls="collapseAgenda">\n
    \t\t\t<h4 class="panel-title">\n
    \t\t\t\tProgramm\n
    \t\t\t</h4>\n
    \t\t</div>\n
    \t\t<div id="collapseAgenda"\n
    \t\t\t class="panel-collapse collapse"\n
    \t\t\t role="tabpanel"\n
    \t\t\t aria-labelledby="headingAgenda">\n
    \t\t\t<div class="panel-body">\n
    \t\t\t\t\t\t\t\t\t<p data-start="2864" data-end="2925"><strong data-start="2864" data-end="2925">Tag 1: Grundlagen, Gef&auml;hrdungen, rechtliche Anforderungen</strong></p>\r\n
    <ul data-start="2926" data-end="3217">\r\n
    <li data-start="2926" data-end="2967">\r\n
    <p data-start="2928" data-end="2967">Einf&uuml;hrung, Vorstellung, Seminarziele</p>\r\n
    </li>\r\n
    <li data-start="2968" data-end="3061">\r\n
    <p data-start="2970" data-end="3061">Verantwortung und Haftung &ndash; was bedeutet &bdquo;elektrotechnische Fachkraft&ldquo; auf der Baustelle?</p>\r\n
    </li>\r\n
    <li data-start="3062" data-end="3095">\r\n
    <p data-start="3064" data-end="3095">Analyse realer Elektrounf&auml;lle</p>\r\n
    </li>\r\n
    <li data-start="3096" data-end="3168">\r\n
    <p data-start="3098" data-end="3168">Sichere Elektroversorgung: Netzformen, Schutzkonzepte, Fehlerquellen</p>\r\n
    </li>\r\n
    <li data-start="3169" data-end="3217">\r\n
    <p data-start="3171" data-end="3217">Einsatz und Betrieb von Ersatzstromerzeugern</p>\r\n
    </li>\r\n
    </ul>\r\n
    <p data-start="3219" data-end="3273"><strong data-start="3219" data-end="3273">Tag 2: Betriebsmittel, Zusammenarbeit, Erste Hilfe</strong></p>\r\n
    <ul data-start="3274" data-end="3546">\r\n
    <li data-start="3274" data-end="3331">\r\n
    <p data-start="3276" data-end="3331">Auswahl und Betrieb elektrischer Maschinen und Ger&auml;te</p>\r\n
    </li>\r\n
    <li data-start="3332" data-end="3379">\r\n
    <p data-start="3334" data-end="3379">Anforderungen an frequenzgeregelte Antriebe</p>\r\n
    </li>\r\n
    <li data-start="3380" data-end="3442">\r\n
    <p data-start="3382" data-end="3442">Zusammenarbeit mit EVUs und baustellenbedingte Sonderf&auml;lle</p>\r\n
    </li>\r\n
    <li data-start="3443" data-end="3503">\r\n
    <p data-start="3445" data-end="3503">Erste Hilfe bei Elektrounf&auml;llen &ndash; Schock und Reanimation</p>\r\n
    </li>\r\n
    <li data-start="3504" data-end="3546">\r\n
    <p data-start="3506" data-end="3546">Erfahrungsaustausch, Abschlussdiskussion</p>\r\n
    </li>\r\n
    </ul>\n
    \t\t\t\t\t\t\t</div>\n
    \t\t</div>\n
    \t</div>\n
    \t                                                                \t<div class="panel panel-accordion">\n
    \t\t<div id="headingLearningGoals"\n
    \t\t\t class="panel-heading collapsed"\n
    \t\t\t role="button"\n
    \t\t\t data-toggle="collapse"\n
    \t\t\t data-parent="#accordionSeminarDetails"\n
    \t\t\t href="#collapseLearningGoals"\n
    \t\t\t aria-expanded="true"\n
    \t\t\t aria-controls="collapseLearningGoals">\n
    \t\t\t<h4 class="panel-title">\n
    \t\t\t\tLernziele\n
    \t\t\t</h4>\n
    \t\t</div>\n
    \t\t<div id="collapseLearningGoals"\n
    \t\t\t class="panel-collapse collapse"\n
    \t\t\t role="tabpanel"\n
    \t\t\t aria-labelledby="headingLearningGoals">\n
    \t\t\t<div class="panel-body">\n
    \t\t\t\t\t\t\t\t\t<p data-start="3580" data-end="3632">Nach dem Seminar sind die Teilnehmenden in der Lage:</p>\r\n
    <ul data-start="3633" data-end="3995">\r\n
    <li data-start="3633" data-end="3708">\r\n
    <p data-start="3635" data-end="3708">Gefahren durch elektrische Energie auf Baustellen korrekt einzusch&auml;tzen</p>\r\n
    </li>\r\n
    <li data-start="3709" data-end="3777">\r\n
    <p data-start="3711" data-end="3777">Verantwortung und Haftung in ihrem T&auml;tigkeitsbereich zu erkennen</p>\r\n
    </li>\r\n
    <li data-start="3778" data-end="3815">\r\n
    <p data-start="3780" data-end="3815">Schutzma&szlig;nahmen sicher umzusetzen</p>\r\n
    </li>\r\n
    <li data-start="3816" data-end="3882">\r\n
    <p data-start="3818" data-end="3882">Elektrische Betriebsmittel sicher auszuw&auml;hlen und zu betreiben</p>\r\n
    </li>\r\n
    <li data-start="3883" data-end="3951">\r\n
    <p data-start="3885" data-end="3951">Mit Energieversorgungsunternehmen zielf&uuml;hrend zusammenzuarbeiten</p>\r\n
    </li>\r\n
    <li data-start="3952" data-end="3995">\r\n
    <p data-start="3954" data-end="3995">Im Notfall richtig Erste Hilfe zu leisten</p>\r\n
    </li>\r\n
    </ul>\n
    \t\t\t\t\t\t\t</div>\n
    \t\t</div>\n
    \t</div>\n
    \t                                                                \t<div class="panel panel-accordion">\n
    \t\t<div id="headingQualification"\n
    \t\t\t class="panel-heading collapsed"\n
    \t\t\t role="button"\n
    \t\t\t data-toggle="collapse"\n
    \t\t\t data-parent="#accordionSeminarDetails"\n
    \t\t\t href="#collapseQualification"\n
    \t\t\t aria-expanded="true"\n
    \t\t\t aria-controls="collapseQualification">\n
    \t\t\t<h4 class="panel-title">\n
    \t\t\t\tAbschluss\n
    \t\t\t</h4>\n
    \t\t</div>\n
    \t\t<div id="collapseQualification"\n
    \t\t\t class="panel-collapse collapse"\n
    \t\t\t role="tabpanel"\n
    \t\t\t aria-labelledby="headingQualification">\n
    \t\t\t<div class="panel-body">\n
    \t\t\t\t\t\t\t\t\t<p>Die Teilnehmenden erhalten eine <strong data-start="4065" data-end="4091">Teilnahmebescheinigung</strong> &uuml;ber das absolvierte Fachseminar.</p>\n
    \t\t\t\t\t\t\t</div>\n
    \t\t</div>\n
    \t</div>\n
    \t                                                                \t<div class="panel panel-accordion">\n
    \t\t<div id="headingHints"\n
    \t\t\t class="panel-heading collapsed"\n
    \t\t\t role="button"\n
    \t\t\t data-toggle="collapse"\n
    \t\t\t data-parent="#accordionSeminarDetails"\n
    \t\t\t href="#collapseHints"\n
    \t\t\t aria-expanded="true"\n
    \t\t\t aria-controls="collapseHints">\n
    \t\t\t<h4 class="panel-title">\n
    \t\t\t\tHinweise\n
    \t\t\t</h4>\n
    \t\t</div>\n
    \t\t<div id="collapseHints"\n
    \t\t\t class="panel-collapse collapse"\n
    \t\t\t role="tabpanel"\n
    \t\t\t aria-labelledby="headingHints">\n
    \t\t\t<div class="panel-body">\n
    \t\t\t\t\t\t\t\t\t<p>&nbsp;</p>\r\n
    <ul>\r\n
    <li data-start="4149" data-end="4213">\r\n
    <p data-start="4151" data-end="4213"><strong data-start="4151" data-end="4161">Dauer:</strong> 14 Lehreinheiten (wahlweise zwei- oder dreit&auml;gig)</p>\r\n
    </li>\r\n
    <li data-start="4214" data-end="4268">\r\n
    <p data-start="4216" data-end="4268"><strong data-start="4216" data-end="4231">Zielgruppe:</strong> Nur f&uuml;r Elektrofachkr&auml;fte geeignet</p>\r\n
    </li>\r\n
    <li data-start="4269" data-end="4324">\r\n
    <p data-start="4271" data-end="4324">Es sind keine besonderen Arbeitsmittel mitzubringen</p>\r\n
    </li>\r\n
    <li data-start="4325" data-end="4397">\r\n
    <p data-start="4327" data-end="4397">Erfahrungsaustausch zwischen Teilnehmenden wird ausdr&uuml;cklich gef&ouml;rdert</p>\r\n
    </li>\r\n
    </ul>\r\n
    <p>&nbsp;</p>\n
    \t\t\t\t\t\t\t</div>\n
    \t\t</div>\n
    \t</div>\n
    \t                                    </div>\n
            <script type="text/javascript">\n
                //$('.panel-collapse').collapse();\n
            </script>\n
        </div>\n
                                        \n
                    \n
                    \n
                    \n
                    \n
                    \n
                    \n
                    <a name="courseDates"></a>\n
    \n
                                                                                    \n
                        <div class="mt-xl">\n
                                <form action="" method="POST">\n
            <input type="hidden" name="filter[send]" value="1"/>\n
            <div class="row cl-filter">\n
                <div class="col-sm-6">\n
                    <h2>Nächster Kurstermin</h2>\n
                </div>\n
                <div class="col-sm-6 cl-filter-languages">\n
                    <div class="pull-right">\n
                        <span>Kurssprachen</span>\n
                        \n
    <input type="hidden" name="filter[course_language][]" value=""><select id="selectMultiple68b8611c8c719" multiple="multiple" name="filter[course_language][]">\n
    \t                        <option value="1">Deutsch</option>\n
                        </select>\n
    <script type="text/javascript">\n
        $(document).ready(function () {\n
            $('#selectMultiple68b8611c8c719').multiselect({\n
                nonSelectedText: 'Nichts ausgewählt',\n
                nSelectedText: 'ausgewählt',\n
    \t\t\tallSelectedText : 'Alle ausgewählt',\n
    \t\t\tnumberDisplayed: 2,\n
                        });\n
        });\n
    </script>\n
    <style>\n
    .dropdown-menu .divider {\n
        height: 1px !important;\n
        margin: 9px 0 !important;\n
        background-color: #e5e5e5 !important;\n
    }\n
    </style>\n
    \n
    \n
                        <button class="btn btn-primary btn-sm"\n
                                name="filter[submit]"\n
                                type="submit">Filtern\n
                        </button>\n
                                        </div>\n
                </div>\n
            </div>\n
        </form>\n
    \n
                                                        \n
                                    <style>\n
    \t.xsem-related-bundles-event-btn {\n
    \t\tpadding: 3px 10px !important;\n
    \t\ttext-transform: uppercase !important;\n
    \t\tfont-weight: 500 !important;\n
    \t}\n
    </style>\n
    \t\t    \n
    \t<div class="card card-event card-sections card-bordered favourite-wrapper ">\n
    \t\t<xsem:Favourites seminar="_context_pass_3" favouriteList="_context_pass_4"></xsem:Favourites>\n
    \t\t<section class="card-header">\n
    \t\t\t\t\t\t<div class="row">\n
    \t\t\t\t<div class="col-xs-12 col-sm-6">\n
    \t\t\t\t\t<h5 class="card-column-headline">Kurstermin</h5>\n
    \t\t\t\t\t                26.09. - 01.10.2025\n
                \t\t\t\t\t\t\t\t\t\t\t<xsem:EditPencil\n
    \t\t\t\t\t\t\t\tobject="_context_pass_5"\n
    \t\t\t\t\t\t\t\tlink="/seminarverwaltung/kurse/fachseminar-fuer-betriebselektrikerinnen-und-elektriker-28/termine/fachseminar-fuer-betriebselektrikerinnen-und-elektriker-26.09.--01.10.2025-28/bearbeiten.html?parentObject=Seminar"\n
    \t\t\t\t\t\t\t\ttarget="editEvent"\n
    \t\t\t\t\t\t>\n
    \t\t\t\t\t\t</xsem:EditPencil>\n
    \t\t\t\t\t\t\t\t\t</div>\n
    \t\t\t\t<div class="col-xs-6 col-sm-3">\n
    \t\t\t\t\t<h5 class="card-column-headline">Kurssprache</h5>\n
    \t\t\t\t\t    <span class="nowrap">Deutsch <img src="./Customizing/global/plugins/Services/UIComponent/UserInterfaceHook/SeminarCatalog/Resources//img/flags/de.png" alt="Kurssprache: Deutsch"></span>\t\t\t\t</div>\n
    \t\t\t\t<div class="col-xs-6 col-sm-3">\n
    \t\t\t\t\t\t\t\t\t\t\t<h5 class="card-column-headline">Kurs-Nr.</h5>\n
    \t\t\t\t\t\t1851 / FB\n
    \t\t\t\t\t\t\t\t\t</div>\n
    \t\t\t</div>\n
    \t\t</section>\n
    \t\t<section class="card-body">\n
    \t\t\t<div class="row">\n
    \t\t\t\t<div class="col-xs-12 col-sm-6">\n
    \t\t\t\t\t\t\t\t\t\t\t<h5 class="card-column-headline">Kurs</h5>\n
    \t\t\t\t\t\n
    \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class="card-title">\n
    \t\t\t\t\t\t\t\n
        Fachseminar für Betriebselektrikerinnen und -elektriker\n
        <xsem:EditPencil\n
    \t\tobject="_context_pass_6"\n
    \t\tlink="/seminarverwaltung/kurse/fachseminar-fuer-betriebselektrikerinnen-und-elektriker-28/termine/fachseminar-fuer-betriebselektrikerinnen-und-elektriker-26.09.--01.10.2025-28/bearbeiten.html?parentObject=Seminar"\n
    \t\ttarget="editEvent"\n
    >\n
    </xsem:EditPencil>\n
    \t\t\t\t\t</div>\n
    \n
    \t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n
    \n
    \t\t\t\t<div class="col-xs-6 col-sm-3">\n
    \t\t\t\t\t\t\t\t\t\t\t<h5 class="card-column-headline">Kursort</h5>\n
    \t\t\t\t\t\t<xsem:FormatEventLocation event="_context_pass_7" cityOnly></xsem:FormatEventLocation>\n
    \t\t\t\t\t\t\t\t\t</div>\n
    \n
    \t\t\t\t <div class="col-xs-6 col-sm-3 online-event-pricecontainer">\n
    \t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t\t\t \t\t\t\t\t\t\t\t <h5 class="card-column-headline">Kursgebühr</h5>\n
    \t\t\t\t\t\t\t\t \t<div class="price-block">\n
    \t\t\t\t\t\t<p class="pb-best-price">\n
    \t\t\t\t\t\t\t<span class="pb-price">100,- EUR</span>\n
    \t\t\t\t<br><span class="pb-vat">\n
    \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n
    \t\t\t\t            \t\t</p>\n
            \n
    \t\t\t\t\t\t\t</div>\n
    \t\t\t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t<p>\n
                                            <a class="btn btn-primary booking"\n
                       href="/buchen/28.html?disabled=0">\n
                        Buchen\n
                    </a>\n
                                \n
    \n
    </p>\n
    \t\t\t\t\t \t\t\t\t\t \t\t\t\t </div>\n
    \t\t\t</div>\n
    \n
    \t\t\t\t\t</section>\n
    \t\t\t\t\t\t\t\t\t<section class="card-footer ce-accordion closed">\n
    \t\t\t\t\t<div class="ce-info">\n
                <div id="event-detail-row-28" class="row">\n
                <div class="col-sm-12 col-md-6 mb-l">\n
                                <div class="info-table">\n
                        <div class="table-row wide">\n
                            <div class="label-column">Kursort:</div>\n
                            <div class="info-column">\n
                                <div class="location">\n
                                        \n
                <p>\n
                <b>Schulungszentrum für Bauwesen</b>\n
            </p>\n
        \n
        <div class="address-row info-table info-table-small">\n
                        <div class="table-row">\n
                    <div class="icon-column">\n
                    <span class="glyphicon glyphicon-record"\n
                          title="Raum"></span>\n
                    </div>\n
                    <div class="info-column">\n
                        233\n
                    </div>\n
                </div>\n
                                <div class="table-row">\n
                    <div class="icon-column">\n
                    <span class="glyphicon glyphicon-home"\n
                          title="Gebäude"></span>\n
                    </div>\n
                    <div class="info-column">\n
                        Westtrakt                                    </div>\n
                </div>\n
                    <div class="table-row">\n
                <div class="icon-column">\n
                    <span class="glyphicon glyphicon-map-marker"\n
                          title="Anschrift"></span>\n
                </div>\n
                <div class="info-column">\n
                    Venloer Str. 1,\n
                    50829 Köln            </div>\n
            </div>\n
        </div>\n
                                    </div>\n
                            </div>\n
                        </div>\n
                    </div>\n
                \n
                 \n
                                            \n
                         </div>\n
        \n
            <div class="col-sm-12 col-md-6 mb-l">\n
    \n
            <div class="map">\n
                                            <div class="event-details-map mb-m">\n
                                            <!-- OPENSTREETMAPS START -->\n
                                        <div id="maploc3-68b8611ca087a"\n
                             class="mapBlock mt-m mb-m"\n
                             style="height: 200px; width: 100%"\n
                             data-mapdata='{"id":"loc3-68b8611ca087a","searchText":"Venloer Str. 1 50829 K\u00f6ln ","description":"Schulungszentrum f\u00fcr Bauwesen<br>Venloer Str. 1<br>50829 K\u00f6ln<br>"}'\n
                             data-longitude="6.9012249"\n
                             data-latitude="50.9567170">\n
                        </div>\n
                                    <!-- OPENSTREETMAPS END -->\n
                        </div>\n
                                        <div id="navloc3-68b8611ca087a" class="mapNavigation text-right mb-m">\n
                        <a class="btn btn-primary mapNavigationLink"\n
                           id="navLinkloc3-68b8611ca087a"\n
                           target="_blank"\n
                           href="https://www.google.de/maps/dir//Venloer Str. 1 50829 Köln ">\n
                            Routenplaner\n
                        </a>\n
                    </div>\n
                                    </div>\n
    \n
                        </div>\n
        </div>\n
        \n
                \n
                        \n
        \n
                        \n
                \n
                \n
        \n
        \n
        \n
        \n
        <div class="row">\n
            <div class="col-sm-12 col-md-6 mb-l">\n
                <div class="info-table">\n
                    \n
                    \n
                        \n
                    \n
                    \n
                    \n
                    \n
    \n
                    \n
                                </div>\n
    \n
                        </div>\n
                </div>\n
    \n
        </div>\n
    \n
    <div id="cancellation-info28">\n
        <div style="padding-top:30px;">\n
            \n
        </div>\n
    </div>\n
    <style>\n
        #xsem #cancellation-info28 {\n
            display: none;\n
        }\n
    </style>\n
    \t\t\t\t\t<div class="ce-accordion-header">\n
    \t\t\t\t\t\t<button id="btnOpenAccordion28">Weitere Informationen</button>\n
    \t\t\t\t\t</div>\n
    \t\t\t\t</section>\n
    \t\t\t\t\t\t</div>\n
    \n
                                                                            </div>\n
                    \n
                    \n
                    \n
                    \n
                    \n
                    \n
                    \n
                                        <div class="mt-xl">\n
                            \n
    \n
    \n
                        </div>\n
                    \n
                    \n
                    <p id="BackToCourseSelection" class="mt-xl">\n
                        <a href="/kursangebot.html"\n
                           class="btn btn-primary">Zur Kursauswahl</a>\n
                    <p>\n
                </div>\n
                \n
                <div class="col-sm-12 col-md-3">\n
                    <p class="mb-m">\n
                        <a class="btn btn-anker"\n
                           href="#courseDates"\n
                           onclick="scrollToAnchor('courseDates');return false;"\n
                        >\n
                            Zu den Kursen\n
                        </a>\n
                    </p>\n
    \n
                                    \n
                                </div>\n
                        </div>\n
        </div>\n
    </div>\n
    """
    
/srv/www/bgphoenics2.invorbereitung.de/ilias/vendor/twig/twig/src/TemplateWrapper.php
 
    /**
     * @return iterable<scalar|\Stringable|null>
     */
    public function stream(array $context = []): iterable
    {
        yield from $this->template->yield($context);
    }
 
    /**
     * @return iterable<scalar|\Stringable|null>
     */
    public function streamBlock(string $name, array $context = []): iterable
    {
        yield from $this->template->yieldBlock($name, $context);
    }
 
    public function render(array $context = []): string
    {
        return $this->template->render($context);
    }
 
    /**
     * @return void
     */
    public function display(array $context = [])
    {
        // using func_get_args() allows to not expose the blocks argument
        // as it should only be used by internal code
        $this->template->display($context, \func_get_args()[1] ?? []);
    }
 
    public function hasBlock(string $name, array $context = []): bool
    {
        return $this->template->hasBlock($name, $context);
    }
 
    /**
     * @return string[] An array of defined template block names
     */
Arguments
  1. array:5 [
      "seminar" => SeminarCatalog\Core\Seminar\Model\Seminar {#3341}
      "currentEvent" => null
      "currentUser" => SeminarCatalog\Core\User\Model\User {#382}
      "filter" => null
      "relatedBundles" => []
    ]
    
/srv/www/bgphoenics2.invorbereitung.de/ilias/Core/Catalog/Classes/Controller/CatalogController.php
        }
        if ($seminar->getType() == \SeminarCatalog\Core\Seminar\Model\Seminar::TYPE_EXTERNAL) {
            //return $this->redirect('catalog');
        }
        $this->setPageTitle($seminar->getTitle());
 
        $template = $this->twig->load('SeminarDetails.twig');
 
        $HeadHtmlService = ObjectManager::get(HeadHtmlService::class);
        $HeadHtmlService->addMetaTag('keywords', $seminar->getTags());
 
        if (!$seminar->isVisible(-1, true)) {
            throw new \SeminarCatalog\Exception\PublicException;
        }
 
        $relatedBundles = ObjectManager::get(BundleRepository::class)->getRelatedBundlesBySeminar($seminar);
 
 
 
        return $template->render(
            array(
                'seminar' => $seminar,
                'currentEvent' => $this->eventRepository->findOneById($eventId),
                'currentUser' => $this->currentUser,
                'filter' => $_SESSION[FilterService::$filterMap[self::class]] ?? null,
                'relatedBundles' => $relatedBundles,
 
            )
        );
    }
 
    /**
     * @access isAnybody
     *
     * @param int $parentId
     * @param string $eventType
     * @param int $showEventRequests
     *
     * @return RedirectControllerResult|string
     * @throws PublicException
Arguments
  1. array:5 [
      "seminar" => SeminarCatalog\Core\Seminar\Model\Seminar {#3341}
      "currentEvent" => null
      "currentUser" => SeminarCatalog\Core\User\Model\User {#382}
      "filter" => null
      "relatedBundles" => []
    ]
    
/srv/www/bgphoenics2.invorbereitung.de/ilias/classes/Controller/BaseController.php
                    $this,
                    'handleParameters',
                    $_GET
                );
 
                $this->handleParameters(...$params);
            }
 
            if (method_exists($this, 'initializeAction')) {
                $params = ClassService::convertGetValuesToMethodParameterValues(
                    $this,
                    'initializeAction',
                    $_GET
                );
                $this->initializeAction(...$params);
            }
 
            $cmd = $cmd . 'Action';
            $params = ClassService::convertGetValuesToMethodParameterValues($this, $cmd, $_GET);
            $html = $this->$cmd(...$params);
 
            global $tpl;
 
            if ($tpl) {
                if ($this->getPageTitle() != '') {
                    $tpl->setTitle($this->getPageTitle());
                } else {
                    // This is a bad idea because it will break the page title in the repository
                    $tpl->setTitle(LanguageService::translate('default_page_header'));
                }
 
                if ($this->getPageIcon() != '') {
                    $tpl->setTitleIcon($this->getPageIcon());
                }
            }
 
            return $html;
        }
 
        throw new AuthenticationException(get_class($this), $cmd);
Arguments
  1. "28"
    
  2. null
    
  3. null
    
/srv/www/bgphoenics2.invorbereitung.de/ilias/classes/SeminarCatalogKernel.php
 
            $router = ObjectManager::get(\SeminarCatalog\Core\Routing\Service\CoreRouter::class);
 
            try {
                if ($request->getRequestUri()) {
                    if (strpos($request->getRequestUri(), '/index.php?') === 0) {
                        throw new ResourceNotFoundException('URLs starting with /index.php? are not allowed');
                    }
                }
                $match  = $router->match($request);
                $router->resolveMatch($match);
                $controller = $match[$configurationService->getControllerGetParameterName()];
                $request->query->add($match);
 
                $controller = UtilityService::prepareClassNameFromUrl($controller);
                $controller = self::checkAccessAndGetControllerInstance(
                    $controller,
                    $configurationService
                );
                $response = $controller->handleCmd($request);
 
            } catch(NoConfigurationException|ResourceNotFoundException $e) {
                // Fallback to legacy Routing
                $controller = $request->get($configurationService->getControllerGetParameterName());
                if ($controller == "") {
                    throw new \Exception("No route found");
                }
 
 
                $controller = UtilityService::prepareClassNameFromUrl($controller);
                $controller = self::checkAccessAndGetControllerInstance(
                    $controller,
                    $configurationService
                );
                $response = $controller->handleCmd();
            }
 
            return $this->handleControllerResponse($response, $request, $controller);
        } catch(\Throwable $e) {
 
Arguments
  1. Symfony\Component\HttpFoundation\Request {#543
      +attributes: Symfony\Component\HttpFoundation\ParameterBag {#533}
      +request: Symfony\Component\HttpFoundation\InputBag {#531}
      +query: Symfony\Component\HttpFoundation\InputBag {#532}
      +server: Symfony\Component\HttpFoundation\ServerBag {#536}
      +files: Symfony\Component\HttpFoundation\FileBag {#535}
      +cookies: Symfony\Component\HttpFoundation\InputBag {#534}
      +headers: Symfony\Component\HttpFoundation\HeaderBag {#537}
      #content: null
      #languages: null
      #charsets: null
      #encodings: null
      #acceptableContentTypes: null
      #pathInfo: "//kursangebot/kurs/28.html"
      #requestUri: "//kursangebot/kurs/28.html"
      #baseUrl: ""
      #basePath: null
      #method: "GET"
      #format: null
      #session: null
      #locale: null
      #defaultLocale: "en"
      -preferredFormat: null
      -isHostValid: true
      -isForwardedValid: true
      -isSafeContentPreferred: null
      -isIisRewrite: false
      basePath: ""
      format: "html"
    }
    
/srv/www/bgphoenics2.invorbereitung.de/ilias/index.php
use SeminarCatalog\Rest\Utility\ControllerResultInterface;
use Symfony\Component\HttpFoundation\Request;
 
 
require_once __DIR__ . '/classes/SeminarCatalogKernel.php';
 
error_reporting(error_reporting() & ~E_NOTICE);
ini_set('display_errors', 1);
apcu_clear_cache();
 
$whoops = new \Whoops\Run;
$whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler);
$whoops->register();
 
define("standalone2",true);
define("DEVMODE",true);
 
$kernel = new \SeminarCatalogKernel();
$kernel->boot();
$response = $kernel->handleRequest(ObjectManager::get(Request::class));
 
if ($response instanceof \Symfony\Component\HttpFoundation\Response || $response instanceof ControllerResultInterface) {
    $response->send();
} else {
    if (is_string($response)) {
        echo $response;
    } else {
        throw new \Exception('Invalid response type given. Only Response|String is valid.');
    }
}
 
// http://localhost:32768/?scontroller=SeminarCatalog__Core__Catalog__Controller__CatalogController&saction=catalog
 
Arguments
  1. Symfony\Component\HttpFoundation\Request {#543
      +attributes: Symfony\Component\HttpFoundation\ParameterBag {#533}
      +request: Symfony\Component\HttpFoundation\InputBag {#531}
      +query: Symfony\Component\HttpFoundation\InputBag {#532}
      +server: Symfony\Component\HttpFoundation\ServerBag {#536}
      +files: Symfony\Component\HttpFoundation\FileBag {#535}
      +cookies: Symfony\Component\HttpFoundation\InputBag {#534}
      +headers: Symfony\Component\HttpFoundation\HeaderBag {#537}
      #content: null
      #languages: null
      #charsets: null
      #encodings: null
      #acceptableContentTypes: null
      #pathInfo: "//kursangebot/kurs/28.html"
      #requestUri: "//kursangebot/kurs/28.html"
      #baseUrl: ""
      #basePath: null
      #method: "GET"
      #format: null
      #session: null
      #locale: null
      #defaultLocale: "en"
      -preferredFormat: null
      -isHostValid: true
      -isForwardedValid: true
      -isSafeContentPreferred: null
      -isIisRewrite: false
      basePath: ""
      format: "html"
    }
    

Environment & details:

Key Value
args
"/kursangebot/kurs/28.html"
_route
"seminar_details_catalog"
saction
"seminarDetails"
scontroller
"SeminarCatalog__Core__Catalog__Controller__CatalogController"
lang
"de"
entryId
"28"
request
Symfony\Component\HttpFoundation\Request {#543
  +attributes: Symfony\Component\HttpFoundation\ParameterBag {#533}
  +request: Symfony\Component\HttpFoundation\InputBag {#531}
  +query: Symfony\Component\HttpFoundation\InputBag {#532}
  +server: Symfony\Component\HttpFoundation\ServerBag {#536}
  +files: Symfony\Component\HttpFoundation\FileBag {#535}
  +cookies: Symfony\Component\HttpFoundation\InputBag {#534}
  +headers: Symfony\Component\HttpFoundation\HeaderBag {#537}
  #content: null
  #languages: null
  #charsets: null
  #encodings: null
  #acceptableContentTypes: null
  #pathInfo: "//kursangebot/kurs/28.html"
  #requestUri: "//kursangebot/kurs/28.html"
  #baseUrl: ""
  #basePath: null
  #method: "GET"
  #format: null
  #session: null
  #locale: null
  #defaultLocale: "en"
  -preferredFormat: null
  -isHostValid: true
  -isForwardedValid: true
  -isSafeContentPreferred: null
  -isIisRewrite: false
  basePath: ""
  format: "html"
}
empty
empty
empty
empty
Key Value
PHP_MAX_INPUT_TIME
"600"
PHP_UPLOAD_MAX_FILESIZE
"512M"
PHP_START_SERVERS
"10"
LANGUAGE
"en_US:en"
HOSTNAME
"php8.2-fpm"
PHP_POOL_NAME
"www_8.2"
PHP_MAX_FILE_UPLOADS
"20"
PHP_INI_DIR
"/usr/local/etc/php"
PHP_OPCACHE_MEMORY_CONSUMPTION
"256M"
PHP_SESSION_GC_MAX_LIFETIME
"3600"
HOME
"/var/www"
PHP_LDFLAGS
"-Wl,-O1 -pie"
PHP_OPCACHE_INTERNED_STRINGS_BUFFER
"32"
PHP_CFLAGS
"-fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
PHP_VERSION
"8.2.28"
PHP_MAX_INPUT_VARS
"4000"
GPG_KEYS
"39B641343D8C104B2B146DC3F9C39DC0B9698544 E60913E4DF209907D8E30D96659A97C9CF2A795A 1198C0117593497A5EC5C199286AF1F9897469DC"
PHP_OPCACHE_JIT
"1255"
PHP_USER
"www-data"
PHP_GROUP
"www-data"
PHP_CPPFLAGS
"-fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
PHP_ASC_URL
"https://www.php.net/distributions/php-8.2.28.tar.xz.asc"
PHP_POST_MAX_SIZE
"512M"
OPENSSL_CONF
"/etc/ssl/openssl.cnf"
PHP_URL
"https://www.php.net/distributions/php-8.2.28.tar.xz"
PHP_MAX_EXECUTION_TIME
"600"
PATH
"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
PHP_MAX_CHILDREN
"20"
PHP_MEMORY_LIMIT
"512M"
PHP_SESSION_SAVE_PATH
"/tmp"
LANG
"en_US.UTF-8"
PHP_OPCACHE_HUGE_CODE_PAGES
"0"
PHP_SESSION_CACHE_EXPIRE
"180"
PHP_OPCACHE_MAX_ACCELERATED_FILES
"32000"
PHP_OPCACE_JIT_BUFFER_SIZE
"32M"
PHP_APP_NAME
"www_8.2"
PHP_LISTEN_PORT
"9000"
PHP_MIN_SPARE_SERVERS
"10"
PHP_MAX_REQUESTS
"5000"
PHPIZE_DEPS
"autoconf \t\tdpkg-dev \t\tfile \t\tg++ \t\tgcc \t\tlibc-dev \t\tmake \t\tpkg-config \t\tre2c"
LC_ALL
"en_US.UTF-8"
PWD
"/var/www/html"
PHP_SOAP_WSDL_CACHE_DIR
"/tmp/"
PHP_SHA256
"af8c9153153a7f489153b7a74f2f29a5ee36f5cb2c6c6929c98411a577e89c91"
PHP_MAX_SPARE_SERVERS
"10"
TZ
"Europe/Berlin"
LDAPTLS_REQCERT
"hard"
PHP_PROCESS_MODELL
"ondemand"
USER
"www-data"
HTTP_ACCEPT_ENCODING
"gzip, br, zstd, deflate"
HTTP_USER_AGENT
"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)"
HTTP_ACCEPT
"*/*"
HTTP_CONNECTION
"close"
HTTP_HTTPS
"on"
HTTP_X_SSL
"on"
HTTP_X_FORWARDED_PORT
"443"
HTTP_X_FORWARDED_PROTO
"https"
HTTP_X_FORWARDED_HOST
"bgphoenics2.invorbereitung.de"
HTTP_X_FORWARDED_FOR
"216.73.216.114"
HTTP_X_REAL_IP
"216.73.216.114"
HTTP_X_HOST
"bgphoenics2.invorbereitung.de"
HTTP_HOST
"bgphoenics2.invorbereitung.de"
REDIRECT_STATUS
"200"
SERVER_NAME
"bgphoenics2.invorbereitung.de"
SERVER_PORT
"80"
SERVER_ADDR
"172.25.64.37"
REMOTE_PORT
""
REMOTE_ADDR
"216.73.216.114"
SERVER_SOFTWARE
"nginx/1.26.0"
GATEWAY_INTERFACE
"CGI/1.1"
REQUEST_SCHEME
"http"
SERVER_PROTOCOL
"HTTP/1.1"
DOCUMENT_ROOT
"/srv/www/bgphoenics2.invorbereitung.de/ilias"
DOCUMENT_URI
"/index.php"
REQUEST_URI
"//kursangebot/kurs/28.html"
SCRIPT_NAME
"/index.php"
CONTENT_LENGTH
""
CONTENT_TYPE
""
REQUEST_METHOD
"GET"
QUERY_STRING
"args=/kursangebot/kurs/28.html"
SCRIPT_FILENAME
"/srv/www/bgphoenics2.invorbereitung.de/ilias/index.php"
PATH_INFO
""
FCGI_ROLE
"RESPONDER"
PHP_SELF
"/index.php"
REQUEST_TIME_FLOAT
1756913948.1458
REQUEST_TIME
1756913948
empty
0. Whoops\Handler\PrettyPageHandler