Bonjour à vous,
j'ai un contrôleur Produit avec une fonction addcart($id) qui permet d'ajouter les produits dans le panier, cette même fonction rend sa vue dans la vue par défaut qui est index, mon problème est de savoir comment envoyé les variables de la fonction addcart dans la vue index? je bloque la dessus, faudra t'il que je crée une vue addcart pour me simplifier les choses ? mais je ne pense pas que c'est une bonne approche si je le fais.
Mon code simplifié :
ProductsController.php

function addcart($id){
$product = $this->Product->find('first', array(
            'fields' => array('id'),
            'conditions' => array('id' => $id)
        ));
if (empty($product))
            throw new NotFoundException('Aucun produit ne correspond à cet ID');
        else {
            $this->add($product'Product']'id']);
        $total = $this->total();
            $count = $this->count();
            $this->Session->setFlash(('Le produit a bien été ajouté à votre panier'), 'flash', array('class' => 'success'));
            $this->redirect($this->referer());
        }
        $this->set(compact('product', 'total', 'count'));
        $this->render('index');
}

Comment envoyé ses variables

5 réponses


antho07
Réponse acceptée

Bonjour, donc oui enlève le redirect sinon tu feras jamais le code qu'il y a dessous.

Par ailleurs qu'est ce que j'entends par "appeler par l'url" .
Cela signifie que si tu précises rien ta méthode est définie en public.

Techniquement cela signifie que ta méthode est appelable partout dans le code en faisant un :

class->methode

Ainsi, lorsque que le dispatcher va parser l'url rentrée par l'utilisateur , ici /products/add/4 par exemple , il va
instancier et initialiser le controller ProductsController , faire appel à la méthode add et lui passer le paramètre 4 .

Donc grossomodo faire ça : (je simplifie pour comprendre)

$productsController = new ProductsController();
$productsController->add(4);

Et du coup cela va lancer la méthode add , comportement que tu ne souhaites pas je pense puisque tu as la méthode addCart($id) qui traite ça ...

Alors comment faire??

On va se servir des objets et de l'encapsulation que permet la programmation orientée objet .
A ce titre, des mots clés permettent de définir l'accessibilité d'une variable ou d'une méthode membre de la classe

Ces mots clés sont les suivants:

public => par défaut, cela signifie que la variable ou la méthode est accessible du moment que la classe est instanciée et initialisée .

typiquement MonObjet->La_variable_ou_la_methode_de_l'objet

private => la variable ou la méthode est accessible uniquement au sein de la classe.

Prenons l'exemple de la classe A suivante:

Class A {
public $nom;
private $age;
function __construct(){
$this->$nom = "";
$this->$age = 0;
}
function __construct($nom,$age){
$this->$nom = $nom;
$this->$age = $age;
}

}

Et maintenant mettons nous dans une class B qui va utiliser la class A :

class B {
..]
$A = new A("toto",5);
//Je veux récuperer le nom dans $A:
$nom = $A->$nom;
//Je veux récuperer l'age de $A
$age = $A->$age

..]
}

ici pas de problème pour $nom ça va marcher, par contre pour $age on va se faire "remballer" et obtenir une erreur.. la variable est private! elle n'est pas accessible hors de la classe A..

protected => comme private sauf qu'en plus de la classe elle même la variable est accessible dans les classes heritées (+ les classes du même package )

D'une manière générale (du moins en JAVA, en PHP je sais pas les bonnes façons de faire, peut être que Grafikart pourra en dire plus)

On met les variables en private ou protected et on crée des setters/getter pour les variables que l'on veut rendre public

class A {
private $__age;
private $__nom;
//constructeur , je passe.. 

public function getNom(){
    return $this->$__nom;
}
public function setNom($nom){
$this->$__nom = $nom;
}
//pareil pour getAge, setAge
}

Et au niveau de la class B

class B {
$A = new A();
$A->setNom("toto");
$A->setAge(38);
$nom = $A->getNom();
$age = $A->getAge();
}

Et pour revenir à ton cas ou tu veux que addcart soit accessible et non add :

public function addcart($machin){
...
$this->_add($truc);
}
private function _add($id){ //on aime bien mettre _ pour savoir dans le code quell accessibilité on a sur la variable ou méthode appelée
..
}

Ainsi de cette manière on choisit quelles actions pourront être appelées par l'url et quelles sont celles qui sont juste des méthodes nécessaires au fonctionnement mais qui n'ont pas vocation a être appelées ailleurs.

bien cordialement

Antho

nraloux
Auteur

Pardonnez mon impolitesse. Un SVP est de mise.
Merci

Bonjour , heu tu rediriges dans le else avant d'appeler la vue index et avant d'envoyer des variables..

Par ailleurs total count et add sont des fonctions que t'as défini dans ton controller??

si c'est le cas, elles pourront être appelé par l'url attention (du moins si elles sont en public..)

nraloux
Auteur

Bonjour et merci pour ta réponse,je l'avait pas vu celle la :) et effectivement count et total sont défini dans le controller,peut tu m'expliquer STP ce que tu veux dire en parlant d'appeler par l'url ?
j'ai voulu essayer l'extension de vue mais j'ai toujours un problème vu que addcart prend un paramètre.
Merci.

nraloux
Auteur

Merci @antho07, tes explications m'ont énormément aidé.