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


Assassins
Auteur
Réponse acceptée

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'

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 %}

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.

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...