Доброго времени суток.
Тема не нова, но все же хотелось бы прояснить некоторый вопрос. Имеют приевшиеся списки стран, городов и, скажем, музеев, для выбора значение атрибута
museum_id модели, например, экспоната.
модель Museum:[PHP]/**
* Метод возвращает список городов, выбирая уникальные значения атрибута city
* @param boolean индексировать ли элементы своими значениями
* по умолчанию метод возвращает архив для виджета CAutocomplete
* array(0=>'New York')
* если же входной параметр установлен в true - массив элементов для dropDownList
* array('New York'=>'New York')
*/
public static function getCountriesValues($index = false)
{
$sql = "SELECT DISTINCT country FROM {{museum}}";
$command = Yii::app()->db->createCommand($sql);
$data = $command->query();
$countries = array();
while(($row = $data->read()) != false)
{
if ($index)
$countries[$row['country']] = $row['country'];
else
$countries[] = $row['country'];
}
return $countries;
}[/PHP]
выдержка из view-файла:[PHP]$country = (!$model->isNewRecord) ? $model->museum->country : ''; // значение, которое должно быть автоматически выбрано в списке стран
echo CHtml::dropDownList('country', $country, Museum::getCountriesValues(true), array(
'empty'=>Yii::t('default', 'Select a country'),
'ajax'=>array(
'type'=>'GET',
'url'=>CController::createUrl('museum/getcities'), // взять данные из результата работы actionGetcities контроллера museum
'update'=>'#Item_city',
'data'=>array(
'country'=>'js:this.value',
'city'=>(!$model->isNewRecord) ? $model->museum->city : null, // если редактируется запись - передадим текущее значение атрибута связанной модели
),
),
));
// Второй выпадающий список, куда будут подгружаться данные, полученные из AJAX-запроса
echo CHtml::dropDownList('Item_city', '', array(), array(
'empty'=>Yii::t('default', 'Select a city'),
'ajax'=>array(
'type'=>'GET',
'url'=>CController::createUrl('museum/getmuseums'),
'update'=>'#Item_museum_id',
'data'=>array(
'city'=>'js:this.value',
'museum'=>(!$model->isNewRecord) ? $model->museum->id : null,
),
)
));
echo $form->dropDownList($model, 'museum_id', array());[/PHP]
файл MuseumController:[PHP]public function actionGetcities()
{
$country = Yii::app()->request->getParam('country');
$city = Yii::app()->request->getParam('city');
if ($country !== null)
{
$data = Yii::app()->db->createCommand()
->selectDistinct('city')
->from('{{museum}}')
->where('country'=:country', array(':country'=>$country))
->query();
while(($row = $data->read()) != false)
{
$params=array('value'=>$row['city']);
if(($city !== null)&&($row['city']==$city) // если было передан город и в результатах он встречается,
$params['selected']=true; // то сделать элемент списка выбранным
echo CHtml::tag('option', $params, CHtml::endcode($row['city']), true);
}
}
}[/PHP]
Приводить метод для получения списка не считаю нужным, там выборка моделей по значению атрибута.
Выше приведенный код отлично работает, но есть одно маленькое "но": если вы редактируете запись, то автоматически значение выбирается только в списке стран, остальные же 2 списка пустые и заполняются значениями только после изменения значения в родительском. В список городов они грузятся только после изменения значения списка стран, в список музеев загружаются только после изменения значения с списке городов.
Поскольку нам уже известны выбранные ранее значения, они хранятся в текущей модели и модели связанного музея, хорошо бы было сразу устанавливать эти значения с выпадающих списках. Для этого я решил после загрузки страницы запускать события изменения значения выпадающего списка:
view-файл:[PHP]if(!$model->isNewRecord)
{
Yii::app()->clientScript->registerScript(
'triggerCountryCityChange',
'$(document).ready(function(){'. // после полной загрузки страницы
'$("#Museum_country).change();'. // запустим event изменения списка стран
'setTimeout(\'$("#Museum_city").change()\', 1000);'. // а через секунду после загрузки данных в список стран, запустим change event списка стран, что загрузит данные в список музеев
.'});'
);
}[/PHP]
Собственно, вопрос - насколько приведенный метод автоматического выбора данных в зависимых select-списках при редактировании записей правильный? Или все таки костыль?
Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
|