2017-05-29 88 views
0

我有一个从选定状态的城市的依赖选择框。CakePHP在提交表单后选择依赖框变空了

工作很好!但在提交表单后,城市选择框变空。

我想知道如何在提交表单后填充选择框。

我正在使用CakePHP 2.5。

我可以在表单提交后看到城市选择框的值,我不知道如何在提交表单后再次填充。

if ($this->request->is('ajax')); 
{ 

      $this->set('stateCities', $this->request->data['stateCities']); 
} 


//controller 
public function getCitiesByStateAjax() 
{ 

    $this->autoRender = false; 
    $this->autoLayout = false; 

    $city_id = $this->data['city']; 

    $this->loadModel('city'); 
    $citiesList = $this->UsuarioSimulador->listCitys($city); 

    $citiesList = Hash::combine(
     $citiesList, '{n}.city.id', array('%s', '{n}.city.name') 
    ); 

    echo json_encode($citiesList); 

} 


//form 

debug($estateCities); 

echo $this->Form->input('City.city', array('label'=>'City', 
                'type' => 'select', 
                'empty'=>'- select one -', 
                'options' => $stateCities, 
                'data-webroot' => $this->webroot) 
         ); 

//Ajax javascript code : 
    $(function() { 

     $(document).on('change', "select#State", function() 
     { 
      var url = '<?php echo Router::url(array('controller' => 'cities', 'action' => 'getCitiesByStateAjax'));?>'; 

      var data = { 
       State: $(this).val() 
      }; 

      $.ajax({ 

       url: url, 
       method: 'POST', 
       data: data, 
       dataType: 'json', 

       beforeSend: function(xhr) { 
        $.blockUI({ 
         message: '<h2>Search</h2>' 
        }); 
       }, 
       complete: function() { 
        $.unblockUI(); 
       }, 
       success: function ($response, a, b) 
       { 
        if(b.status == 200) { 
         var $optionsCity = $("#Cities").html($("<option />").val('').text('- select -')); 

         if($response) { 
          $optionsCity.prop("disabled", false); 

          $.each($response, function(idestate, value) { 
           var $opt = new Option(value, idestate); 

           $optionsCity.append($opt); 
          }); 
         } else { 
          $optionsCity.prop("disabled", true); 
         } 

        } else { 
         alert($response); 
        } 
       }, 
       error: function(x, t, m) { 
        var msg = 'Ocorreu um erro inesperado. '; 

        if(t === "timeout") { 
         msg += "Aguarde 30 segundos e tente novamente!"; 
        } else { 
         msg = t; 
        } 

        alert(msg); 
       } 
      }); 
     });   

回答

0

我不知道Cake Framework,但我会告诉你应该遵循的逻辑。

首先,在你的控制器,你必须返回含有id和城市的value的多维数组:

$cities = array 
(
    array('id' => 1, 'value' => 'London'), 
    array('id' => 2, 'value' => 'Rio de Janeiro'), 
    array('id' => 3, 'value' => 'Berlin') 
); 

echo json_encode($cities); 

其次,由于回报是你需要分析它在你的JavaScript中的JSON文件。

var json = JSON.parse(response); 

最后,你所要做的只是一个循环。

var html = ''; 

$.each(json, function(i, city) 
{ 
    html += '<option value="' + city.id + '">'; 
    html +=  city.value; 
    html += '</option>'; 
}); 

$('#cities').html(html);