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

Posted

技术标签:

【中文标题】如何在 jquery 中获取 FormHelper::postLink() 在 Cakephp4 中使用选项 \'block\' => true 生成的表单?【英文标题】:How in jquery to get the form generated by FormHelper::postLink() with option 'block' => true in Cakephp4?如何在 jquery 中获取 FormHelper::postLink() 在 Cakephp4 中使用选项 'block' => true 生成的表单? 【发布时间】:2022-01-17 03:37:41 【问题描述】:

我想用 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 中获取帖子链接表单,因为它不在主表单中并且不在 postLink 附近?

到目前为止(例如,当我不需要使用选项 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' =&gt; true 选项,有没有办法在 jquery 中获取 postLink 表单?

【问题讨论】:

【参考方案1】:

我刚刚找到了解决方案。

我在链接的 '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;
    );

【讨论】:

以上是关于如何在 jquery 中获取 FormHelper::postLink() 在 Cakephp4 中使用选项 'block' => true 生成的表单?的主要内容,如果未能解决你的问题,请参考以下文章

FormHelper::getSourceValue() 在 CakePHP4 中的验证错误时不返回实体

是否可以在不修改 Form 类的情况下使用 django-crispy-form FormHelper

如何在jquery中获取php数组值

如果使用虚拟键盘,Jquery 如何在输入字段中获取值

JavaScript / jQuery:如何在 Firefox 中获取选定的文本

如何在jquery中获取表单的类计数?