Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
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> </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> <?= $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)); ?>">< Previous</a> |
<?php else: ?>
<span class="disabled">< 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 ></a>
<?php else: ?>
<span class="disabled">Next ></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
Hello,
Dans cet appel :
<?= $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 :
<?= $this->paginationControl($this->paginator, 'Sliding', 'my_pagination_control.phtml'); ?>
ou faire un
Zend_View_Helper_PaginationControl::setDefaultViewPartial('my_pagination_control.phtml');
A+
Hors ligne
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
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
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 :
$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
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
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
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
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
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() :
$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" :
<?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 ») :
<?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)); ?>">< Previous</a> | <?php else: ?> <span class="disabled">< Previous</span> | <?php endif; ?> <!-- Next page link --> <?php if (isset($this->next)): ?> <a href="<?php echo $this->url(array('page' => $this->next)); ?>">Next ></a> | <?php else: ?> <span class="disabled">Next ></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
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 :
/** * 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