这听起来很容易,但对我来说这很麻烦。我一直在编写一个表单来编辑已经存在的数据库条目。根据连接表中的记录创建和填充某些字段。
这听起来有点粗略,所以我会试着说明一下。我有一个名为Content的内容表和一个名为Files的表,其中包含文件名和位置。我根据提供的内容ID获取文件名,然后表单创建字段,然后用文件名填充这些字段。
public function setFiles($files) {
$i = 0;
foreach ($files as $file) {
$i++;
$fieldname = "encloseditemname{$i}";
$this->addElement('text', $fieldname, array('required' => true,
'label' => 'Enclosed item name (test)',
'value' => $file['file_url'],
));
}
}
这完全正常,但现在我想添加一个按钮,允许我删除其中一个文件。所以我认为应该做的是在控制器中创建一个fileDeleteAction()
,然后让按钮重定向到该操作,让它删除数据库中的条目,然后使用表单呈现视图。
让动作呈现不同的视图,然后是标准视图,而不是问题。编写代码来删除数据库中的条目,也不是问题。使用addElements方法创建一个重定向到删除操作的按钮作为工厂...大量问题。这是我有多远。
$this->addElement('button', "deleteencloseditem{$i}", array( ??? ));
如何让此按钮重定向到删除操作,而不会影响我的表单底部的提交按钮,该按钮用于提交表单并调用我的控制器中的editAction。
我已经研究过使用一些javascript来检测按下了哪个按钮但是我还没有在家中使用javascript而且我无法找到如何找出按下哪个按钮,因为按钮名称和id依赖于setFiles函数因此可以在deleteencloseditem1
和deleteencloseditem5000
之间,具体取决于它推入表单的文件名数量。
我怎样才能完成这项工作?任何提示或建议都非常感谢:)
答案 0 :(得分:1)
HTML <form>
只能有一个action
属性,表单在提交时会被路由到该属性。但是,客户端和服务器端都有解决方法。
服务器端
action
(在您的表单代码中由$this->setAction(...)
设置)post
(或get
)变量确定点击了哪个按钮客户端
使用按钮的click
事件来确定单击了哪个按钮。我假设按钮的ID
会告诉您有关要删除的文件的信息。假设您给所有删除按钮class="delete"
,您可以使用jQuery执行以下操作:
$('input.delete').click(function(){
// remove 'deleteencloseditem' from the button's ID
// to only keep the file number
var myFileID = $(this).attr('id').replace('deleteencloseditem', '');
window.location.href = 'myLocation?fileID=' + myFileID;
});
答案 1 :(得分:0)
只需使用路由。表单路由意味着将action
指向相应的路由。表单操作中的路径将导致ZF中的路由使用关联的控制器和操作。
答案 2 :(得分:0)
解决此问题的最简单方法是使用链接进行删除操作,然后将其设置为按钮。
或者你可以使用两个按钮和一个表格,你只需要用不同的方式标记它们,并在POST上测试标签名称。
if ($this->getRequest()->getPost('submit') == 'Label')