CakePHP-Fr.Org

Forum francophone du Framework CakePHP

Vous n'êtes pas identifié.

#1 23-03-2014 15:48:47

mimosa21
Chouquette
Date d'inscription: 23-03-2014
Messages: 1

Element en fonction d'un clic dans une liste

Bonjour à tous,

C'est mon premier post sur le forum et je tiens à saluer toutes les personnes qui donnent de leur temps et les aides précieuses qu'elles fournissent smile

Voilà mon soucis:
Dans une vue de création d'une annonce add.ctp, j'ai une liste déroulante catégorie et une liste sous catégories.
Quand je clique sur une catégorie, elle m'active la liste sous catégories avec les options propres à la catégorie (ex: catégorie = immobilier , sous categories = maison, chateau, péniche, etc. cela grâce à mon code en fin de add.ctp

Code: php

  1. <?php    
  2.     $this->Js->get('#InputCategory_Id')->event('change',
  3.     $this->Js->request(array(
  4.       'controller'=>'subcategories',
  5.       'action'=>'getByCategory'
  6.       ), array(
  7.       'update'=>'#InputSubcategory_Id',
  8.       'async' => true,
  9.       'method' => 'post',
  10.       'dataExpression'=>true,
  11.       'data'=> $this->Js->serializeForm(array(
  12.         'isForm' => true,
  13.         'inline' => true
  14.         ))
  15.       ))
  16.     );

ma vue get_by_category.ctp

Code: php

  1. <!-- file path app/View/Subcategories/get_by_category.ctp -->
  2. <?php
  3.     if(!empty($subcategories)){
  4.         foreach ($subcategories as $key => $value):
  5. ?>
  6.         <option value="<?php echo $key; ?>"><?php echo $value; ?></option>
  7. <?php
  8.         endforeach;
  9.     } else {
  10. ?>
  11.     <option value="">No Data</option>
  12. <?php
  13.     }
  14. ?>

et mon action dans SubcategoriesController

Code: php

  1.    public function getByCategory() {
  2.         $category_id = $this->request->data['Announce']['category_id'];
  3.         $subcategories = $this->Subcategory->find('list', array(
  4.       'fields' => array('Subcategory.id', 'Subcategory.name_fr'),
  5.             'conditions' => array('Subcategory.category_id' => $category_id),
  6.             'recursive' => -1,
  7.       'order' => array('Subcategory.name_fr ASC')
  8.             ));
  9.         $this->set('subcategories',$subcategories);
  10.         $this->layout = 'ajax';
  11.     }

Maintenant ce que je voudrais faire c'est:
    Si je clique sur maison, cela m'ouvre en dessous un élément propre à 'maison' avec plusieurs input que je pourrais renseigner:
      - Surface habitable,
      - Surface terrain,
      - Consommation énergétique
    Si je clique sur péniche, il est clair que ça doit m'ouvrir un autre élément qui ne contiendra pas l'input de la surface du terrain. Là je ne sais absolument pas comment m'y prendre j'ai commencé par suivre le cook book mais c'est loin d'être clair, je ne trouve rien qui puisse m'aider sur google.
J'ai commencé avec la doc à écrire ceci:

Code: php

  1.   $this->Js->get('#InputSubcategory_Id')->event('click',
  2.     $this->Js->request(
  3.       array(
  4.         'controller'=>'????',
  5.         'action' => '????', '????'
  6.       ),
  7.       array('async' => true, 'update' => '#element')
  8.     )
  9.   );

mais je ne vois absolument pas comment je dois créer mon controller, ma vue, bref perdu depuis plusieurs jours à tourner en rond sur ce casse-tête.

Merci à vous de m'éclairer.

Hors ligne

 

#2 19-05-2014 11:37:24

cyberbobjr
Baker
Date d'inscription: 13-07-2010
Messages: 625

Re: Element en fonction d'un clic dans une liste

Salut,
Alors il y'a plusieurs trucs à faire.

tout d'abord, tu as la méthode barbare et la méthode intelligente.

La méthode barbare :
Résumé :
Pour chaque catégorie, tu as une vue différente qui contient les champs que tu veux récupérer.

Exemple :
ton utilisateur sélectionne la catégorie "maison" dans la liste.
Une requête AJAX est déclenchée et traitée par ton contrôleur, le "update" de la requête serait un div de détail.
La fonction du contrôleur détecte la catégorie "Maison" (par un switch / case) et fait un render("elements/maison_sous_categorie.ctp")
"maison_sous_categorie.ctp" contiendrait tes inputs (superficie, etc.)

Problème :
tu auras autant de pages .ctp que de catégories => mises à jour laborieuses et irréalistes dés que tu dépasse 3 catégories.

La méthode intelligente:
Résumé :
Il te faut créer une métabase de donnée dans une table.

Exemple :
Tu créé une table "metacategorie" contenant les champs suivants :
- id : index, normal
- category_id : contient l'id de la catégorie à relier
- field_name : type string qui donne le nom du champ à renseigner pour la catégorie
- field_type : integer te donnant le type du champ en question (texte, numeric, password, etc.)
- field_value : texte qui permet d'indiquer les valeurs du champ (utile dans le cas des inputs SELECT)

Ton utilisateur sélectionne la catégorie "maison" (category_id = 1 par exemple) dans la liste.
Une requête AJAX est déclenchée et traitée par ton contrôleur, le "update" de la requête serait un div de détail.
La fonction du contrôleur fait une requête sur la table "metacategorie" avec un WHERE category_id = 1
Le résultat est envoyé par render("elements/affiche_sous_categorie")
affiche_sous_categorie.ctp est générique, de style :

Code: php

  1. foreach($inputs as $input) {
  2. switch($input['field_type']){
  3. case 0 : // champ texte
  4. echo $this->Form->input($input['field_name']);
  5. break;
  6. case 1 : // champ password
  7. echo $this->Form->input($input['field_name'],array('type'=>'password');
  8. break;
  9. }

Problème : cela nécessite de créer un gestionnaire de champs par catégorie, c'est un peu plus long mais extensible à l'infini.

voilà en gros comment j'aborderais les choses, mais d'autres solutions peuvent être proposées par les visiteurs.


Développeur freelance et disponible, contactez-moi en privé.
Mon blog CakePHP : http://caketuts.key-conseil.fr

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB
Traduction par FluxBB.fr