2017-06-07 1 views
0

Ich bin neu in Symfony, bekam ich eine Seite in dem ich eine Liste von Artikeln, und ich erstellt darüber ein Formular, das mir erlauben, die Ergebnisse meiner Abfrage zu filtern: enter image description heresymfony paginator + Filterform

Das Formular funktioniert gut, aber wenn ich auf die zweite Seite meiner Paginator-Tabelle, die Form zurücksetzen, so wird auch mein Filter zurückgesetzt. Was ich will, ist, dass wir Ergebnisse filtern können und in der Lage sind, die Tabelle mit demselben Filter zu paginieren, und dass das Formular seine Daten behält.

Hier ist mein Code jetzt:

Controller:

public function listeAction(Request $request, $page) { 
     if ($page < 1 && strlen($page) != 0) { 
      throw new NotFoundHttpException('Page "' . $page . '" inexistante.'); 
     } else if (strlen($page) == 0) { 
      $page = 1; 
     } 

     $nbPerPage = 5; 

     $form = $this->createForm(ArticleRechercheType::class); 
     $form->setData(array('rds' => true)); 

     //if we use filters 
     if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) { 
      $data = $form->getData(); 
      $form = $this->createForm(ArticleRechercheType::class, $data); 
      if ($data['famille'] != null) { 
       $data['famille'] = $data['famille']->getId(); 
      } 
      $listArticles = $this->getDoctrine() 
        ->getManager() 
        ->getRepository('GRBackOfficeBundle:Article') 
        ->getFilteredArticles($page, $nbPerPage, $data); 
     } else { 
      $data = $form->getData(); 
      $form = $this->createForm(ArticleRechercheType::class, $data); 

      $listArticles = $this->getDoctrine() 
        ->getManager() 
        ->getRepository('GRBackOfficeBundle:Article') 
        ->getArticles($page, $nbPerPage); 
     } 

     $nbPages = ceil(count($listArticles)/$nbPerPage); 

     if ($nbPages != 0 && $page > $nbPages) { 
      throw new NotFoundHttpException('Page "' . $page . '" inexistante.'); 
     } 

     if ($nbPages == 0) { 
      $nbPages = 1; 
     } 

     return $this->render('GRBackOfficeBundle:Article:liste_articles.html.twig', array(
        'form' => $form->createView(), 
        'listArticles' => $listArticles, 
        'nbPages' => $nbPages, 
        'page' => $page 
     )); 
    } 

Form:

class ArticleRechercheType extends AbstractType { 

    public function buildForm(FormBuilderInterface $builder, array $options) { 
     $builder->add('famille', EntityType::class, array(
        'class' => 'GRBackOfficeBundle:Famille', 
        'choice_label' => 'nom', 
        'required' => false 
       )) 
       ->add('rds', CheckboxType::class, array('required' => false)) 
       ->add('recherche', TextType::class, array('required' => false)) 
       ->add('Rechercher', SubmitType::class); 
    } 

    public function configureOptions(OptionsResolver $resolver) { 
     $resolver->setDefaults(array(
      'translation_domain' => false 
     )); 
    } 

} 

Ausblick:

{% extends "GRBackOfficeBundle::layout.html.twig" %} 

{% block title %} 
    Liste des articles 
{% endblock %} 

{% block gr_bo_body %} 
    <h2>Liste des articles</h2> 

    <div class="row"> 
     <div class="well row"> 
      {{ form_start(form) }} 

      {{ form_errors(form) }} 

      <div class="form-group col-md-2"> 
       {{ form_label(form.famille, "Famille d'article", {'label_attr': {'class': 'control-label'}}) }} 

       {{ form_errors(form.famille) }} 

       {{ form_widget(form.famille, {'attr': {'class': 'form-control'}}) }} 
      </div> 

      <div class="form-group col-md-4"> 
       {{ form_widget(form.rds, {'attr': {'class': ''}}) }} 
       {{ form_label(form.rds, "Montrer les articles en rupture de stock", {'label_attr': {'class': 'control-label'}}) }} 
       {{ form_errors(form.rds) }} 


      </div> 

      <div class="form-group col-md-3"> 
       {{ form_label(form.recherche, "Recherche", {'label_attr': {'class': 'control-label'}}) }} 

       {{ form_errors(form.recherche) }} 

       {{ form_widget(form.recherche, {'attr': {'class': 'form-control'}}) }} 
      </div> 
      <div class="form-group col-md-3" style="text-align: center"> 
       {{ form_widget(form.Rechercher, {'attr': {'class': 'btn btn-primary'}}) }} 
      </div> 
      {{ form_rest(form) }} 

      {{ form_end(form) }} 
     </div> 

     <div class="well row"> 
      <table class="table table-bordered table-striped" id="listeArticles" style="width: 100%" cellspacing="0"> 
       <thead> 
        <tr> 
         <th>Référence client</th> 
         <th>Référence interne</th> 
         <th>Famille</th> 
         <th>Libellé</th> 
         <th>Alerte</th> 
         <th>Stock</th> 
        </tr> 
       </thead> 
       <tbody id="bodyListeArticles"> 
        {% for article in listArticles %} 
         <tr> 
          <td><a href="{{ path('gr_bo_modif_article', {'article_id': article.id}) }}">{{ article.RefArticle }}</a></td> 
          <td>{{ article.RefLogistique }}</td> 
          <td>{{ article.famille.nom }}</td> 
          <td>{{ article.libelle }}</td> 
          <td>{{ article.StockAlerte }}</td> 
          <td>{{ article.StockActuel }}</td> 
         </tr> 
        {% endfor %} 
       </tbody> 
      </table> 
      {% if nbPages > 1 %} 
       <ul class="pagination"> 
        {% for p in range(1, nbPages) %} 
         <li {% if p == page %} class="active"{% endif %}> 
          <a href="{{path('gr_bo_liste_articles', {'page' : p}) }}">{{ p }}</a> 
         </li> 
        {% endfor %} 
       </ul> 
      {% endif %} 
     </div> 

    </div> 

{% endblock %} 

Wenn jemand eine Idee, wie habe ich kann mach das, das wird ein ppreciated

Antwort

1

Sie können ein Bündel verwenden (wie zum Beispiel das Paket knp paginator) oder Ihre Argumente in die Sitzung einfügen. Aber das Bündel wird es einfach machen, da es alles für dich tut, du musst nur deine Daten weitergeben

+0

Ich kannte dieses Bündel nicht, du hattest recht, es erlaubt mir, genau das zu tun, was ich will :) Danke für dein Hilfe! – AKM

+0

Sie sind willkommen. Symfony haben eine Menge Bündel, zögern Sie nicht, ein wenig Forschung vor der Codierung zu tun, es kann Sie eine Menge Zeit sparen;) –

+0

Sie haben Recht, wenn ich dieses Bündel früher verwendet hätte, hätte ich gewonnen mindestens 1 Arbeitstag ... – AKM