Bonjour,
Je suis entrain de créer un panier dans mon système MVC mais impossible de récupérer tous les id des produits sélectionnés.
Voici mon controller :
/**
* Permet d'afficher le contenu du panier
**/
function index(){
$this->loadModel('Post');
$ids = array_keys($_SESSION'panier']);
var_dump($ids);
$idss = implode(',',$ids);
var_dump($idss);

$condition = array('online' => 1,'type'=>'product','id' => $idss);
$d'panier'] = $this->Post->find(array(
'conditions' => $condition,
'fields' => 'Post.id,Post.name,Post.slug,Post.price',

));

$this->set($d);
var_dump($d);
}

Avec ce système, je ne retrouve que le premier ID de la chaîne. Comment récupérer tous les id stockés dans ma session panier?!
Merci!

7 réponses


il faut que tu fasses des modifs dans ta fonction find pour gérer deux cas si $id est un entier alors tu fais un id = $id si $id est un tableau alors tu fera "$id IN '".implode($id, ',')."'" un truc du genre car je ne sais pas qu'elle tete a ton fichier

Romanier
Auteur

Merci pour ta réponse. Tu veux dire modifier la fonction find dans le Model ou directement sur le controller?
En fait, je sais qu'il faut que je fasse un implode dans la conditions mais impossible de trouver la bonne formule.
"$id IN '".implode($id, ',')."'", ne fonctionne pas. Aucun bug mais le tableau se retrouve vide.
Une idée?

Romanier
Auteur
/**
    * Permet d'afficher le contenu du panier
    **/
    function index(){
    $this->loadModel('Post');
    $id = array_keys($_SESSION'panier']);
    var_dump($id);

    $condition = array('online' => 1,'type'=>'product', 'id'=> "$id IN '".implode($id, ',')."'");
    $d'panier'] = $this->Post->find(array(
        'conditions' => $condition,
        'fields' => 'Post.id,Post.name,Post.slug,Post.price',
        ));

    $this->set($d);
    var_dump($d);
        }   
    }

Et ça ne renvoi rien.

Le model :

// Construction de la condition
        if(isset($req'conditions'])){
            $sql .= 'WHERE ';
            if(!is_array($req'conditions'])){
                $sql .= $req'conditions']; 
            }else{
                $cond = array(); 
                foreach($req'conditions'] as $k=>$v){
                    if(!is_numeric($v)){
                        $v = '"'.mysql_real_escape_string($v).'"'; 
                    }

                    $cond] = "$k=$v";
                }
                $sql .= implode(' AND ',$cond);

            }
        }

normal dans ton model il ne passe jamais dans le if vu que $req'conditions'] est toujours un tableau...

le plus simple c'est dans ton controleur tu fais un truc du genre
$condition = "'online' = 1 AND 'type' = 'product' AND 'id' IN (".implode($id, ',').")";

la pour le coup vu que $conditions est une chaine dans ton model il va passer dans le if (check quand meme qu'il n'y a pas d'erreur dans la chaine car j'ai pas vérifié) mais normalement ca devrait marcher

Excusé moi d'être hors-sujet mais comment as-tu fait pour avoir ce type de couleur pour ta syntaxe PHP ?
car moi le $this n'est pas coloré, le isset est bleu etc. et je préfère largement votre configuration.
Pourriez-vous me dire comment faire ceci? merci d'avance !

WhiteCoders

Romanier
Auteur

Finalement j'ai réussi avec cette méthode :

Le Model modifié :

// Construction de la condition
        if(isset($req'conditions'])){
            $sql .= 'WHERE ';
            if(!is_array($req'conditions'])){
                $sql .= $req'conditions']; 
            }else{
                $cond = array(); 
                foreach($req'conditions'] as $k=>$v){
                    if(is_array($v)){
                    switch ($v'cond']) {
                        case 'in':
                            $cond] = get_class($this).".$k IN (".implode(', ',$v'value']).')';
                        break;
                    }
                    }else{
                    if(!is_numeric($v)){
                        $v = '"'.mysql_real_escape_string($v).'"'; 
                    }
                    $cond] = "$k=$v";
                }
            }
                $sql .= implode(' AND ',$cond);

            }
        }

Le Controller :

/**
    * Permet d'afficher le contenu du panier
    **/
    function index(){
    $this->loadModel('Post');
    $id = array_keys($_SESSION'panier']);

    $d'panier'] = $this->Post->find(array(
        'fields' => 'Post.id,Post.name,Post.slug,Post.price, Post.type',
        'conditions' => array ('id' => array ('cond' => 'in', 'value' => $id)),

        ));
    $this->set($d);

        }   
    }

Je sais pas si je vais rencontrer des problèmes dans le futur, mais pour le moment tout fonctionne très bien.
Merci!

oui en effet c'est pas con aussi tu pourras gérer les or de la meme maniere aussi

Pour la coloration c'est du js je pense un truc genre pretify ou meme famille