Formulaire custom

Par Assassins, il y a 9 ans


Bonjour,

J'ai créé un formulaire custom qui contient ceci :

{# src/RecaptchaBundle/Resources/views/Form/fields.html.twig #} {% block recaptcha_widget %} {% spaceless %} {% if form.vars.recaptcha_enabled %} <div class="g-recaptcha" name="recaptcha" data-sitekey="{{ form.vars.publickey }}"></div> {% endif %} {% endspaceless %} {% endblock %}

Je voudrais faire en sorte que si le formulaire custom est appelé il ajoute automatique le script dans le block javascript du template de base.

J'avais essayé de faire cela :

{# src/RecaptchaBundle/Resources/views/Form/fields.html.twig #} {% block recaptcha_widget %} {% spaceless %} {% if form.vars.recaptcha_enabled %} {% block javascripts %} {{ parent() }} <script type="text/javascript" src='{{form.vars.url_api}}'></script> {% endblock %} <div class="g-recaptcha" name="recaptcha" data-sitekey="{{ form.vars.publickey }}"></div> {% endif %} {% endspaceless %} {% endblock %}

mais cela ne fonctionne pas avez-vous une idée ?

Merci d'avance.

4 réponses

SimonAndGarfunkel, il y a 9 ans

Salut Assassins,

je crois que ce lien peut t'aider...

A tester: au lieu de

{% if form.vars.recaptcha_enabled %} {% block javascripts %} {{ parent() }} <script type="text/javascript" src='{{form.vars.url_api}}'></script> {% endblock %} <div class="g-recaptcha" name="recaptcha" data-sitekey="{{ form.vars.publickey }}"></div> {% endif %}

Essaye avec:

{% block recaptcha_widget %} {% spaceless %} {% if form.vars.recaptcha_enabled %} <div class="g-recaptcha" name="recaptcha" data-sitekey="{{ form.vars.publickey }}"></div> {% endif %} {% block javascripts %} {{ parent() }} {% if form.vars.recaptcha_enabled %} <script type="text/javascript" src='{{form.vars.url_api}}'></script> {% endif %} {% endblock %} {% endspaceless %} {% endblock %}
Assassins, il y a 9 ans

Bonjour,

Merci d'avoir répondu. J'ai essayé la solution que vous me proposez malheureusement j'ai le même message d'erreur :

Calling "parent" on a template that does not extend nor "use" another template is forbidden in @RecaptchaBundle\Resources\views\form\fields.html.twig at line 7.

SimonAndGarfunkel, il y a 9 ans

Salut Assassins,

Calling "parent" on a template that does not extend => c'est le truc que je craignais...

J'avoue ne pas avoir de solution à ce problème.
Autant, il est sur que l'on ne peut pas surcharger/étendre un block à travers une condition (le lien que j'ai donné en parle):

{% if form.vars.recaptcha_enabled %} {% block javascripts %} {{ parent() }} {# Code... #} {% endblock %} {% endif %}

Après, je ne vois pas comment il est possible de surcharger/étendre un block dans un autre en sachant que ce dernier ne possède pas le block à surcharger (cette phrase est bien top compliqué ^^).

Solution plus que médiocre: laisser dans un javascript la condition:

{% if form is defined and form.vars.recaptcha_enabled is defined and form.vars.recaptcha_enabled %} <script type="text/javascript" src='{{form.vars.url_api}}'></script> {% endif %}

Si quelqu'un a une vraie solution, je serai curieux de la connaître...

Assassins, il y a 9 ans

Bonjour,
Merci pour votre aide.

Je vien de trouvé une solution.

Voici ce que j'ai rajouté dans la fonction buildView du service qui envoie les paramètres au template:

public function buildView(FormView $view, FormInterface $form, array $options) { $view->vars = array_replace($view->vars, array( 'recaptcha_enabled' => $this->enabled, 'publickey' => $this->publickey, 'url_api' => $this->url_api )); if (!$this->enabled) { return; } $js = "<script type=\"text/javascript\" src='".$this->url_api."'></script>"; $this->dispatcher->addListener('kernel.response', function($event) use ($js) { $response = $event->getResponse(); $content = $response->getContent(); $pos = strripos($content, '</body>'); $content = substr($content, 0, $pos).$js.substr($content, $pos); $response->setContent($content); }); }

et dans le constructeur j'ai ajouté le paramètre suivant EventDispatcherInterface $dispatcher, puis dans les arguments du service j'ai ajouté '@event_dispatcher'