templates/layouts/footer.html.twig line 1

Open in your IDE?
  1. <footer>
  2.     <div class="container container-footer my-4">
  3.         <a class="nav-logo" href="{{ path('home') }}">
  4.             <img src="{{ logo ?? asset('assets/images/logo.svg') }}" width="150" alt="logo" style="background: white; border-radius: 10px;">
  5.         </a>
  6.         <div class="row justify-content-between mt-3">
  7.             <div class="col-xl-3 col-lg-4 col-md-4 col-sm-6">
  8.                 <ul class="list-unstyled float-md-left float-lft w-100">
  9.                     {% if socialLinks['facebook'] is not empty %}
  10.                         <li class="">
  11.                             <a href="{{ socialLinks['facebook'] }}" target="_blank">
  12.                                 <span>
  13.                                     <i class="fab fa-facebook-f"></i>
  14.                                 </span>
  15.                             </a>
  16.                         </li>
  17.                     {% endif %}
  18.                     {% if socialLinks['twitter'] is not empty %}
  19.                         <li class="">
  20.                             <a href="{{ socialLinks['twitter'] }}" target="_blank">
  21.                                 <span>
  22.                                     <i class="fab fa-twitter"></i>
  23.                                 </span>
  24.                             </a>
  25.                         </li>
  26.                     {% endif %}
  27.                     {% if socialLinks['instagram'] is not empty %}
  28.                         <li class="">
  29.                             <a href="{{ socialLinks['instagram'] }}" target="_blank">
  30.                                 <span>
  31.                                     <i class="fab fa-instagram"></i>
  32.                                 </span>
  33.                             </a>
  34.                         </li>
  35.                     {% endif %}
  36.                     {% if socialLinks['linkedin'] is not empty %}
  37.                         <li class="">
  38.                             <a href="{{ socialLinks['linkedin'] }}" target="_blank">
  39.                                 <span>
  40.                                     <i class="fab fa-linkedin"></i>
  41.                                 </span>
  42.                             </a>
  43.                         </li>
  44.                     {% endif %}
  45.                     {% if socialLinks['youtube'] is not empty %}
  46.                         <li class="">
  47.                             <a href="{{ socialLinks['youtube'] }}" target="_blank">
  48.                                 <span>
  49.                                     <i class="fab fa-youtube"></i>
  50.                                 </span>
  51.                             </a>
  52.                         </li>
  53.                     {% endif %}
  54.                     {% if socialLinks['twitch'] is not empty %}
  55.                         <li class="">
  56.                             <a href="{{ socialLinks['twitch'] }}" target="_blank">
  57.                                 <span>
  58.                                     <i class="fab fa-twitch"></i>
  59.                                 </span>
  60.                             </a>
  61.                         </li>
  62.                     {% endif %}
  63.                 </ul>
  64.             </div>
  65.         </div>
  66.         <div class="mt-3 row">
  67.             <div class="col-lg-4">
  68.                 {% if siteConfig.isContactActivated %}
  69.                     <ul class="list-footer">
  70.                         <li>
  71.                             <a href="{{path('contact')}}">{{'footer.contact'|trans }}</a>
  72.                         </li>
  73.                     </ul>
  74.                 {% endif %}
  75.             </div>
  76.             <div class="col-lg-4">
  77.                 <ul class="list-footer">
  78.                     <li class="policy" data-button="policy" data-target="#policyModal">{{ 'footer.policy'|trans }}</li>
  79.                     <li class="policy" data-button="cookies-policy" data-target="#cookiesPolicyModal">{{ 'footer.cookies-policy'|trans }}</li>
  80.                     <li class="policy" data-button="terms" data-target="#termsModal">{{ 'footer.terms'|trans }}</li>
  81.                     {% if siteConfig.activedContribution %}
  82.                         <li class="policy" data-button="terms" data-target="#FormContribution">
  83.                             <button class="btn BoutonContribution">
  84.                                 <i class="bi bi-plus-circle-fill"></i>
  85.                             </button>
  86.                         </li>
  87.                     {% endif %}
  88.                     {% if app.user %}
  89.                         {% if siteConfig.activedNotification %}
  90.                             <li class="policy" data-button="notifications" data-target="#notificationModal">
  91.                                 <button class="btn btn-notification fade show">
  92.                                     <i class="bi bi-bell"></i>
  93.                                     <span id="notification-badge" class="position-absolute top-0 start-0 translate-middle badge rounded-pill bg-danger border">
  94.                                         <span id="notification-count">
  95.                                             {% if notifications is not empty %}
  96.                                                 {{ notifications|length }}{% else %}0
  97.                                             {% endif %}
  98.                                         </span>
  99.                                         <span class="visually-hidden">unread notifications</span>
  100.                                     </span>
  101.                                 </button>
  102.                             </li>
  103.                         {% endif %}
  104.                     {% endif %}
  105.                 </ul>
  106.             </div>
  107.             <div class="col-lg-4">
  108.                 <ul class="list-footer">
  109.                     <li class="policy" data-button="terms-of-use" data-target="#termsOfUseModal">{{'footer.terms-of-use'|trans }}</li>
  110.                     {% if siteConfig.isAnonymizationActive %}
  111.                         <li class="policy" data-button="anonymization" data-target="#anonymizeModal" role="button" tabindex="0" aria-controls="anonymizeModal">
  112.                             {{ 'footer.anonymization'|trans }}
  113.                         </li>
  114.                     {% endif %}
  115.                 </ul>
  116.             </div>
  117.         </div>
  118.         <div class="mt-3 d-flex justify-content-between footer-copy-right">
  119.             <div>
  120.                 {{ siteConfig.copyright }}
  121.             </div>
  122.             <div>
  123.                 <small>Version :
  124.                     {{ appVersion }}</small>
  125.             </div>
  126.         </div>
  127.     </div>
  128. </footer>
  129. <!-- Modals -->
  130. <div class="modal fade" id="termsModal" tabindex="-1" role="dialog" aria-hidden="true">
  131.     <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
  132.         <div class="modal-content">
  133.             <div class="modal-header">
  134.                 <h5 class="modal-title" id="exampleModalLabel">{{ 'terms.modal-heading'|trans }}</h5>
  135.                 <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
  136.             </div>
  137.             <div class="modal-body">
  138.                 <p class="text-black">{{ mentionLegal.termsOfService|raw }}</p>
  139.             </div>
  140.             <div class="modal-footer">
  141.                 <button type="button" class="btn btn-primary" data-bs-dismiss="modal">{{ 'terms.close-modal-btn'|trans }}</button>
  142.             </div>
  143.         </div>
  144.     </div>
  145. </div>
  146. {% if siteConfig.activedContribution %}
  147.     <div class="modal fade" id="FormContribution" tabindex="-1" role="dialog" aria-hidden="true">
  148.         <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
  149.             <div class="modal-content">
  150.                 <div class="modal-header">
  151.                     <h5 class="modal-title" id="contributionLabel">{{  siteConfig.getTitle ?? 'Contribution' }}</h5>
  152.                     <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
  153.                 </div>
  154.                 <div class="modal-body">
  155.                     <p class="text-black">
  156.                         {{- renderContibutorForm() -}}
  157.                     </p>
  158.                 </div>
  159.             </div>
  160.         </div>
  161.     </div>
  162. {% endif %}
  163. {# Policy modal réutilisable #}
  164. {% if app.user %}
  165.     {{ include('privacy/modal.html.twig') }}
  166.     {% if siteConfig.isAnonymizationActive %}
  167.         {{ include('privacy/_anonymize_modal.html.twig') }}
  168.     {% endif %}
  169. {% endif %}
  170. {# Script footer conservé mais SANS reload automatique, et uniquement si déclenché depuis le footer #}
  171. <script>
  172.     document.addEventListener('DOMContentLoaded', function () {
  173. const saveBtn = document.getElementById('savePrivacyBtn');
  174. const checkbox = document.getElementById('privacyCheckbox');
  175. const acceptForm = document.getElementById('accept-privacy-form');
  176. const refuseForm = document.getElementById('refuse-privacy-form');
  177. if (! saveBtn || ! acceptForm || ! refuseForm) 
  178. return;
  179. async function postForm(form) {
  180. const fd = new FormData(form);
  181. const resp = await fetch(form.action, {
  182. method: 'POST',
  183. headers: {
  184. 'X-Requested-With': 'XMLHttpRequest'
  185. },
  186. body: fd
  187. });
  188. try {
  189. return await resp.json();
  190. } catch {
  191. return {ok: false};
  192. }}
  193. // Flag: si l’orchestrateur a ouvert la modale, il pose window.__ORCH__OPEN = true
  194. saveBtn.addEventListener('click', async () => {
  195. const form = checkbox.checked ? acceptForm : refuseForm;
  196. const res = await postForm(form);
  197. if (res && res.ok) {
  198. if (!window.__ORCH__OPEN) { // Ouverture via footer → on peut recharger
  199. location.reload();
  200. }
  201. // Sinon, l’orchestrateur fermera la modale et enchaînera
  202. } else {
  203. alert('Une erreur est survenue. Merci de réessayer.');
  204. }
  205. });
  206. }
  207. );
  208. </script>
  209.     <div class="modal fade" id="cookiesPolicyModal" tabindex="-1" role="dialog" aria-hidden="true">
  210.         <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
  211.             <div class="modal-content">
  212.                 <div class="modal-header">
  213.                     <h5 class="modal-title" id="cookiesPolicyModalLabel">{{ cookiesPolicy.title }}</h5>
  214.                     <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
  215.                 </div>
  216.                 <div class="modal-body">
  217.                     <p class="text-black">{{ cookiesPolicy.content|raw }}</p>
  218.                 </div>
  219.                 <div class="modal-footer">
  220.                     <button type="button" class="btn btn-primary" data-bs-dismiss="modal">{{ 'terms.close-modal-btn'|trans }}</button>
  221.                 </div>
  222.             </div>
  223.         </div>
  224.     </div>
  225.     <div class="modal fade" id="termsOfUseModal" tabindex="-1" role="dialog" aria-hidden="true" data-bs-backdrop="static" data-bs-keyboard="false">
  226.         <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
  227.             <div class="modal-content">
  228.                 <div class="modal-header">
  229.                     <h5 class="modal-title text-black" id="termsOfUseModalLabel">{{ termsOfUse.title }}</h5>
  230.                     <button type="button" class="btn-close btn-close-termsOfUse" data-bs-dismiss="modal" aria-label="Close" {% if app.user %} {{ app.user.acceptcgu ? '' : 'disabled' }}{% endif %}>
  231.                     </button>
  232.                 </div>
  233.                 <div class="modal-body">
  234.                     <div class="row">
  235.                         <p class="text-black">{{ termsOfUse.content|raw }}</p>
  236.                     </div>
  237.                     <div class="row">
  238.                         {% if app.user %}
  239.                             <div class="custom-checkbox custom-control">
  240.                                 <input type="checkbox" data-checkboxes="mygroup" class="custom-control-input" id="termsOfUseCheckbox" {{app.user.acceptCgu ? 'checked' : '' }} {% if app.user %} {{ app.user.acceptcgu ? 'disabled' : '' }}{% endif %}>
  241.                                 <label for="termsOfUseCheckbox" class="custom-control-label">
  242.                                     J'accepte les conditions générales d'utilisation
  243.                                 </label>
  244.                             </div>
  245.                         {% endif %}
  246.                     </div>
  247.                 </div>
  248.                 <div class="modal-footer">
  249.                     <button id="btnTermsClose" type="button" class="btn btn-primary btn-close-termsOfUse" data-bs-dismiss="modal"
  250.                      {% if app.user %} 
  251.                         {{ app.user.acceptcgu ? '' : 'disabled' }}
  252.                      {% endif %}
  253.                     >
  254.                         {{ 'terms.close-modal-btn'|trans }}
  255.                     </button>
  256.                 </div>
  257.             </div>
  258.         </div>
  259.     </div>
  260. {% if app.user %}
  261.         {% if siteConfig.activedNotification %}
  262.             <div class="modal fade" id="notificationModal" tabindex="-1" role="dialog" aria-hidden="true">
  263.                 <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
  264.                     <div class="modal-content">
  265.                         <div class="modal-header">
  266.                             <h5 class="modal-title" id="notificationModalLabel">{{ 'notification.modal-heading'|trans }}</h5>
  267.                             <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
  268.                         </div>
  269.                         <div class="modal-body">
  270.                             {% for entry in notifications %}
  271.                                 <a href="{{ path('podcast', { slug: entry.notification.blogPost.slug, notification_id: entry.id }) }}" class="d-block alert alert-success fade show w-100" style="text-decoration: none !important;" data-id="{{ entry.id }}">
  272.                                     <h4 class="alert-heading d-flex justify-content-between align-items-center mb-0">
  273.                                         <span>{{ entry.notification.title }}</span>
  274.                                         <button type="button" class="btn-close"></button>
  275.                                     </h4>
  276.                                     <p class="mb-0">
  277.                                         {{ entry.notification.description }}
  278.                                     </p>
  279.                                 </a>
  280.                             {% endfor %}
  281.                             <p class="no-notification my-4 text-center {{ notifications is not empty ? 'd-none' }}">{{ 'notification.no-notification'|trans }}</p>
  282.                         </div>
  283.                         <div class="modal-footer">
  284.                             <button type="button" class="btn btn-primary" data-bs-dismiss="modal">{{ 'notification.close-modal-btn'|trans }}</button>
  285.                         </div>
  286.                     </div>
  287.                 </div>
  288.             </div>
  289.         {% endif %}
  290. {% endif %}