如何在 jquery 中获取由 FormHelper::postLink() 使用选项 'block' => true 在 Cakephp4 中生成的表单?

How in jquery to get the form generated by FormHelper::postLink() with option 'block' => true in Cakephp4?

我想使用 FormHelper::postLink() 在 ajax 中管理删除。

复杂的是我使用了选项 'block' => true :

<div class="item-box">
<!-- [...] -->
<?php
$this->Form->postLink('<i class="fas fa-trash-alt fa-fw"></i>',
                                                [
                                                    'plugin' => 'FileManager',
                                                    'controller' => 'Fichiers',
                                                    'action' => 'delete',
                                                    $file->id
                                                ],
                                                [
                                                    'block' => true, // The postLink form is outside the main form, How can I get the form in jquery when I click on this postLink ?
                                                    'confirm' => 'Confirmer la suppression ?',
                                                    'class' => 'delete secondary button',
                                                    'title' => 'Supprimer le fichier',
                                                    'escapeTitle' => false
                                                ]);
?>
</div>

我不知道如何在 ajax 中获取 post link 表单,因为它在主表单之外并且不在 [= 附近35=]链接 ?

到目前为止(例如,当我不需要使用选项 block 时)我能够得到这样的表格:

$('.item-box .delete')
    .removeAttr('onclick')
    .click(function(e){
        e.preventDefault();
        var form = $(this).prev(); // The form was just before the postLink
        var url = $(form).attr("action");

        if($(this).data('confirm-message'))
            message_confirmation = $(this).data('confirm-message');
        else
            message_confirmation = 'Confirm ?';

        if(confirm(message_confirmation)) {

            parent = $(this).parents('.item-box');

            $.ajax({
                type: 'POST',
                cache: false,
                url: url,
                data: $(form).serialize()
            })
            .done(function(response) {
                                parent.slideUp(
                                    'fast',
                                    function(){
                                        parent.remove();
            
                                    }
                                );
                            })
            .fail(function(error) {
                                alert("Delete Error (" + error.statusText + ")");
                                location.reload();
                            });
        }
            
        return false;
    });

既然我在 postLink() 中使用选项 'block' => true,是否有办法在 jquery 中获取 postLink 表单?

我刚刚找到了解决方案。

我在 link 的 'data-form-name' 属性中添加与 postLink 关联的表单名称,然后使用此属性获取表单:

$('.item-box .delete')
    .each(function(index){
        var formName = $(this).attr("onclick").match(/post_[A-Za-z0-9]+/);
        console.log(formName);
        $(this).attr('data-form-name', formName); // Add the name of the form associated to the postLink() in data-form-name attribute
    })
    .removeAttr('onclick')
    .click(function(e){
        e.preventDefault();
        var form = $('form[name="' + $(this).data('form-name') + '"]'); // get the form depending on data-form-name attribute
        var url = $(form).attr("action");
        if($(this).data('confirm-message'))
            message_confirmation = $(this).data('confirm-message');
        else
            message_confirmation = 'Confirm ?';

        if(confirm(message_confirmation)) {

            parent = $(this).parents('.item-box');

            $.ajax({
                type: 'POST',
                cache: false,
                url: url,
                data: $(form).serialize()
            })
            .done(function(response) {
                                parent.slideUp(
                                    'fast',
                                    function(){ // fonction de callback quand le fadeOut est fini 
                                        parent.remove(); // remove enlève l'élément du DOM (fadeout le masque!) 
            
                                    }
                                );
                            })
            .fail(function(error) {
                                alert("Delete error (" + error.statusText + ")");
                                location.reload();
                            });
        }
            
        return false;
    });