2015-03-10 6 views
0

У меня проблема с Knp, запросом AJAX и фильтром. Я думаю, что я делаю что-то очень нехорошее здесь, но я не уверен, как именно KnpPaginator работает внутри, и у меня нет времени, чтобы понять это в этом проекте.Symfony2 - KnpPaginator - AJAX/встроенный контроллер

В любом случае, на моей странице встроен контроллер, который отображает таблицу на странице. Когда paginator вызывается из ветки, он возвращает маршрут к странице контейнера, что приводит к тому, что paginator не работает с моими запросами GET на этот uri.

Я не уверен, что кто-либо из вас встретил это - я рад услышать, есть ли лучшее решение проблемы (я уверен, что есть). Вот мой код:

CONTROLLER

 /** 
    * Just a shell page 
    * 
    * @Route("/postmanagement/index") 
    * @Template() 
    * 
    * @return array 
    */ 
    public function indexAction() 
    { 
     $form = $this->createForm(new FilterPostsType(), null, array(
       'action' => $this->generateUrl('myblog_admin_postmanagement_filterposts'), 
       'method' => 'POST' 
      ) 
     ); 

    return array(
     'form' => $form->createView() 
    ); 
} 

    /** 
    * Returns active posts and comments 
    * 
    * @param Request $request 
    * 
    * @return array 
    */ 
    public function defaultAction(Request $request) 
    { 
     $em = $this->getDoctrine()->getManager(); 

     $posts = $em->getRepository('ModelBundle:Post')->findBy(array(
       'active' => true 
      ) 
     ); 

     $paginator = $this->get('knp_paginator'); 
     $pagination = $paginator->paginate($posts, $request->query->get('page', 1), 10); 

     return $this->render("AdminBundle:PostManagement:_ajax-panel.html.twig", array(
       'isPost' => true, 
       'posts' => $posts, 
       'pagination' => $pagination 
      ) 
     ); 
    } 

    /** 
    * @param Request $request 
    * 
    * @Route("/postmanagement/filter") 
    * 
    * @return array 
    */ 
    public function filterPostsAction(Request $request) 
    { 
     $form = $this->createForm(new FilterPostType(), null, array(
       'action' => $this->generateUrl('myblog_admin_postmanagement_filterposts'), 
       'method' => 'POST' 
      ) 
     ); 

//  if ($request->isMethod('POST')) { 
      $posts = null; 
      $form->handleRequest($request); 
      $data = $form->getData(); 
      $posts = $this->get('myblog.admin_manager')->filterPosts($data); 

      switch ($data['type']) { 
       case 'post': 
        $isPost = true; 
        $isComment = false; 
        break; 
       case 'comment': 
        $isPost = false; 
        $isComment = true; 
        break; 
      } 
//  } 

     $paginator = $this->get('knp_paginator'); 
     $pagination = $paginator->paginate($posts, $request->query->get('page', 1), $data['maxresults']); 

     if (is_null($posts)) { 
      return new NotFoundHttpException(); 
     } else { 
      return $this->render('AdminBundle:PostManagement:_ajax-panel.html.twig', array(
        'posts' => $posts, 
        'isPost' => $isPost, 
        'isComment' => $isComment, 
        'pagination' => $pagination 
       ) 
      ); 
     } 
} 

Я не проводка мнения здесь, так как это простой визуализация (контроллер (MyBundle: Контроллер: MyAction)). Как вы можете видеть, есть форма, которую я отправляю на странице, чтобы отфильтровать сообщения. Это также создает проблему, так как кажется, что paginator не сохраняет запрос после того, как я запустил его через фильтр.

Спасибо за помощь! Мне бы очень хотелось, чтобы кто-то сделал это раньше, и придумал лучшее решение, чем мой довольно запутанный (что также связано с слишком большим количеством запросов по моему вкусу).

ответ

1

Я понял.

Если кто-то хотел бы постраничной с InfiScr спускового + KNPPaginatorBundle + фильтр (PHP), используйте этот JS:

/** 
* Load more pagination handler 
*/ 
var AjaxPagination = function (options) { 
    AjaxProt.call(this, options); 
    this.filter = options.filter; 
    this.toJoinEl = options.toJoinEl; 
    this.containerEl = options.containerEl; 
    this.navContainer = options.navContainer; 
    this.nextSelector = options.nextSelector; 
    this.uri = options.uri; 
}; 

AjaxPagination.prototype = Object.create(AjaxProt.prototype); 

AjaxPagination.prototype.init = function() { 
    var thisObj = this, 
     uri = thisObj.uri; 
    $(thisObj.navContainer).hide(); 
    $(document).on(thisObj.event, thisObj.targetEl, function (e) { 
     e.preventDefault(); 
     thisObj.ajaxRequest(uri); 
    }); 
}; 

AjaxPagination.prototype.ajaxRequest = function (uri) { 
    var thisObj = this, 
     page = $(this.nextSelector).attr('href').match(/\d+$/); 
    $('#filter_bets_page').val(page); 

    var data = $(this.filter).serialize(), 
     method = this.method; 

    console.log(data); 

    $.ajax({ 
     url: uri, 
     data: data, 
     type: method, 
     success: function (data) { 
      thisObj.infiScrCallback(data); 
     } 
    }); 
}; 

AjaxPagination.prototype.infiScrCallback = function(data) { 
    var thisObj = this; 
    $(thisObj.navContainer).remove(); 

    if (thisObj.toJoinEl) { 
     var filteredContent = $("<div>").append($.parseHTML(data)).find('.findable'); 
     var newPagination = $("<div>").append($.parseHTML(data)).find('div.pagination-hidden'); 
     $(thisObj.toJoinEl).append(filteredContent); 
     $(thisObj.containerEl).append(newPagination); 
    } else { 
     $(thisObj.containerEl).append(data).fadeIn(); 
    } 

    if (!$(thisObj.nextSelector).length) { 
     $(thisObj.targetEl).fadeOut(); 
    } 
}; 
Смежные вопросы