sweetalert удалить подтвердить laravel

У меня проблема в laravel для подтверждения удаления сообщения с помощью sweetalert

<script>
        !function ($) {
        "use strict";
        var SweetAlert = function () {
        };
        //examples 
        SweetAlert.prototype.init = function () {

            $('.sa-remove').click(function () {
                swal({
                    title: "are u sure?",
                    text: "lorem lorem lorem",
                    type: "error",
                    showCancelButton: true,
                    confirmButtonClass: 'btn-danger waves-effect waves-light',
                    confirmButtonText: "Delete",
                    cancelButtonText: "Cancel",
                    closeOnConfirm: true,
                    closeOnCancel: true
                },
                function(){
                    window.location.href = "{{ route('panel.posts.remove',$post->id) }}";
                });
            });
        },
        //init
        $.SweetAlert = new SweetAlert, $.SweetAlert.Constructor = SweetAlert
}(window.jQuery),

//initializing 
    function ($) {
        "use strict";
        $.SweetAlert.init()
    }(window.jQuery);
</script>    

Но у меня есть foreach в представлении, и он просто передает последний foreach пост id, и когда я хочу удалить, например, второй пост в таблице, последний удаляется!

это таблица:

             <thead>
                <tr>
                    <th>ID</th>
                    <th>Title</th>
                    <th>Body</th>
                    <th>Author</th>
                    <th>Operations</th>
                </tr>
            </thead>
            <tbody>
                @foreach($posts as $post)
                <tr>
                    <td>{{ $post->id }}</td>
                    <td>{{ $post->title }}</td>
                    <td>{{ $post->body }}</td>
                    <td>{{ $post->user->name }}</td>
                    <td>
                         <a href="#" class="sa-remove"><button class="wave-effect btn btn-danger btn-bordred wave-light"><i class="fa fa-times"></i></button></a>
                    </td> 
                </tr>
                @endforeach
            </tbody>

и я новичок в этом конечно!


person alitnk    schedule 08.06.2018    source источник


Ответы (3)


Вы удаляете не тот модальный объект. Сначала вы должны добавить атрибут данных к кнопке ссылки.

 <a href="#" data-id="{{$post->id}}" class="sa-remove"><button class="wave-effect btn btn-danger btn-bordred wave-light"><i class="fa fa-times"></i></button></a> code here

Затем в вашем коде javascript извлеките значение атрибута и измените URL-адрес.

 $('.sa-remove').click(function () {
            var postId = $(this).data('id'); 
            swal({
                title: "are u sure?",
                text: "lorem lorem lorem",
                type: "error",
                showCancelButton: true,
                confirmButtonClass: 'btn-danger waves-effect waves-light',
                confirmButtonText: "Delete",
                cancelButtonText: "Cancel",
                closeOnConfirm: true,
                closeOnCancel: true
            },
            function(){
                window.location.href = "your-url/" + postId;
            }); here
person skm    schedule 09.06.2018
comment
Спасибо приятель! это именно то, что я хотел, и это прекрасно работает. - person alitnk; 10.06.2018

Проблема в вашем URL-адресе, вы не выбираете динамически идентификатор модели, которую необходимо удалить, потому что в вашем javascript на вашем URL-адресе вы только что напечатали $post->id, что-то вы не должны делать это, так как смешивание php и js - это плохая практика...

Поэтому, чтобы решить вашу проблему, вы должны правильно установить свой href, либо вставить его непосредственно в свой атрибут href, либо не смешивая php с js, например: выбрав $post->id с помощью селектора JS, а не php, вы пытаетесь печатать php на javascript динамически, что не имеет никакого смысла. PHP-код, который у вас есть внутри js, будет запускаться ОДИН РАЗ, поэтому он печатает последний идентификатор вместо элемента, на который вы нажали...

Вы должны попытаться сделать что-то вроде... :

function(){
                window.location.href =  // select post id with js here;
            });

Но что я бы сделал, так это установил href на ваш foreach, чтобы вы уже настроили и были готовы опубликовать нужный вам маршрут, чтобы это имело больше смысла.

<a href="/your-delete-route/{{$post->id}}" class="sa-remove"><button class="wave-effect btn btn-danger btn-bordred wave-light"><i class="fa fa-times"></i></button></a>
person GaimZz    schedule 09.06.2018

Если вы работаете с несколькими записями, вы можете использовать этот полностью динамический код:

<a href="{{ route('users.destroy', $entity->id) }}"
    class="confirmation"
    data-title="Delete User"
    data-text="Are you sure want to delete this user? ">
     <i class="icon-trash"></i>
</a>

Из атрибутов данных вы можете получить динамический URL-адрес и заголовок для коробки Sweetalear. а затем просто передайте эту информацию в Javascript.

jQuery(document).on('click', '.confirmation', function (e) {
    e.preventDefault(); // Prevent the href from redirecting directly
    var linkURL = $(this).attr("href");
    var _title = $(this).attr("data-title");
    var _text = $(this).attr("data-text");
    warnBeforeRedirect(linkURL, _text, _title);
});

Сделайте функцию, чтобы затем подтвердить и перенаправить пользователя на метод удаления:

function warnBeforeRedirect(linkURL, _text, _title) {
    swal({
        title: _title,
        text: _text,
        type: 'warning',
        showCancelButton: true,
        html: true,
    }, function () {
        var form = $('<form>', {
            'method': 'POST',
            'action': linkURL
        });

        var hiddenInput = $('<input>', {
            'name': '_method',
            'type': 'hidden',
            'value': 'DELETE'
        });

        hiddenToken = $('<input>', {
            'name': '_token',
            'type': 'hidden',
            'value': jQuery('meta[name="csrf-token"]').attr('content')
        });

        form.append(hiddenInput).append(hiddenToken).appendTo('body').submit();
    });
}

Если вы используете Laravel DELETE Route, вам также необходимо передать токен в скрытый. Итак, я создал форму и добавил к ней тег Body с некоторыми скрытыми переменными. затем просто отправьте его.

Надеюсь, это будет полезно для вас. Удачи.

person Gautam Patadiya    schedule 09.06.2018
comment
большое спасибо! но я не хочу использовать метод POST... есть ли способ не менять все это? мой код совершенно неверен? - person alitnk; 09.06.2018