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 :

Pagination et ajout


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2012
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 21
    Points : 16
    Points
    16
    Par défaut Pagination et ajout
    Bonjour

    Voila aujourd'hui et après avoir réussi a faire la pagination dans ma page index je m'aperçois après que l'ajout ne marche plu et quand je clic sur ajouté il m'affiche une erreur qui dit:
    CRITICAL - Uncaught PHP Exception Doctrine\DBAL\DBALException: "LIMIT argument offset=-4 is not valid" at C:\wamp\www\Livraison\vendor\doctrine\dbal\lib\Doctrine\DBAL\Platforms\AbstractPlatform.php line 2668"
    Bon j'explique les seul changement que j'ai effectué pour la pagination :

    Dans Mon Routing j'ai changer l'index dans client.yml qui est devenu comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    client:
    pattern: /{page}
    defaults: { _controller: "SLamaLivraisonBundle:Client:index", page: 1 }
    Dans Mon Contrôleur j'ai changer IndexAction() qui est devenu comme ceci:
    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
    29
    30
    31
    32
    33
    34
     public function indexAction($page)
        {
     
             $session = new Session();
     
            if ($session->get('valid')=='true')
            {
          $client=new Client();
           $form = $this->container->get('form.factory')->create(new ClientType());
            $total             = $this->getDoctrine()->getRepository('SLamaLivraisonBundle:Client')->createQueryBuilder('p')->getQuery()->getResult();
     
            /* total of résultat */
            $total_clients    = count($total);
            $clients_per_page = 4;
            $last_page         = ceil($total_clients / $clients_per_page);
            $previous_page     = $page > 1 ? $page - 1 : 1;
            $next_page         = $page < $last_page ? $page + 1 : $last_page;
            /* résultat  à afficher*/
            $entities          = $this->getDoctrine()->getRepository('SLamaLivraisonBundle:Client')->createQueryBuilder('p')->setFirstResult(($page * $clients_per_page) - $clients_per_page)->setMaxResults(4)->getQuery()->getResult();
            return $this->render('SLamaLivraisonBundle:Client:index.html.twig', array(
                'entities' => $entities,
                'last_page' => $last_page,
                'previous_page' => $previous_page,
                'current_page' => $page,
                'next_page' => $next_page,
                'total_clients' => $total_clients,
                 'form'   => $form->createView(),
                'client'=>$client,
            ));
            return $this->render('SLamaLivraisonBundle:Client:index.html.twig');
        }
        else 
           return $this->redirect($this->generateUrl('Admin'));
        }

    Et Dans le Twig j'ai tout changer presque et voila mon code

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    <h4 class="alert_info">Welcome to the Client List Manager.</h4>
    <article class="module width_3_quarter">
    		<header><h3 class="tabs_involved">Client list Manager</h3>
    		<ul class="tabs">
       			 <a href="{{ path('client_new') }}"><img src="{{ asset('bundles/Livraison/images/add26.png') }}" title="Create a new entry"/></a>
     
    		</ul>
    		</header>
     
    <div class="tab_container">
    			<div id="tab1" class="tab_content">
     
            {% if entities is not empty %}
                                <table class="tablesorter" cellspacing="0"> 
    			<thead> 
    				 <tr>
                                        <th>Id</th>
                                        <th>Nom</th>
                                        <th>Prenom</th>
                                        <th>Adresse</th>
                                        <th>Code Postal</th>
                                          <th>Numéro Téléléphone</th>
                                        <th>Email</th>         
                                         <th>Cin</th>
                                        <th>Actions</th>
                                    </tr>
    			</thead> 
    			<tbody> 
            {% for key, entity in entities %}
             <tr>
                    <td><a href="{{ path('client_show', { 'id': entity.id }) }}">{{ entity.id }}</a></td>
                    <td>{{ entity.nom }}</td>
                    <td>{{ entity.prenom }}</td>
                    <td>{{ entity.adresse }}</td>
                    <td>{{ entity.codepostal }}</td>
                    <td>{{ entity.tel }}</td>
                    <td>{{ entity.email }}</td>
                    <td>{{ entity.cin }}</td>
                    <td>
     
                            <a href="{{ path('client_show', { 'id': entity.id }) }}"><img src="{{ asset('bundles/Livraison/images/info20.png') }}" title="Show"/></a>
                              <a href="{{ path('client_edit', { 'id': entity.id }) }}"><img src="{{ asset('bundles/Livraison/images/edit20.png') }}" title="Edit"/></a>
     
                    </td>
                </tr>
            {% endfor %}
     
    </tbody> 
    			</table>
            {% else %}
            <p>Résultat vide</p>
            {% endif %}
          <table class="tablesorter" cellspacing="0"> 
    			<thead> 
                                <tr> <th><span></span></th>
                                     <th><span></span></th>
     
          {% if last_page > 1 %}
                                 <th><a href="{{ path('client', { 'page': 1 }) }}"> <span> prec </span> </a></th><th> <a href="{{ path('client', { 'page': previous_page }) }}"> <span> prec </span> </a></th>
     
     
     
            <th><a href="{{ path('client', { 'page': next_page }) }}"> <span> suiv </span> </a></th><th> <a href="{{ path('client', { 'page': last_page }) }}"> <span> suiv </span></a></th> 
          {% endif %}
                                    </tr>   </thead></table>
     
    			</div><!-- end of #tab1 -->
     
    		</div><!-- end of .tab_container -->
     
    		</article><!-- end of content manager article -->
    Quelqu'un Peu M'aidai SVP car j'ai Rien Changer dans NewAction et ca marche plu en plus je c pas ce que veu dire cette erreur
    Merci et Désolé pour le dérangement

  2. #2
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Points : 677
    Points
    677
    Par défaut
    Salut,

    Peux tu faire un var_dump de ta variale $page au début de ta IndexAction.

    Je pense qu'il est égale à 0 donc forcément
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setFirstResult((0* $clients_per_page) - 4)
    ça donne -4.

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2012
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Non L'affichage marche très bien et la pagination aussi mais quand je clik sur ajouté encerclé en rouge dans le screen numéro 1 l'erreur en question s'affiche ( screen numéro 2 )

    juste pour info la 4 c le numéro de ligne par page



    Screen 1


    Screen 2

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $total = $this->getDoctrine()->getRepository('SLamaLivraisonBundle:Client')->createQueryBuilder('p')->getQuery()->getResult();
     
    /* total of résultat */
    $total_clients    = count($total);
    //....
    $entities = $this->getDoctrine()->getRepository('SLamaLivraisonBundle:Client')->createQueryBuilder('p')->setFirstResult(($page * $clients_per_page) - $clients_per_page)->setMaxResults(4)->getQuery()->getResult();
    l'interet d'une pagination c'est de ne pas charger en mémoire toute les lignes d'une table, hors dans ton code c'est ce que tu fais, une première requete qui lit toute les lignes, juste pour en connaitre le nombre, suivi d'une deuxième qui ne récupère que les lignes à afficher.
    Je t'encourage à utiliser des librairies déjà existante pour ce genre de routine.
    pour ma part j'utilise le knpPaginatorBundle https://github.com/KnpLabs/KnpPaginatorBundle

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2012
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    enfaite avec les bundle il ya 2 etape que je sais pas ou maitre
    la 1er par exemple avec ce bundle
    je sais pas ou maitre ca ( il dit dans deps or j'ai pas de deps:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [knp-components]
        git=http://github.com/KnpLabs/knp-components.git
     
    [KnpPaginatorBundle]
        git=http://github.com/KnpLabs/KnpPaginatorBundle.git
        target=bundles/Knp/Bundle/PaginatorBundle
    le 2éme je sais pas ou maitre ca par raport a mon code existant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    // File: app/autoload.php
    $loader->registerNamespaces(array(
        'Knp\\Component'      => __DIR__.'/../vendor/knp-components/src',
        'Knp\\Bundle'         => __DIR__.'/../vendor/bundles',
        // ...
    ));

    Mon code Existant est le suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
     
    use Doctrine\Common\Annotations\AnnotationRegistry;
     
    $loader = require __DIR__.'/../vendor/autoload.php';
     
    // intl
    if (!function_exists('intl_get_error_code')) {
        require_once __DIR__.'/../vendor/symfony/symfony/src/Symfony/Component/Locale/Resources/stubs/functions.php';
    }
     
    AnnotationRegistry::registerLoader(array($loader, 'loadClass'));
     
    return $loader;

  6. #6
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Points : 677
    Points
    677
    Par défaut
    Quel version utilise tu de Symfony2 ? A partir de la version 2.1, il faut utiliser composer et le fichier composer.json pour ajouter des bundles.

    Pour ce qui concerne ton problème d'erreur quand tu cliques sur le bouton add, tu vas vers cette url
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <a href="{{ path('client_new') }}"><img src="{{ asset('bundles/Livraison/images/add26.png') }}" title="Create a new entry"/></a>
    C'est cette action qui plante. Peux tu montrer cette action ?

    @arnooo999, Le bundle paginator charge la table complète à travers la query ou le querybuilder qui est transmis au service knp_paginator.
    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 listAction() 
    {
        $em    = $this->get('doctrine.orm.entity_manager');
        $dql   = "SELECT a FROM AcmeMainBundle:Article a";
        $query = $em->createQuery($dql);
     
        $paginator  = $this->get('knp_paginator');
        $pagination = $paginator->paginate(
            $query,
            $this->get('request')->query->get('page', 1)/*page number*/,
            10/*limit per page*/
        );
     
        // parameters to template
        return $this->render('AcmeMainBundle:Article:list.html.twig', array('pagination' => $pagination));
    }
    extrait de la doc du bundle.

    Notre ami a du utiliser ce lien pour créer sa pagination. Lien web

    C'est vrai que réinvener la roue, alors qu'elle existe déjà sous la forme d'un bundle, ça ressemble a une perte de temps. Je trouves que cela permets de s’approprier le framework aussi.

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2012
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    client_new:
        pattern:  /new
        defaults: { _controller: "SLamaLivraisonBundle:Client:new" }

    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
      public function newAction()
        { $session = new Session();
     
     
            if ($session->get('valid')=='true')
            {
            $entity = new Client();
            $form   = $this->createForm(new ClientType(), $entity);
     
            return $this->render('SLamaLivraisonBundle:Client:new.html.twig', array(
                'entity' => $entity,
                'form'   => $form->createView(),
            ));
         }
        else 
           return $this->redirect($this->generateUrl('Admin'));
        }

  8. #8
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Points : 677
    Points
    677
    Par défaut
    Déja la bonne pratique est d'utiliser les services donc pour accèder à la session,

    au lieu de Quelle est l'action derrière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->redirect($this->generateUrl('Admin'));
    ?

Discussions similaires

  1. zend paginator et ajout de paramètre
    Par vince29 dans le forum Autres composants
    Réponses: 38
    Dernier message: 29/07/2011, 09h58
  2. Ajout pagination au script
    Par answer27 dans le forum Langage
    Réponses: 3
    Dernier message: 27/06/2011, 14h06
  3. [ZF 1.8] Ajouter des parametres au paginator ?
    Par kreatik dans le forum MVC
    Réponses: 1
    Dernier message: 04/06/2009, 15h59
  4. Réponses: 7
    Dernier message: 12/02/2009, 10h55
  5. Réponses: 3
    Dernier message: 18/07/2008, 11h17

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