Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 24-09-2008 13:40:08

magnan
Nouveau membre
Date d'inscription: 24-09-2008
Messages: 5

Utilisation de Zend_Paginator

J'essaie d'utiliser ZEND_Paginator pour afficher une liste paginée. Je n'obtiens qu'une liste
comportant les n premiers projets de la table (n = $itemsPerPage).
Les liens Next, Previous et les numéros de page ne s'affichent pas.
Merci d'indiquer ce que je dois modifier dans les scripts ci-dessous pour obtenir
le résultat recherché.
Merci par avance


-- MySQL Database Schema

CREATE TABLE projets (
    id int(11) NOT NULL AUTO_INCREMENT,
    codproj varchar(5) NOT NULL,
    libproj varchar(100) NOT NULL,
    PRIMARY KEY (id)
);



IndexController

class IndexController extends Zend_Controller_Action
{
    function indexAction()
    {
        $this->view->title = "Lancement des Projets ";
        $projets = new Projets();
        $projets->listeProjet();
        $this->view->paginator = $projets->paginator;
        $this->render();
    }
}



class Projets extends Zend_Db_Table
{
    protected $_name = 'projets';
    public $paginator;

    function listeProjet()
    {

      $itemNumber = 2;
      $itemsPerPage = 15;
      $page = 1;
      $registry = Zend_Registry::getInstance();
      $db = Zend_Registry::get('db');
      $select = $db->select()->from('projets', array('codproj', 'libproj'));
      $paginator = Zend_Paginator::factory($select);
      $paginator->setItemCountPerPage($itemsPerPage);
      $paginator->setCurrentPageNumber($page);
      $items = $paginator->getItem($itemNumber);
      $paginator->setDefaultScrollingStyle('Jumping');
      $this->paginator = $paginator;
    }
}

index.phtml

<p><a href="<?php echo $this->url(array('controller'=>'index',
        'action'=>'add'));?>">Ajouter un projet</a></p>
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
    <th>Code</th>
    <th>Libelle du projet</th>
    <th>&nbsp;</th>
</tr>
<?php


if (count($this->paginator)): ?>   

<ul>   
<?php   
// Zend_Paginator implements IteratorAggregate so iteration logic is factored out   
foreach ($this->paginator as $item): ?>   
<tr><td><li><?= $item['codproj']; ?></li>&nbsp; <?= $item['libproj']; ?></td></tr>
<?php if ($this->pageCount): ?>
<div class="paginationControl">
<!-- Previous page link -->
<?php if (isset($this->previous)): ?>
<a href="<?= $this->url(array('page' => $this->previous)); ?>">&lt; Previous</a> |
<?php else: ?>
<span class="disabled">&lt; Previous</span> |
<?php endif; ?>

<!-- Numbered page links -->
<?php foreach ($this->pagesInRange as $page): ?>
<?php if ($page != $this->current): ?>
<a href="<?= $this->url(array('page' => $page)); ?>"><?= $page; ?></a> |
<?php else: ?>
<?= $page; ?> |
<?php endif; ?>
<?php endforeach; ?>

<!-- Next page link -->
<?php if (isset($this->next)): ?>
<a href="<?= $this->url(array('page' => $this->next)); ?>">Next &gt;</a>
<?php else: ?>
<span class="disabled">Next &gt;</span>
<?php endif; ?>
</div>
<?php endif; ?>
<?php endforeach; ?>   
</ul>   
<?php endif; ?>   

</table>


Si j'ajoute la ligne suivante, j'obtiens le message d'erreur ci-dessous :
<?= $this->paginationControl($this->paginator) ?>

Fatal error: Uncaught exception 'Zend_View_Exception' with message 'No view partial provided
and no default set' in C:\wamp\www\lancepro\library\Zend\View\Helper\PaginationControl.php:108
Stack trace: #0 [internal function]: Zend_View_Helper_PaginationControl->paginationControl
(Object(Zend_Paginator)) #1 C:\wamp\www\lancepro\library\Zend\View\Abstract.php(318): call_user_func_array(Array, Array) #2 [internal function]: Zend_View_Abstract->__call('paginationContr...', Array) #3 C:\wamp\www\lancepro\application\views\scripts\index\index.phtml(49): Zend_View->paginationControl(Object(Zend_Paginator)) #4 C:\wamp\www\lancepro\library\Zend\View.php(107): include('C:\wamp\www\lan...') #5 C:\wamp\www\lancepro\library\Zend\View\Abstract.php(787): Zend_View->_run('..\application\...') #6 C:\wamp\www\lancepro\library\Zend\Controller\Action\Helper\ViewRenderer.php(921): Zend_View_Abstract->render('index/index.pht...') #7 C:\wamp\www\lancepro\library\Zend\Controller\Action\Helper\ViewRenderer.php(942): Zend_Controller_Action_Helper_Vi in C:\wamp\www\lancepro\library\Zend\View\Helper\PaginationControl.php on line 108

Hors ligne

 

#2 24-09-2008 16:01:26

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: Utilisation de Zend_Paginator

Hello,

Dans cet appel :

Code:

<?= $this->paginationControl($this->paginator) ?>

Tu n'as pas les 2ème et 3ème paramètres. Tu utilises donc ceux par défaut :
- défilement : "Sliding"
- vues : AUCUN PARAMETRE (=> "'No view partial provided and no default set")

Tu dois soit la définir au moment de l'appel :

Code:

<?= $this->paginationControl($this->paginator, 'Sliding', 'my_pagination_control.phtml'); ?>

ou faire un

Code:

Zend_View_Helper_PaginationControl::setDefaultViewPartial('my_pagination_control.phtml');

A+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#3 25-09-2008 11:07:29

magnan
Nouveau membre
Date d'inscription: 24-09-2008
Messages: 5

Re: Utilisation de Zend_Paginator

Merci pour la réponse. En effet le message d'erreur n'apparait plus. Par contre la remarque ci-dessous est
toujours d'actualité.(Je suppose que l'erreur se situe dans le fichier index.phtml.
Merci d'avance.


J'essaie d'utiliser ZEND_Paginator pour afficher une liste paginée. Je n'obtiens qu'une liste
comportant les n premiers projets de la table (n = $itemsPerPage).
Les liens Next, Previous et les numéros de page ne s'affichent pas.
Merci d'indiquer ce que je dois modifier dans les scripts ci-dessous pour obtenir
le résultat recherché.

Hors ligne

 

#4 25-09-2008 12:36:55

magnan
Nouveau membre
Date d'inscription: 24-09-2008
Messages: 5

Re: Utilisation de Zend_Paginator

De plus la description de cette fonctionnalité n'est pas trés explicite dans la doc de Zend Framework.
Aussi je pense qu'une explication claire du processus avec un exemple complet comportant le code de
chacun des scripts pourrait être utile à plusieurs lecteurs du forum

Hors ligne

 

#5 25-09-2008 14:45:34

fte
Membre
Lieu: 06 13 83
Date d'inscription: 16-05-2008
Messages: 112
Site web

Re: Utilisation de Zend_Paginator

Salut, j'ai eu l'occasion de l'utiliser à sa sortie de l'incubateur en conjonction avec Smarty.
Il faut gèrer les numéros de pages donc modifier ta variable de page courante $page avec par exemple :

Code:

        $page = ( int ) $this->_request->getParam ( 'page', 0 );    // (Pagination) : recuperation numero de page courant
        $paginator->setCurrentPageNumber($page); 

        $this->view->pages = $paginator->getPages(); 
        $this->view->objets= $paginator;

Après on peut rajouter un parametre du nombre d'objets affichés au choix du client (5, 10, 15, ...tout)...

Edit: dans ton controleur :
$this->view->paginator = $paginator;
aulieu de :
$this->paginator = $paginator;

Dernière modification par fte (25-09-2008 14:49:29)

Hors ligne

 

#6 25-09-2008 16:56:59

magnan
Nouveau membre
Date d'inscription: 24-09-2008
Messages: 5

Re: Utilisation de Zend_Paginator

Si quelqu'un a déjà utilisé cette fonctionnalité merci de me transmettre un exemple complet qui fonctionne (avec tous les scripts) comindiqué ci-dessus.
Merci par avance.

Hors ligne

 

#7 25-09-2008 17:59:53

pozowebs
Membre
Lieu: Gran Canaria
Date d'inscription: 06-07-2008
Messages: 83
Site web

Re: Utilisation de Zend_Paginator

Salut. J'ai déjà utilisé cette fonction, qui marche sans problème. L'exemple complet que j'ai suivi à la lettre est celui de la doc (en anglais). http://framework.zend.com/manual/en/zen … usage.html

a+!

Dernière modification par pozowebs (25-09-2008 18:02:30)

Hors ligne

 

#8 25-09-2008 18:32:17

fte
Membre
Lieu: 06 13 83
Date d'inscription: 16-05-2008
Messages: 112
Site web

Re: Utilisation de Zend_Paginator

magnan a écrit:

Si quelqu'un a déjà utilisé cette fonctionnalité merci de me transmettre un exemple complet qui fonctionne (avec tous les scripts) comindiqué ci-dessus.
Merci par avance.

Est ce que tu as testé $this->view->paginator à la place de $this->paginator ?

Hors ligne

 

#9 16-10-2008 20:11:15

etaty
Membre
Date d'inscription: 16-10-2008
Messages: 49

Re: Utilisation de Zend_Paginator

mikaelkael a écrit:

Hello,

Dans cet appel :

Code:

<?= $this->paginationControl($this->paginator) ?>

Tu n'as pas les 2ème et 3ème paramètres. Tu utilises donc ceux par défaut :
- défilement : "Sliding"
- vues : AUCUN PARAMETRE (=> "'No view partial provided and no default set")

Tu dois soit la définir au moment de l'appel :

Code:

<?= $this->paginationControl($this->paginator, 'Sliding', 'my_pagination_control.phtml'); ?>

ou faire un

Code:

Zend_View_Helper_PaginationControl::setDefaultViewPartial('my_pagination_control.phtml');

A+

Est t'il possible de placer "my_pagination_control.phtml" dans le dossier \views\helpers par exemple ?
D'ailleurs il ne devrait pas se trouver dans ce dossier normalement ?
Car le chemin d'inclusion par défaut est \application\default\views\scripts\

Hors ligne

 

#10 20-10-2008 13:17:47

_Raynor_
Membre
Date d'inscription: 11-09-2008
Messages: 28

Re: Utilisation de Zend_Paginator

Moi ce qui m'étonne c'est qu'en utilisant un Zend_Paginator avec mon Zend_Db_Table_Select je ne me retrouve pas avec des Zend_Db_Table_Row mais avec des array().

Je ne trouve, nul part un moyen de régler cela.

Voici mon code (peut-être qu'il t'aidera magnan) :
Contrôleur : "TestController.php" / indexAction() :

Code:

$objectsTable = new TableMachin(); // Table est mon Zend_Db_Table
$select = $objectsTable->select();

$paginator = Zend_Paginator::factory($select);
$paginator->setCurrentPageNumber($this->_getParam('pageNum', 1));
$paginator->setItemCountPerPage(2);
$paginator->setView($this->view);

Zend_Paginator::setDefaultScrollingStyle('Sliding');
Zend_View_Helper_PaginationControl::setDefaultViewPartial('paginator.phtml');
$this->view->paginator = $paginator;

Vue "index.phtml" :

Code:

<?php echo $this->paginator; ?>
<table>
<?php
foreach ($this->paginator as $currentPaginatorItem) {
  echo '  <tr>
    <td>', var_dump($currentPaginatorItem), '</td> // J'ai un array contenant mes valeurs de ligne Db dont les indexs sont les noms des colonnes
    <td>', $currentPaginatorItem->id, '</td>
    <td>', $currentPaginatorItem->date, '</td>
    <td>', $currentPaginatorItem->nom, '</td>
  </tr>', "\n";
}
?>
</table>

paginator.phtml (tiré de http://framework.zend.com/manual/fr/zen … usage.html : « Pagination d'objets ») :

Code:

<?php if ($this->pageCount): ?> 
<div class="paginationControl">
<?php echo $this->firstItemNumber; ?> - <?php echo $this->lastItemNumber; ?> 
of <?php echo $this->totalItemCount; ?>

<!-- First page link -->
<?php if (isset($this->previous)): ?>
  <a href="<?php echo $this->url(array('page' => $this->first)); ?>">First</a> | 
<?php else: ?>
  <span class="disabled">First</span> |
<?php endif; ?> 

<!-- Previous page link --> 
<?php if (isset($this->previous)): ?> 
  <a href="<?php echo $this->url(array('page' => $this->previous)); ?>">&lt; Previous</a> | 
<?php else: ?> 
  <span class="disabled">&lt; Previous</span> | 
<?php endif; ?> 

<!-- Next page link --> 
<?php if (isset($this->next)): ?> 
  <a href="<?php echo $this->url(array('page' => $this->next)); ?>">Next &gt;</a> |
<?php else: ?> 
  <span class="disabled">Next &gt;</span> |
<?php endif; ?>

<!-- Last page link -->
<?php if (isset($this->next)): ?>
  <a href="<?php echo $this->url(array('page' => $this->last)); ?>">Last</a>
<?php else: ?>
  <span class="disabled">Last</span>
<?php endif; ?> 

</div> 
<?php endif; ?>

Hors ligne

 

#11 20-10-2008 16:04:50

_Raynor_
Membre
Date d'inscription: 11-09-2008
Messages: 28

Re: Utilisation de Zend_Paginator

Je réponds moi-même à ma question :
Obtenir un array associatif (clés = string) est normal : c'est le FetchMode par défaut de l'adaptateur que j'utilise (MySQLi).

Voici le code pour passer d'un tel tableau à un Rowset :

Code:

/**
   * Créer un Rowset a partir d'une table, d'un select et d'un tableau associatif de données
   * 
   * @param Zend_Db_Table_Abstract $table   Table dont sont issue les données
   * @param $datas                          Données (tableau associatif)
   * @param Zend_Db_Table_Select $select    Select d'où sont issues les données 
   * @return Zend_Db_Table_Rowset_Abstract  Un Rowset construit à partir des données
     */
    function createRowset (Zend_Db_Table_Abstract $table, $datas, Zend_Db_Table_Select $select)
    {
        //TODO: Rendre $select facultatif ? (mettre readOnly à true par défaut)
        //TODO: Vérifier le type minimum de $datas (Traversable ?)
    $data  = array(
      'table'    => $table,
      'data'     => $datas,
      'readOnly' => $select->isReadOnly(),
      'rowClass' => $table->info(ComFonctions::ROW_CLASS),
      'stored'   => true
    );
    $rowSetClass = $table->info(ComFonctions::ROWSET_CLASS);

    @Zend_Loader::loadClass($rowSetClass);
    return new $rowSetClass($data);
    }

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages