Подтверждение перед удалением и Pjax

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
iZacNT
Сообщения: 35
Зарегистрирован: 2019.07.09, 04:53

Подтверждение перед удалением и Pjax

Сообщение iZacNT »

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

View:

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

 if ($model->adresess) {
                              foreach ($model->adresess as $adress){
                                  echo "<tr>";
                                  echo "<td style='width: 50px;'>";
                                  if ($adress->adresess_status == 1) {
                                  echo "<i class='fa fa-star' aria-hidden='true' data-toggle='tooltip' data-placement='top' title='По умолчанию' ></i>"; }
                                  echo "</td>";
                                  echo "<td>";
                                        echo $adress->adresess_index." обл. ".$adress->adresess_region.", ".$adress->adresess_city.", ".$adress->adresess_street." ".$adress->adresess_home." ".$adress->adresess_corpus."-".$adress->adresess_apartament;
                                  echo "</td>";
                                  echo "<td>";
                                  echo Html::a('Редактировать', ['user/adress-update', 'id'=>\Yii::$app->user->id,'uid'=>$adress->adresess_id],
                                      ['style' => 'font-size:14px;margin-left: 5px;']);
                                  echo Html::a('Удалить', ['user/adress-delete', 'id'=>\Yii::$app->user->id,'uid'=>$adress->adresess_id],
                                      ['style' => 'font-size:14px;margin-left: 5px; color: red',
                                          'data' => [
                                              'confirm' => 'Вы уверены что хотите удалить адрес?',
                                              'method' => 'post',
                                          ],
                                      ]);
                                  echo "</td>";
                                  echo "</tr>";
                                }
Controller:

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

 public function actionAdressDelete($id,$uid)
    {
        $model = Adresess::find()
            ->where(['adresess_id'=>$uid])
            ->one()
            ->delete();

        return $this->render('update', [
            'model' => $this->findModel($id),     //Модель User
        ]);

    }
 
Вопрос такой;
Если оставить эти строки

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

 'data' => [
                                              'confirm' => 'Вы уверены что хотите удалить адрес?',
                                              'method' => 'get',
                                          ],
Выскакивает вопрос перед удалением (это правильно). Но при подтверждении не срабатывает Pjax и обновляется вся страница.
Если убрать эти строки то Pjax отрабатывает как надо, но нет подтверждения. А хотелось бы.
Как это можно поправить?
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Подтверждение перед удалением и Pjax

Сообщение unknownby »

iZacNT писал(а): 2021.03.11, 19:14 Выскакивает вопрос перед удалением (это правильно). Но при подтверждении не срабатывает Pjax и обновляется вся страница.
Если убрать эти строки то Pjax отрабатывает как надо, но нет подтверждения. А хотелось бы.
В чем проблема обновления страницы? И почему удаление у вас через GET идёт?
iZacNT
Сообщения: 35
Зарегистрирован: 2019.07.09, 04:53

Re: Подтверждение перед удалением и Pjax

Сообщение iZacNT »

unknownby писал(а): 2021.03.12, 08:49 В чем проблема обновления страницы?
Действия происходят на разных вкладках, хотелось бы что бы после удаления оставаться на той вкладке, на которой был.
unknownby писал(а): 2021.03.12, 08:49 И почему удаление у вас через GET идёт?

Да. Я вчера после регистрации поста заметил и исправил
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: Подтверждение перед удалением и Pjax

Сообщение masson »

public function actionAdressDelete пусть обрабатывает post(id) и возвращает

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

return 'ok' (или сообщение об ошибке в случае проблем);
В гриде рисуй так: (стилями делай похожим на линк)

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

echo Html::span('Удалить', ['class' => 'ingrid_delete', 'data-uid' => $adress->adresess_id, 'style' => 'font-size:14px;margin-left: 5px; color: red']);
И в конце вьюхи с гридом допиши:

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

$deleteUrl = Url::to(['user/adress-delete']);

$js = <<< JS
$(document).on("click", "span.ingrid_delete",function() {
    if (!confirm("Хотите удалить запись")) {
        return false;
    }
    
    let id = $(this).data("uid");
    $.post("$deleteUrl", {id: id}, function(response) {
        if (response === "ok") {
            $.pjax.reload("#pjax_container_id");
        } else {
            alert(response);
        }
    })
});
JS;

$this->registerJs($js);
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Подтверждение перед удалением и Pjax

Сообщение unknownby »

iZacNT писал(а): 2021.03.12, 09:41 Действия происходят на разных вкладках, хотелось бы что бы после удаления оставаться на той вкладке, на которой был.
А если так сделать?

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

public function actionAdressDelete($uid)
    {
        $model = Adresess::findOne($uid)->delete();

        return $this->redirect(Url::previous());
    }
При этом сообщение с подтверждением вернуть обратно.

А чтобы возвращалось на нужную вкладку, то нужно запоминать на каком Табе находимся и при обновлении страницы чтобы возвращалось на открытый Таб, а не переходило на первый каждый раз.
iZacNT
Сообщения: 35
Зарегистрирован: 2019.07.09, 04:53

Re: Подтверждение перед удалением и Pjax

Сообщение iZacNT »

И в конце вьюхи с гридом допиши:

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

$deleteUrl = Url::to(['user/adress-delete']);

$js = <<< JS
$(document).on("click", "span.ingrid_delete",function() {
    if (!confirm("Хотите удалить запись")) {
        return false;
    }
    
    let id = $(this).data("uid");
    $.post("$deleteUrl", {id: id}, function(response) {
        if (response === "ok") {
            $.pjax.reload("#pjax_container_id");
        } else {
            alert(response);
        }
    })
});
JS;

$this->registerJs($js);
Если делаю так:
Логика такая. если нет адресов, то я жму кнопку добавить адрес, в Pjax контейнер подгружается форма с полями для добавления. Добавляю адреса. Потом удаляю один адрес (используя JS). После выполнения pjax.reload обновляется контейнер и в него подгружается форма добавления адреса(А должен вывести список адресов).))) Сам метод мне нравится.

Я думал все это можно сделать стандартными средствами.
Буду пробовать как подсказал "unknownby"
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: Подтверждение перед удалением и Pjax

Сообщение masson »

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

let url = "url со списками адресов";
$.pjax.reload("#pjax_container_id", {url: url});
Если по уму то форма добавления адреса не в контейнер должна грузиться, а в модалке всплывать. Потом по тому же принципу - в модалке жмешь кнопку "Добавить", получаешь ответ "ок", прячешь модалку и вызываешь pjax.reload. А если получаешь не "ок" а ошибки валидации - то вываливаешь их в алерте (или модалку перерисовываешь, как удобнее). И исходный список и модалка при этом так и остаются на экране
Последний раз редактировалось masson 2021.03.12, 17:19, всего редактировалось 1 раз.
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: Подтверждение перед удалением и Pjax

Сообщение masson »

iZacNT писал(а): 2021.03.12, 16:48 После выполнения pjax.reload обновляется контейнер и в него подгружается форма добавления адреса(А должен вывести список адресов).)))
Что запрашиваешь то и подгружается
iZacNT
Сообщения: 35
Зарегистрирован: 2019.07.09, 04:53

Re: Подтверждение перед удалением и Pjax

Сообщение iZacNT »

masson писал(а): 2021.03.12, 17:11

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

let url = "url со списками адресов";
$.pjax.reload("#pjax_container_id", {url: url});
Если по уму то форма добавления адреса не в контейнер должна грузиться, а в модалке всплывать. Потом по тому же принципу - в модалке жмешь кнопку "Добавить", получаешь ответ "ок", прячешь модалку и вызываешь pjax.reload. А если получаешь не "ок" а ошибки валидации - то вываливаешь их в алерте (или модалку перерисовываешь, как удобнее). И исходный список и модалка при этом так и остаются на экране
Спасибо
iZacNT
Сообщения: 35
Зарегистрирован: 2019.07.09, 04:53

Re: Подтверждение перед удалением и Pjax

Сообщение iZacNT »

masson писал(а): 2021.03.12, 17:11

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

let url = "url со списками адресов";
$.pjax.reload("#pjax_container_id", {url: url});
Если по уму то форма добавления адреса не в контейнер должна грузиться, а в модалке всплывать. Потом по тому же принципу - в модалке жмешь кнопку "Добавить", получаешь ответ "ок", прячешь модалку и вызываешь pjax.reload. А если получаешь не "ок" а ошибки валидации - то вываливаешь их в алерте (или модалку перерисовываешь, как удобнее). И исходный список и модалка при этом так и остаются на экране

Подскажите пожалуйста! Как передать данные формы через JS в Контроллер, что бы получилось загрузить ее в модель?
JS

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

$(document).on("click", "button.addAdres",
function (){
    $('#myModal').modal('show');
    $('.modal-title').empty();
    $('.modal-title').append("Добавить адрес");
    $('.modal-content').find('.modal-body').load("$addUrl",{},function (){
        $('.btnSubmit').css("display", "none");
    });
    $('.jsSaveButton').on('click', function (){
        
        var data = $('#adresSaveForm').serializeArray();
        //alert(data);
        $.post("$addUrl", {data: data}, function(response) {
        if (response === "ok") {
            $.pjax.reload("#adresess_container");
        } else {
            alert(response);
        }
    })
        
    })
}
);
Controller;

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

public function actionAdress($id)
    {
        $model = new Adresess();

        if (Yii::$app->request->isAjax){
            //Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
        if ($model->load(Yii::$app->request->post())) {
            $model->save();
            return "ok";
        }else {
            var_dump(Yii::$app->request->post());
           // Yii::$app->response->format = \yii\web\Response::FORMAT_RAW;
            return $this->renderAjax('../adresess/_form', ['model' => $model]);

        }
        }
    }
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: Подтверждение перед удалением и Pjax

Сообщение masson »

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

var data = $('#adresSaveForm').serialize();
А не serializeArray();

А вообще в своих проектах я использую класс https://github.com/loveorigami/yii2-modal-ajax ... Очень удобная штука
iZacNT
Сообщения: 35
Зарегистрирован: 2019.07.09, 04:53

Re: Подтверждение перед удалением и Pjax

Сообщение iZacNT »

masson писал(а): 2021.03.14, 21:37

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

var data = $('#adresSaveForm').serialize();
А не serializeArray();

А вообще в своих проектах я использую класс https://github.com/loveorigami/yii2-modal-ajax ... Очень удобная штука
Спасибо. Буду дольше разбираться.
iZacNT
Сообщения: 35
Зарегистрирован: 2019.07.09, 04:53

Re: Подтверждение перед удалением и Pjax

Сообщение iZacNT »

masson писал(а): 2021.03.14, 21:37

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

var data = $('#adresSaveForm').serialize();
А не serializeArray();

А вообще в своих проектах я использую класс https://github.com/loveorigami/yii2-modal-ajax ... Очень удобная штука

Сделал конечно корявенько, но работает:

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

$(document).on("click", "button.addAdres",
function (){
    $('#myModal').modal('show');
    $('.modal-title').empty();
    $('.modal-title').append("Добавить адрес");
    $('.modal-content').find('.modal-body').load("$addUrl",{},function (){
        $('.btnSubmit').css("display", "none");
    });
    $('.jsSaveButton').on('click', function (){
        
        var Adresess = new Object();
        Adresess.adresess_user_id = "$userId";
        Adresess.adresess_index = $('#adresess-adresess_index').val();
        Adresess.adresess_region = $('#adresess-adresess_region').val();
        Adresess.adresess_city = $('#adresess-adresess_city').val();
        Adresess.adresess_street = $('#adresess-adresess_street').val();
        Adresess.adresess_home = $('#adresess-adresess_home').val();
        Adresess.adresess_corpus = $('#adresess-adresess_corpus').val();
        Adresess.adresess_apartament = $('#adresess-adresess_apartament').val();
        
        alert(Adresess);
        $.post("$addUrl", {Adresess: Adresess}, function(response) {
        if (response === "ok") {
            $.pjax.reload("#adresess_container");
        } else {
            alert(response);
        }
    })
        
    })
}
);
Если честно так и не понял как быстро привести обьект к нужному виду.

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

var data = $('#adresSaveForm').serialize();
Дает в результате строку с параметрами

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

var data = $('#adresSaveForm').serializeArray();
Дает в результате массив обьектов.
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: Подтверждение перед удалением и Pjax

Сообщение masson »

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

var data = $('#adresSaveForm').serialize();

$.post("$addUrl", data, function(response) {
        if (response === "ok") {
            $.pjax.reload("#adresess_container");
        } else {
            alert(response);
        }
Ответить