templates/Partial/demande_form.html.twig line 1

Open in your IDE?
  1. {% form_theme demande_form 'Form/exacompare.html.twig' %}
  2. {{ form_start(demande_form, {'attr': {'class': 'request-form form', 'enctype': "multipart/form-data"}}) }}
  3. <div class="inner-form col-sm-12">
  4. <div class="table-form request-form-field cat row">
  5. <div id="categorie" class="col-sm-12">
  6. {{ form_label(demande_form.categorie) }}
  7. <div class="form-fields clearfix">
  8. {{ form_widget(demande_form.categorie) }}
  9. {{ form_errors(demande_form.categorie) }}
  10. </div>
  11. </div>
  12. </div>
  13. <fieldset>
  14. <legend>Votre bien</legend>
  15. <div class="table-form row">
  16. <div class="col-sm-12">
  17. {{ form_label(demande_form.bienType) }}
  18. <div class="form-fields clearfix">
  19. {{ form_widget(demande_form.bienType) }}
  20. {{ form_errors(demande_form.bienType) }}
  21. </div>
  22. </div>
  23. </div>
  24. <div class="table-form row">
  25. <div class="col-sm-12">
  26. {{ form_label(demande_form.bienLocalisation) }}
  27. <div class="form-fields clearfix localisation-container">
  28. {{ form_widget(demande_form.bienLocalisation) }}
  29. {{ form_errors(demande_form.bienLocalisation) }}
  30. </div>
  31. </div>
  32. {{ form_row(demande_form.bienCodePostal, {'row_attr': {'class': 'col-sm-6'}}) }}
  33. {{ form_row(demande_form.bienVille, {'row_attr': {'class': 'col-sm-6'}}) }}
  34. </div>
  35. <div class="table-form row">
  36. <div class="col-sm-4">
  37. {{ form_label(demande_form.bienNombrePieces) }}
  38. <div class="form-fields clearfix">
  39. {{ form_widget(demande_form.bienNombrePieces) }}
  40. {{ form_errors(demande_form.bienNombrePieces) }}
  41. </div>
  42. </div>
  43. <div class="col-sm-4">
  44. {{ form_label(demande_form.bienSurface) }}
  45. <div class="form-fields clearfix">
  46. {{ form_widget(demande_form.bienSurface) }}
  47. {{ form_errors(demande_form.bienSurface) }}
  48. </div>
  49. </div>
  50. <div class="col-sm-4" data-groups="diagnostics">
  51. {{ form_label(demande_form.bienAnneeConstructionChoice) }}
  52. <div class="form-fields clearfix">
  53. {{ form_widget(demande_form.bienAnneeConstructionChoice) }}
  54. {{ form_errors(demande_form.bienAnneeConstructionChoice) }}
  55. </div>
  56. </div>
  57. <div class="col-sm-4" data-groups="expertises etudes solutions energies">
  58. {{ form_label(demande_form.bienAnneeConstructionFree) }}
  59. <div class="form-fields clearfix">
  60. {{ form_widget(demande_form.bienAnneeConstructionFree) }}
  61. </div>
  62. {{ form_errors(demande_form.bienAnneeConstructionFree) }}
  63. </div>
  64. </div>
  65. <div class="table-form row">
  66. <div class="col-sm-4">
  67. {{ form_label(demande_form.bienCopropriete) }}
  68. <div class="form-fields clearfix">
  69. {{ form_widget(demande_form.bienCopropriete) }}
  70. {{ form_errors(demande_form.bienCopropriete) }}
  71. </div>
  72. </div>
  73. <div class="col-sm-4" data-groups="diagnostics">
  74. {{ form_label(demande_form.bienGaz) }}
  75. <div class="form-fields clearfix">
  76. {{ form_widget(demande_form.bienGaz) }}
  77. {{ form_errors(demande_form.bienGaz) }}
  78. </div>
  79. </div>
  80. <div class="col-sm-4" data-groups="diagnostics">
  81. {{ form_label(demande_form.bienElectricite) }}
  82. <div class="form-fields clearfix">
  83. {{ form_widget(demande_form.bienElectricite) }}
  84. {{ form_errors(demande_form.bienElectricite) }}
  85. </div>
  86. </div>
  87. <!-- <div class="col-sm-8">
  88. <div class="form-label">
  89. <label for="demande_bienPhoto">Joignez une photo (10&nbsp;Mo max)</label>
  90. </div>
  91. <div class="form-fields clearfix">
  92. <span class="browse-button row">
  93. <span class="col-md-6">
  94. <input class="hide" type="file" id="demande_bienPhoto" name="bienPhoto">
  95. <button class="browse" type="button">Parcourir</button>
  96. </span>
  97. <span class="file col-md-6">Aucun fichier sélectionné.</span>
  98. </span>
  99. </div>
  100. </div> -->
  101. </div>
  102. </fieldset>
  103. <fieldset>
  104. <legend>Votre projet</legend>
  105. <div class="table-form row">
  106. <!-- <div class="col-sm-4 -->
  107. <div class="col-sm-4" data-groups="solutions energies">
  108. <div class="form-label">
  109. {{ form_label(demande_form.prestation) }}
  110. </div>
  111. <div class="form-fields clearfix">
  112. {{ form_widget(demande_form.prestation) }}
  113. </div>
  114. {{ form_errors(demande_form.prestation) }}
  115. </div>
  116. <!-- <div class="col-sm-4 -->
  117. {# <div class="col-sm-4">
  118. <div class="form-label">
  119. {{ form_label(demande_form.expiration) }}
  120. </div>
  121. <div class="form-fields clearfix">
  122. {{ form_widget(demande_form.expiration) }}
  123. {{ form_errors(demande_form.expiration) }}
  124. </div>
  125. </div> #}
  126. <!-- <div class="browse-button col-sm-8 -->
  127. <!-- <div class="browse-button col-sm-8" data-groups="expertises etudes solutions energies" style="">
  128. <div class="form-label">
  129. <div class="form-label">
  130. <label for="demande_descriptionFile">Joignez un descriptif (10&nbsp;Mo max)</label>
  131. </div>
  132. </div>
  133. <div class="form-fields clearfix">
  134. <span class="browse-button row">
  135. <span class="col-md-6">
  136. <input class="hide" type="file" id="demande_descriptionFile" name="descriptionFile">
  137. <button class="browse" type="button">Parcourir</button>
  138. </span>
  139. <span class="file col-md-6">Aucun fichier sélectionné.</span>
  140. </span>
  141. </div>
  142. </div> -->
  143. <!-- <div class="col-sm-12 -->
  144. <div class="col-sm-12">
  145. <div class="form-label">
  146. {{ form_label(demande_form.comment) }}
  147. </div>
  148. <div class="form-fields clearfix">
  149. {{ form_widget(demande_form.comment) }}
  150. </div>
  151. {{ form_errors(demande_form.comment) }}
  152. </div>
  153. </div>
  154. </fieldset>
  155. <fieldset>
  156. <legend>Vous-même</legend>
  157. <div class="table-form row">
  158. {% block warning_privacy %}
  159. <p class="form-message col-sm-12">
  160. Vos données personnelles (nom, email, téléphone) ne seront pas utilisées à des fins publicitaires.
  161. </p>
  162. <p class="form-message col-sm-12">
  163. Attention, si vos informations ci-dessous sont inexactes, votre demande ne sera pas traitée.
  164. </p>
  165. {% endblock %}
  166. <div class="col-sm-4 hidden">
  167. {{ form_label(demande_form.clientStatut) }}
  168. <div class="form-fields clearfix">
  169. {{ form_widget(demande_form.clientStatut) }}
  170. {{ form_errors(demande_form.clientStatut) }}
  171. </div>
  172. </div>
  173. <div class="col-sm-4">
  174. {{ form_label(demande_form.clientNom) }}
  175. <div class="form-fields clearfix">
  176. {{ form_widget(demande_form.clientNom) }}
  177. {{ form_errors(demande_form.clientNom) }}
  178. </div>
  179. </div>
  180. <div class="col-sm-4">
  181. {{ form_label(demande_form.clientEmail) }}
  182. <div class="form-fields clearfix">
  183. {{ form_widget(demande_form.clientEmail) }}
  184. {{ form_errors(demande_form.clientEmail) }}
  185. </div>
  186. </div>
  187. <div class="col-sm-4">
  188. {{ form_label(demande_form.clientTelephone) }}
  189. <div class="form-fields clearfix">
  190. {{ form_widget(demande_form.clientTelephone) }}
  191. {{ form_errors(demande_form.clientTelephone) }}
  192. </div>
  193. </div>
  194. </div>
  195. </fieldset>
  196. <div class="row">
  197. <!-- <div class="estimation declaration">
  198. <div class="form-fields col-sm-12">
  199. <input type="checkbox" id="estimation" name="estimation" {% if demande is defined and demande.estimation %}value="on" checked{% endif %}>
  200. <label id="label_estimation" for="estimation" class=""><p>De plus, je souhaite faire estimer gratuitement mon bien par un agent immobilier<p></label>
  201. </div>
  202. </div> -->
  203. {% block warning %}
  204. <p class="form-message col-sm-12">
  205. En validant ce formulaire, j'accepte que jusqu'à 3 prestataires me contactent pour me fournir un devis gratuit.
  206. </p>
  207. {% endblock %}
  208. <p class="form-required-legend form-message col-sm-12">
  209. <span class="required form-required-mark">*</span> Champ obligatoire.
  210. </p>
  211. </div>
  212. <div class="request-form-submit clearfix row">
  213. {{ form_row(demande_form.submit, {'type': 'button', 'attr': {'onclick': 'requiredVerification()'}}) }}
  214. </div>
  215. </div>
  216. {{ form_end(demande_form) }}
  217. <script>
  218. $('#demande_clientTelephone').on('keyup', function () {
  219. var phone = $(this).val();
  220. $('#demande_clientTelephone').val(phone.replace(/[^0-9]/g, ''));
  221. });
  222. $('select#demande_categorie').removeAttr('required')
  223. var form_demande_validated = false;
  224. $("form").submit(function(e){
  225. if (!form_demande_validated) {
  226. e.preventDefault(e);
  227. requiredVerification();
  228. }
  229. });
  230. function requiredVerification() {
  231. form_demande_validated = true;
  232. $("form ul.form-errors").remove();
  233. $('#categorie select:visible, #demande_bienType').each(function () {
  234. if (!$(this).val() || $(this).val() == '') {
  235. $(this).parent(".select-background").after("<ul class='form-errors'><li>Veuillez renseigner ce champ.</li></ul>");
  236. if (form_demande_validated) {
  237. this.setCustomValidity("Veuillez renseigner ce champ.");
  238. $(this).focus();
  239. $('html, body').animate({ scrollTop: $(this).parent(".select-background").offset().top - 110}, 50);
  240. }
  241. form_demande_validated = false;
  242. } else {
  243. this.setCustomValidity("");
  244. }
  245. })
  246. if (!$('.auto_cp').val() || $('.auto_cp').val() == '' || !$('.auto_ville').val() || $('.auto_ville').val() == '') {
  247. if ($(".localisation").val() == '' || !$('.localisation').val()) {
  248. $(".localisation").after("<ul class='form-errors'><li>Veuillez renseigner ce champ.</li></ul>");
  249. } else {
  250. $(".localisation").after("<ul class='form-errors'><li>Veuillez sélectionner une ville et un code postal valides.</li></ul>");
  251. }
  252. if (form_demande_validated) {
  253. console.log('.localisation')
  254. $(".localisation").focus();
  255. $('html, body').animate({ scrollTop: $('.localisation').offset().top - 110}, 50);
  256. }
  257. form_demande_validated = false;
  258. }
  259. $("form select[required]:visible:not(#demande_bienType)").each(function () {
  260. if (!$(this).val() || $(this).val() == '') {
  261. $(this).parent(".select-background").after("<ul class='form-errors'><li>Veuillez renseigner ce champ.</li></ul>");
  262. if (form_demande_validated) {
  263. console.log("element select", this)
  264. this.setCustomValidity("Veuillez renseigner ce champ.");
  265. $(this).focus();
  266. $('html, body').animate({ scrollTop: $(this).parent(".select-background").offset().top - 110}, 50);
  267. }
  268. form_demande_validated = false;
  269. } else {
  270. this.setCustomValidity("");
  271. }
  272. })
  273. $("form input[required]:visible").each(function () {
  274. if (
  275. !$(this).is(".localisation")
  276. && (
  277. !$(this).val()
  278. || $(this).val() == ''
  279. || ($(this).is('checkbox') && !$(this).is(':checked')))
  280. )
  281. {
  282. $(this).after("<ul class='form-errors'><li>Veuillez renseigner ce champ.</li></ul>");
  283. if (form_demande_validated) {
  284. this.setCustomValidity("Veuillez renseigner ce champ.");
  285. $(this).focus();
  286. $('html, body').animate({ scrollTop: $(this).offset().top - 110}, 50);
  287. }
  288. form_demande_validated = false;
  289. } else { this.setCustomValidity(""); }
  290. });
  291. if ($("#demande_clientEmail").val() && $("#demande_clientEmail").val() != "") {
  292. var regex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
  293. if (!regex.test($("#demande_clientEmail").val())) {
  294. $("#demande_clientEmail").after("<ul class='form-errors'><li>Veuillez saisir un email valide.</li></ul>");
  295. if (form_demande_validated) {
  296. $("#demande_clientEmail").focus();
  297. $('html, body').animate({ scrollTop: $("#demande_clientEmail").offset().top - 110}, 50);
  298. }
  299. form_demande_validated = false;
  300. }
  301. }
  302. var phone = $("#demande_clientTelephone").val();
  303. phone = phone.replaceAll(" ", "");
  304. $('#demande_clientTelephone').val(phone);
  305. phone = $("#demande_clientTelephone").val();
  306. // Supprimer les espaces et les caractères spéciaux
  307. const numeroNettoye = phone.replace(/[^0-9]/g, '');
  308. // Liste noire de numéros spécifiques (Set pour des performances optimales)
  309. const blacklist = new Set([
  310. '0000000000', '1111111111', '2222222222',
  311. '3333333333', '4444444444', '5555555555',
  312. '6666666666', '7777777777', '8888888888',
  313. '9999999999', '0123456789', '0987654321'
  314. ]);
  315. // Liste des motifs spéciaux interdits
  316. const motifsSpeciaux = [
  317. '0101010101', '0202020202', '0303030303',
  318. '0404040404', '0505050505', '0606060606',
  319. '0707070707', '0909090909'
  320. ];
  321. // Vérifier la longueur (10 chiffres)
  322. if (
  323. blacklist.has(numeroNettoye)
  324. || (numeroNettoye.length !== 0 && numeroNettoye.length !== 10)
  325. || (numeroNettoye.length !== 0 && !/^0[1-79]/.test(numeroNettoye))
  326. || motifsSpeciaux.includes(numeroNettoye)
  327. || /(\d)\1{7,}|^(\d)\1{9}$/.test(numeroNettoye)
  328. || /(\d{2})\1{3,}/.test(numeroNettoye)
  329. ) {
  330. $("#demande_clientTelephone").after("<ul class='form-errors'><li>Veuillez saisir un téléphone valide.</li></ul>");
  331. if (form_demande_validated) {
  332. $('#demande_clientTelephone').focus();
  333. $('html, body').animate({ scrollTop: $('#demande_clientTelephone').offset().top - 110}, 50);
  334. }
  335. form_demande_validated = false;
  336. }
  337. const submitButton = $("form button");
  338. if (form_demande_validated) {
  339. submitButton.prop('disabled', true);
  340. submitButton.text('Envoi en cours…');
  341. $('form').submit();
  342. }
  343. return form_demande_validated;
  344. }
  345. </script>