Error 500 Internal Server Error

GET https://dev.jem-formation.fr/configuration.php.bak/privacy-policy

Forwarded to ErrorController (966a0d)

Exceptions

Impossible to access an attribute ("firstName") on a null variable in base.html.twig at line 287.

Exception

Twig\Error\ RuntimeError

Show exception properties
Twig\Error\RuntimeError {#2000
  -lineno: 287
  -rawMessage: "Impossible to access an attribute ("firstName") on a null variable."
  -source: Twig\Source {#1941
    -code: """
      <!DOCTYPE html>\n
      <html lang="{{ app.request.locale }}" hrefLang="{{ app.request.locale }}">\n
        <head>\n
          <script>\n
            const setTheme = (theme) => {\n
              theme ??= localStorage.theme || 'light'\n
              document.documentElement.dataset.theme = theme\n
              document.documentElement.setAttribute('data-bs-theme', theme)\n
              localStorage.theme = theme\n
            }\n
            setTheme()\n
          </script>\n
          <meta charset="UTF-8" />\n
          <meta http-equiv="X-UA-Compatible" content="IE=edge" />\n
          <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />\n
          <meta name="theme-color" content="#317EFB" />\n
          {% block seo %}\n
            <meta name="robots" content="index, follow" />\n
            <meta name="title" content="{{ 'global.meta_title'|trans({'%platformName%': platformName }) }}" />\n
            <meta name="description" content="{{ 'global.meta_description'|trans }}">\n
            <!--Seo Réseaux-->\n
            <meta property="og:title" content="{{ 'global.meta_title'|trans({'%platformName%': platformName }) }}">\n
            <meta property="og:type" content=website >\n
            <meta property="og:description" content="{{ 'global.meta_description'|trans }}">\n
            <meta property="og:image" content="{{ asset('/website/' ~ platformLogoPath) }}">\n
            <meta property="og:site_name" content="{{ 'global.meta_title'|trans({'%platformName%': platformName }) }}">\n
            <meta property="og:url" content="{{ app.request.getSchemeAndHttpHost() }}">\n
            <!--Seo Twitter-->\n
            <meta property="twitter:title" content="{{ 'global.meta_title'|trans({'%platformName%': platformName }) }}">\n
            <meta property="twitter:type" content=website >\n
            <meta property="twitter:description" content="{{ 'global.meta_description'|trans }}">\n
            <meta property="twitter:image" content="{{ asset('/website/' ~ platformLogoPath) }}">\n
            <meta name="twitter:card" content=summary >\n
          {% endblock %}\n
      \n
          <title>\n
            {% block title %}\n
      \n
            {% endblock %}&nbsp;- {{ 'global.meta_title'|trans({'%platformName%': platformName }) }}\n
          </title>\n
          <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">\n
          <link rel="icon" type="image/png" sizes="32x32" href="{{ asset('/images/favicon-32x32.png') }}" />\n
          <link rel="icon" type="image/png" sizes="16x16" href="{{ asset('/images/favicon-16x16.png') }}" />\n
          <link rel="manifest" href="/site.webmanifest">\n
          <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css" integrity="sha512-MV7K8+y+gLIBoVD59lQIYicR65iaqukzvf/nwasF0nqhPay5w/9lJmVM2hMDcnK1OnMGCdVK+iQrJ7lzPJQd1w==" crossorigin="anonymous" referrerpolicy="no-referrer" />\n
          <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome-animation/0.2.1/font-awesome-animation.min.css" />\n
          <link rel="stylesheet" href="https://unpkg.com/@sjmc11/tourguidejs/dist/css/tour.min.css">\n
      \n
          <link rel="stylesheet" href="{{ asset('css/bootstrap/bootstrap.min.css') }}" />\n
          {# Permet de personnaliser les vidéos #}\n
          {# <link href="https://vjs.zencdn.net/8.10.0/video-js.css" rel="stylesheet" /> #}\n
          {# Permet d'afficher le code formaté pour les cours #}\n
          {# <link rel="stylesheet" href="{{ asset('css/prism.css') }}" /> #}\n
          <link rel="stylesheet" href="{{ asset('css/colors.css') }}" />\n
          <link rel="stylesheet" href="{{ asset('css/app.css') }}" />\n
          <link rel="stylesheet" href="{{ asset('css/feedback.css') }}" />\n
          <link rel="stylesheet" href="{{ asset('css/notifications.css') }}" />\n
          <link rel="stylesheet" href="{{ asset('css/chatbot.css') }}" />\n
          <link rel="stylesheet" href="//cdn.datatables.net/1.13.4/css/jquery.dataTables.min.css" />\n
          <link rel="stylesheet" href="//cdn.datatables.net/2.1.0/css/dataTables.dataTables.min.css" />\n
          <link href="https://cdn.datatables.net/v/bs5/jq-3.7.0/dt-2.1.0/af-2.7.0/r-3.0.2/datatables.min.css" rel="stylesheet">\n
      \n
          {# <link rel="stylesheet" href="//cdn.datatables.net/responsive/3.0.2/css/responsive.dataTables.css" /> #}\n
          {% block stylesheets %}\n
            {{ encore_entry_link_tags('app') }}\n
          {% endblock %}\n
          <script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>\n
          {# <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/5.3.0/js/bootstrap.bundle.min.js"></script> #}\n
          <script src="https://cdn.datatables.net/v/bs5/jq-3.7.0/dt-2.1.0/af-2.7.0/r-3.0.2/datatables.min.js"></script>\n
          <script src="{{ asset('js/bootstrap/bootstrap.bundle.min.js') }}"></script>\n
          <script src="https://cdn.jsdelivr.net/npm/fullcalendar@6.1.14/index.global.min.js"></script>\n
          {% block javascripts %}\n
              {{ encore_entry_script_tags('app') }}\n
            {# {% block importmap %}\n
              {{ importmap('app') }}\n
            {% endblock %} #}\n
          {% endblock %}\n
        </head>\n
        <body>\n
          {% block body %}\n
            {% block header %}\n
              <nav class="navbar navbar-expand-lg navbar-light border-bottom border-light sticky-top bg-v1-primary" id="navbar">\n
                <div class="container-fluid">\n
                  <a class="navbar-brand" href="{{ path('app_home') }}"><img src="{{ (platformLogoPath starts with "http" or platformLogoPath starts with "https" ? platformLogoPath : asset('/website/' ~ platformLogoPath)) }}" height="125" alt="{{ platformLogoName }}" id="logo_platform" /></a>\n
                  <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button>\n
                  <div class="collapse navbar-collapse" id="navbarText">\n
                    <ul class="navbar-nav me-auto mb-2 mb-lg-0">\n
                      <li class="nav-item">\n
                        <a class="nav-link" aria-current="page" href="{{ path('app_home') }}">{{ 'header.home'|trans }}</a>\n
                      </li>\n
                      <li class="nav-item">\n
                        <a class="nav-link" href="{{ path('app_modules') }}">{{ 'header.modules'|trans }}</a>\n
                      </li>\n
                      {% if is_granted('ROLE_ADMIN') %}\n
                        <li class="nav-item">\n
                          <a class="nav-link" href="{{ path('admin') }}">{{ 'header.administration'|trans }}</a>\n
                        </li>\n
                      {% endif %}\n
                      <li class="nav-item">\n
                        <a class="nav-link" href="{{ path('app_mailbox') }}">{{ 'header.mailbox'|trans }}</a>\n
                      </li>\n
                      <li class="nav-item">\n
                        <a class="nav-link" href="{{ path('app_q_and_a') }}">{{ 'header.faq'|trans }}</a>\n
                      </li>\n
                      {# <li class="nav-item">\n
                        <form action="{{ path('_update_session_filter') }}">\n
                          <select name="form_filter_session" id="form_filter_session" class="form-select pe-5" onchange="this.form.submit();">\n
                            <option value="-1">Tout le secteur</option>\n
                            <option value="0" selected="">Toutes mes sessions</option>\n
                          </select>\n
                        </form>\n
                      </li> #}\n
                    </ul>\n
                    {% if app.environment is same as("dev") %}\n
                    <ul class="navbar-nav me-auto mb-2 mb-lg-0 text-white bg-danger px-2">\n
                      <li>DEBUG</li>\n
                    </ul>\n
                    {% endif %}\n
                    \n
                    {% if app.request.get('_locale') is defined and app.request.get('_locale') is not empty %}\n
                    <ul class="navbar-nav ms-auto mb-2 mb-lg-0">\n
                      <li class="nav-item">\n
                        <form class="d-flex formIndex" role="search" action="#" method="GET" id="searchForm2">\n
                          <div class="hero">\n
                            <div id="searchBox" class="border rounded">\n
                              <i class="fa-solid fa-magnifying-glass fa-lg" id="searchIcon"></i>\n
                              <input type="text" class="inputNav" id="searchInput" placeholder="{{ 'header.search'|trans }}" autocomplete="off" />\n
                            </div>\n
                          </div>\n
                        </form>\n
                      </li>\n
                      <li>\n
                        <div class="z-3 border position-absolute d-none bg-dark" id="containerSearchResults">\n
                          <div class="d-flex flex-column mx-3 my-2" id="searchResults">\n
                            <div class="d-none" data-category="courses" id="searchCourses">\n
                              <span class="h3">{{ 'global.courses'|trans }}</span>\n
                              <div></div>\n
                              <hr />\n
                            </div>\n
                            <div class="d-none" data-category="trainees" id="searchTrainees">\n
                              <span class="h3">{{ 'global.trainees'|trans }}</span>\n
                              <div></div>\n
                              <hr />\n
                            </div>\n
                            <div class="d-none" data-category="trainers" id="searchTrainers">\n
                              <span class="h3">{{ 'global.trainers'|trans }}</span>\n
                              <div></div>\n
                              <hr>\n
                            </div>\n
                            <div class="d-none" data-category="coordinators" id="searchCoordinators">\n
                              <span class="h3">{{ 'global.coordinators'|trans }}</span>\n
                              <div></div>\n
                              <hr>\n
                            </div>\n
                            <div class="d-none" data-category="responsibles" id="searchResponsibles">\n
                              <span class="h3">{{ 'global.responsibles'|trans }}</span>\n
                              <div></div>\n
                            </div>\n
                            <div class="d-none" id="noResults">\n
                              <span>{{ 'header.search_no_result'|trans }}</span>\n
                            </div>\n
                          </div>\n
                        </div>\n
                      </li>\n
                      <li class="nav-item d-flex align-items-center px-1">\n
                        <div class="dropdown-container">\n
                          <a href="#" type="button" data-dropdown="notificationMenu" class="position-relative px-1">\n
                            {% if (notificationsHomeworksToDo is defined and notificationsHomeworksToDo is not empty) \n
                              or (notificationsNews is defined and notificationsNews is not empty) \n
                              or (notificationsMessages is defined and notificationsMessages is not empty) \n
                              or (notificationsInternships is defined and notificationsInternships is not empty) \n
                              or (notificationsNewCourses is defined and notificationsNewCourses is not empty) %}\n
                            <i class="fa fa-md fa-bell faa-tada animated"></i>\n
                            <span class="position-absolute top-0 start-25 translate-middle badge border border-light rounded-circle bg-danger p-1"><span class="visually-hidden">{{ 'notifications.unread_messages'|trans }}</span>\n
                            </span>\n
                            {% else %}\n
                            <i class="fa fa-md fa-bell"></i>\n
                            {% endif %}\n
                          </a>\n
                          <ul class="dropdown z-1" name="notificationMenu">\n
                            <li class="notification-group" id="notificationsNews">\n
                              <div class="notification-tab">\n
                                <i class="fa fa-square-poll-vertical"></i>\n
                                <h6>{{ 'header.notifications.news'|trans }}</h6>\n
                                <span class="label">{{ notificationsNews is defined and notificationsNews is not empty ? notificationsNews|length : 0 }}</span>\n
                              </div>\n
                              <!-- tab -->\n
                              <ul class="notification-list">\n
                                {% if notificationsNews is defined and notificationsNews is not empty %}\n
                                  {% for notification in notificationsNews %}\n
                                    {% include "_components/_notification.html.twig" %}\n
                                  {% endfor %}\n
                                {% else %}\n
                                  <li class="notification-list-item">\n
                                    <p class="message">{{ 'notifications.no_news'|trans }}</p>\n
                                  </li>\n
                                {% endif %}\n
                              </ul>\n
                            </li>\n
                            <li class="notification-group {{ is_granted('ROLE_TRAINER') ? 'd-none' : '' }}" id="notificationsToDo">\n
                              <div class="notification-tab">\n
                                <i class="fa fa-list-check"></i>\n
                                <h6>{{ 'header.notifications.to_do'|trans }}</h6>\n
                                <span class="label">{{ notificationsHomeworksToDo is defined and notificationsHomeworksToDo is not empty ? notificationsHomeworksToDo|length : 0 }}</span>\n
                              </div>\n
                              <!-- tab -->\n
                              <ul class="notification-list">\n
                                {% if notificationsHomeworksToDo is defined and notificationsHomeworksToDo is not empty %}\n
                                  {% for notification in notificationsHomeworksToDo %}\n
                                    {% include "_components/_notification.html.twig" %}\n
                                  {% endfor %}\n
                                {% else %}\n
                                  <li class="notification-list-item">\n
                                    <p class="message">{{ 'notifications.no_new_homework'|trans }}</p>\n
                                  </li>\n
                                {% endif %}\n
                              </ul>\n
                            </li>\n
                            <li class="notification-group" id="notificationsMessages">\n
                              <div class="notification-tab">\n
                                <i class="fa fa-envelope"></i>\n
                                <h6>{{ 'header.notifications.messages'|trans }}</h6>\n
                                <span class="label">{{ notificationsMessages is defined and notificationsMessages is not empty ? notificationsMessages|length : 0 }}</span>\n
                              </div>\n
                              <ul class="notification-list">\n
                                {% if notificationsMessages is defined and notificationsMessages is not empty %}\n
                                  {% for notification in notificationsMessages %}\n
                                    {% include "_components/_notification.html.twig" %}\n
                                  {% endfor %}\n
                                {% else %}\n
                                  <li class="notification-list-item">\n
                                    <p class="message">{{ 'notifications.no_new_message'|trans }}</p>\n
                                  </li>\n
                                {% endif %}\n
                              </ul>\n
                            </li>\n
                            {% if is_granted('ROLE_TRAINER') %}\n
                            <li class="notification-group" id="notificationsInternships">\n
                              <div class="notification-tab">\n
                                <i class="fa fa-graduation-cap"></i>\n
                                <h6>{{ 'header.notifications.internships'|trans }}</h6>\n
                                <span class="label">{{ notificationsInternships is defined and notificationsInternships is not empty ? notificationsInternships|length : 0 }}</span>\n
                              </div>\n
                              <ul class="notification-list">\n
                                {% if notificationsInternships is defined and notificationsInternships is not empty %}\n
                                  {% for notification in notificationsInternships %}\n
                                    {% include "_components/_notification.html.twig" %}\n
                                  {% endfor %}\n
                                {% else %}\n
                                  <li class="notification-list-item">\n
                                    <p class="message">{{ 'notifications.no_new_internship'|trans }}</p>\n
                                  </li>\n
                                {% endif %}\n
                              </ul>\n
                            </li>\n
                            {% endif %}\n
                            <li class="notification-group {{ is_granted('ROLE_TRAINER') ? 'd-none' : '' }}" id="notificationsCourses">\n
                              <div class="notification-tab">\n
                                <i class="fa fa-circle-info"></i>\n
                                <h6>{{ 'header.notifications.courses'|trans }}</h6>\n
                                <span class="label">{{ notificationsNewCourses is defined and notificationsNewCourses is not empty ? notificationsNewCourses|length : 0 }}</span>\n
                              </div>\n
                              <ul class="notification-list">\n
                                {% if notificationsNewCourses is defined and notificationsNewCourses is not empty %}\n
                                  {% for notification in notificationsNewCourses %}\n
                                    {% include "_components/_notification.html.twig" %}\n
                                  {% endfor %}\n
                                {% else %}\n
                                  <li class="notification-list-item">\n
                                    <p class="message">{{ 'notifications.no_new_course'|trans }}</p>\n
                                  </li>\n
                                {% endif %}\n
                              </ul>\n
                            </li>\n
                          </ul>\n
                        </div>\n
                      </li>\n
                      <li class="nav-item dropdown">\n
                        <a class="nav-link dropdown-toggle" href="#" id="navbar_dropdown_language" role="button" data-bs-toggle="dropdown" aria-expanded="false">{{ app.request.get('_locale') }}</a>\n
                        <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbar_dropdown_language">\n
                          {% for switch in locale_switch_links() %}\n
                            <li><a class="dropdown-item" href="{{ switch.url }}">{{ switch.label|trans }}</a></li>\n
                          {% endfor %}\n
                        </ul>\n
                      </li>\n
                      <li class="nav-item dropdown">\n
                        <a class="nav-link dropdown-toggle" href="#" id="navbar_dropdown_user" role="button" data-bs-toggle="dropdown" aria-expanded="false">{{ app.user.firstName|capitalize }}&nbsp;{{ app.user.lastName|upper }}</a>\n
                        <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbar_dropdown_user">\n
                          <li>\n
                            <a class="dropdown-item" href="{{ path('app_account_privacy_index') }}">{{ 'header.personal.modify'|trans }}</a>\n
                          </li>\n
                          <li>\n
                            <a class="dropdown-item nav-link form-check form-switch" href="#" onclick="document.getElementById('form_dark_mode').click();">\n
                              <input class="form-check-input" type="checkbox" role="switch" id="form_dark_mode" />\n
                              <label class="form-check-label" for="form_dark_mode" onclick="document.getElementById('form_dark_mode').click();">{{ 'header.personal.dark_mode'|trans }}</label>\n
                            </a>\n
                          </li>\n
                          <li>\n
                            {% if is_granted('IS_IMPERSONATOR') %}\n
                              <a class="dropdown-item" href="?_switch_user=_exit">{{ 'header.personal.exit_impersonation'|trans }}</a>\n
                            {% endif %}\n
                            <a class="dropdown-item" href="{{ path('app_logout') }}">{{ 'header.personal.logout'|trans }}</a>\n
                          </li>\n
                          <li class="text-muted text-end pe-3">\n
                            <p class="text-reset">v.{{ app_version() ~ "." ~ app.environment|upper }}</p>\n
                          </li>\n
                        </ul>\n
                      </li>\n
                    </ul>\n
                    {% endif %}\n
                  </div>\n
                </div>\n
              </nav>\n
            {% endblock %}\n
            {% block feedback %}\n
              <a role="button" data-bs-toggle="modal" data-bs-target="#modalFeedback" class="feedback-button" href="#">Feedback</a>\n
            {% endblock %}\n
            {% for flashMessage in app.session.flashbag.get('notice') %}\n
              {% include '_components/_alert.html.twig' with { 'type': 'success', 'bg': 'success', 'fa': 'bell', 'message': flashMessage } %}\n
            {% endfor %}\n
            {% for flashMessage in app.session.flashbag.get('info') %}\n
              {% include '_components/_alert.html.twig' with { 'type': 'info', 'bg': 'info', 'fa': 'info', 'message': flashMessage } %}\n
            {% endfor %}\n
            {% for flashMessage in app.session.flashbag.get('error') %}\n
              {% include '_components/_alert.html.twig' with { 'type': 'error', 'bg': 'danger', 'fa': 'times', 'message': flashMessage } %}\n
            {% endfor %}\n
            <main>\n
              {% block main %}\n
      \n
              {% endblock %}\n
            </main>\n
            {% block footer %}\n
              <footer class="border-top border-light bg-v1-primary fixed-bottom">\n
                <p class="text-center m-0">\n
                  &copy; 2022 - {{ 'now'|date('Y') }} {{ platformName }} - {{ 'footer.text'|trans }} <a href="http://www.marceau-rodrigues.fr" target="_blank">Marceau RODRIGUES</a>&nbsp;-&nbsp;<a href="{{ path('app_legal_notices') }}">{{ 'footer.legal_notices'|trans }}</a>&nbsp;|&nbsp;<a href="{{ path('app_privacy_policy') }}">{{ 'footer.privacy_policy'|trans }}</a>\n
                </p>\n
              </footer>\n
            {% endblock %}\n
            <div id="chatbot" class="main-card collapsed border">\n
              <button id="chatbot_toggle">\n
                <span class="visually-hidden">chatbot</span>\n
                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">\n
                  <path d="M0 0h24v24H0V0z" fill="none" />\n
                  <path d="M15 4v7H5.17l-.59.59-.58.58V4h11m1-2H3c-.55 0-1 .45-1 1v14l4-4h10c.55 0 1-.45 1-1V3c0-.55-.45-1-1-1zm5 4h-2v9H6v2c0 .55.45 1 1 1h11l4 4V7c0-.55-.45-1-1-1z" />\n
                </svg>\n
                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" style="display:none">\n
                  <path d="M0 0h24v24H0V0z" fill="none" />\n
                  <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z" />\n
                </svg>\n
              </button>\n
              <div class="main-title">\n
                <div>\n
                  <span>Chatbot</span>\n
                </div>\n
              </div>\n
              <div class="chat-area" id="message-box">\n
                <div class="text-center">\n
                  <img src="{{ (platformLogoPath starts with "http" or platformLogoPath starts with "https" ? platformLogoPath : asset('/website/' ~ platformLogoPath)) }}" height="125" alt="{{ platformLogoName }}">\n
                </div>\n
              </div>\n
              <div class="line"></div>\n
              <div class="input-div">\n
                <input class="input-message" name="message" type="text" id="message" placeholder="{{ 'chatbot.placeholder'|trans }}" autocomplete="off" />\n
                <button class="input-activate-ia" title="{{ getServerAI ? 'Activer l\'IA':'L\'IA est momentanément indisponible' }}" onclick="activateAI();" {{ getServerAI ? '':'disabled' }}>\n
                  <span class="visually-hidden">ia</span>\n
                  <i class="fa-solid fa-robot"></i>\n
                </button>\n
                <button class="input-send" onclick="send()">\n
                  <span class="visually-hidden">message</span>\n
                  <svg style="width:24px;height:24px">\n
                    <path d="M2,21L23,12L2,3V10L17,12L2,14V21Z" />\n
                  </svg>\n
                </button>\n
              </div>\n
            </div>\n
      \n
            <div class="modal modal-xl fade" id="modalFeedback" data-bs-backdrop="true" data-bs-keyboard="true" tabindex="-1" aria-labelledby="modalFeedbackTitle" aria-hidden="true">\n
              <div class="modal-dialog">\n
                <div class="modal-content">\n
                  <div class="modal-header">\n
                    <div class="container">\n
                      <div class="row">\n
                        <h5 class="modal-title w-auto" id="modalFeedbackTitle">{{ 'feedback.title'|trans }}</h5>\n
                        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>\n
                        &nbsp;\n
                      </div>\n
                    </div>\n
                  </div>\n
                  <div class="modal-body">\n
                    <form action="#" method="POST" id="form_feedback">\n
                      <div class="container">\n
                        <div class="row">\n
                          <div class="col-12">\n
                            <div class="form-group">\n
                              <label for="form_feedback_link" class="form-label mb-0 required">{{ 'feedback.form_link'|trans }}</label>\n
                              <input type="text" class="form-control" name="form_feedback_link" id="form_feedback_link" placeholder="https://..." value="{{ app.request.uri }}" />\n
                            </div>\n
                          </div>\n
                          <div class="col-12 mt-2">\n
                            <div class="form-group">\n
                              <label for="form_feedback_category" class="form-label mb-0 required">{{ 'feedback.form_category'|trans }}</label>\n
                              <select name="form_feedback_category" id="form_feedback_category" class="form-select">\n
                                <option value="0" disabled selected>{{ 'feedback.form_category_placeholder'|trans }}</option>\n
                                {% for feedbackCategory in feedbackCategories %}\n
                                  <option value="{{ feedbackCategory.id }}">{{ feedbackCategory.label }}</option>\n
                                {% endfor %}\n
                              </select>\n
                            </div>\n
                          </div>\n
                          <div class="col-12 mt-2">\n
                            <div class="form-group">\n
                              <label for="form_feedback_weight" class="form-label mb-0 required">{{ 'feedback.form_weight'|trans }}</label>\n
                              <select name="form_feedback_weight" id="form_feedback_weight" class="form-select">\n
                                <option value="0" disabled selected>{{ 'feedback.form_weight_placeholder'|trans }}</option>\n
                                <option value="1">1 - {{ 'feedback.form_weight_light'|trans }}</option>\n
                                <option value="2">2 - {{ 'feedback.form_weight_medium'|trans }}</option>\n
                                <option value="3">3 - {{ 'feedback.form_weight_heavy'|trans }}</option>\n
                                <option value="4">4 - {{ 'feedback.form_weight_critical'|trans }}</option>\n
                              </select>\n
                            </div>\n
                          </div>\n
                          <div class="col-12 mt-2">\n
                            <div class="form-group">\n
                              <label for="form_feedback_annotation" class="form-label mb-0 required">{{ 'feedback.form_description'|trans }}</label>\n
                              <textarea class="form-control" name="form_feedback_annotation" id="form_feedback_annotation" rows="5" placeholder="{{ 'feedback.form_description_placeholder'|trans }}"></textarea>\n
                            </div>\n
                          </div>\n
                        </div>\n
                        <div class="row mt-2">\n
                          <div class="col-12">\n
                            <a value="Envoyer" class="btn btn-primary float-end" onclick="sendFeedback();document.getElementById('form_feedback').reset();$('#modalFeedback').modal('hide');" role="button">{{ 'global.btn_send'|trans }}</a>\n
                          </div>\n
                        </div>\n
                      </div>\n
                    </form>\n
                  </div>\n
                </div>\n
              </div>\n
            </div>\n
      \n
            <!-- Modal pour afficher les détails de l'événement -->\n
            <div id="event-details-modal" class="modal modal-xl" style="display: none;" aria-labelledby="modalCalendarTitle">\n
              <div class="modal-dialog">\n
                <div class="modal-content">\n
                  <div class="modal-header">\n
                    <div class="container">\n
                      <div class="row">\n
                        <h5 class="modal-title w-auto" id="modalCalendarTitle">Détails de l'événement</h5>\n
                        <button type="button" class="btn-close modal-close" data-bs-dismiss="modal" aria-label="Close"></button>\n
                        &nbsp;\n
                      </div>\n
                    </div>\n
                  </div>\n
                  <div class="modal-body">\n
                    <!-- Les détails de l'événement seront insérés ici via JavaScript -->\n
                  </div>\n
                </div>\n
              </div>\n
            </div>\n
            {# Permet de personnaliser les vidéos #}\n
            {# <script src="https://vjs.zencdn.net/8.10.0/video.min.js"></script> #}\n
            {# Permet d'afficher le code formaté pour les cours #}\n
            {# <script src="{{ asset('js/prism.js') }}"></script> #}\n
            <script src="https://unpkg.com/@sjmc11/tourguidejs/dist/tour.js" crossorigin="anonymous" referrerpolicy="no-referrer"></script>\n
            <script src="{{ asset('js/app.js') }}"></script>\n
            <script>\n
              if(typeof locale === "undefined") {\n
                let locale;\n
              }\n
                locale = "{{ app.request.attributes.get('_locale') }}";\n
            </script>\n
            <script src="{{ asset('js/darkMode.js') }}"></script>\n
            <script src="{{ asset('js/script.js') }}"></script>\n
            <script src="{{ asset('js/notifications.js') }}"></script>\n
            {# <script src="{{ asset('js/chatbot.js') }}"></script> #}\n
            <script>\n
              let ai_enabled = false;\n
              var running = false;\n
              function send() {\n
                if(!ai_enabled) {\n
                  if (running == true) return;\n
                  var msg = document.getElementById("message").value.trim();\n
                  if (msg == "") return;\n
                  running = true;\n
                  addMsg(msg);\n
                  //DELEAY MESSAGE RESPOSE Echo\n
                  window.setTimeout(addResponseMsg, 1000, msg, true);\n
                } else {\n
                  let message = $('#message').val().trim();\n
                  if (message === '') return;\n
      \n
                  var div = document.createElement("div");\n
                  div.innerHTML = "<span style='flex-grow:1'></span><div class='chat-message-sent align-self-end'>" + message + "</div>";\n
                  div.className = "chat-message-div";\n
                  document.getElementById("message-box").appendChild(div);\n
                  let chatBox = $('#message-box');\n
                  $('#message').val('');\n
                  chatBox.scrollTop(chatBox.prop("scrollHeight"));\n
      \n
                  let botMessage = $('<div class="chat-message-received ia"></div>');\n
                  chatBox.append(botMessage);\n
                  chatBox.scrollTop(chatBox.prop("scrollHeight"));\n
      \n
                  let safeMessage = encodeURIComponent(message)\n
                    .replace(/%2F/g, '%252F')  // Double encodage du `/`\n
                    .replace(/%3F/g, '%253F')  // Double encodage du `?`\n
                    .replace(/%26/g, '%2526')  // Double encodage du `&`\n
                    .replace(/%3D/g, '%253D')  // Double encodage du `=`\n
                    .replace(/%23/g, '%2523')  // Double encodage du `#`\n
                    .replace(/%2B/g, '%252B')  // Double encodage du `+`\n
                    .replace(/%22/g, '%2522')  // Double encodage du `"`\n
                    .replace(/%3C/g, '%253C')  // Double encodage du `<`\n
                    .replace(/%3E/g, '%253E')  // Double encodage du `>`\n
                    .replace(/%27/g, '%2527')  // Double encodage du `'`\n
                    .replace(/%5C/g, '%255C'); // Double encodage du `\`\n
                  ;\n
                  let eventSource = new EventSource('/{{ app.request.get("_locale") }}/ai_chatbot/' + safeMessage);\n
                  let fullMessage = "";\n
      \n
                  eventSource.onmessage = function(event) {\n
                      if (event.data === "[DONE]") {\n
                        eventSource.close(); // Fin du stream\n
                      } else {\n
                        fullMessage += event.data; // Concaténer les fragments\n
                        botMessage.html(formatMessage(fullMessage)); // Mettre à jour l'affichage\n
                        chatBox.scrollTop(chatBox.prop("scrollHeight"));\n
                      }\n
                  };\n
      \n
                  eventSource.onerror = function() {\n
                    eventSource.close();\n
                  };\n
                }\n
              }\n
      \n
              function formatMessage(text) {\n
                // Sépare les paragraphes\n
                let paragraphs = text.split(/\n\n+/).map(p => p.trim()); \n
                \n
                // Transforme chaque paragraphe en <p>...</p>\n
                text = paragraphs.map(p => `<p>${p.replace(/\n/g, "<br>")}</p>`).join("");\n
      \n
                // Convertit le markdown simple en HTML\n
                text = text.replace(/\*\*(.*?)\*\*/g, "<strong>$1</strong>"); // Gras\n
                text = text.replace(/\*(.*?)\*/g, "<em>$1</em>"); // Italique\n
                text = text.replace(/_(.*?)_/g, "<u>$1</u>"); // Souligné\n
      \n
                // Convertit les blocs de code multi-lignes ```code``` en <pre><code>code</code></pre>\n
                text = text.replace(/```([\s\S]*?)```/g, '<pre><code>$1</code></pre>');\n
                \n
                // Convertit les blocs de code inline `code` en <code>code</code>\n
                text = text.replace(/`([^`]+)`/g, '<code>$1</code>');\n
      \n
                // Ajoute automatiquement des <p> autour du texte\n
                return "<p>" + text + "</p>";\n
              }\n
      \n
              function addMsg(msg) {\n
                  var div = document.createElement("div");\n
                  div.innerHTML =\n
                      "<span style='flex-grow:1'></span><div class='chat-message-sent'>" +\n
                      msg +\n
                      "</div>";\n
                  div.className = "chat-message-div";\n
                  document.getElementById("message-box").appendChild(div);\n
                  //SEND MESSAGE TO API\n
                  document.getElementById("message").value = "";\n
                  document.getElementById("message-box").scrollTop = document.getElementById(\n
                      "message-box"\n
                  ).scrollHeight;\n
              }\n
      \n
              function addResponseMsg(msg, ajax = false) {\n
                  if (ajax) {\n
                      var formData = new FormData();\n
                      formData.append("form_chatbot_message", msg);\n
                      $.ajax({\n
                        url: "/" + locale + "/chatbot",\n
                        method: "post",\n
                        dataType: "json",\n
                        data: formData,\n
                        processData: false,\n
                        contentType: false,\n
                        success: function (r) {\n
                          if (r.success) {\n
                            r.messages.forEach((message) => {\n
                              var div = document.createElement("div");\n
                              div.innerHTML = "<div class='chat-message-received'>" + message + "</div>";\n
                              div.className = "chat-message-div";\n
                              document.getElementById("message-box").appendChild(div);\n
                              document.getElementById("message-box").scrollTop = document.getElementById(\n
                                  "message-box"\n
                              ).scrollHeight;\n
                            });\n
                            running = false;\n
                          }\n
                        },\n
                        error: function (e) {\n
                          console.error(e.getMessage());\n
                        },\n
                      });\n
                  } else {\n
                    var div = document.createElement("div");\n
                    div.innerHTML = "<div class='chat-message-received'>" + msg + "</div>";\n
                    div.className = "chat-message-div";\n
                    document.getElementById("message-box").appendChild(div);\n
                    document.getElementById("message-box").scrollTop = document.getElementById(\n
                        "message-box"\n
                    ).scrollHeight;\n
                    running = false;\n
                  }\n
              }\n
              document.getElementById("message").addEventListener("keyup", function (event) {\n
                  if (event.keyCode === 13) {\n
                      event.preventDefault();\n
                      send();\n
                  }\n
              });\n
              document.getElementById("chatbot_toggle").onclick = function () {\n
                  if (document.getElementById("chatbot").classList.contains("collapsed")) {\n
                    document.getElementById("chatbot").classList.remove("collapsed")\n
                    document.getElementById("chatbot_toggle").children[1].style.display = "none"\n
                    document.getElementById("chatbot_toggle").children[2].style.display = ""\n
                    // Default display message\n
                    if($('#message-box .chat-message-div').length === 0) {\n
                      setTimeout(addResponseMsg, 1000, "{{ 'chatbot.welcome'|trans({'%user%': app.user.username })|raw }}", false)\n
                    }\n
                  } else {\n
                      document.getElementById("chatbot").classList.add("collapsed")\n
                      document.getElementById("chatbot_toggle").children[1].style.display = ""\n
                      document.getElementById("chatbot_toggle").children[2].style.display = "none"\n
                  }\n
              }\n
      \n
              // Gestion de l'IA\n
              function activateAI() {\n
                ai_enabled = !ai_enabled;\n
                document.getElementById("message").classList.toggle("ai-enabled");\n
              }\n
            </script>\n
            <script>\n
              if(typeof tg === "undefined") {\n
                let tg;\n
              } \n
              $(document).ready(function () {\n
                // Gestion du TourGuide\n
                if ({{ is_granted('ROLE_TRAINEE') ? 'true' : 'false' }}) {\n
                  const stepsTourGuideTrainee = [\n
                    {\n
                      title: "{{ 'tourguide.index.trainee.start.title'|trans }}",\n
                      content: "{{ 'tourguide.index.trainee.start.content'|trans|raw }}", \n
                      position: 'center', \n
                      group: 'trainee-index', \n
                      order: 0,\n
                      display_modal: false, \n
                      link: null\n
                    },\n
                    {\n
                      title: "{{ 'tourguide.index.trainee.navbar.title'|trans }}",\n
                      target: '#navbar',\n
                      content: "{{ 'tourguide.index.trainee.navbar.content'|trans }}",\n
                      position: 'bottom', \n
                      group: 'trainee-index',  \n
                      order: 1,\n
                      display_modal: false, \n
                      link: null\n
                    },\n
                    {\n
                      title: "{{ 'tourguide.index.trainee.feedback.title'|trans }}",\n
                      target: '.feedback-button',\n
                      content: "{{ 'tourguide.index.trainee.feedback.content'|trans }}",\n
                      position: 'bottom', \n
                      group: 'trainee-index',  \n
                      order: 2,\n
                      display_modal: false, \n
                      link: null\n
                    },\n
                    {\n
                      title: "{{ 'tourguide.index.trainee.courses.last_courses.title'|trans }}",\n
                      target: 'main .container .row:nth-of-type(3)',\n
                      content: "{{ 'tourguide.index.trainee.courses.last_courses.content'|trans }}",\n
                      position: 'right', \n
                      group: 'trainee-index',  \n
                      order: 3,\n
                      display_modal: false, \n
                      link: null\n
                    },\n
                    {\n
                      title: "{{ 'tourguide.index.trainee.courses.popular_courses.title'|trans }}",\n
                      target: 'main .container .row:nth-of-type(4)',\n
                      content: "{{ 'tourguide.index.trainee.courses.popular_courses.content'|trans }}",\n
                      position: 'right', \n
                      group: 'trainee-index',  \n
                      order: 4,\n
                      display_modal: false, \n
                      link: null\n
                    },\n
                    {\n
                      title: "{{ 'tourguide.index.trainee.survey.title'|trans }}",\n
                      target: 'main .container .row:nth-of-type(5)',\n
                      content: "{{ 'tourguide.index.trainee.survey.content_bis'|trans }}",\n
                      position: 'right', \n
                      group: 'trainee-index',  \n
                      order: 5,\n
                      display_modal: false, \n
                      link: null\n
                    }, \n
                    {\n
                      title: "{{ 'tourguide.index.trainee.chatbot.title'|trans }}",\n
                      target: '#chatbot',\n
                      content: "{{ 'tourguide.index.trainee.chatbot.content'|trans }}",\n
                      position: 'top', \n
                      group: 'trainee-index',  \n
                      order: 6,\n
                      display_modal: false, \n
                      link: null\n
                    }, \n
                    {\n
                      title: "{{ 'tourguide.index.trainee.survey.title'|trans }}",\n
                      target: '#endSurvey',\n
                      content: "{{ 'tourguide.index.trainee.survey.content'|trans }}",\n
                      position: 'right', \n
                      group: 'trainee-end-survey-index',  \n
                      order: 0,\n
                      display_modal: false, \n
                      link: null\n
                    }, \n
                    {\n
                      title: "{{ 'tourguide.index.trainee.modules.title'|trans }}",\n
                      target: '#liste_modules',\n
                      content: "{{ 'tourguide.index.trainee.modules.content'|trans }}",\n
                      position: 'right', \n
                      group: 'trainee-modules',  \n
                      order: 0,\n
                      display_modal: false, \n
                      link: null\n
                    }, \n
                    {\n
                      title: "{{ 'tourguide.index.trainee.modules.example.title'|trans }}",\n
                      target: '#liste_modules .card:nth-of-type(1)',\n
                      content: "{{ 'tourguide.index.trainee.modules.example.content'|trans }}",\n
                      position: 'right', \n
                      group: 'trainee-modules',  \n
                      order: 1,\n
                      display_modal: false, \n
                      link: "{{ path('app_course', {'course': '9b8e2dec-aaab-493f-a691-c2c5f92aa782'}) }}"\n
                    }, \n
                    {\n
                      title: "{{ 'tourguide.index.trainee.courses.title'|trans }}",\n
                      target: '#liste_cours',\n
                      content: "{{ 'tourguide.index.trainee.courses.content'|trans }}",\n
                      position: 'right', \n
                      group: 'trainee-modules',  \n
                      order: 2,\n
                      display_modal: false, \n
                      link: null\n
                    }, \n
                    {\n
                      title: "{{ 'tourguide.index.trainee.courses.example.title'|trans }}",\n
                      target: '#liste_cours .card:nth-of-type(1)',\n
                      content: "{{ 'tourguide.index.trainee.courses.example.content'|trans }}",\n
                      position: 'right', \n
                      group: 'trainee-modules',  \n
                      order: 3,\n
                      display_modal: false, \n
                      link: null\n
                    }, \n
                    {\n
                      title: "{{ 'tourguide.index.trainee.courses.example.resources.title'|trans }}",\n
                      target: '#liste_cours .card:nth-of-type(1) .fa-book',\n
                      content: "{{ 'tourguide.index.trainee.courses.example.resources.content'|trans }}",\n
                      position: 'right', \n
                      group: 'trainee-modules',  \n
                      order: 4,\n
                      display_modal: false, \n
                      link: "{{ path('app_embed', {'slide': '2PACX-1vS1fqRHqPke4F_m70pDAqmJNntPHgGXCL7Jd-GX4JdsTeMpdYEgPmbBWV1kYvqgEz98Z6pAIygV6VVT'}) }}"              \n
                    }, \n
                    {\n
                      title: "{{ 'tourguide.index.trainee.courses.example.embed.title'|trans }}",\n
                      target: 'iframe',\n
                      content: "{{ 'tourguide.index.trainee.courses.example.embed.content'|trans }}",\n
                      position: 'bottom', \n
                      group: 'trainee-modules',  \n
                      order: 5,\n
                      display_modal: false, \n
                      link: null\n
                    }, \n
                    {\n
                      title: "{{ 'tourguide.index.trainee.courses.example.embed.resources.title'|trans }}",\n
                      target: '#liste_ressources',\n
                      content: "{{ 'tourguide.index.trainee.courses.example.embed.resources.content'|trans }}",\n
                      position: 'top', \n
                      group: 'trainee-modules',  \n
                      order: 6,\n
                      display_modal: false, \n
                      link: null\n
                    }, \n
                    {\n
                      title: "{{ 'tourguide.index.trainee.courses.example.embed.resources.give.title'|trans }}",\n
                      target: '#liste_tps .card .fa-arrow-up-from-bracket',\n
                      content: "{{ 'tourguide.index.trainee.courses.example.embed.resources.give.content'|trans }}",\n
                      position: 'top', \n
                      group: 'trainee-modules',  \n
                      order: 7,\n
                      display_modal: false, \n
                      link: null\n
                    }, \n
                    {\n
                      title: "{{ 'tourguide.index.trainee.mailbox.title'|trans }}",\n
                      target: 'main .container-fluid',\n
                      content: "{{ 'tourguide.index.trainee.mailbox.content'|trans }}",\n
                      position: 'top', \n
                      group: 'trainee-mailbox',  \n
                      order: 0,\n
                      display_modal: false, \n
                      link: null\n
                    }, \n
                    {\n
                      title: "{{ 'tourguide.index.trainee.mailbox.example.contacts.title'|trans }}",\n
                      target: '#liste_contacts',\n
                      content: "{{ 'tourguide.index.trainee.mailbox.example.contacts.content'|trans }}",\n
                      position: 'top', \n
                      group: 'trainee-mailbox',  \n
                      order: 1,\n
                      display_modal: false, \n
                      link: null\n
                    }, \n
                    {\n
                      title: "{{ 'tourguide.index.trainee.mailbox.example.conversation.title'|trans }}",\n
                      target: '#messages',\n
                      content: "{{ 'tourguide.index.trainee.mailbox.example.conversation.content'|trans }}",\n
                      position: 'top', \n
                      group: 'trainee-mailbox',  \n
                      order: 2,\n
                      display_modal: false, \n
                      link: null\n
                    }, \n
                    {\n
                      title: "{{ 'tourguide.index.trainee.mailbox.example.contacts.cohort.title'|trans }}",\n
                      target: '#liste_contacts a:nth-of-type(1)',\n
                      content: "{{ 'tourguide.index.trainee.mailbox.example.contacts.cohort.content'|trans }}",\n
                      position: 'right', \n
                      group: 'trainee-mailbox',  \n
                      order: 3,\n
                      display_modal: false, \n
                      link: null\n
                    }, \n
                    {\n
                      title: "{{ 'tourguide.index.trainee.mailbox.example.contacts.trainer.title'|trans }}",\n
                      target: '#liste_contacts a:nth-of-type(2)',\n
                      content: "{{ 'tourguide.index.trainee.mailbox.example.contacts.trainer.content'|trans }}",\n
                      position: 'right', \n
                      group: 'trainee-mailbox',  \n
                      order: 4,\n
                      display_modal: false, \n
                      link: null\n
                    }, \n
                    {\n
                      title: "{{ 'tourguide.index.trainee.mailbox.example.contacts.trainees.title'|trans }}",\n
                      target: '#liste_contacts #chat-trainees',\n
                      content: "{{ 'tourguide.index.trainee.mailbox.example.contacts.trainees.content'|trans }}",\n
                      position: 'right', \n
                      group: 'trainee-mailbox',  \n
                      order: 5,\n
                      display_modal: false, \n
                      link: null\n
                    }, \n
                    {\n
                      title: "{{ 'tourguide.index.trainee.account.informations.tab.title'|trans }}",\n
                      target: '#subnavbar',\n
                      content: "{{ 'tourguide.index.trainee.account.informations.tab.content'|trans }}",\n
                      position: 'bottom', \n
                      group: 'trainee-informations',  \n
                      order: 0,\n
                      display_modal: false, \n
                      link: null\n
                    }, \n
                    {\n
                      title: "{{ 'tourguide.index.trainee.account.replay_tutorial.title'|trans }}",\n
                      target: '#btn_replay_tutorial',\n
                      content: "{{ 'tourguide.index.trainee.account.replay_tutorial.content'|trans }}",\n
                      position: 'left', \n
                      group: 'trainee-informations',  \n
                      order: 1,\n
                      display_modal: false, \n
                      link: null\n
                    }, \n
                    {\n
                      title: "{{ 'tourguide.index.trainee.account.avatar.title'|trans }}",\n
                      target: '#liste_avatars',\n
                      content: "{{ 'tourguide.index.trainee.account.avatar.content'|trans }}",\n
                      position: 'bottom', \n
                      group: 'trainee-informations',  \n
                      order: 2,\n
                      display_modal: false, \n
                      link: null\n
                    }, \n
                    {\n
                      title: "{{ 'tourguide.index.trainee.account.informations.title'|trans }}",\n
                      target: '#form_user',\n
                      content: "{{ 'tourguide.index.trainee.account.informations.content'|trans }}",\n
                      position: 'bottom', \n
                      group: 'trainee-informations',  \n
                      order: 3,\n
                      display_modal: false, \n
                      link: null\n
                    }, \n
                    {\n
                      title: "{{ 'tourguide.index.trainee.account.informations.signature.title'|trans }}",\n
                      target: '#signature-pad',\n
                      content: "{{ 'tourguide.index.trainee.account.informations.signature.content'|trans }}",\n
                      position: 'bottom', \n
                      group: 'trainee-informations',  \n
                      order: 4,\n
                      display_modal: false, \n
                      link: null\n
                    }, \n
                    {\n
                      title: "{{ 'tourguide.index.trainee.account.informations.actual_signature.title'|trans }}",\n
                      target: '#actual-signature',\n
                      content: "{{ 'tourguide.index.trainee.account.informations.actual_signature.content'|trans }}",\n
                      position: 'bottom', \n
                      group: 'trainee-informations',  \n
                      order: 5,\n
                      display_modal: false, \n
                      link: null\n
                    }, \n
                  ];\n
                  tg = new tourguide.TourGuideClient({\n
                    steps: stepsTourGuideTrainee,\n
                    rememberStep: true,\n
                    prevLabel: "{{ 'global.btn_previous'|trans }}",\n
                    nextLabel: "{{ 'global.btn_next'|trans }}",\n
                    dialogClass: 'tourguide-dialog',\n
                    backdropClass: 'tourguide-backdrop',\n
                    progressBar: '#45BEEB', \n
                    hidePrev: true // Avoid to show the previous button which is buggy with the modal\n
                  });\n
                  {% if is_granted('ROLE_TRAINEE') %}\n
                  localStorage.setItem('tg_tours_complete', '{{ app.user.tutorialCompleted }}');\n
                  {% endif %}\n
                  if(localStorage.getItem('tg_tours_complete').toString() !== '') {\n
      \n
                    tg.onBeforeExit(async () => {\n
                      $.ajax({\n
                        url: '{{ path('app_save_completed_tutorial') }}',\n
                        type: 'POST',\n
                        dataType: 'json',\n
                        data: {\n
                          tours: localStorage.getItem('tg_tours_complete').toString()\n
                        }\n
                      });\n
                    });\n
                  }\n
                  tg.onBeforeStepChange(()=>{\n
                    return new Promise((resolve, reject) => {\n
                      if(tg.tourSteps[tg.activeStep].link !== null) {\n
                        window.location.href = tg.tourSteps[tg.activeStep].link;\n
                      } \n
                      return resolve(true);\n
                      {# else {\n
                        return reject()\n
                      } #}\n
                    });\n
                  }); \n
                  tg.onAfterStepChange(()=>{\n
                    return new Promise((resolve, reject) => { \n
                      if (tg.tourSteps[tg.activeStep].display_modal === true) {\n
                        $('#modalFeedback').modal("show");\n
                      } else if (tg.tourSteps[tg.activeStep].display_modal === false) {\n
                        $('#modalFeedback').modal("hide");\n
                      }\n
                      return resolve(true);\n
                      {# else {\n
                        return reject()\n
                      } #}\n
                    });\n
                  }); \n
                }\n
      \n
                $('#searchInput').on('keyup', () => {\n
                  if ($('#searchInput').val().length >= 3) {\n
                    $.ajax({\n
                      url: `{{ path('app_search') }}`,\n
                      method: 'POST',\n
                      dataType: 'json',\n
                      async: true,\n
                      data: {\n
                        q: $('#searchInput').val()\n
                      },\n
                      success: (r) => {\n
                        // Suppression des résultats précédents\n
                        $('#searchResults #searchCourses > div > div > a').remove()\n
                        $('#searchResults #searchTrainees > div > div > a').remove()\n
                        $('#searchResults #searchTrainers > div > div > a').remove()\n
                        $('#searchResults #searchCoordinators > div > div > a').remove()\n
                        $('#searchResults #searchResponsibles > div > div > a').remove()\n
                        $('#containerSearchResults').removeClass('d-none')\n
                        $('#containerSearchResults').addClass('show')\n
      \n
                        if(r.courses.length === 0 && r.trainees.length === 0 && r.trainers.length === 0 && r.coordinators.length === 0 && r.responsibles.length === 0) {\n
                          $('#searchResults #searchCourses').addClass('d-none')\n
                          $('#searchResults #searchTrainees').addClass('d-none')\n
                          $('#searchResults #searchTrainers').addClass('d-none')\n
                          $('#searchResults #searchCoordinators').addClass('d-none')\n
                          $('#searchResults #searchResponsibles').addClass('d-none')\n
                          $('#searchResults #noResults').removeClass('d-none')\n
                        } else {\n
                          $('#searchResults #noResults').addClass('d-none')\n
                          if (r.courses.length > 0) {\n
                            $('#searchResults #searchCourses').removeClass('d-none')\n
                            r.courses.forEach((course) => {\n
                              $('#searchResults #searchCourses > div').html($('#searchResults #searchCourses > div').html() + '<div><a href="/' + '{{ app.request.attributes.get("_locale") }}' + '/embed/' + course.link + '"><div><i class="fa-solid fa-pager"></i>&nbsp;[' + course.module.label + ']&nbsp;-&nbsp;' + course.title + '</div></a></div>')\n
                            })\n
                          } else {\n
                            $('#searchResults #searchCourses').addClass('d-none')\n
                          }\n
                \n
                          if (r.trainees.length > 0) {\n
                            $('#searchResults #searchTrainees').removeClass('d-none')\n
                            r.trainees.forEach((trainee) => {\n
                              $('#searchResults #searchTrainees > div').html($('#searchResults #searchTrainees > div').html() + '<div><a href="/' + '{{ app.request.attributes.get("_locale") }}' + '/trainee/' + trainee.uuid + '"><div><i class="fa-solid fa-user"></i>&nbsp;' + "[20"+ trainee.username.slice(-2) + "] " + trainee.lastName + ' ' + trainee.firstName + '</div></a>{% if is_granted("ROLE_TRAINER") and app.environment == "dev" %}<a class="btn btn-outline-primary m-1" href="?_switch_user=' + trainee.username + '"><i class="fa-solid fa-plug"></i></a>{% endif %}{% if is_granted("ROLE_TRAINER") %}<a class="btn btn-outline-primary m-1" href="/' + '{{ app.request.attributes.get("_locale") }}' + '/trainee/' + trainee.uuid + '"><i class="fa-solid fa-eye"></i></a>{% endif %}<a class="btn btn-outline-primary m-1" href="/' + '{{ app.request.attributes.get("_locale") }}' + '/mailbox/trainee/' + trainee.uuid + '"><i class="fa-solid fa-paper-plane"></i></a></div>')\n
                            })\n
                          } else {\n
                            $('#searchResults #searchTrainees').addClass('d-none')\n
                          }\n
                \n
                          if (r.trainers.length > 0) {\n
                            $('#searchResults #searchTrainers').removeClass('d-none')\n
                            r.trainers.forEach((trainer) => {\n
                              $('#searchResults #searchTrainers > div').html($('#searchResults #searchTrainers > div').html() + '<div><a href="/' + '{{ app.request.attributes.get("_locale") }}' + '/trainer/' + trainer.uuid + '"><div><i class="fa-solid fa-user"></i>&nbsp;' + trainer.lastName + ' ' + trainer.firstName + '</div></a><a class="btn btn-outline-primary m-1" href="/' + '{{ app.request.attributes.get("_locale") }}' + '/trainer/' + trainer.uuid + '"><i class="fa-solid fa-eye"></i></a><a class="btn btn-outline-primary m-1" href="/' + '{{ app.request.attributes.get("_locale") }}' + '/mailbox/trainer/' + trainer.uuid + '"><i class="fa-solid fa-paper-plane"></i></a></div>')\n
                            })\n
                          } else {\n
                            $('#searchResults #searchTrainers').addClass('d-none')\n
                          }\n
                \n
                          if (r.coordinators.length > 0) {\n
                            $('#searchResults #searchCoordinators').removeClass('d-none')\n
                            r.coordinators.forEach((coordinator) => {\n
                              $('#searchResults #searchCoordinators > div').html($('#searchResults #searchCoordinators > div').html() + '<div><a href="/' + '{{ app.request.attributes.get("_locale") }}' + '/coordinator/' + coordinator.uuid + '"><div><i class="fa-solid fa-user"></i>&nbsp;' + coordinator.lastName + ' ' + coordinator.firstName + '</div></a><a class="btn btn-outline-primary m-1" href="/' + '{{ app.request.attributes.get("_locale") }}' + '/coordinator/' + coordinator.uuid + '"><i class="fa-solid fa-eye"></i></a><a class="btn btn-outline-primary m-1" href="/' + '{{ app.request.attributes.get("_locale") }}' + '/mailbox/coordinator/' + coordinator.uuid + '"><i class="fa-solid fa-paper-plane"></i></a></div>')\n
                            })\n
                          } else {\n
                            $('#searchResults #searchCoordinators').addClass('d-none')\n
                          }\n
                \n
                          if (r.responsibles.length > 0) {\n
                            $('#searchResults #searchResponsibles').removeClass('d-none')\n
                            r.responsibles.forEach((responsible) => {\n
                              $('#searchResults #searchResponsibles > div').html($('#searchResults #searchResponsibles > div').html() + '<div><a href="/' + '{{ app.request.attributes.get("_locale") }}' + '/responsible/' + responsible.uuid + '"><div><i class="fa-solid fa-user"></i>&nbsp;' + responsible.lastName + ' ' + responsible.firstName + '</div></a><a class="btn btn-outline-primary m-1" href="/' + '{{ app.request.attributes.get("_locale") }}' + '/responsible/' + responsible.uuid + '"><i class="fa-solid fa-eye"></i></a><a class="btn btn-outline-primary m-1" href="/' + '{{ app.request.attributes.get("_locale") }}' + '/mailbox/responsible/' + responsible.uuid + '"><i class="fa-solid fa-paper-plane"></i></a></div>')\n
                            })\n
                          } else {\n
                            $('#searchResults #searchResponsibles').addClass('d-none')\n
                          }\n
                        }\n
                      },\n
                      error: (r) => {\n
                        alert(r.message)\n
                      }\n
                    })\n
                  } else {\n
                    $('#searchResults #searchCourses > div > div > a').remove()\n
                    $('#searchResults #searchTrainees > div > div > a').remove()\n
                    $('#searchResults #searchTrainers > div > div > a').remove()\n
                    $('#searchResults #searchCoordinators > div > div > a').remove()\n
                    $('#searchResults #searchResponsibles > div > div > a').remove()\n
                    $('#containerSearchResults').addClass('d-none')\n
                  }\n
                })\n
              })\n
            </script>\n
            <script>\n
              $(document).on('DOMContentLoaded', () => {\n
                $(function () {\n
                  $('[data-toggle="tooltip"]').tooltip()\n
                })\n
              });\n
            </script>\n
          {% endblock %}\n
          {% block js %}\n
      \n
          {% endblock %}\n
        </body>\n
      </html>\n
      """
    -name: "base.html.twig"
    -path: "/var/www/html/templates/base.html.twig"
  }
  -phpFile: "/var/www/html/vendor/twig/twig/src/Extension/CoreExtension.php"
  -phpLine: 1739
}
  1. <li><a class="dropdown-item" href="{{ switch.url }}">{{ switch.label|trans }}</a></li>
  2. {% endfor %}
  3. </ul>
  4. </li>
  5. <li class="nav-item dropdown">
  6. <a class="nav-link dropdown-toggle" href="#" id="navbar_dropdown_user" role="button" data-bs-toggle="dropdown" aria-expanded="false">{{ app.user.firstName|capitalize }}&nbsp;{{ app.user.lastName|upper }}</a>
  7. <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbar_dropdown_user">
  8. <li>
  9. <a class="dropdown-item" href="{{ path('app_account_privacy_index') }}">{{ 'header.personal.modify'|trans }}</a>
  10. </li>
  11. <li>
  1. yield " </ul>
  2. </li>
  3. <li class=\"nav-item dropdown\">
  4. <a class=\"nav-link dropdown-toggle\" href=\"#\" id=\"navbar_dropdown_user\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">";
  5. // line 287
  6. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(Twig\Extension\CoreExtension::capitalize($this->env->getCharset(), CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, (isset($context["app"]) || array_key_exists("app", $context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.', 287, $this->source); })()), "user", [], "any", false, false, false, 287), "firstName", [], "any", false, false, false, 287)), "html", null, true);
  7. yield "&nbsp;";
  8. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(Twig\Extension\CoreExtension::upper($this->env->getCharset(), CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, (isset($context["app"]) || array_key_exists("app", $context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.', 287, $this->source); })()), "user", [], "any", false, false, false, 287), "lastName", [], "any", false, false, false, 287)), "html", null, true);
  9. yield "</a>
  10. <ul class=\"dropdown-menu dropdown-menu-end\" aria-labelledby=\"navbar_dropdown_user\">
  11. <li>
in vendor/twig/twig/src/Template.php -> block_header (line 446)
  1. throw new \LogicException('A block must be a method on a \Twig\Template instance.');
  2. }
  3. if (null !== $template) {
  4. try {
  5. yield from $template->$block($context, $blocks);
  6. } catch (Error $e) {
  7. if (!$e->getSourceContext()) {
  8. $e->setSourceContext($template->getSourceContext());
  9. }
  1. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  2. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "body"));
  3. // line 81
  4. yield " ";
  5. yield from $this->unwrap()->yieldBlock('header', $context, $blocks);
  6. // line 315
  7. yield " ";
  8. yield from $this->unwrap()->yieldBlock('feedback', $context, $blocks);
  9. // line 318
  10. yield " ";
in vendor/twig/twig/src/Template.php -> block_body (line 446)
  1. throw new \LogicException('A block must be a method on a \Twig\Template instance.');
  2. }
  3. if (null !== $template) {
  4. try {
  5. yield from $template->$block($context, $blocks);
  6. } catch (Error $e) {
  7. if (!$e->getSourceContext()) {
  8. $e->setSourceContext($template->getSourceContext());
  9. }
  1. // line 78
  2. yield " </head>
  3. <body>
  4. ";
  5. // line 80
  6. yield from $this->unwrap()->yieldBlock('body', $context, $blocks);
  7. // line 1079
  8. yield " ";
  9. yield from $this->unwrap()->yieldBlock('js', $context, $blocks);
  10. // line 1082
  11. yield " </body>
in vendor/twig/twig/src/Template.php -> doDisplay (line 402)
  1. {
  2. $context += $this->env->getGlobals();
  3. $blocks = array_merge($this->blocks, $blocks);
  4. try {
  5. yield from $this->doDisplay($context, $blocks);
  6. } catch (Error $e) {
  7. if (!$e->getSourceContext()) {
  8. $e->setSourceContext($this->getSourceContext());
  9. }
  1. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  2. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template", "home/privacy_policy.html.twig"));
  3. $this->parent = $this->load("base.html.twig", 1);
  4. yield from $this->parent->unwrap()->yield($context, array_merge($this->blocks, $blocks));
  5. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  6. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
in vendor/twig/twig/src/Template.php -> doDisplay (line 402)
  1. {
  2. $context += $this->env->getGlobals();
  3. $blocks = array_merge($this->blocks, $blocks);
  4. try {
  5. yield from $this->doDisplay($context, $blocks);
  6. } catch (Error $e) {
  7. if (!$e->getSourceContext()) {
  8. $e->setSourceContext($this->getSourceContext());
  9. }
  1. return $this->blocks;
  2. }
  3. public function display(array $context, array $blocks = []): void
  4. {
  5. foreach ($this->yield($context, $blocks) as $data) {
  6. echo $data;
  7. }
  8. }
  9. public function render(array $context): string
in vendor/twig/twig/src/Template.php -> display (line 373)
  1. ob_start();
  2. } else {
  3. ob_start(function () { return ''; });
  4. }
  5. try {
  6. $this->display($context);
  7. } catch (\Throwable $e) {
  8. while (ob_get_level() > $level) {
  9. ob_end_clean();
  10. }
  1. yield from $this->template->yieldBlock($name, $context);
  2. }
  3. public function render(array $context = []): string
  4. {
  5. return $this->template->render($context);
  6. }
  7. /**
  8. * @return void
  9. */
  1. * @throws SyntaxError When an error occurred during compilation
  2. * @throws RuntimeError When an error occurred during rendering
  3. */
  4. public function render($name, array $context = []): string
  5. {
  6. return $this->load($name)->render($context);
  7. }
  8. /**
  9. * Displays a template.
  10. *
  1. if (null !== $block) {
  2. return $this->container->get('twig')->load($view)->renderBlock($block, $parameters);
  3. }
  4. return $this->container->get('twig')->render($view, $parameters);
  5. }
  6. private function doRender(string $view, ?string $block, array $parameters, ?Response $response, string $method): Response
  7. {
  8. $content = $this->doRenderView($view, $block, $parameters, $method);
  1. return $this->container->get('twig')->render($view, $parameters);
  2. }
  3. private function doRender(string $view, ?string $block, array $parameters, ?Response $response, string $method): Response
  4. {
  5. $content = $this->doRenderView($view, $block, $parameters, $method);
  6. $response ??= new Response();
  7. if (200 === $response->getStatusCode()) {
  8. foreach ($parameters as $v) {
  9. if ($v instanceof FormInterface && $v->isSubmitted() && !$v->isValid()) {
  1. * If an invalid form is found in the list of parameters, a 422 status code is returned.
  2. * Forms found in parameters are auto-cast to form views.
  3. */
  4. protected function render(string $view, array $parameters = [], ?Response $response = null): Response
  5. {
  6. return $this->doRender($view, null, $parameters, $response, __FUNCTION__);
  7. }
  8. /**
  9. * Renders a block in a view.
  10. *
AbstractController->render() in src/Controller/HomeController.php (line 262)
  1. }
  2. #[Route('/privacy-policy', name: 'app_privacy_policy', methods: "GET")]
  3. public function privacyPolicy(): Response
  4. {
  5. return $this->render('home/privacy_policy.html.twig', [
  6. 'serverName' => $_SERVER["SERVER_NAME"]
  7. ]);
  8. }
  9. #[IsGranted(new Expression('is_granted("ROLE_TRAINEE")'))]
in vendor/symfony/http-kernel/HttpKernel.php -> privacyPolicy (line 183)
  1. $this->dispatcher->dispatch($event, KernelEvents::CONTROLLER_ARGUMENTS);
  2. $controller = $event->getController();
  3. $arguments = $event->getArguments();
  4. // call controller
  5. $response = $controller(...$arguments);
  6. // view
  7. if (!$response instanceof Response) {
  8. $event = new ViewEvent($this, $request, $type, $response, $event);
  9. $this->dispatcher->dispatch($event, KernelEvents::VIEW);
  1. $request->headers->set('X-Php-Ob-Level', (string) ob_get_level());
  2. $this->requestStack->push($request);
  3. $response = null;
  4. try {
  5. return $response = $this->handleRaw($request, $type);
  6. } catch (\Throwable $e) {
  7. if ($e instanceof \Error && !$this->handleAllThrowables) {
  8. throw $e;
  9. }
  1. $this->boot();
  2. ++$this->requestStackSize;
  3. $this->resetServices = true;
  4. try {
  5. return $this->getHttpKernel()->handle($request, $type, $catch);
  6. } finally {
  7. --$this->requestStackSize;
  8. }
  9. }
  1. ) {
  2. }
  3. public function run(): int
  4. {
  5. $response = $this->kernel->handle($this->request);
  6. if (Kernel::VERSION_ID >= 60400) {
  7. $response->send(false);
  8. if (\function_exists('fastcgi_finish_request') && !$this->debug) {
in vendor/autoload_runtime.php -> run (line 29)
  1. $app = $app(...$args);
  2. exit(
  3. $runtime
  4. ->getRunner($app)
  5. ->run()
  6. );
require_once('/var/www/html/vendor/autoload_runtime.php') in public/index.php (line 5)
  1. <?php
  2. use App\Kernel;
  3. require_once dirname(__DIR__).'/vendor/autoload_runtime.php';
  4. return function (array $context) {
  5. return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']);
  6. };

Logs

Level Channel Message
INFO 06:52:46 deprecation User Deprecated: Class "Doctrine\ORM\Proxy\Autoloader" is deprecated. Use native lazy objects instead. (Autoloader.php:74 called by DoctrineBundle.php:130, https://github.com/doctrine/orm/pull/12005, package doctrine/orm)
{
    "exception": {}
}
INFO 06:52:46 request Matched route "_profiler".
{
    "route": "_profiler",
    "route_parameters": {
        "_route": "_profiler",
        "_controller": "web_profiler.controller.profiler::panelAction",
        "token": "cdc76a"
    },
    "request_uri": "https://dev.jem-formation.fr/_profiler/cdc76a",
    "method": "GET"
}
DEBUG 06:52:46 event Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\DebugHandlersListener::configure".
{
    "event": "kernel.request",
    "listener": "Symfony\\Component\\HttpKernel\\EventListener\\DebugHandlersListener::configure"
}
DEBUG 06:52:46 event Notified event "kernel.request" to listener "Symfony\UX\Turbo\Request\RequestListener::__invoke".
{
    "event": "kernel.request",
    "listener": "Symfony\\UX\\Turbo\\Request\\RequestListener::__invoke"
}
DEBUG 06:52:46 event Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\ValidateRequestListener::onKernelRequest".
{
    "event": "kernel.request",
    "listener": "Symfony\\Component\\HttpKernel\\EventListener\\ValidateRequestListener::onKernelRequest"
}
DEBUG 06:52:46 event Notified event "kernel.request" to listener "Symfony\Bridge\Doctrine\Middleware\IdleConnection\Listener::onKernelRequest".
{
    "event": "kernel.request",
    "listener": "Symfony\\Bridge\\Doctrine\\Middleware\\IdleConnection\\Listener::onKernelRequest"
}
DEBUG 06:52:46 event Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\SessionListener::onKernelRequest".
{
    "event": "kernel.request",
    "listener": "Symfony\\Component\\HttpKernel\\EventListener\\SessionListener::onKernelRequest"
}
DEBUG 06:52:46 event Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\LocaleListener::setDefaultLocale".
{
    "event": "kernel.request",
    "listener": "Symfony\\Component\\HttpKernel\\EventListener\\LocaleListener::setDefaultLocale"
}
DEBUG 06:52:46 event Notified event "kernel.request" to listener "Symfony\Component\AssetMapper\AssetMapperDevServerSubscriber::onKernelRequest".
{
    "event": "kernel.request",
    "listener": "Symfony\\Component\\AssetMapper\\AssetMapperDevServerSubscriber::onKernelRequest"
}
DEBUG 06:52:46 event Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\RouterListener::onKernelRequest".
{
    "event": "kernel.request",
    "listener": "Symfony\\Component\\HttpKernel\\EventListener\\RouterListener::onKernelRequest"
}
DEBUG 06:52:46 event Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\LocaleListener::onKernelRequest".
{
    "event": "kernel.request",
    "listener": "Symfony\\Component\\HttpKernel\\EventListener\\LocaleListener::onKernelRequest"
}
DEBUG 06:52:46 event Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\LocaleAwareListener::onKernelRequest".
{
    "event": "kernel.request",
    "listener": "Symfony\\Component\\HttpKernel\\EventListener\\LocaleAwareListener::onKernelRequest"
}
DEBUG 06:52:46 event Notified event "kernel.request" to listener "Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener::configureLogoutUrlGenerator".
{
    "event": "kernel.request",
    "listener": "Symfony\\Bundle\\SecurityBundle\\Debug\\TraceableFirewallListener::configureLogoutUrlGenerator"
}
DEBUG 06:52:46 event Notified event "kernel.request" to listener "Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener::onKernelRequest".
{
    "event": "kernel.request",
    "listener": "Symfony\\Bundle\\SecurityBundle\\Debug\\TraceableFirewallListener::onKernelRequest"
}
DEBUG 06:52:46 event Notified event "kernel.request" to listener "EasyCorp\Bundle\EasyAdminBundle\EventListener\AdminRouterSubscriber::onKernelRequestPrettyUrls".
{
    "event": "kernel.request",
    "listener": "EasyCorp\\Bundle\\EasyAdminBundle\\EventListener\\AdminRouterSubscriber::onKernelRequestPrettyUrls"
}
DEBUG 06:52:46 event Notified event "kernel.request" to listener "App\EventListener\CheckMaintenanceListener::onKernelRequest".
{
    "event": "kernel.request",
    "listener": "App\\EventListener\\CheckMaintenanceListener::onKernelRequest"
}
DEBUG 06:52:46 event Notified event "kernel.request" to listener "EasyCorp\Bundle\EasyAdminBundle\EventListener\AdminRouterSubscriber::onKernelRequest".
{
    "event": "kernel.request",
    "listener": "EasyCorp\\Bundle\\EasyAdminBundle\\EventListener\\AdminRouterSubscriber::onKernelRequest"
}
DEBUG 06:52:46 event Notified event "kernel.controller" to listener "EasyCorp\Bundle\EasyAdminBundle\EventListener\AdminRouterSubscriber::onKernelController".
{
    "event": "kernel.controller",
    "listener": "EasyCorp\\Bundle\\EasyAdminBundle\\EventListener\\AdminRouterSubscriber::onKernelController"
}
DEBUG 06:52:46 event Notified event "kernel.controller" to listener "Symfony\Bundle\FrameworkBundle\DataCollector\RouterDataCollector::onKernelController".
{
    "event": "kernel.controller",
    "listener": "Symfony\\Bundle\\FrameworkBundle\\DataCollector\\RouterDataCollector::onKernelController"
}
DEBUG 06:52:46 event Notified event "kernel.controller" to listener "Symfony\Component\HttpKernel\DataCollector\RequestDataCollector::onKernelController".
{
    "event": "kernel.controller",
    "listener": "Symfony\\Component\\HttpKernel\\DataCollector\\RequestDataCollector::onKernelController"
}
DEBUG 06:52:46 event Notified event "kernel.controller_arguments" to listener "Symfony\Component\Security\Http\EventListener\IsCsrfTokenValidAttributeListener::onKernelControllerArguments".
{
    "event": "kernel.controller_arguments",
    "listener": "Symfony\\Component\\Security\\Http\\EventListener\\IsCsrfTokenValidAttributeListener::onKernelControllerArguments"
}
DEBUG 06:52:46 event Notified event "kernel.controller_arguments" to listener "Symfony\Component\Security\Http\EventListener\IsGrantedAttributeListener::onKernelControllerArguments".
{
    "event": "kernel.controller_arguments",
    "listener": "Symfony\\Component\\Security\\Http\\EventListener\\IsGrantedAttributeListener::onKernelControllerArguments"
}
DEBUG 06:52:46 event Notified event "kernel.controller_arguments" to listener "Symfony\Component\HttpKernel\EventListener\CacheAttributeListener::onKernelControllerArguments".
{
    "event": "kernel.controller_arguments",
    "listener": "Symfony\\Component\\HttpKernel\\EventListener\\CacheAttributeListener::onKernelControllerArguments"
}
DEBUG 06:52:46 event Notified event "kernel.controller_arguments" to listener "Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestPayloadValueResolver::onKernelControllerArguments".
{
    "event": "kernel.controller_arguments",
    "listener": "Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestPayloadValueResolver::onKernelControllerArguments"
}
DEBUG 06:52:46 event Notified event "kernel.controller_arguments" to listener "Symfony\Component\HttpKernel\EventListener\ErrorListener::onControllerArguments".
{
    "event": "kernel.controller_arguments",
    "listener": "Symfony\\Component\\HttpKernel\\EventListener\\ErrorListener::onControllerArguments"
}
INFO 06:52:46 doctrine Connecting with parameters {params}
{
    "params": {
        "use_savepoints": true,
        "driver": "pdo_mysql",
        "idle_connection_ttl": 600,
        "host": "192.168.1.131",
        "port": 3306,
        "user": "paf",
        "password": "<redacted>",
        "driverOptions": [],
        "defaultTableOptions": [],
        "dbname": "autoformation_dev",
        "serverVersion": "11.8.3-MariaDB",
        "charset": "utf8mb4"
    }
}
DEBUG 06:52:46 doctrine Executing statement: SELECT t0.id AS id_5, t0.username AS username_6, t0.last_name AS last_name_7, t0.first_name AS first_name_8, t0.roles AS roles_9, t0.password AS password_10, t0.email AS email_11, t0.activated AS activated_12, t0.tmp_code AS tmp_code_13, t0.tmp_code_date AS tmp_code_date_14, t0.signature AS signature_15, t0.uuid AS uuid_16, t0.phone_number AS phone_number_17, t0.avatar_id AS avatar_id_18, t0.dtype, t1.password_save AS password_save_19, t1.documents AS documents_20, t1.diploma AS diploma_21, t1.tutorial_completed AS tutorial_completed_22, t1.cohort_id AS cohort_id_23, t2.role AS role_24, t2.entrance_code AS entrance_code_25, t2.entrance_code_date AS entrance_code_date_26, t2.responsible_id AS responsible_id_27, t3.role AS role_28, t3.entrance_code AS entrance_code_29, t3.entrance_code_date AS entrance_code_date_30, t3.sector_id AS sector_id_31, t4.role AS role_32, t4.entrance_code AS entrance_code_33, t4.entrance_code_date AS entrance_code_date_34, t4.coordinator_id AS coordinator_id_35 FROM user t0 LEFT JOIN trainee t1 ON t0.id = t1.id LEFT JOIN coordinator t2 ON t0.id = t2.id LEFT JOIN responsible t3 ON t0.id = t3.id LEFT JOIN trainer t4 ON t0.id = t4.id WHERE t0.id = ? (parameters: {params}, types: {types})
{
    "sql": "SELECT t0.id AS id_5, t0.username AS username_6, t0.last_name AS last_name_7, t0.first_name AS first_name_8, t0.roles AS roles_9, t0.password AS password_10, t0.email AS email_11, t0.activated AS activated_12, t0.tmp_code AS tmp_code_13, t0.tmp_code_date AS tmp_code_date_14, t0.signature AS signature_15, t0.uuid AS uuid_16, t0.phone_number AS phone_number_17, t0.avatar_id AS avatar_id_18, t0.dtype, t1.password_save AS password_save_19, t1.documents AS documents_20, t1.diploma AS diploma_21, t1.tutorial_completed AS tutorial_completed_22, t1.cohort_id AS cohort_id_23, t2.role AS role_24, t2.entrance_code AS entrance_code_25, t2.entrance_code_date AS entrance_code_date_26, t2.responsible_id AS responsible_id_27, t3.role AS role_28, t3.entrance_code AS entrance_code_29, t3.entrance_code_date AS entrance_code_date_30, t3.sector_id AS sector_id_31, t4.role AS role_32, t4.entrance_code AS entrance_code_33, t4.entrance_code_date AS entrance_code_date_34, t4.coordinator_id AS coordinator_id_35 FROM user t0 LEFT JOIN trainee t1 ON t0.id = t1.id LEFT JOIN coordinator t2 ON t0.id = t2.id LEFT JOIN responsible t3 ON t0.id = t3.id LEFT JOIN trainer t4 ON t0.id = t4.id WHERE t0.id = ?",
    "params": {
        "1": 1
    },
    "types": {
        "1": 1
    }
}
INFO 06:52:46 deprecation User Deprecated: Since symfony/var-exporter 7.3: Using ProxyHelper::generateLazyGhost() is deprecated, use native lazy objects instead.
{
    "exception": {}
}
INFO 06:52:46 deprecation User Deprecated: Since symfony/var-exporter 7.3: The "Symfony\Component\VarExporter\LazyGhostTrait" trait is deprecated, use native lazy objects instead.
{
    "exception": {}
}
INFO 06:52:46 deprecation User Deprecated: Since symfony/var-exporter 7.3: Using ProxyHelper::generateLazyGhost() is deprecated, use native lazy objects instead.
{
    "exception": {}
}

Stack Trace

RuntimeError
Twig\Error\RuntimeError:
Impossible to access an attribute ("firstName") on a null variable in "base.html.twig" at line 287.

  at templates/base.html.twig:287
  at Twig\Extension\CoreExtension::getAttribute()
     (var/cache/dev/twig/0f/0faca2f45b7f67804292389ebb814919.php:2101)
  at __TwigTemplate_c6df601d6d4b562c8dd70dddeb6f751a->block_header()
     (vendor/twig/twig/src/Template.php:446)
  at Twig\Template->yieldBlock()
     (var/cache/dev/twig/0f/0faca2f45b7f67804292389ebb814919.php:347)
  at __TwigTemplate_c6df601d6d4b562c8dd70dddeb6f751a->block_body()
     (vendor/twig/twig/src/Template.php:446)
  at Twig\Template->yieldBlock()
     (var/cache/dev/twig/0f/0faca2f45b7f67804292389ebb814919.php:164)
  at __TwigTemplate_c6df601d6d4b562c8dd70dddeb6f751a->doDisplay()
     (vendor/twig/twig/src/Template.php:402)
  at Twig\Template->yield()
     (var/cache/dev/twig/15/151a0a05bc1cd6718b6126a8fd3d44d3.php:55)
  at __TwigTemplate_bc174d61ee9e2388073e8b5672d9643b->doDisplay()
     (vendor/twig/twig/src/Template.php:402)
  at Twig\Template->yield()
     (vendor/twig/twig/src/Template.php:358)
  at Twig\Template->display()
     (vendor/twig/twig/src/Template.php:373)
  at Twig\Template->render()
     (vendor/twig/twig/src/TemplateWrapper.php:51)
  at Twig\TemplateWrapper->render()
     (vendor/twig/twig/src/Environment.php:333)
  at Twig\Environment->render()
     (vendor/symfony/framework-bundle/Controller/AbstractController.php:459)
  at Symfony\Bundle\FrameworkBundle\Controller\AbstractController->doRenderView()
     (vendor/symfony/framework-bundle/Controller/AbstractController.php:464)
  at Symfony\Bundle\FrameworkBundle\Controller\AbstractController->doRender()
     (vendor/symfony/framework-bundle/Controller/AbstractController.php:278)
  at Symfony\Bundle\FrameworkBundle\Controller\AbstractController->render()
     (src/Controller/HomeController.php:262)
  at App\Controller\HomeController->privacyPolicy()
     (vendor/symfony/http-kernel/HttpKernel.php:183)
  at Symfony\Component\HttpKernel\HttpKernel->handleRaw()
     (vendor/symfony/http-kernel/HttpKernel.php:76)
  at Symfony\Component\HttpKernel\HttpKernel->handle()
     (vendor/symfony/http-kernel/Kernel.php:182)
  at Symfony\Component\HttpKernel\Kernel->handle()
     (vendor/symfony/runtime/Runner/Symfony/HttpKernelRunner.php:35)
  at Symfony\Component\Runtime\Runner\Symfony\HttpKernelRunner->run()
     (vendor/autoload_runtime.php:29)
  at require_once('/var/www/html/vendor/autoload_runtime.php')
     (public/index.php:5)