2015-07-15 20 views
10

Daha önce bunu denedim: yii2 dependent autocomplete widgetYii2 DropDownList Onchange değişiklik Otomatik Tamamlama Widget "source" özniteliği?

ama neden çalışmadığını bilmiyorum. komut dosyası ile burada benim html:

<?= $form->field($model, 'lbt_holder_type')->dropDownList(['prompt' => '--- Select Holder Type ---', 'S' => 'Student', 'E' => 'Employee'], 
        ['onChange' => 'JS: var value = (this.value); 
           if(value == "S"){$(#libraryborrowtransaction-name).autoComplete({source: '. $s_data.');} 
           if(value == "E"){$(#libraryborrowtransaction-name).autoComplete({source: '. $e_data.');} 

        '])?> 

Otomatik tamamlama:

<?= $form->field($model, 'name')->widget(\yii\jui\AutoComplete::classname(), [ 
       'options' => ['class' => 'form-control', 'placeholder' => 'Enter Name/ID'], 
       'clientOptions' => [ 
        'source' => $s_data, 
        'autoFill' => true, 
        'minLength' => '1', 
        'select' => new yii\web\JsExpression("function(event, ui) { 
         $('#libraryborrowtransaction-lbt_holder_id').val(ui.item.id); 
        }") 
       ], 
      ])?> 

i dropdownlist değerine göre otomatik tamamlama kaynağını değiştirmek istiyorum, S sonra $ S_Data başka yük $ e_data yüklerseniz. Bununla ilgili herhangi bir yardım. Teşekkürler.

İşte benim veri,

$s_data = (new \yii\db\Query()) 
->select(["CONCAT(stu_unique_id,' - ',stu_first_name,' ',stu_last_name) as value","CONCAT(stu_unique_id,' - ',stu_first_name,' ',stu_last_name) as label","s_info.stu_info_stu_master_id as id"]) 
->from('stu_master stu') 
->join('join','stu_info s_info','s_info.stu_info_id = stu_master_stu_info_id') 
->where('is_status = 0') 
->all(); 

ve

$e_data = (new \yii\db\Query()) 
    ->select(["CONCAT(emp_unique_id, ' - ',emp_first_name,' ',emp_last_name) as value","info.emp_info_emp_master_id as id"]) 
    ->from('emp_master emp') 
    ->join('join', 'emp_info info', 'info.emp_info_id = emp_info_emp_master_id') 
    ->where('is_status = 0')   
    ->all(); 
+0

Bugün bana yardımcı olacak kimse ??? –

cevap

8

Eh, neyin yanlış olduğunu test etmek için benim test yii2 ortamına kod parçacıkları ekledik bu. Yani orada koduyla bazı sorunlar şunlardır: Her şeyden

[ 
    'onChange' => 
     'JS: var value = (this.value); 

     if(value == "S"){$(#libraryborrowtransaction-name). 
      autoComplete({source: '. $s_data.');} 

     if(value == "E"){$(#libraryborrowtransaction-name). 
      autoComplete({source: '. $e_data.');} 

'] 

İlk fark ettim yii senin "S" ve "E" için bazı tırnak işareti sembolleri kaçan uygulamak ne ve tarayıcıda kod &quot;S&quot; benziyor.

Sonraki, jui otomatik tamamlama eklentisi, "autocomplete" numaralı ancak "autoComplete" numaralı jquery prototipine bir özellik ekler. Js büyük/küçük harf duyarlı olduğu için, bu iki isim bunun için farklı görünüyor.

Yani benim çözüm aşağıda gösterildiği gibi

(sınama amacıyla doğru senin soru sağlanan kodu kullanan yii görünümü dosyasında ekleyebilirsiniz), js komut dosyası ayırmak için onchange özelliğinden tüm js taşımak oldu Bu gibi DropDownList en onchange özelliğine Bu yeni olay işleyici
<script> 
    function holderTypeChangeHandler(ev) { 
     var value = (this.value); 
     if(value == 'S'){ 
      $('#libraryborrowtransaction-name').autocomplete({source: ' . $s_data . '}); 
     } 
     if(value == 'E'){ 
      $('#libraryborrowtransaction-name').autocomplete({source: ' . $e_data . '}); 
     } 
    } 
    window.onload = function(){ 
     $('#libraryborrowtransaction-lbt_holder_type').on('change', holderTypeChangeHandler); 

    }; 
</script> 

Ve macun adı:

['onChange' => 'holderTypeChangeHandler'] 

GÜNCELLEME: -------------------- -

Yii2 Otomatik Tamamlama, JQuery UI otomatik tamamlama küçük aracına ve Yii2 Otomatik Tamamlama 'a göre settings for JUI autocomplete widget'u içerdiğinden, source option'un açıklaması için JUI API belgelerine başvurabiliriz. Görebildiğiniz gibi, bu seçenek bir dizi (bu durumda JSON verisine URI olarak kullanılır), bir fonksiyon veya js veri dizisi veya nesnelerin js dizisi olabilir.

Sorunuzda, bir veri dizisi döndüren method all() yardımıyla db'den bazı verileri almak için \yii\db\Query kullanıyorsunuzdur. Son olarak, \yii\db\Query->all ile aldığınız veri dizisini js dizisi nesnesine dönüştürmeniz gerekir. senin $e_data için

// Let's say this is a result of your query to db with use of `\yii\db\Query->...->all();` 
$some_array = [                                                                                                                 
    [                                      
     "value" => "Val 1",                                 
     "label" => "Label 1", 
     "id" => 1 
    ], 
    [ 
     "value" => "Val 2", 
     "label" => "Label 2", 
     "id" => 2 
    ] 
] 

// Just convert it to json string 
$s_data = json_encode($some_array); 
... 
// When concat this json string as a value of source attribute for Yii Autocomplete 
$('#libraryborrowtransaction-name').autocomplete({source: <?= $s_data ?> }); 

eğer aynı: dava için size json_encode() işlevini kullanmanız gerekir özellikle bunu yapmak için, php json functions kullanın. Sadece dikkat edin, verilerinizi PHP ile db'den elde edin, ancak onu JS ile kullanın, böylece php dizisinin bir dize sunumu js dizisine dönüştürülmesi gerekir ve bu dönüşüm json_encode ile yapılabilir.

+0

Otomatik tamamlama kaynağına ne geçmeliyim? json ayrıştırma hatası alıyorum. –

+0

S veya E değerini değiştirdiğimde, hataya geçiyor. –

+0

Konsolum bunu gösteren "geri dön JSON.parse (data +" ");" sayfa bulunamadı. Url'nin onChange olayının çalışmadan sonra oluşturulduğunu düşünüyorum. –

İlgili konular