Зависимые dropDownList

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
yii_bliss
Сообщения: 3
Зарегистрирован: 2014.09.25, 13:37

Зависимые dropDownList

Сообщение yii_bliss »

Есть три модели

Region id, region
City id, city, region_id(связан с id региона)
Timetable region, city (каждый будет хранить id соответствующий городу и региону)

Хочу сделать, чтобы список города зависил от выбранного региона.

В представление пишу

Код: Выделить всё

echo $form->dropDownList($model,'region',CHtml::listData(Region::model()->findAll(), 'id', 'region'),
        array(
            'prompt'=>'Select Region',
            'ajax' => array(
                'type' => 'POST', //My method type
                'url' => CController::createUrl('Timetable/LoadRegions'),
                array('id'=>'js:this.value'),
                'dataType' => 'JSON',
                'success'=>'js:function(data) {
                    $("#Timetable_region").html(data);
                }'

            ))); 
В контроллере:

Код: Выделить всё

 public function actionLoadRegions()
    {

        $Region_id=$_POST['region'];

        $criteria=new CDbCriteria();
        $criteria->select=array('id, city');
        $criteria->condition='region_id='.$Region_id;
        $criteria->order='city';
        $CityAry= City::model()->findAll($criteria);

        $ary=array();
        foreach($CityAry as $i=>$obj)
        {
            $ary[$i]['id']=$obj->id;
            $ary[$i]['city']=$obj->city;
        }

        echo CHtml::dropDownList('listname', 'city', $ary, array('prompt'=>'Select City'));
    } 
Но где-то просиходит загвоздка. Во первых, не смотря на то, что в POST появляется id выбранного региона. Потом в запросе он не появляется(смотрю через FireBug):

Код: Выделить всё

CDbCommand не удалось исполнить SQL-запрос: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER BY city' at line 1. The SQL statement executed was: SELECT id, city FROM `r_city` `t` WHERE region_id= ORDER BY city
Ну и второй список вообще не появляется

Где ошибка? :)
HQ0
Сообщения: 182
Зарегистрирован: 2012.10.17, 17:21

Re: Зависимые dropDownList

Сообщение HQ0 »

CDbCommand не удалось исполнить SQL-запрос: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER BY city' at line 1. The SQL statement executed was: SELECT id, city FROM `r_city` `t` WHERE region_id= ORDER BY city
В ошибке все прекрасно написано :)
yii_bliss
Сообщения: 3
Зарегистрирован: 2014.09.25, 13:37

Re: Зависимые dropDownList

Сообщение yii_bliss »

С пост разобрался, а вот со вторым списком пока нет
Pavelyev
Сообщения: 42
Зарегистрирован: 2011.11.06, 19:18

Re: Зависимые dropDownList

Сообщение Pavelyev »

Прочитав этот топик узнал, что "А так было можно?" и решил сделать у себя такую же штуку.
Получилось костыльно немного:
Сущности - Товар, коллекция, марка. Товар обязательно имеет марку, а вот коллекцию не обязательно.
Код экшена:

Код: Выделить всё

    public function actionList()
    {
        $listData = Collection::getList(Yii::app()->request->getPost('mark_id'));
        if(!$listData)
            return;
        echo CHtml::activeDropDownList(
            new Product,
            'collection_id',
            $listData,
            array('prompt' => 'Выберите коллекцию')
        );
    } 
Код в модели, который вызывает в экшене:

Код: Выделить всё

    public static function getList($mark_id)
    {
        return
            CHtml::listData(
                self::model()->findAllByAttributes(array(
                    'mark_id' => $mark_id
                )),
                'id',
                'name'
            );
    } 
Код в форме:

Код: Выделить всё

<?
// это пришлось вынести сюда, потому что в форме происходит ошибка Array to String conversion, странно, но ладно - потом разберусь
$collections = Collection::getList($model->mark_id);
$collectionsEmpty = empty($collections)?true:false;
?>
// начинается форма 

<div class="row">
    <?= $form->labelEx($model, 'mark_id'); ?>
    <?=
    $form->dropDownList(
        $model,
        'mark_id',
        Mark::asArray(),
        array(
            'prompt' => 'Выберите',
            'onchange' => '$("#collection_selector").attr("disabled", "disabled").val("Не выбрана");'.CHtml::ajax(
                array(
                    'type' => 'POST',
                    'url' => $this->createUrl('collection/list'),
                    'data' => array('mark_id' => 'js:$(this).val()'),
                    'success' => 'js:function(data){
                        if(data.length == 0)
                            $("#collection_selector").attr("disabled", "disabled");
                        else
                        {
                            $("#collection_selector").removeAttr("disabled").html(data);
                        }
                    }'
                )
            ),
            'id' => 'mark_selector'
        )
    ); ?>
    <?= $form->error($model, 'mark_id'); ?>
</div>


<div class="row">
    <?= $form->labelEx($model, 'collection'); ?>
    <?=
    $form->dropDownList(
        $model,
        'collection_id',
        $collections,
        array(
            'prompt' => 'Выберите',
            'id' => 'collection_selector',
            'disabled' => ($collectionsEmpty?'disabled': null)
        )
    )?>
    <?= $form->error($model, 'collection_id'); ?>
</div>
// другие поля и конец формы
Вот такое мясо получилось, но работает ОК) Ещё бы прелоадер сделать, пока ajax гуляет, но уже лень.
Если кому не лень - поделитесь своим способом, я уверен, что мой код сильно усложнен.
yii_bliss
Сообщения: 3
Зарегистрирован: 2014.09.25, 13:37

Re: Зависимые dropDownList

Сообщение yii_bliss »

Pavelyev, а вы могли бы сами сущности привести здесь? Вернее названиях их полей
ps. разобрался

спасибо
Ответить