X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> Зависимые select-списки в Yii
r3ntg3n
r3ntg3n
Topic Starter сообщение 8.4.2012, 18:42; Ответить: r3ntg3n
Сообщение #1


Доброго времени суток.

Тема не нова, но все же хотелось бы прояснить некоторый вопрос. Имеют приевшиеся списки стран, городов и, скажем, музеев, для выбора значение атрибута 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+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Верстка и Разработка веб-приложений (Yii 2,WordPress, Symfony, Laravel)
Верстка,правка косяков/багов + другая работа. Доступные цены.
26 Fortunatus 30767 10.5.2023, 2:17
автор: Zond
Открытая тема (нет новых ответов) Списки всех зарегистрированных доменов с указанными NS адресами
11 phosphoruss 8634 4.11.2021, 21:07
автор: phosphoruss
Открытая тема (нет новых ответов) Вакансия php+yii. Удаленно. 4 часа в день. 25000 р.
0 giovanni 1250 17.6.2020, 10:31
автор: giovanni
Открытая тема (нет новых ответов) Требуется разработчик на проект на YII
Создание под ключ веб-ресурса ( СМИ )
1 webnewsgroup 2649 3.11.2017, 18:00
автор: webnewsgroup
Открытая тема (нет новых ответов) Продаю списки WordPress(11.2млн), Joomla(1.53млн) форумов и ещё 42 движков
0 naikon_group 1412 22.8.2015, 21:50
автор: naikon_group


 



RSS Текстовая версия Сейчас: 29.3.2024, 17:41
Дизайн