Bonjour,

Je suis entrain de développer une petite application avec 3 modeles comme suit :
Rayon(id,nom)
Category(id,nom,rayons_id)
Article(id, nom, category_id)

Les 3 modèles sont liés Rayons hasMany Category et Category hasMany Article.

Je voudrais quand on ajoute un nouvel article qu'on puisse sélectionner le Rayon qui ensuite affiche sur une liste déroulante les catégories de chaque rayon.

Voici la fonction add.ctp dans model/Articles/add.ctp
div class="form">
<?php echo $this->Form->create('Article'); ?>
<fieldset>
<legend><?php echo __('Ajouter Article'); ?></legend>
<?php
echo $this->Form->input('nom');
echo $this->Form->input('quantite');
echo $this->Form->input('prix');
echo $this->Form->input('rayons_id',array($rayons, 'empty' => 'choisir', 'onchange' =>'change(this.select)'));
echo $this->Form->input('categories_id' ,array('clas' => 'loader' ,'stypr' => 'display:hidden'));

?>
</fieldset>

<?php echo $this->Form->end(__('Submit')); ?>

Merci de m'indiquer des pistes ?

3 réponses


bambe
Auteur
Réponse acceptée

Merci El156 je vais me pencher sur cette piste.

bambe
Auteur
Réponse acceptée

Bonjour à tous,

j'ai réussi à faire ma liste dynamqiue grâce à ce lien :

Dans app/Controller/CategoriesController j'ai mis la fonction :

public function getRayons() {
        $rayons_id = $this->request->data'Article']'rayons_id'];

        $categories = $this->Category->find('list', array('fields' => array('id','nom'),
            'conditions' => array('Category.rayons_id' => $rayons_id),
            'recursive' => -1
            ));

        $this->set('categories',$categories);
        $this->layout = 'ajax';
    }

Dans /app/Controller/View/Articles/add.ctp

<?php echo $this->Form->create('Article'); ?>
    <fieldset>
        <legend><?php echo __('Add Article'); ?></legend>
    <?php
        echo $this->Form->input('nom');
        echo $this->Form->input('quantite');
        echo $this->Form->input('prix');
        echo $this->Form->input('rayons_id', array('empty' => 'Choisir' , 'options' => $rayons));
        echo $this->Form->input('categories_id');
        $this->Js->get('#ArticleRayonsId')->event('change', 
        $this->Js->request(array('controller'=>'categories','action'=>'getRayons'), 
            array(
            'update'=>'#ArticleCategoriesId',
            'async' => true,
            'method' => 'post',
            'dataExpression'=>true,
            'data'=> $this->Js->serializeForm(array(
                'isForm' => true,
                'inline' => true
                ))
            ))
        );
    ?>
    </fieldset>
<?php echo $this->Form->end(__('Submit')); ?>

il faut aussi charger les helper et components
$helpers = array('Js');

public $components = array('Paginator', 'Session','RequestHandler');

et dans default.ctp du layout par defaut :

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
    <!-- scripts_for_layout -->
    <?php echo $scripts_for_layout; ?>
    <!-- Js writeBuffer -->
    <?php
    if (class_exists('JsHelper') && method_exists($this->Js, 'writeBuffer')) echo $this->Js->writeBuffer();
    // Writes cached scripts

Comme tu veux créer un article il te faut donc charger tes Rayons et tes categories de façon a part entiére depuis ton controller Article

<?PHP
App::uses('AppController', 'Controller');
Class ArticlesController extends AppController {

    function get_rayons($params = null){
        if($params == null){
            $params = array();
        }
        $this->loadModel('Rayon');
        return $this->Rayon->find('all',$params); //tu charge tes Rayon, tu enléve la recursivité
    }
    function get_categories($params = null){
        if($params == null){
            $params = array();
        }
        $this->loadModel('Category'); 
        //chargement simple tu peut aussi utiliser le find list pour générer un input aprés tous est indiqué dans la doc Cake
        return $this->Category->find('all',$params); //tu charge tes categories, tu enléve la recursivité
    }
    function index(){ //correspond à ta vue actuelle
        $this->set('Categories', $this->get_categories());
        $this->set('Rayons', $this->get_rayons());
    } 
}
?>

Ensuite c'est a toi de gérer dans ta vue comment tu veux créer ton article tu peut faire une liste déroulante avec le rayon et une autre avec la categories etc... Perso je préfére les sélections au clique avec des inputs caché pour stocker les données.
Depuis ton controller pour la sauvegarde de l'article du save() tes datas avec ton category_id et tu loadModel('Category') pour y enregistrer ton rayon_id.

Si par contre tes rayons ont des categories que tu définis toi même à l'avance du peut faire une requête ajax quand tu clique sur on rayon pour charger les categories qui y corresponde.