{% extends 'front/base_front.html.twig' %}
{% block title %}
{{ 'Pages.Contact.Label' | trans({} , 'messages_front') }}
{% endblock %}
{% block stylesheets %}
{{ parent() }}
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@600;700&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css"/>
{% endblock %}
{% block javascripts %}
{{ parent() }}
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
{% endblock %}
{% block container %}
<section id="contact_main_arae">
<div class="container">
<div class="page_heading">
<h2>{{ 'Pages.Contact.Messages.ContactUs' | trans({} , 'messages_front') }}</h2>
<p>{{ 'Pages.Contact.Messages.ContactSubtitle' | trans({} , 'messages_front') }}</p>
</div>
<div class="contact_wrapper">
{# ---------------- Agencies + individual maps ---------------- #}
<div class="agencies_col">
{% for agency in agencies %}
<div class="agency_item">
<div class="agency_map_box">
<div id="leaflet_{{ agency.id }}" class="agency_map" data-name="{{ agency.name }}"></div>
</div>
<div class="agency_details">
<h3>{{ agency.name }}</h3>
<ul>
<li>
<span class="icon_badge"><i class="fas fa-map-marker-alt"></i></span>
<span>
<strong>{{ 'Pages.Footer.Messages.Address' | trans({} , 'messages_front') }} :</strong>
{{ agency.address }}, {{ agency.city }}
</span>
</li>
{% if agency.email is defined and agency.email %}
<li>
<span class="icon_badge"><i class="fas fa-envelope"></i></span>
<span>
<strong>{{ 'Pages.Common.Fields.Email' | trans({} , 'messages_front') }} :</strong> {{ agency.email }}
</span>
</li>
{% endif %}
<li>
<span class="icon_badge"><i class="fas fa-phone"></i></span>
<span>
<strong>{{ 'Pages.Common.Fields.Phone' | trans({} , 'messages_front') }} :</strong>
{{ agency.phone }}
</span>
</li>
{% if agency.whatsapp is defined and agency.whatsapp %}
<li>
<span class="icon_badge"><i class="fab fa-whatsapp"></i></span>
<span>
<strong>whatsapp :</strong> {{ agency.whatsapp }}
</span>
</li>
{% endif %}
</ul>
</div>
</div>
{% endfor %}
</div>
{# ---------------- Contact form ---------------- #}
<div class="form_col">
<h2>{{ 'Pages.Contact.Messages.ContactUs' | trans({} , 'messages_front') }}</h2>
<p class="subtitle">{{ 'Pages.Contact.Messages.LeaveMessage' | trans({} , 'messages_front') }}</p>
{% for flash_error in app.flashes('error') %}
<div class="alert alert-danger" role="alert">{{ flash_error }}</div>
{% endfor %}
{{ form_start(form) }}
{# Last name / First name #}
<div class="row_gap">
{% if form.civility is defined %}
<div style="flex: 0 0 90px;">{{ form_row(form.civility, {label: false}) }}</div>
{% endif %}
<div>{{ form_row(form.lastName, {label: false, attr: {placeholder: 'Nom'}}) }}</div>
<div>{{ form_row(form.firstName, {label: false, attr: {placeholder: 'Prénom'}}) }}</div>
</div>
{{ form_row(form.email, {label: false, attr: {placeholder: 'Email'}}) }}
{# Champ téléphone sans dépendance externe #}
{{ form_widget(form.phone, {attr: {placeholder: 'Téléphone'}}) }}
{% if form.subject is defined %}
{{ form_row(form.subject, {label: false, attr: {placeholder: 'Objet'}}) }}
{% endif %}
{% if form.service is defined %}
{{ form_row(form.service, {label: false}) }}
{% endif %}
{{ form_row(form.message, {label: false, attr: {placeholder: 'Votre message'}}) }}
<button type="submit" class="btn btn_theme btn_md">
{{ 'Pages.Contact.Messages.SendMessage' | trans({} , 'messages_front') }}
</button>
{{ form_end(form) }}
</div>
</div>
</div>
</section>
<script>
$(document).ready(() => {
{% for agency in agencies %}
{% if agency.latitude and agency.longitude %}
(function () {
let mapEl = document.getElementById('leaflet_{{ agency.id }}');
let map = L.map(mapEl, {
zoomControl: true,
scrollWheelZoom: false
}).setView([{{ agency.latitude }}, {{ agency.longitude }}], 14);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
// Real Leaflet popup, opened by default, sitting above the
// marker with its little tail (native Leaflet behaviour).
// maxWidth/minWidth stop it from ever stretching full-width.
L.marker([{{ agency.latitude }}, {{ agency.longitude }}])
.addTo(map)
.bindPopup(mapEl.dataset.name, {
closeButton: true,
autoClose: false,
maxWidth: 220,
minWidth: 90
})
.openPopup();
})();
{% endif %}
{% endfor %}
// Keep phone values consistent without relying on a third-party CDN.
let phoneInput = document.querySelector('input[name="phone"]');
if (phoneInput) {
let phoneForm = phoneInput.closest('form');
if (phoneForm) {
phoneForm.addEventListener('submit', () => {
phoneInput.value = phoneInput.value.trim().replace(/\s+/g, ' ');
});
}
}
});
</script>
<script src="{{ asset('assets/js/leaflet_map.js') }}"></script>
{% endblock %}