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 :

Récupérer un tableau dans un formulaire


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 18
    Par défaut Récupérer un tableau dans un formulaire
    Bonjour à vous,


    ORM: Propel

    Objectif: transférer une ancienne commande dans le panier

    Fonctionnement: actuellement, le panier se met à jour normalement, c'est à dire en ajoutant un produit en fonction de son ID.

    Problème: lorsque je veux transmettre une commande dans le panier, il y à donc plusieurs ID de produit à transmettre, or je bloque la dessus.... tout bête hein? (vive symfony... '^^)




    ...\www\apps\frontend\modules\order\templates\showSuccess.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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    <div class="ligne legend">
     <div class="span-3">Produit</div>
     <div class="span-1">Qt&eacute;</div>
     <div class="span-1">Prix unitaire</div>
     <div class="span-1 outils last">Total</div>
    </div>
    <?php $cpt_id = 0; ?>
    <?php foreach ($products as $product): ?>
    <div class="ligne new">
     <div class="span-3 titreNew">
      <h3><?php echo $product->getProductSelling()->getName() ?></h3>
     </div>
     <div class="span-1"><?php echo $product->getQuantity() ?></div>
     <div class="span-1"><?php echo $product->getPrice() ?> &euro;</div>
     <div class="span-1 outils last">
      <?php echo ($product->getQuantity()*$product->getPrice())?> &euro;
     </div>
     <?php $tb_id[$cpt_id] = $product->getProductSelling()->getId(); ?>
     <?php $cpt_id++; ?>
    </div>
    <?php endforeach ?>
     
    ~~~~~~~~~~~~
     
    // Tentative d'envoi des ID via un tableau
     
    <?php foreach ($tb_id as $i => $value) { ?>
     <?php echo form_tag('shoppingcart/add') ?>
     <?php echo input_hidden_tag('id', $tb_id[$i]) ?>
     <?php echo submit_tag('Ajouter au panier', 'class="bt_action"') ?>
     </form>
    <?php } ?>
    Visuel:




    J'ai mis que un seul bouton "Ajouter au panier" mais actuellement il y en a 3 à cause du foreach que j'ai ajouté (fin du code précédent).



    Le problème est que la page qui récupère les données (le panier -> shoppingcart/add) ne fonctionne qu'avec un identifiant unique, et non un tableau d'identifiants.

    ...\www\apps\frontend\modules\shoppingcart\templates\listSuccess.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
    17
    18
    19
    20
    21
    22
    23
    24
     
    <div class="span-4">
     <table>
      <tr>
       <th id="produit">Produit</th>
       <th id="xfr">XFR</th>
       <th id="qte">Qte</th>
       <th id="unit" class="right">Prix unitaire</th>
       <th id="total" class="right">Total</th>
       <th id="total" class="right" style="border-bottom:0px;">&nbsp;</th>
      </tr>
      <?php foreach ($items as $item): ?>
      <?php $object = call_user_func(array($item->getClass().'Peer', 'retrieveByPk'), $item->getId()) ?>
      <tr id="<?php echo 'itemX_'.$item->getId() ?>">
      <td><em><?php echo link_to($object->getName(), 'com_support/view?id='.$object->getId()) ?></em>
      </td>
      <td><?php echo $object->getXfrVisuel() ?></td>
      <td><?php echo input_tag('quantity_'.$item->getId(), $item->getQuantity(), 'size="1"') ?></td>
      <td class="right"><span id="<?php echo 'price_'.$item->getId() ?>"><?php echo format_currency($item->getPrice()) ?></span>€ HT</td>
      <td class="right"><span id="<?php echo 'total_price_'.$item->getId() ?>"><?php echo format_currency($item->getPrice() * $item->getQuantity()) ?></span>€</td>
      <td style="border-bottom:0px;">&nbsp;<a href="#" onClick="ClearInput('<?php echo 'quantity_'.$item->getId() ?>');"><img alt="Supprimer" title="Supprimer" src="/www.extranetvelux.com/www/web/images/icon/cross.png"></a></td>
     </tr>
     <?php endforeach ?>
    [etc...]

    Visuel:



    Dans le cas présent, j'ai cliqué sur le bouton "Ajouter au panier" correspondant à la Carte de visite.


    Donc pour récapituler, j'arrive a envoyer ligne par ligne ma commande dans le panier, en cliquant sur le "Ajouter au panier" de chaque produit, mais je souhaiterais envoyer toutes les lignes de la commande d'un seul coup.

    Dois-je changer le fonctionnement du panier lui-même ou y a-t'il une astuce pour récupérer le tableau d'identifiant et de les traiter un par un.

    Attention, sans $_POST $_GET svp... made in symfony


    J'ai essayé d'être clair (j'ai du mal sa ^^) et concis, donc si jamais vous avez des questions, ou si vous avez besoin d'avoir plus de code pour analyser le problème, n'hésitez pas à me demander.

    Sa me déprime vraiment de buggé sur un problème aussi simple que sa...

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 957
    Par défaut
    Je n'ai pas vraiment compris comment tu ajoutes un élément dans ton panier cela dit ta variable ID doit etre un tableau si tu veux envoyer plusieurs variables.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php foreach ($tb_id as $i => $value) { ?>
     <?php echo form_tag('shoppingcart/add') ?>
     <?php echo input_hidden_tag('id[]', $tb_id[$i]) ?>
     <?php echo submit_tag('Ajouter au panier', 'class="bt_action"') ?>
     </form>
    <?php } ?>

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 18
    Par défaut
    Effectivement, c'est la première chose que j'ai faite.

    Sauf que si je fais sa, je tombe sur une page d'erreur symfony étant donné que la page du panier ne doit recevoir qu'un seul identifiant, d'ou mon problème.

    En fait j'aurais besoin de savoir comment récupérer ce tableau id[], dois-je revoir la structure du panier ou est-il possible de géré par une boucle ou autre les ID du tableau mais un par un... enfin je sais je suis pas très clair, mais c'est justement parce que je vois pas comment faire

    En tout cas merci pour l'intérêt porté à mon post

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 957
    Par défaut
    Sauf que si je fais sa, je tombe sur une page d'erreur symfony étant donné que la page du panier ne doit recevoir qu'un seul identifiant, d'ou mon problème.
    Ton action doit etre capable de gérer un tableau d'ID, il faudra juste que tu l'adaptes un peu.

    En fait j'aurais besoin de savoir comment récupérer ce tableau id[], dois-je revoir la structure du panier ou est-il possible de géré par une boucle ou autre les ID du tableau mais un par un... enfin je sais je suis pas très clair, mais c'est justement parce que je vois pas comment faire
    Une boucle dans ton action devrait faire l'affaire.
    Peux-tu poster ton action?

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 18
    Par défaut
    Voici la classe associé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class orderActions extends sfActions
    {
      public function executeShow()
      {
        $this->order = OrderPeer::retrieveByPk($this->getRequestParameter('id'));
        $this->forward404Unless($this->order);    
        $this->products = $this->order->getOrderProducts();
      }
     
    [...]
     
    }
    Si je met id[] au lieu de id -> Cette page n'existe pas.

    Après je dois vous avouez que je suis pas très a l'aise dans les class avec tout ses $this et ...Peer

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 957
    Par défaut
    Huuum, order ID est unique donc c'est normal qu'il n'y est pas de tableau.
    L'action que tu as poster permet d'afficher ta commande. Je pensais plus a l'action qui permet d'ajouter dans ton caddie plusieurs produits c'était bien ta question initiale ?

  7. #7
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 18
    Par défaut
    Autant pour moi, dur dur le matin....

    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
     
    class shoppingcartActions extends sfActions
    {
      public function executeAdd()
      {
        if($this->hasRequestParameter('id'))
        {
     
          $product = ProductSellingPeer::retrieveByPk($this->getRequestParameter('id'));
     
          $this->forward404Unless($product);
     
         $shopping_cart = $this->getUser()->getShoppingCart();
     
          $item = new sfShoppingCartItem('ProductSelling', $this->getRequestParameter('id'));
          $item->setQuantity(1);
          $item->setPrice($product->getPrice());
          $shopping_cart->addItem($item);
     
     
         $this->setFlash('cart_notification', 'Le produit '.$product->getName().' a bien été ajouté à votre panier.');
     
         return $this->redirect('shoppingcart');
     
        }
      }
     
    [...]
     
    }

  8. #8
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 18
    Par défaut
    Sinon juste pour ma culture perso ^^

    Dans mon fichier \www\apps\frontend\modules\order\templates\editSuccess.php

    J'ai cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php $object = call_user_func(array($item->getClass().'Peer', 'retrieveByPk'), $item->getId()) ?>
    Je connaissais pas call_user_func, mais merci google:

    call_user_func ( callback function , mixed parameter , mixed ... )

    call_user_func appelle la fonction utilisateur function_name , et lui passe les paramètres parameter .


    J'ai fait un echo de $item->getClass(), cela me donne: ProductSelling

    Or, je suis allé voir dans la class ProductSellingPeer, et à ma grande surprise, il n'y a aucune méthode retrieveByPk....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class ProductSellingPeer extends BaseProductSellingPeer
    {
      public function getTestimonialCount() {
        $c = new Criteria();
        $c->add(TestimonialPeer::PRODUCT_ID, 1);
        $this->categorys = TestimonialPeer::doSelect($c);
      }
    }


    Auriez-vous une explication ?

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 957
    Par défaut
    J'ai fait un echo de $item->getClass(), cela me donne: ProductSelling
    Or, je suis allé voir dans la class ProductSellingPeer, et à ma grande surprise, il n'y a aucune méthode retrieveByPk....
    En faite c'est grâce a la Programmation Orienté Objet (POO), ta classe ProductSellingPeer hérite des méthodes de la classe BaseProductSellingPeer. Dans les cours et tutoriels PHP : http://php.developpez.com/cours/

    http://hachesse.developpez.com/objetphp/
    http://hdd34.developpez.com/cours/artpoo/

  10. #10
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 18
    Par défaut
    Arf quelle tâche je fais... j'en oublie les bases '^^


    \www\lib\model\om\BaseProductSellingPicturePeer.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
    17
    18
    19
    20
     
    [...]
     
    	public static function retrieveByPK($pk, $con = null)
    	{
    		if ($con === null) {
    			$con = Propel::getConnection(self::DATABASE_NAME);
    		}
     
    		$criteria = new Criteria(ProductSellingPicturePeer::DATABASE_NAME);
     
    		$criteria->add(ProductSellingPicturePeer::ID, $pk);
     
     
    		$v = ProductSellingPicturePeer::doSelect($criteria, $con);
     
    		return !empty($v) > 0 ? $v[0] : null;
    	}
     
    [...]
    Merci

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 957
    Par défaut
    Oui c'était pas de la magie

    Mais bon un oubli est vite arrivé quand on utilise un Framework.
    Il y a tellement de chose a appréhender surtout avec Symfony.

Discussions similaires

  1. Passé un tableau dans un formulaire et le récupérer
    Par Alexandre T dans le forum Struts 1
    Réponses: 10
    Dernier message: 23/07/2007, 09h30
  2. Réponses: 5
    Dernier message: 20/07/2007, 16h15
  3. insérer un tableau dans un formulaire ACCESS
    Par julie76 dans le forum Access
    Réponses: 2
    Dernier message: 25/10/2005, 19h47
  4. [Tableaux] tableau dans un formulaire
    Par Elo13 dans le forum Langage
    Réponses: 4
    Dernier message: 26/09/2005, 18h28
  5. [ STRUTS ] [ LOGIC:ITERATE ] tableau dans un formulaire
    Par LoulouFifi dans le forum Struts 1
    Réponses: 3
    Dernier message: 18/06/2004, 17h19

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