Вариант приёма и отправки ajax(post) запросов в Yii

В этой записи было рассказано как реализовать обработку множества строк в таблице сформированной с помощью компонента zii виджета CGridView, теперь немного расширяя функционал расскажем как ,к примеру, удалить выделенные записи из таблицы базы данных MySQL, делать это будем отправляя post запрос из представления и принимая, а так же обрабатывая его в контроллере.

Итак, отправить post запрос можно следующим образом:

$.post(
"",
{
    delete_id: $(this).attr("value")
}).done(function(result){
    alert(result);
});

В данном случае в пустых кавычках ничего не пишем, так как отправляем запрос с той же страницы, на которой и находимся, в запросе передаем параметр delete_id в котором содержится id записи в БД которую нам требуется удалить и принимаем результат запроса и выводим.

Далее принимаем этот параметр в соответствующем контроллере и в соответствующем экшене (action):

public function actionTest()
{
    $delete_id = Yii::app()->request->getPost('delete_id');
    if(Yii::app()->request->isAjaxRequest){
    	$result = TestTable::model()->deleteByPk($delete_id);
    	echo CHtml::encode($result);
        Yii::app()->end();
    }
    else {
        $this->render('test');
    }
}

В данном примере мы в переменную $delete_id получаем id записи которую нужно удалить, далее в Yii::app()->request->isAjaxRequest проверяем был ли запрос асинхронным, если бы, то выполняем следующие действия:

  1. Удаляем соответствующую запись и сохраняем в переменную результат действия
  2. Возвращаем результат выполнения (именно его и выведет на js код)
  3. Завершаем приложение

Если же запрос к нам пришел не асинхронный, то мы просто отрисовываем представление.

Визуально у вас должно получиться что-то похожее на это:

Выделяем и жмем кнопку удалить

Получаем ответ с сервера об успешном выполнении

Смотрим в консоль и убеждаемся, что все хорошо прошло

Теперь остается только привести полный код представления:

<script>
function treat() {
    $(".checkclass").each(function() {
        if ($(this).prop("checked")) {
            $.post(
            "",
            {
                delete_id: $(this).attr("value")
            }).done(function(result){
                alert(result);
            });
        }
    });
}
</script>
<div style="margin-bottom: -30px;">
    <button type="button" onclick="treat();">
        <span>Удалить</span>
    </button>
</div>
<?php

$dd = New test;
$SqldataProvider = $dd->get_testtablet_dataProvider();
$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$SqldataProvider,
    'enablePagination' => true,
    'ajaxUpdate' => false,
    'hideHeader' => false,
    'columns'=>array(
        array(
                'class'=>'CCheckBoxColumn',
                'selectableRows' => 2,
                'checkBoxHtmlOptions' => array('class' => 'checkclass'),
            ),
        array(
            'name' => 'id',
            'value' => 'CHtml::encode($data["id"])',
            'type' => 'raw',
        ),
        array(
            'name' => 'name',
            'header' => 'Имя',
            'value' => 'CHtml::encode($data["first_name"])',
            'type' => 'text',
        ),
        array(
            'name' => 'Фамилия',
            'value' => 'CHtml::encode($data["second_name"])',
            'type' => 'raw',
        ),
    ),
));
?>

Ну а полный код контроллера расположен чуть выше, кстати для работы вам понадобится еще и модель таблицы TestTable которую можно автоматически сгенерировать в gii.

comments powered by HyperComments
При копировании материалов обратная ссылка на play-stop.ru желательна обязательна!