2017-06-07 3 views
0

は、私は記事のリストを持ってどこにページを持って、私は私が私のクエリの結果をフィルタリングすることができ、その上のフォーム作成: enter image description heresymfonyのページネータ+フィルタフォーム

フォームはうまく動作しますが、ページテーブルの2ページ目をクリックするとフォームがリセットされるため、フィルタもリセットされます。私が望むのは、結果をフィルタリングし、同じフィルタを使用してテーブルを改ページでき、フォームがデータを保持できるということです。

ここ

が今の私のコードです:

コントローラー:

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 
     )); 
    } 

フォーム:

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 
     )); 
    } 

} 

ビュー:

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

誰がどのように私ができるのアイデアを持っている場合それは、 pprepreciated

答えて

1

あなたは、(例としては、knpページャバンドルのように)バンドルを使用したり、argsをセッションに入れることができます。しかし、バンドルはあなたのためにすべてを行うようにシンプルになります、あなたはあなたのデータを渡す必要があります

+0

私はこのバンドルを知らなかった、あなたは正しかった、それは私が欲しいものを行うことができます:)ありがとうございます助けて! – AKM

+0

よろしくお願いいたします。 symfonyにはバンドルがたくさんあります。コーディングする前にちょっとした研究をすることを躊躇しないでください。多くの時間を節約できます; –

+0

このバンドルを先に使い始めると、少なくとも1日の仕事... – AKM