Bonjour,

J'aurais souhaité afficher une requète dans un menu déroulant. Le problème est lorsque je fais ma requète je rencontre quelques problèmes.
J'ai un controller categories et un subcategories (car dans ma BDD les subcategories dépendent des categories)

Or dans le controller subCategories je souhaiterais récupérer la liste de mes categories pour les envoyer à ma vue.
Débutant avec Cake, je ne sais pas trop comment m'y prendre. J'ai essayé ceci mais ça ne marche pas.

<?php
class subCategoriesController extends AppController 
{
function addSubCategory()
    {
        $categories = $this->Category->find('list'); //On recherche les catégories
                $this->set(compact('Subtegories')); // On les envoit à la vue.
}
}
?>

Quelqu'un pourrait-il éclairer ma lanterne svp ? :)

6 réponses


ker0x
Réponse acceptée

Tu as 3 façons de faire :

  1. Tu déclares une variable $uses au début de ta Class et tu lui passe un tableau contenant tous les Model que tu veux utiliser dans ton Controller. Le premier Model doit obligatoirement être le Model du Controller.

    Class subCategoriesController extends AppController
    {
    public $uses = array('Subcategory', 'Category');
    ...
    }

  2. Tu utilises la fonction loadModel() pour charger le Model voulu avant de faire ta requête

    $this->loadModel('Category');
    $categories = $this->Category->find('list');

  3. Tu utilises les associations.

    $categories = $this->Subcategory->Category->find('all')

En supposant que le Model Subcategory a une association belongsTo avec le Model Category

ker0x
Réponse acceptée

Nomme juste ton champ avec le nom de la clé étrangère de ton Model lié et ta liste devrait se remplir automatiquement

echo $this->Form->input('category_id')

Si ce n'est pas le cas, passe juste la variable $categories dans les options

echo $this->Form->input('category_id', array(
    'options' => $categories
)

Salut, je te conseille d'utiliser requestAction() dans ta vue
http://book.cakephp.org/2.0/fr/controllers.html#Controller::requestAction

mais attention, car a chaque fois que tu vas charger la page il va faire une requête sql pour récuperer tes données donc ça risque d'allourdir ta page, donc il faut utiliser un système de cache avec

http://book.cakephp.org/2.0/fr/core-libraries/caching.html

Hello,
je pose la question au cas ou, pourquoi n'utilises tu peux pas le behavior Tree de cakephp? Ca permet de traiter indifféremment les catégories des sous catégories (voir des sous sous catégories si besoin) : http://book.cakephp.org/2.0/fr/core-libraries/behaviors/tree.html
Surtout dans l'optique de faire un menu déroulant. (en plus ca permet de gérer l'ordre des items).

Ensuite dans l'action de ton controller tu génères l'arbres avec les enfants de chaque items, le path pour savoir ou tu es dans ton menu et hop le tour est joué. Qu'en penses tu ?

Hello, pour le Tree ça m'a l'air un poil compliqué pour ce que j'ai à faire (sachant que je dois avoir 4-5 catégories à retourner donc bon ...)

J'ai donc choisi de mettre ceci dans mon controller :

<?php
class subCategoriesController extends AppController 
{

function add()
    {
$this->loadModel('Category');
        $categories = $this->Category->find('list');
        $this->set(compact('categories')); // On les envoit à la vue.
}
?>

Et ceci dans ma vue:

<?php
    foreach ($categories as $category) {
    echo $categories'Category']'categoryName'];
}
?>

Bon tout ceci fonctionne, le truc qui me dérange c'est que je n'arrive pas à insérer mes valeurs dans une liste déroulante.

J'ai été voir la doc et je sais que je devrais avoir un code ce ce type là.

<?php
echo $this->Form->input('field', array(
      'options' => array(
        1, 2, 3, 4, 5),
      'empty' => 'Catégorie'
  ));
?>

Sauf qu'il faudrait remplacer 1,2,3,4 par les catégories que j'ai récupéré au dessus.
Mettre le foreach à l'intérieur ne fonctionne pas,quelqu'un peut-il m'aiguiller SVP ? :)

Super ça marche merci beaucoup :)