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