Hello,

Je souhtrais faire un formulaire search commun à toutes les pages de mon site sans avoir à dupliquer du code. Donc accessible via tous mes controllers voir d'autres bundles.

Quelle est la "good pratice" ? Faire un bundle dédié ? un service ?

J'ai vu qu'on pouvait appeler une methode du controller via une fonction render de Twig. Ce qui marche nickel jusqu'à ce que je me rende compte que je ne passe pas dans le :

    $form = $this->createForm( new SearchAdvertType() );

    if( $this->get('request')->getMethod() == 'POST')
    {
        die( "Y a qqn ?");
    }

(j'ai fait un bundle Seach dédié et ce code est dans le controller de ce bundle).

Je me demandais si je pouvias faire une classe abstraite pour mes controllers qui héritrait elle de Controller et qui contiendrait la gestion de mon formulaire. Mais je ne sais pas si c'est très "symfony"...

Merci pour vous précieux conseils !

15 réponses


skp
Réponse acceptée

Tu peux essayer dans twig de remplacer ton render par :

{{ render(controller('AppBundle:Default:topArticles', {request: app.request})) }}

Bonsoir, tu veux faire une recherche avec un seul champ texte ? Ou tu veux pouvoir ajouter des champs supplémentaires ?

JohnDuff
Auteur

Bsr merci pour ta réponse déjà... Plusieurs champs oui. Comme c'est pour ma recherche je veux faire transiter le gros de la logique par là...

Enfaite, j'ai mal posé ma question. Je voulais savoir si ton formulaire sera identique pour toutes les entités ou bien chaque entité aura des champs supplémentaires.

Dans le cas d'un formulaire identique, tu devrais regarder: http://symfony.com/doc/current/book/forms.html#using-a-form-without-a-class

Dans le cas avec des champs supplémentaires pour chaque entité, tu dois je pense créer à chaque fois un Type.

JohnDuff
Auteur

Le formulaire va tapper dnas plusieurs entités mais je ne comprends pas cette question. Une fois que je valide mon formulaire je fais ce que je veux (avec mes cheuv... euh...) non ?

Merci pour le lien. Ca revient à faire se que j'ai fait dans le controller de mon bundle search avec le handleRequest en plus (que j'ai raoujté et toujours rien...). Mmmm

class DefaultController extends Controller
{
public function searchAdvertAction(Request $request)
{
$form = $this->createForm( new SearchAdvertType() );
$form->handleRequest($request);
if ($form->isValid())
{
$data = $form->getData();
die( "Y a qqn ?");
}
return $this->render('BgSearchBundle:Default:searchAdvert.html.twig', array('form' => $form->createView()));
}
}

Tu veux simplement afficher ton formulaire de recherche dans toutes tes vues et ce formulaire pointerait par exemple vers "AdvertController:searchAction" ? Si oui regarde http://symfony.com/doc/current/quick_tour/the_view.html#embedding-other-controllers

JohnDuff
Auteur

Oui c'est tout à fait ca. Qd au lien c'est ce que j'ai fait. La vue du formulaire s'affiche bien partout mais je ne passe pas dans le handle du submit... C'est comme si c'était le controller de mon path courrant qui écoutait l évènement submit alors que je le crée depuis un autre controller via le render de twig. J'sais pas si j'ai été assez clair. D'ailleurs je dis ptête n'importe quoi...

Si tu fais le code ci-dessous, que te retourne la method "isSubmitted()" ?

class DefaultController extends Controller
{
    public function searchAdvertAction(Request $request)
    {
        $form = $this->createForm(new SearchAdvertType());
        $form->handleRequest($request);
        dump($form->isSubmitted());
    }
}
JohnDuff
Auteur

Mmm false...

Mon controller n'écoute pas l'evenement submit meme avec ce handlerequest...

Ressemble à quoi ton SearchAdvertType ?

JohnDuff
Auteur

<?php

namespace Bg\BgSearchBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class SearchAdvertType extends AbstractType
{
/**

  • {@inheritdoc}
    */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
    $builder->add('toto', null, array('attr'=> array('placeholder'=>'toto')));
    $builder->add('search', 'submit');
    }

    /**

  • {@inheritdoc}
    */
    public function getName()
    {
    return 'bg_bgbundle_search';
    }
    }
JohnDuff
Auteur

Bon ok... ok... t'es un champion. Mais tu me dois des explications ! :) Qui passe quoi ou comment qd. N'hésites pas à me prendre pour un con je débute dans symfony.

Mmm j'ai oublié de mettre la source http://stackoverflow.com/questions/32028070/symfony2-search-panel-on-all-pages mais en gros lorsque tu fais un "render(controller(...))" symfony créer une sous requête qui apparemment ne contient pas les données passer en POST. Par conséquent, tu dois lui passer la requête principale qui elle contient les données.
Cependant, pour ton formulaire de recherche, tu lui définis quoi pour l'attribut "action" ? la page courante ou l'url qui pointe vers l'action de recherche ?

JohnDuff
Auteur

L'url qui pointe vers l'action de recherche puisqu'elle peut se faire via n'importe quelle page pkoi ?

En tout cas merci de filer des coups de mains sur les forums à toi et à ceux qui répondent. C'est totalement désinteressé donc d'autant plus louable. Tu m'as trouvé le lien, traduit et expliqué, pour peu tu viendrais le coder à ma place... Thanks !

Juste par curiosité et de rien ça fait toujours plaisir d'aider.