Yii2表单中的附加按钮提交表单而不是调用其操作

tre*_*der 5 php forms yii yii2

我有一个典型的Yii2表单,用于通过典型的提交按钮更新我的模型.如果有任何要删除的照片,我会在旁边显示" 删除照片 "按钮.这段视图看起来像这样:

<?= Html::submitButton('Save changes', ['class' => 'btn btn-primary', 'name' => 'edit-button']) ?>

<?php $image = isset($page->photo) ? $page->photo->getImageUrl() : null; ?>

<?php if (isset($image)): ?>

    <?= Html::a('Delete photo', ['delete-image', 'lab' => $lab->id, 'kind' => $page->kind], [
        'class' => 'btn btn-danger',
        'data' => [
            'confirm' => 'Do you really want to delete this photo?',
            'method' => 'post'
        ],
    ]) ?>

<?php endif; ?>
Run Code Online (Sandbox Code Playgroud)

当这个模型附有照片并且这两个按钮彼此相邻时,我必须'method' => 'post'在第二个按钮代码中注释掉一部分.因为,如果我不这样做,第二个按钮是......提交表单(就像第一个一样)而不是调用lab/delete-image路由.

这是第一件事,我不明白.整个代码由Gii生成或从一些Yii教程中复制粘贴.甚至没有一点我的发明,但它的工作奇怪.我错过了什么?

看起来,普通Html::a链接(仅由Twitter Bootstrap设计为看起来像一个按钮,但根本不是按钮)data-method="post"在元素代码中包含属性时提交表单而不是调用其动作.这是Yii2中的错误还是我错过了什么?

Ton*_*ony 8

您需要将链接放在表单之外.对于具有data-method属性yii的元素的调用操作具有js函数handleAction,其文档说:

此方法可识别data-method元素的属性.如果该属性存在,则该方法将提交包含此元素的表单.如果没有包含表单,将使用此属性值给出的方法创建并提交表单(例如"post","put").

对于超链接,表单操作将采用链接的"href"属性的值.

此外,如果您使用yii2 v2.0.3或更高版本,您可以添加data-params属性,该值应该是数据的JSON表示,并且此数据将在请求中提交.例如:

 echo Html::a('Delete image', ['delete-image'], [
     'data' => [
        'confirm' => 'Do you really want to delete this photo?'
        'method' => 'post',
        'params' => [
            'lab' => $lab->id,
            'kind' => $page->kind,
        ],
    ],
]);
Run Code Online (Sandbox Code Playgroud)

在这个例子中,params数组将由yii2 internaly进行json编码