Bonjour, j'ai repris le tuto de grafikart lier plusieurs select avec cakephp j'arrive à bien récupérer mes champs à partir d'une fonction par contre pour l'injecter sur le target du select ça marche pas j'ai beau chercher l'erreur je ne vois pas ! donc une aide serait la bienvenu je mets le code de ma vue edit et de la fonction en question ainsi que le code du Ajax ! [code]$('.ajaxList').change(function(event){ var select = $(this); var id = '#'+select.data('target'); $.get(select.data('url'),{id:select.val()},function(data){ if (data.error) { alert(data.error); }else{ var target = $(id).get(0); target.options.lenght = 0; for(var i in data.results){ var result = data.results*; target.options* = new Option(result.name,result.id,false,false); } } },'json'); });[/code] vue edit (je n'ai mis que la partie qui lie les deux selects) : [code]
<?php echo $this->Form->input('country_id',array('label'=>__('Country'),'class'=>'ajaxList','empty'=>__('Choose a Country'),'id'=>'country','size'=>10,'data-target'=>'city','div'=>false,'data-url'=>$this->Html->url(array('controller'=>'companies','action'=>'getcities'))));?>
<?php echo $this->Form->input('city_id',array('type'=>'select','label'=>'City','id'=>'city','size'=>10,'empty'=>__('Choose a country'),'div'=>false)); ?>
[/code] la ,fonction ![code] public function getcities(){ if (isset($_GET['id'])) { $this->loadModel('City'); $cities = $this->City->find('list', array( 'conditions' => array( 'country_id' => $_GET['id'] ) , 'fields' => array( 'City.id','City.name') )); var_dump($cities); if (empty($cities)) { $return = array('error'=>'no city for this country'); } else{ $return = array( 'error'=>false, 'cities'=>$cities ); } } else{ $return = array('error'=>'choose a country before'); } echo (json_encode($return)); }[/code]
Dans le for de ton code JS, tu cherches dans le tableau results de ton retour Json, hors ce tableau n'existe pas, il faut que tu cherches dans cities ;) [code] for(var i in data.cities){ var result = data.cities*; target.options* = new Option(result.name,result.id,false,false); } [/code]
j'ai rectifié le tir c'est effectivement la variable results de mon retour json quue je voulais j'ai donc modifié la fonction mais rien n'y fait je n'ai toujours pas les valeurs dans mon select je remets le bon code [code] $('.ajaxList').change(function(event){ var select = $(this); var id = '#'+select.data('target'); $.get(select.data('url'),{id:select.val()},function(data){ if (data.error) { alert(data.error); }else{ var target = $(id).get(0); target.options.lenght = 0; for(var i in data.results){ var result = data.results*; target.options* = new Option(result.name,result.id,false,false); } } },'json'); });[/code] [code]public function getcities(){ if (isset($_GET['id'])) { $this->loadModel('City'); $cities = $this->City->find('list', array( 'conditions' => array( 'country_id' => $_GET['id'] ) , 'fields' => array( 'City.id','City.name') )); if (empty($cities)) { $results = array('error'=>'no city for this country'); } else{ $results = array( 'error'=>false, 'results'=>$cities ); } } else{ $results = array('error'=>'choose a country before'); } echo (json_encode($results)); }[/code] [code]
<label class="control-label" for="select01">Pays</label>
<?php echo $this->Form->input('country_id',array('div'=>false,'label'=>false,'size'=>10,'class'=>'ajaxList','id'=>'country','data-target'=>'city','empty'=>'Choose a country','data-url'=>$this->Html->url(array('controller'=>'companies','action'=>'getcities'))));?>
<label class="control-label" for="select01">City</label>
<select id="city" name="data[Company][city_id]" class="ajaxList" data-url="<?= $this->Html->url( array( 'controller' => 'companies', 'action' => 'districts'));?>" data-target="district">
<option value="0">Vous devez sélectionner un pays</option>
</select>
[/code]
j'ai finalement résolu le problème mais j'ai encore un petit beug ! j'ai bien le renvoi en json de mes données mais quand je clique sur un pays il arrive que la région ne se charge pas sur le coup ! desfois je suis meme obligé de réactualiser la page et j'ai bien le renvoi des mes données quand je vérifie sur la console ! Autre problème ! à l'édition comment lui dire de changer les données pays , region et département qu"on avait déjà choisi ?? Merci ! je vous mets le code ! [code]public function getcities(){ if (isset($_GET['id'])) { $this->loadModel('City'); $cities = $this->City->find('all', array( 'conditions' => array( 'country_id' => $_GET['id'] ) , 'fields' => array( 'City.id','City.name') )); if (empty($cities)) { $return = array('error'=>'no city for this country'); } else{ $return = array( 'error'=>false, 'results'=>$cities ); } } else{ $return = array('error'=>'choose a country before'); } die (json_encode($return)); } public function getdistrict(){ if (isset($_GET['id'])) { $this->loadModel('District'); $districts = $this->District->find('all', array( 'conditions' => array( 'city_id' => $_GET['id'] ) , 'fields' => array( 'District.id','District.name') )); if (empty($districts)) { $return = array('error'=>'no District for this city'); } else{ $return = array( 'error'=>false, 'results'=>$districts ); } } else{ $return = array('error'=>'choose a district before'); } die (json_encode($return)); }[/code] Code JS [code] $('.ajaxList').change(function(event){ var select = $(this); var id = '#'+select.data('target'); $.get(select.data('url'), {id:select.val()}, function(data){ if(data.error){ alert(data.error); }else{ var target = $(id).get(0); target.options.length = 0; for(var i in data.results){ var result = data.results*; target.options* = new Option(result.City.name, result.City.id, false, false); } } },'json'); }); $('.ajaxList').change(function(event){ var select = $(this); var id = '#'+select.data('target'); $.get(select.data('url'), {id:select.val()}, function(data){ if(data.error){ alert(data.error); }else{ var target = $(id).get(0); target.options.length = 0; for(var i in data.results){ var result = data.results*; target.options* = new Option(result.District.name, result.District.id, false, false); } } },'json'); });[/code] Formulaire [code]
<label class="control-label"><?php echo __('Country');?></label>
<select id="country" name="data[Company][country_id]" class="ajaxList" data-url="<?= $this->Html->url( array( 'controller' => 'companies', 'action' => 'getcities'));?>" data-target="city" size="10">
<?php foreach ( $countries as $country ): ?>
<option value="0" selected>Choose a Country</option>
<option value="<?php echo $country['Country']['id']; ?>">
<?php echo $country['Country']['name']; ?>
</option>
<?php endforeach ?>
</select>
<label class="control-label" for="select01"><?php echo __('City');?></label>
<?php echo $this->Form->input('city_id', array('label'=>false, 'empty' => 'Choose a country ...','options' => array(),'size'=>10, 'data-target'=>'district', 'data-url' => $this->Html->url( array( 'controller' => 'companies', 'action' => 'getdistrict')), 'class'=>"ajaxList",'id'=>'city') );?>
<label class="control-label"><?php echo __('District');?></label>
<?php echo $this->Form->input('district_id', array('label'=>false,'empty' => 'Choose a city ...','options' => array(),'size'=>10,'id'=>'district'));?>
[/code]