2015-07-15 11 views
10

Ho già provato questo: yii2 dependent autocomplete widgetYii2 DropDownList Onchange modifica l'attributo "fonte" del widget di completamento automatico?

ma non so perché non funziona. qui il mio HTML con script:

<?= $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.');} 

        '])?> 

Autocomplete:

<?= $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); 
        }") 
       ], 
      ])?> 

voglio cambiare sorgente di completamento automatico in base al valore di DropDownList, se S quindi caricare $ G_Dati altro carico $ e_data. Qualsiasi aiuto con questo. Grazie.

Ecco i miei dati,

$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(); 

e,

$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

qualcuno che mi aiuti oggi ??? –

risposta

8

Beh, ho aggiunto i tuoi frammenti di codice al mio ambiente yii2 di prova per testare ciò che è sbagliato. Quindi ci sono alcuni problemi con il tuo codice:

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

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

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

'] 

Prima di tutto ho notato quello che Yii applicare un po 'fuga per i simboli marchio preventivo per il vostro "S" ed "E" e il codice in del browser sembra &quot;S&quot;.

Successivamente, il plugin di completamento automatico jui aggiunge una proprietà al prototipo jquery con nome "autocomplete" ma non "autoComplete". Poiché js è sensibile al maiuscolo/minuscolo, questi due nomi hanno un aspetto diverso.

Quindi la mia soluzione era quella di spostare tutti i js da onchange proprietà di separare lo script js, come illustrato di seguito (per scopi di test è possibile aggiungerlo direttamente nel tuo file di visualizzazione yii in cui si utilizza il codice fornito nella tua domanda)

<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> 

E il nome di pasta di questo nuovo gestore di eventi alla proprietà OnChange del DropDownList in questo modo:

['onChange' => 'holderTypeChangeHandler'] 

UPDATE: -------------------- -

Poiché il completamento automatico Yii2 basato sul widget di completamento automatico dell'interfaccia utente JQuery e del complemento Yii2 clientOptions contiene settings for JUI autocomplete widget, è possibile fare riferimento ai documenti API JUI per la spiegazione dello source option. Come puoi vedere, questa opzione può essere una stringa (in questo caso utilizzata come dati URI in JSON), una funzione o un array js di dati o array js di oggetti.

Nella domanda si sta utilizzando \yii\db\Query per recuperare alcuni dati da db con l'aiuto di method all(), che restituisce una matrice di dati. Quindi, alla fine è necessario convertire la matrice di dati che si ottiene con \yii\db\Query->all in array js di oggetti. Per farlo, usare php json functions, particolarmente per il vostro caso è necessario utilizzare la funzione json_encode():

// 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 ?> }); 

Lo stesso se per il vostro $e_data. Presta attenzione, ottieni i tuoi dati da db con PHP, ma usali con JS, quindi l'array php deve essere convertito in una serie di oggetti js di presentazione di stringhe e questa conversione puoi fare con json_encode.

+0

cosa devo passare alla mia "fonte" completa automatica. sto ricevendo l'errore json parse. –

+0

quando cambio il valore di S o E, si sta verificando sopra l'errore. –

+0

La mia console mostra questo "return JSON.parse (data +" ");" pagina non trovata. Penso che l'url sia stato creato dopo che l'evento onChange non funziona. –

Problemi correlati