2011-07-28 6 views
1

La pagination dans Symfony est assez simple et plutôt bonne. Cependant, je suis à la recherche de la meilleure direction à suivre pour ajouter dans le tri à la table.Symfony: Pagination + Tri?

Mes pensées sont que la colonne de tri, la direction et le numéro de page en cours sont définis dans le uri, comme ceci:

http://www.mysite.com/backend_dev.php/articles/author/asc/3/ 

Et puis sur chaque page, Symfony utilise la uri pour déterminer la colonne de tri courant, direction et page, puis manipule tous les liens de pagination pour prendre ces choses en compte de sorte que lorsque vous cliquez sur un lien pour changer de pages ou de trier par une colonne différente, il vous emmène à l'endroit approprié.

Est-ce que quelqu'un a d'autres directions que je pourrais suivre? Je connais la simplicité du plugin tablesorter de jQuery mais ça craint quand il y a plus de 1000 enregistrements car il faut les charger tous en même temps pour faire fonctionner ce plugin.

+0

Si vous utilisez la doctrine, cela peut vous intéresser: http://www.doctrine-project.org/documentation/manual/1_2/zh/utilities:pagination – greg0ire

+0

Merci, la pagination est prise en charge, mais cette page ne fait rien Ne proposez aucune suggestion sur le tri. –

+0

Vous pouvez modifier la Doctrine_Query en fonction des paramètres que vous obtiendrez de votre itinéraire, qui doit être comme/articles /: sorting_column /: sorting_direction /: limit – greg0ire

Répondre

0

L'administrateur du générateur a une approche intéressante. Il obtient le tri de l'URI ainsi que ci-dessous.

/backend_dev.php/pedidos?sort=status&sort_direction=asc 

Afin de ne pas porter ces paramètres obtenir à travers les liens (il est une douleur pour le faire), il stocke dans la session utilisateur. Voyons voir un exemple. Dans l'action que vous aurez

public function executeIndex(sfWebRequest $request) 
    { 
    // sorting 
    if ($request->getParameter('sort') && $this->isValidSortColumn($request->getParameter('sort'))) 
    { 
     $this->setSort(array($request->getParameter('sort'), $request->getParameter('sort_type'))); 
    } 

    // pager 
    if ($request->getParameter('page')) 
    { 
     $this->setPage($request->getParameter('page')); 
    } 

    $this->pager = $this->getPager(); 
    $this->sort = $this->getSort(); 
    }  

//// more code 


    protected function setPage($page) 
    { 
    $this->getUser()->setAttribute('ef3Pedido.page', $page, 'admin_module'); 
    } 

    protected function getPage() 
    { 
    return $this->getUser()->getAttribute('ef3Pedido.page', 1, 'admin_module'); 
    } 

    protected function getSort() 
    { 
    if (null !== $sort = $this->getUser()->getAttribute('ef3Pedido.sort', null, 'admin_module')) 
    { 
     return $sort; 
    } 

    $this->setSort($this->configuration->getDefaultSort()); 

    return $this->getUser()->getAttribute('ef3Pedido.sort', null, 'admin_module'); 
    } 

    protected function setSort(array $sort) 
    { 
    if (null !== $sort[0] && null === $sort[1]) 
    { 
     $sort[1] = 'asc'; 
    } 

    $this->getUser()->setAttribute('ef3Pedido.sort', $sort, 'admin_module'); 
    } 

    protected function isValidSortColumn($column) 
    { 
    return Doctrine::getTable('Pedido')->hasColumn($column); 
    } 

C'est une bonne approche pour les deux, l'utilisateur final et le développeur.

+0

Cela ressemble à une approche intéressante, mais comment accomplissez-vous cela sans porter les paramètres get à travers tous les liens? Lorsque vous visitez une page, comment les paramètres get seront-ils dans l'URI s'ils ne sont pas ajoutés aux liens? –

+0

En regardant votre code, on dirait qu'il obtient le paramètre des paramètres de tri et de direction de l'URI et qu'il les définit dans la session. Mais alors, que faites-vous avec ces valeurs de session? Comment peuvent-ils vous aider à ne pas avoir tous les paramètres dans les liens? –

+0

Eh bien, avant de configurer la requête pour le pager, utilisez les fonctions getPage() et getSort() pour obtenir de la session les valeurs stockées. Ensuite, utilisez les définir dans le pager. –