获取正确的 ID 以在具有多个帖子的站点中删除

Getting the correct ID to delete in site with multiple posts

我只是 运行 遇到了一个我无法理解的问题。

我有一个网站,其中包含用户制作的所有应用程序,如下所示:

我在每个 post 上都有一个 delete/cancel 的按钮,这个 post (Bewerbung zurückziehen)。

按下该按钮时,会打开一个带有一些文本的模式。当他按下模式中的删除按钮时,如果用户确定要删除它,则应用程序将被取消。

但是,删除的始终是页面上的第一个页面,而不是按下按钮的那个页面。

我必须以某种方式获取按下按钮的应用程序 ID,但我对如何操作一无所知。

这里是 blade 代码:

<div class="flex-grow">
    @foreach($bewerbungen as $bewerbung)
        @foreach($stellenanzeigen_names as $stellenanzeigen_name)
            @if($bewerbung->Stellenanzeigen_ID === $stellenanzeigen_name->Stellenanzeigen_ID)
                <div class="p-10 grid-cols-3 grid-rows-3 gap-4 shadow-2xl mb-10 grey_bg border-solid border-2 border-black rounded-lg">
                    <!--Card 1-->
                    <div>
                        {{ $stellenanzeigen_name->Titel }}
                        <hr class="border-black">
                    </div>
                    <div class="pt-4 pl-8 font-medium text-xl font-bold font-serif">
                        ID der Bewerbung: {{ $bewerbung->Bewerbung_ID }}
                    </div>
                    <div class="pt-4 pl-8 pb-3 font-medium text-xl font-bold font-serif">
                        ID der Stellenanzeige: {{ $bewerbung->Stellenanzeigen_ID }}
                    </div>
                    <div class="flex justify-end">
                        <button type="submit"
                                name="open_btn"
                                class="open-btn mr-8 text-black px-4 py-3 rounded text-base font-medium button_bg float-right shadow transition duration-500 ease-in-out transform hover:-translate-y-1 hover:scale-100"
                        >
                            Bewerbung zurückziehen
                        </button>
                    </div>
                    <div id="cancel_appl_modal"
                         class="modal fixed ml-96 top-20 mx-auto p-5 border w-96 shadow-lg rounded-md post_bg hidden text-white">
                        <div class="mt-3 text-center text-2xl">
                            Bewerbung zurückziehen
                        </div>

                        <div class="items-center px-4 py-3">
                            <label for="neue_telefonnummer" class="sr-only">Neue Telefonnummer</label>

                            <form method="post"
                                  action="{{ route('delete', $bewerbung->Bewerbung_ID) }}">
                                @csrf
                                <div class="text-lg mb-4">
                                    Wenn Sie die Bewerbung zurückziehen haben Sie keinen Zugriff mehr
                                    auf alle Daten.
                                    Die Daten werden jedoch noch im System archiviert.
                                </div>
                                <button type="submit"
                                        id="ok_btn"
                                        class="mb-4 pb-3 w-full text-black px-4 py-3 rounded text-base font-medium bg-teal float-right shadow transition duration-500 ease-in-out transform hover:-translate-y-1 hover:scale-100 shadow-2xl border-2 w-full p-4 rounded-lg"
                                >
                                    Bewerbung zurückziehen
                                </button>
                            </form>
                        </div>

                        <div class="items-center px-4 py-3">
                            <button id="back_btn"
                                    class="mb-4 pb-3 w-full text-black px-4 py-3 rounded text-base font-medium bg-teal float-right shadow transition duration-500 ease-in-out transform hover:-translate-y-1 hover:scale-100 shadow-2xl border-2 w-full p-4 rounded-lg"
                            >
                                zurück
                            </button>
                        </div>
                    </div>
                </div>
            @endif
        @endforeach
    @endforeach
</div>

这是模态的JS代码:

let buttons = document.querySelectorAll('.open-btn');

var delete_appl_modal = document.getElementById("cancel_appl_modal");

buttons.forEach((button) => {
    button.addEventListener('click', function (event) {
        // this is where you would open the modal
        delete_appl_modal.style.display = 'block';
        console.log(event.target.innerHTML);
    })
});

var submit_btn = document.getElementById("ok_btn");

var back_btn = document.getElementById("back_btn");

open.onclick = function () {
    delete_appl_modal.style.display = "block";
}

back_btn.onclick = function () {
    delete_appl_modal.style.display = "none";
}

window.onclick = function (event) {
    if (event.target == modal) {
        delete_appl_modal.style.display = "none";
    }
}

这是您的表格:

<form method="post" action="{{ route('delete', $bewerbung->Bewerbung_ID)}}">

但它是在一个循环中,所以大概你正在创建很多,每个都有相同的按钮和相同的 ID :

<button type="submit" id="ok_btn"  ... >

由于 ID 必须是唯一的,当您的 javascript 触发时,它会查找 ID 为“ok_btn”的元素以提交相关表单。由于有很多(同样,ID 应该是唯一的),所以它只提交它遇到的第一个。所以它总是只会删除页面上的第一个。

我的建议是:

  1. 不要将表单或模式放在循环中。
  2. 将模态框放在末尾,其中包含表单,表单中有一个隐藏字段(称为“delete_id”。
  3. 使用 javascript 填充“delete_id”与用户单击以调出模式时要删除的事物的相关 ID。
  4. 像现在一样使用确认按钮提交表单。

我找到了一个带有小变通方法的解决方案!

我按照评论/答案中的建议将模式移出了循环,然后我添加了两个隐藏的输入字段:

<form method="post"
                                  action="{{ route('delete', $bewerbung->Bewerbung_ID) }}">
                                @csrf
                                <div class="text-lg mb-4">
                                    Wenn Sie die Bewerbung zurückziehen haben Sie keinen Zugriff mehr
                                    auf alle Daten.
                                    Die Daten werden jedoch noch im System archiviert.
                                </div>
                                <input type="hidden" id="email" name="email" value="{{ $bewerbung->bewerber_email }}">
                                <input type="hidden" id="delete_id" name="delete_id" value="">
                                <button type="submit" id="ok_btn" class="mb-4 pb-3 w-full text-black px-4 py-3 rounded text-base font-medium
                                                bg-teal float-right shadow transition
                                                duration-500 ease-in-out transform hover:-translate-y-1 hover:scale-100
                                                shadow-2xl border-2 w-full p-4 rounded-lg">
                                    Bewerbung zurückziehen
                                </button>
                            </form>

因此,对于第一个字段,用户的电子邮件被传递到控制器,对于第二个字段,我使用此 javascript 代码分配值:

function reply_click(clicked_id)
        {
            document.getElementById("delete_id").value = clicked_id;
        }

打开模式的按钮现在看起来像这样:

<button type="submit" name="open_btn" class="open-btn mr-8 text-black px-4 py-3 rounded text-base font-medium
                                                    button_bg float-right shadow transition
                                duration-500 ease-in-out transform hover:-translate-y-1 hover:scale-100" id="{{$bewerbung->Bewerbung_ID}}" onclick="reply_click(this.id)">Bewerbung
                                    zurückziehen
                                </button>

感谢所有评论,你们的提示让我找到了正确的方向:)