IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Utilisation du sfPager [1.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 29
    Par défaut Utilisation du sfPager
    Bonjour,
    Voilà, j'aimerais mettre un pager pour les news sur ma page index.
    Je me base sur le tuto jobeet pour le faire mais je n'arrive pas a grand chose.

    Est-ce que vous pourriez jeter un coup d'oeuil ?

    actions.class.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     public function executeIndex(sfWebRequest $request) {
            $this->pager = new sfDoctrinePager(
                            'Nouvelle',
                            sfConfig::get('max_news')
            );
            $this->pager->setQuery(Doctrine_Core::getTable('Nouvelle')->getNouvelles());
            $this->pager->setPage($request->getParameter('page', 1));
            $this->pager->init();
        }
    Nouvelle.class.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        public function getNouvellesQuery() {  
            $q = Doctrine_Query::create()
                            ->from('Nouvelle n');
     
            return Doctrine_Core::getTable('Nouvelle')->addNouvellesQuery($q);
        }
    NouvelleTable.class.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public function getNouvelles(Doctrine_Query $q = null) {
            return $this->addNouvellesQuery($q)->execute();
        }
     
        public function addNouvellesQuery(Doctrine_Query $q = null) {
            if (is_null($q)) {
                $q = Doctrine_Query::create()
                                ->from('Nouvelle n');
            }
     
            $alias = $q->getRootAlias();
     
            $q->addOrderBy($alias . '.created_at DESC');
     
            return $q;
        }
    indexSuccess.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      <?php foreach ( $pager->getResults() as $nouvelle): ?>
            <div id="news_<?php echo $nouvelle->getId() ?>" class="news">
    <!-- -->
            </div>
        <?php endforeach; ?>

    Merci d'avance



    edit:
    Je me suis rendu compte que j'avais oublié de poster le message d'erreure que j'ai; Le voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Fatal error: Call to undefined method Doctrine_Collection::offset() in /var/www/sagaDev/lib/vendor/symfony/plugins/sfDoctrinePlugin/lib/pager/sfDoctrinePager.class.php on line 86
     
    Call Stack:
        0.0106     329556   1. {main}() /var/www/sagaDev/web/saga_dev.php:0
        4.1788    7190760   2. sfContext->dispatch() /var/www/sagaDev/web/saga_dev.php:13
        4.1788    7190804   3. sfFrontWebController->dispatch() /var/www/sagaDev/lib/vendor/symfony/util/sfContext.class.php:170
        4.1921    7210048   4. sfController->forward() /var/www/sagaDev/lib/vendor/symfony/controller/sfFrontWebController.class.php:48
        4.3992    7604148   5. sfFilterChain->execute() /var/www/sagaDev/lib/vendor/symfony/controller/sfController.class.php:233
        4.3996    7605276   6. sfRenderingFilter->execute() /var/www/sagaDev/lib/vendor/symfony/filter/sfFilterChain.class.php:53
        4.3996    7605276   7. sfFilterChain->execute() /var/www/sagaDev/lib/vendor/symfony/filter/sfRenderingFilter.class.php:33
        4.3999    7606364   8. sfGuardRememberMeFilter->execute() /var/www/sagaDev/lib/vendor/symfony/filter/sfFilterChain.class.php:53
        4.4000    7606616   9. sfFilterChain->execute() /var/www/sagaDev/plugins/sfDoctrineGuardPlugin/lib/sfGuardRememberMeFilter.class.php:56
        4.4003    7607700  10. sfExecutionFilter->execute() /var/www/sagaDev/lib/vendor/symfony/filter/sfFilterChain.class.php:53
        4.4004    7608612  11. sfExecutionFilter->handleAction() /var/www/sagaDev/lib/vendor/symfony/filter/sfExecutionFilter.class.php:42
        4.4005    7608612  12. sfExecutionFilter->executeAction() /var/www/sagaDev/lib/vendor/symfony/filter/sfExecutionFilter.class.php:78
        4.4005    7608656  13. sfActions->execute() /var/www/sagaDev/lib/vendor/symfony/filter/sfExecutionFilter.class.php:92
        4.4008    7609848  14. newsActions->executeIndex() /var/www/sagaDev/lib/vendor/symfony/action/sfActions.class.php:60
        5.3049   10795840  15. sfDoctrinePager->init() /var/www/sagaDev/apps/saga/modules/news/actions/actions.class.php:21
        5.3049   10795928  16. sfDoctrinePager->getCountQuery() /var/www/sagaDev/lib/vendor/symfony/plugins/sfDoctrinePlugin/lib/pager/sfDoctrinePager.class.php:100
     
     
    Variables in local scope (#16):
      $query = class Doctrine_Collection { protected $data = array (0 => class Nouvelle { ... }, 1 => class Nouvelle { ... }); protected $_table = class NouvelleTable { protected $_data = array (...); protected $_identifier = 'id'; protected $_identifierType = 1; protected $_conn = class Doctrine_Connection_Mysql { ... }; protected $_identityMap = array (...); protected $_repository = class Doctrine_Table_Repository { ... }; protected $_columns = array (...); protected $_uniques = array (...); protected $_fieldNames = array (...); protected $_columnNames = array (...); protected $columnCount = 6; protected $hasDefaultValues = NULL; protected $_options = array (...); protected $_tree = NULL; protected $_parser = class Doctrine_Relation_Parser { ... }; protected $_templates = array (...); protected $_filters = array (...); protected $_generators = array (...); protected $_generator = NULL; protected $_invokedMethods = array (...); protected $record = class Nouvelle { ... }; protected $attributes = array (...); protected $parent = class Doctrine_Connection_Mysql { ... }; protected $_impl = array (...); protected $_params = array (...); protected $_locator = NULL; protected $_resources = array (...) }; protected $_snapshot = array (0 => class Nouvelle { ... }, 1 => class Nouvelle { ... }); protected $reference = NULL; protected $referenceField = NULL; protected $relation = NULL; protected $keyColumn = NULL; protected $_locator = NULL; protected $_resources = array () }

  2. #2
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Le problème est qu'il n'y a aucune raison pour que cela plante...

    La manière d'obtenir le query est certes un peu emberlificotée (j'ai dû la lire attentivement deux fois pour comprendre ) mais totalement propre et efficace.

    La méthode qui pose problème offset est issue de l'implémentation ArrayAccess. C'est donc après avoir récupéré les données et lors de l'hydratation en mode objet des données que cela plante. Mais pourquoi ???

    Essaye avec une requête simplisme, pour voir.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 29
    Par défaut
    J'ai trouver la solution.

    C'est parce que la méthode que j'utilisait exécutais déjà la requète.
    Si dans l'action je fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     $this->pager = new sfDoctrinePager(
                            'Nouvelle',
                            sfConfig::get('app_max_news')
            );
            $this->pager->setQuery(Doctrine_Core::getTable('Nouvelle')->addNouvellesQuery());
            $this->pager->setPage($request->getParameter('page', 1));
            $this->pager->init();
    Cela fonctionne



    Edit:
    Au fait, c'est quoi un hydrator ? Parce que j'ai un peu du mal a comprendre.

  4. #4
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Le pire c'est que c'était ma première option, j'ai cherché lu et relu et confondu getNouvelle() et getNouvelleQuery().

    Effectivement, il faut le query, pas le résultat, vu qu'il va modifier le query pour ajouter les paramètres début et nombre de lignes.

    Pour me faire pardonner, un partial pour gérer les numéros de pages en dessous de ton pager.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    <?php if ($pager->haveToPaginate()): ?>
      <div class="pagination">
        <a href="<?php echo url_for($route . '?page=1') ?>" title="<?php echo __('First page', '', 'pager') ?>" >
          <<
        </a>
     
        <a href="<?php echo url_for($route . '?page=' . $pager->getPreviousPage() )?> title="<?php echo __('Previous page', '', 'pager') ?>"">
           <
        </a>
     
        <?php foreach ($pager->getLinks() as $page): ?>
          <?php if ($page == $pager->getPage()): ?>
            <?php echo $page ?>
          <?php else: ?>
            <a href="<?php echo url_for($route . '?page=' . $page) ?>"><?php echo $page ?></a>
          <?php endif; ?>
        <?php endforeach; ?>
     
        <a href="<?php echo url_for($route . '?page=' . $pager->getNextPage() )?> title="<?php echo __('Next page', '', 'pager') ?>" >
          >
        </a>
     
        <a href="<?php echo url_for($route . '?page=' . $pager->getLastPage()) ?>" title="<?php echo __(' Last page', '', 'pager') ?>" >
          >>
        </a>
      </div>
    <?php endif; ?>
    Et pour le lancer depuis ton template :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?php include_partial('generic/pager',
            array('pager' => $pager,
                'page' => $CurrentPage,
                'route' => '@dossiers'
            )) ?>
    Sachant que le partial est dans un module particulier "generic" qui reprend tous les partiels communs aux modules.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 29
    Par défaut
    Merci c'est super sympa ^^

    ps:
    C'est quoi un hydrator ? J'ai posé la question la tantot, mais tu as pas du la voir ^^

  6. #6
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    C'est une des choses qui fait la différence entre doctrine et propel. La possibilité d'hydrater suivant plusieurs schémas.

    De base, quant tu récupères des données, elles sont sous forme d'objet et donc modifiables et sauvegardables dans la base. Mais quant tu affiches un tableau d'enregistrement, tu n'as aucun intérêt à récupérer tous les objets sous forme d'objet PHP. Il est possible de les récupérer sous forme de tableau php (array), beaucoup plus rapide et beaucoup moins lourd.

    Généralement cela fonctionne bien, il se peut dans quelques cas très particulier, l'absence du modèle objet soit pénalisant. Il y a plusieurs manière d'hydrater, soit par tableau et sous tableau, soit le tous dans un grand tableau unique.

    Plus d'information dans la documentation de doctrine.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 16h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 15h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 13h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 17h01
  5. Réponses: 2
    Dernier message: 21/03/2002, 00h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo