CakePHP-Fr.Org

Forum francophone du Framework CakePHP

Vous n'êtes pas identifié.

#1 05-09-2016 16:44:00

RemLab
Chouquette
Date d'inscription: 05-09-2016
Messages: 1

CakePHP 3.3 - Liste déroulantes dynamiquement liées

Bonjour,

je débute avec CakePHP et je dois réaliser une application de gestion des absences dans le cadre d'un projet.

Sur ma page index.ctp des Absences j'ai inséré une première liste déroulante pour la sélection des classes comme ceci:

code
{
                  <?php echo $this->Form->input('sector_id', array('options' => $sectors, 'label' => 'Classes',                                                           'empty' => '--Sélectionner une classe--', 'class' => 'target'));?>

}
qui est peuplé à l'aide de cette requête:

code
{
                    $this->set('sectors', $this->Absences->Students->Sectors->find('list'));       
            $this->set(compact('sectors'));   
}

Je souhaiterais récupéré l'id sélectionné et l'utiliser dans cette requête pour générer la liste qui contient les matières.

code
{
                        $this->loadModel('Subjects');
            $this->set('pages', $this->Subjects->Modules->find('list')
                ->where(['Modules.sector_id' => $id]));
}

J'ai commencé par insérer un script dans ma vue comme ceci:

code
{
<script>

// add page form
$('.ajax_page #PageUserId').change(function(){
    // selected value
    var selected = $(this).val();
   

    // ajax
    $.ajax({
        type: "POST",
        url: '/Absences/ajax_get_user_pages',
        data: "ajax=true&id="+selected,
        success: function(msg){
            //console.log(msg);
            $('.ajax_page_id').html(msg);
        }
    });
});

<\script>
}

(Exemple repris sur un autre article de ce forum)

et dans mon controller Absences j'ai ajouté cette fonction:

code
{
        function ajax_get_user_pages() {
    // init
    $id = $this->params['form']['id'];
    $pages = array();
    $this->layout = null;

        if($id > 0) {
            // get pages
            $this->loadModel('Subjects');
            $this->set('pages', $this->Subjects->Modules->find('list')
                ->where(['Modules.sector_id' => $id]));
        }

        // set
        $this->set(compact('pages'));   
    }
}

j'ai crée ensuite la vue pour ajax_get_users_pages.ctp

code
{
<?php
// file: /views/page/ajax_get_users_pages.ctp

if(!empty($pages)) {
echo $form->input('page_id',array(
    'label'=>'Parent Page: <span>*</span>',
    'title'=>'Parent Page of Page. (Required)',
    'type'=>'select',
    'options'=>$pages,
    'div'=>false,
    'name'=>'data[Page][page_id]'
));
}
?>

Opération sans succès. L'exemple que j'ai trouvé est peut-être mal adapter ? Je n'ai pas une bonne connaissance de jQuery et de javascript où un petit détails de débutant m'échappe??

Si quelqu'un aurait une piste, un bon exemple ou une idée, je suis preneur et vous remercie d'avance pour toute réponses ou suggestions.

Hors ligne

 

#2 20-09-2016 10:50:27

Fath_Emma
Chouquette
Date d'inscription: 21-07-2016
Messages: 4

Re: CakePHP 3.3 - Liste déroulantes dynamiquement liées

J'ai le même souci que toi et je bloque dessus depuis plusieurs jours, j'ai trouvé des exemples pour la version 2 mais rien concernant la version 3. As-tu réussi à le faire STP?

Hors ligne

 

#3 20-09-2016 10:56:22

Minux
Crêpe Suzette
Date d'inscription: 20-09-2016
Messages: 5

Re: CakePHP 3.3 - Liste déroulantes dynamiquement liées

@Fath_Emma
Peux-tu donner les liens des infos que tu as trouver pour CakePHP 2.x STP ?

Dernière modification par Minux (20-09-2016 10:56:49)

Hors ligne

 

#4 20-09-2016 11:25:56

6120
The Big Cake
Date d'inscription: 06-11-2009
Messages: 381

Re: CakePHP 3.3 - Liste déroulantes dynamiquement liées

Ce type de problème ne concerne pas vraiment cakephp.
Tu devrais plutôt poser la question dans un forum jquery.

Au niveau de cakephp, il suffit de faire une méthode que tu appelles dans ta fonction javascript ( avec un layout ajax).
Dans ton controller :

Code: php

  1. $this->viewBuilder()->layout('ajax');

Hors ligne

 

#5 21-09-2016 11:11:42

Minux
Crêpe Suzette
Date d'inscription: 20-09-2016
Messages: 5

Re: CakePHP 3.3 - Liste déroulantes dynamiquement liées

Bon ben... je dois dire que je sèche !!!

Info : je suis en CakePHP 2.x, je ne sais pas si ça change grand chose.

J'ai pour ma part une erreur : '500 Internal Server Error'

Ma méthode retourne bien du JSON. Si j'explore ma page sous Firefox, et que je prend l'URL de la requête Ajax, le résultat est correct.

Des idées ???

Hors ligne

 

#6 22-09-2016 11:02:27

Minux
Crêpe Suzette
Date d'inscription: 20-09-2016
Messages: 5

Re: CakePHP 3.3 - Liste déroulantes dynamiquement liées

Aié, je suis arrivé à quelque chose grâce au tuto suivant:
    Dynamic dropdown in cakephp 2.0 (Selectbox)
Par contre, par préférence, j'ai séparé le code js dans un fichier à part. J'ai donc du remplacer l'appel à la méthode Router::url dans mon appel ajax :

Code: php

  1. url: '<?php echo Router::url(array("controller" => "countries", "action" => "getStates")); ?>' ,

par un codage en dur :

Code: php

  1. url: 'countries/getStates' ,

Comment utiliser du code CakePHP dans un fichier js ?
J'ai essayé de renommer mon fichier .js en .php, mais lors du chargement avec le helper Html, il rajouter toujours le .js à mon fichier javascript même si je je l'appel en ajoutant l'extension .php.
Y-a-t-il un option pour empêcher l'ajout du .js (je n'ai encore rien trouvé à ce sujet) ?

Hors ligne

 

#7 22-09-2016 13:38:22

6120
The Big Cake
Date d'inscription: 06-11-2009
Messages: 381

Re: CakePHP 3.3 - Liste déroulantes dynamiquement liées

1) tu ne peux jamais exécuter du php dans une fonction javascript (le code php étant exécuté côté serveur)
2) par contre tu peux mettre ta fonction javascript dans un fichier php (un "element" par exemple)
et là, avant ta fonction, tu peux déclarer des variables

exemple dans NomDeTonElement.ctp:

Code: php

  1. <script type="text/javascript">
  2. var maVariableUrl = "<?php echo Router::url(array('controller' => 'countries', 'action' => 'getStates')); ?>";
  3. $(document).ready(function() {
  4. ... etc.
  5. et plus loin :
  6. url: maVariableUrl,
  7. ... etc.
  8. });
  9. </script>

et bien sûr, tu n'oublies pas d'appeler ton élément :

Code: php

  1. <?php echo $this->element("NomDeTonElement"); ?>

(sans l'extension ".ctp")

Dernière modification par 6120 (22-09-2016 15:03:45)

Hors ligne

 

#8 23-09-2016 20:52:55

Minux
Crêpe Suzette
Date d'inscription: 20-09-2016
Messages: 5

Re: CakePHP 3.3 - Liste déroulantes dynamiquement liées

Rappel : Je me suis basé sur le code source de cette article :  Dynamic dropdown in cakephp 2.0 (Selectbox)

Je veux que mes listes soient triées, donc je modifie ma méthode getCities :

Code: php

  1. $cities = $this->Country->State->City->find('list', array(
  2.   'fields' => array(
  3.     'id',
  4.     'city_name',
  5.   ),
  6.   'conditions' => array(
  7.     'City.state_id' => $this->request['data']['id']
  8.   ),
  9.   'order'      => array('City.city_name ASC')
  10. ));

Or, en sortie ma liste dans mon select n'est plus triée.
Une idée ???

Dernière modification par Minux (25-09-2016 18:53:40)

Hors ligne

 

#9 25-09-2016 20:58:56

6120
The Big Cake
Date d'inscription: 06-11-2009
Messages: 381

Re: CakePHP 3.3 - Liste déroulantes dynamiquement liées

Peut-être :

Code: php

  1. 'order'      => array('City.city_name' => 'ASC')

Hors ligne

 

#10 26-09-2016 00:39:14

Minux
Crêpe Suzette
Date d'inscription: 20-09-2016
Messages: 5

Re: CakePHP 3.3 - Liste déroulantes dynamiquement liées

Non ça ne marche pas plus...
Je ne comprend pas car si on se contente d'afficher le résultat dans une vue normale, il est trié.
C'est comme si le json_encode mélangeait la liste, mais ça n'a ni queue ni tête.

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB
Traduction par FluxBB.fr