Понимаю тема заезжаная, всех уже достала... , но чета у меня не заводится, может кто помочь разобраться
Новый вариант моих НЕ РАБОЧИХ селектов.
По идеи 3 селекта: Страна / Регион / Город
Так по порядку: вот мои поля в БД:
страна: id_country | country_name_ru | country_name_en | title | ....
регион: id_region | id_country |region_name_ru | region_name_en |title | ...
города: id_city | id_region | id_country | city_name_ru | city_name_en | title | alias
==================================================================================================================
По идеи, пользователь указывает свой адрес, в модели создал функция allCountry(), которая будет заполнять наш первый "Список"
Код: Выделить всё
public static function allCountry()
{
return CHtml::listData(self::model()->findAll(), 'id_country', 'country_name_ru');
}
Далее
1. На форме, указываю: 'enableAjaxValidation'=>true,
2. В контроллере UserController, подтверждаю права и включаю Валидацию Ajax в Update:
Код: Выделить всё
public function accessRules()
{
return array(
array('allow',
'actions'=>array('index','view', 'create','profile', 'savecoords', 'update',
'delete','password','index', 'admin','updatedistricts', 'updatecities'),
'roles'=>array('role_admin'),
),
array('allow',
'actions'=>array('index','view', 'create','profile', 'savecoords',
'update','delete','password','index', 'admin','updatedistricts', 'updatecities'),
'roles'=>array('role_user'),
),
array('allow',
'actions'=>array('updatedistricts', 'updatecities'),
'roles'=>array('role_guest'),
),
array('deny',
'users'=>array('*'),
),
);
}
/**
* Updates a particular model.
* If update is successful, the browser will be redirected to the 'view' page.
* @param integer $id the ID of the model to be updated
*/
public function actionUpdate($id)
{
$model = $this->loadModel($id);
// Uncomment the following line if AJAX validation is needed
$this->performAjaxValidation($model);
if(isset($_POST['User']))
{
$model->attributes = $_POST['User'];
if($model->save())
Yii::app()->user->setFlash('updateUser','Вы удачно обновили информацию');
$this->redirect(array('update','id'=>$model->id));
}
$this->render('update',array(
'model'=>$model,
));
}
так же в UserController вписываю функции,
Код: Выделить всё
public function actionUpdateRegion()
{
//Region
$data = Region::model()->findAll('id_country=:id_country', array(':id_country'=>(int) $_POST['id_country']));
$data = CHtml::listData($data,'id_region','region_name_ru');
$dropDownRegion = "<option value=''>Выберите регион</option>";
foreach($data as $value=>$name)
$dropDownRegion .= CHtml::tag('option', array('value'=>$value),CHtml::encode($name),true);
//City
$dropDownCity = "<option value='null'>Выберите город</option>";
// return data (JSON formatted)
echo CJSON::encode(array(
'dropDownRegion'=>$dropDownRegion,
'dropDownCity'=>$dropDownCity
));
}
public function actionUpdateCity()
{
$data = City::model()->findAll('id_region=:id_region', array(':id_region'=>(int) $_POST['id_region']));
$data = CHtml::listData($data,'id_city','city_name_ru');
echo "<option value=''>Выберите город</option>";
foreach($data as $value=>$name)
echo CHtml::tag('option', array('value'=>$value),CHtml::encode($name),true);
}
Ну и конечно же, моя главная форма:
Код: Выделить всё
<?php $form=$this->beginWidget('CActiveForm', array(
'id'=>'user-form',
'htmlOptions'=>array(
),
// Please note: When you enable ajax validation, make sure the corresponding
// controller action is handling ajax validation correctly.
// There is a call to performAjaxValidation() commented in generated controller code.
// See class documentation of CActiveForm for details on this.
'enableAjaxValidation'=>true,
)); ?>
<p class="note">Fields with <span class="required">*</span> are required.</p>
<?php echo $form->errorSummary($model); ?>
<div class="row">
<?php echo $form->labelEx($model,'web'); ?>
<?php echo $form->textField($model,'web',array('size'=>60,'maxlength'=>255)); ?>
<?php echo $form->error($model,'web'); ?>
</div>
<?
$country = (!$model->isNewRecord) ? $model->country : ''; //echo $model->country;
echo CHtml::dropDownList('id_country',$country, Country::allCountry(),
array(
'prompt'=>'Выберите страну', //Yii::t('default', 'Select a country'),
'ajax' => array(
'type'=>'POST',
'url'=>CController::createUrl('admin/user/updateRegion'),
'dataType'=>'json',
'data'=>array(
'id_country'=>'js:this.value',
'id_region'=>(!$model->isNewRecord) ? $model->region : null,
'id_city'=>(!$model->isNewRecord) ? $model->city : null,
// если редактируется запись - передадим текущее значение атрибута связанной модели
),
'success'=>'function(data) {
$("#id_region").html(data.dropDownRegion);
$("#id_city").html(data.dropDownCity);
}',
)));
$regionNow = (!$model->isNewRecord) ? $model->region : '';
echo CHtml::dropDownList('id_region',$regionNow, array(),
array(
'prompt'=>'Выберите область',
'ajax' => array(
'type'=>'POST',
'url'=>CController::createUrl('admin/user/updateCity'),
'update'=>'#id_city',
'data'=>array('id_region'=>'js:this.value'),
)));
$cityNow = (!$model->isNewRecord) ? $model->city : '';
echo CHtml::dropDownList('id_city',$cityNow, array(), array('prompt'=>'Вы берите город'));
?>
вот результат в браузере, если вдруг там с якорями ошибка могла забрести,
Код: Выделить всё
<select name="id_country" id="id_country">
<option value="">Выберите страну</option>
<option value="219">Россия</option>
<option value="220" selected="selected">Украина</option>
<option value="221">Беларусь</option>
.................
<option value="434">Южная Корея</option>
<option value="435">Южная Осетия</option>
<option value="436">Ямайка</option>
<option value="437">Япония</option>
<option value="438">Макао</option>
</select><select name="id_region" id="id_region">
<option value="">Выберите область</option>
</select><select name="id_city" id="id_city">
<option value="">Вы берите город</option>
</select>
1.
Код: Выделить всё
'url'=>CController::createUrl('admin/user/updateRegion'), // Здесь у меня Админ панель идет как Модуль, поэтому добавилять "admin" в путь надо?!
2.
Код: Выделить всё
$data = Region::model()->findAll('id_country=:id_country', array(':id_country'=>(int) $_POST['id_country']));
Все я в тупике!