我有一个典型的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中的错误还是我错过了什么?
答案 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