Vi posto un esempio completamente funzionante di 2 input text dipendenti in autocomplete.
Inserita nella prima text la provincia nella seconda si selezionano solo i comuni di appartenenza.
Questo esempio è stato possibile grazie all’aiuto del post di:
Paskuale
Giuseppe e alla query di Diopralinato
Vi chiedo di contribuire per migliorare il codice che ho scritto.
Come primo step seguite il post di paskuale. Successivamente modificate come di seguito:
— codice view _form ------
<div class="row">
<?php
/**
* Provicia Residenza
*/
/** Se si tratta di un nuovo inserimento $provincia è vuoto altrimenti,
* se un update carico il valore testuale del comune nella input
* (assegnandolo come $value a CJuiAutoComplete)
*/
if (!$model->isNewRecord) // in caso di UPDATE carico il comune->nome
{
$provincia=Provincia::model()->findByPk($model->provincia)->nome;
}else{
$provincia='';
}
/* questo controllo nascosto riceverà l'id del comune scelto non il nome*/
echo $form->hiddenField($model,'Provincia',array('id'=>'hidden_residenza_provincia_id'));
echo $form->labelEx($model,'Provincia');
$this->widget('zii.widgets.jui.CJuiAutoComplete', array(
'id'=>'pnome',
'name'=>'pnome',
'value'=>$provincia,
//'value'=>'test21',
'source'=>$this->createUrl('index.php/autocomplete/autocompleteProvincia'),
//'id'=>'searchBox',
//'name'=>'searches',
//'source'=>$this->createUrl('user/complete'),
// additional javascript options for the autocomplete plugin
//in the controller
'options'=>array(
'showAnim'=>'fold',
'delay'=>300, // wait 300ms after user stops typing
'minLength'=>2, // length of entered characters before completing
'select'=>'js:function(event, ui) {
$("#pnome").val(ui.item.id); // ui.item.whatYouReturnInController
$("#hidden_residenza_provincia_id").val(ui.item.id)
alert(ui.item.id+" "+ui.item.label + " "+ui.item.value);
}',
),
));
?>
</div>
<div class="row">
<?php
/**
* Comune di Residenza
*/
/** Se si tratta di un nuovo inserimento $comune è vuoto altrimenti,
* se un update carico il valore testuale del comune nella input
* (assegnandolo come $value a CJuiAutoComplete)
*/
if (!$model->isNewRecord) // in caso di UPDATE carico il comune->nome
{
$comune=Comuni::model()->findByPk($model->residenza)->nome;
}else{
$comune='';
}
/* questo controllo nascosto riceverà l'id del comune scelto non il nome*/
echo $form->hiddenField($model,'Citta',array('id'=>'hidden_residenza_comune_id'));
echo $form->labelEx($model,'Citta');
$this->widget('zii.widgets.jui.CJuiAutoComplete', array(
'id'=>'cnome',
'name'=>'cnome',
'value'=>$comune,
'options'=>array(
'showAnim'=>'fold',
'delay'=>30, // wait 300ms after user stops typing
'minLength'=>2, // length of entered characters before completing
'search'=>'js:function(){
var url ="'.$this->createUrl('index.php/autocomplete/autocompleteTest?newparam=').'"
url = url+$("#hidden_residenza_provincia_id").val();
$("#cnome").autocomplete({
source : url,
});
}',
),
));
?>
</div>
— codice Controller Autocomplete ------
<?php
class AutocompleteController extends Controller
{
public $layout='main';
public function actionIndex()
{
// renders the view file 'protected/views/site/index.php'
// using the default layout 'protected/views/layouts/main.php'
$this->render('index');
//$newparam = CHttpRequest::getParam('newparam',null);
}
public function actionAutocompleteProvincia(){
$res =array();
if(isset($_GET['term'])){
$qtxt =" SELECT province.nome AS pnome, province.id AS pid FROM province
WHERE province.nome LIKE :provincia";
$command =Yii::app()->db->createCommand($qtxt);
$command->bindValue(":provincia", '%'.$_GET['term'].'%', PDO::PARAM_STR);
//$res =$command->queryColumn();
$res = $command->queryAll();
foreach($res as $p)
{
$results[] = array(
'label'=>$p['pnome'],
'value'=>$p['pnome'],
'id'=>$p['pid'],
);
}
}
echo CJSON::encode($results);
Yii::app()->end();
}
public function actionAutocompleteTest() {
$res =array();
$provinciaid = CHttpRequest::getParam('newparam',null);
if (isset($_GET['term']) and isset($provinciaid) ) {
// http://www.yiiframework.com/doc/guide/database.dao
$qtxt ="SELECT comuni.id as cid, comuni.nome AS cnome, province.nome AS pnome, province.id AS pid FROM comuni INNER JOIN province
ON comuni.id_provincia=province.id
WHERE comuni.nome LIKE :comune AND province.id = :provinciaid";
$command =Yii::app()->db->createCommand($qtxt);
$command->bindValue(":comune", '%'.$_GET['term'].'%', PDO::PARAM_STR);
$command->bindValue(":provinciaid", $provinciaid, PDO::PARAM_STR);
$res = $command->queryAll();
foreach($res as $p)
{
$results[] = array(
'label'=>$p['cnome'],
'value'=>$p['cnome'],
'id'=>$p['cid'],
'pv'=>$p['pnome'],
);
}
}
echo CJSON::encode($results);
Yii::app()->end();
}
}
Saluti a tutti e grazie al contributo che fornite al forum.