Yii CButtonColumn напрямую обновляет базу данных

Итак, у меня есть значок в моем CButtonColumn, возможно ли сделать так, чтобы, щелкнув этот значок, он напрямую обновлял определенное поле записи в базе данных?

Например,

Запись бронирования с полем Complete. Нажав на значок, он автоматически изменяет значение Complete с 0 на 1.

Можно ли сделать что-то подобное? Если да, то как? Я попытался добавить весь SQL-запрос в urlExpression, например,

Yii::app()->db->createCommand('UPDATE booking SET complete = 1 WHERE id = 1')

Но это не работает.

Пожалуйста, помогите мне, спасибо заранее.

ОБНОВЛЕНИЕ на основе комментария Хамеда

'changeComplete' => array(
                'imageUrl' => 'images/complete.png',
                'options' => array(
                    'title' => 'Complete',
                    //'style' => 'cursor:pointer; margin: 0 2px;'
                ),
                'url' => 'Yii::app()->createUrl("booking/changeComplete", array("id"=>$data->id))',
                'click' => "function(){
                    $.fn.yiiGridView.update('id', {
                        type:'POST',
                        url:$(this).attr('href'),
                        success:function(data) {
                            $.fn.yiiGridView.update('id');
                        }
                    })
                    return false;
                }",
            ),

в контролере бронирования:

public function actionChangeComplete($id)
{
    Yii::app()->db->createCommand('UPDATE booking SET complete = 1 WHERE id = $id');
}

но он все еще не работает при нажатии на кнопку. Я сделал что-то не так? Пожалуйста, сообщите спасибо


person NewbieCoder    schedule 30.03.2015    source источник
comment
Что произошло после нажатия на кнопку? Ты видишь консоль? Также $.fn.yiiGridView.update('GridID');. параметр - это идентификатор вашей сетки.   -  person hamed    schedule 30.03.2015
comment
Консоль ничего не показывает. А можно узнать, что вы имеете в виду под «сеткой»?   -  person NewbieCoder    schedule 30.03.2015
comment
Хорошо, я понял, что вы имели в виду, в моем случае это сетка бронирования. Он обновляет сетку, но ничего не делает. complete по-прежнему остается прежним.   -  person NewbieCoder    schedule 30.03.2015
comment
Ой! Теперь все работает. Просто добавьте ->execute(); в оператор Yii SQL сзади. Большое спасибо! :D   -  person NewbieCoder    schedule 30.03.2015
comment
Прошу прощения, что забыл поставить галочку.   -  person NewbieCoder    schedule 30.03.2015


Ответы (1)


Первое, что вы должны знать, это транзакции базы данных должны выполняться внутри контроллера, а не в представлении. Таким образом, вы должны попробовать действие для этого. Попробуйте это внутри вашего gridView

array(
    'class' => 'CButtonColumn',
    'template' => '{changeComplete}',
    'buttons' => array(
        'changeComplete' => array(
            'label' => Your button label',
            'imageUrl' => false,
            'options' => array(
                'title' => 'title of your button',
                'style' => 'cursor:pointer; margin: 0 2px;'
            ),
            'url' => 'Yii::app()->createUrl("test/changeField", array("id"=>$data->id))',
            'click' => "function(){
                        $.fn.yiiGridView.update('gridID', {
                        type:'POST',
                        url:$(this).attr('href'),
                        success:function(data) {
                        $.fn.yiiGridView.update('gridID');
                        }
                    })
                           return false;
                 }
                ",
        ),

    )
),

Теперь вам нужно определить actionChangeField внутри TestController (имена контроллера и действия приведены только в качестве примера, вы должны определить действие с подходящим именем в подходящем контроллере)

public function actionChangeField($id)
{
      Yii::app()->db->createCommand('UPDATE booking SET complete = 1 WHERE id = $id')->execute();
}

Наконец, замените «gridID» на идентификатор вашей сетки (без знака #).

person hamed    schedule 30.03.2015