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

时间:2015-07-07 08:32:29

标签: 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; ?>

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

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

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

1 个答案:

答案 0 :(得分:8)

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

  

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

     

对于超链接,表单操作将采用&#34; href&#34;的值。链接的属性。

此外,如果您使用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,
        ],
    ],
]);

在此示例中,params数组将由yii2 internaly

进行json编码