Button Zend表单删除按钮
这听起来很简单,但对我来说,这也很让人困惑。我一直在制作一个表单来编辑一个已经存在的数据库条目。一些字段是根据联接表中的记录创建和填充的 这听起来有点粗略,所以我将尝试举例说明。我有一个名为content的表和一个名为Files的表,其中包含文件名和位置。我根据提供的内容id获取文件名,然后表单创建字段,然后用文件名填充这些字段Button Zend表单删除按钮,button,zend-framework,zend-form,factory,Button,Zend Framework,Zend Form,Factory,这听起来很简单,但对我来说,这也很让人困惑。我一直在制作一个表单来编辑一个已经存在的数据库条目。一些字段是根据联接表中的记录创建和填充的 这听起来有点粗略,所以我将尝试举例说明。我有一个名为content的表和一个名为Files的表,其中包含文件名和位置。我根据提供的内容id获取文件名,然后表单创建字段,然后用文件名填充这些字段 public function setFiles($files) { $i = 0; foreach ($files as $file) {
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函数,因此可以介于deleteConsedEditEM1
和之间deleteEncloseEditEM5000
取决于它推送到表单中的文件名数量
我怎样才能做到这一点?任何提示或建议都非常感谢:)只需使用路由即可。表单路由是指将操作
定向到相应的路由。表单操作中的路径将导致ZF中的路由使用关联的控制器和操作。HTML
只能有一个属性,表单在提交时路由到该属性。然而,客户端和服务器端都有克服这一问题的变通方法
服务器端
让所有按钮只需提交到表单的操作
(由表单代码中的$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;
});
解决此问题的最简单方法是只使用删除操作的链接,然后将其设置为按钮样式。
或者,您可以对一个表单使用两个按钮,您只需对它们进行不同的标记,并在POST上测试标签名称
if ($this->getRequest()->getPost('submit') == 'Label')
我已经研究过这个解决方案,但遗憾的是,它给我带来了另一个问题。虽然它确实按预期工作,但它确实产生了一个问题。它适用于表单上的所有提交按钮,包括我实际上只想提交表单的按钮。所以,如果我能找出如何检查这些按钮中的哪一个被按下,然后决定要走哪条路线,那就行了。看看我的问题,我意识到我没有提到这个按钮,所以我将对它进行编辑:)@Björn坦率地说,我并不喜欢这个解决方案,但就实现控制器和操作而言,这是唯一的解决方案。我更喜欢一个控制器/操作,并评估随帖子提交的参数。根据表格的不同,我将直接调用模型或使用\u forward()
。请注意,操作也链接到视图。遗憾的是,客户端版本无法正常工作。似乎找不到按下哪个按钮<代码>$('input.delete')。单击(函数(){
正在选取类型设置为delete的按钮,如果没有我自己的submit按钮扩展版本,我无法设置按钮属性类型。当我在顶部帖子中创建按钮元素时,它将是“button”,如果我决定创建submit按钮元素,它将是“submit”。目前正在尝试服务器端解决方案。我已获得服务器端版本正在运行,正如您所建议的,我已确定操作按钮已按下,并根据已将其转发到正确的操作,然后删除条目,然后重定向到上一个操作页面。我承认,首先,我在删除条目后再次转发,结果只会进入无限循环第二次尝试删除同一条记录时出现DB错误。幸运的是,改用重定向解决了这一问题。很高兴服务器端版本正常工作。至于客户端方法:当然可以更改$('input.delete'))
插入任何标识删除按钮的内容。如果您的删除按钮都是
,并且页面上没有其他
标记,您当然可以使用$('button')
。或者,可以肯定的是,$('button[name^=“DeleteEncloseEdItem”])
,它选择以DeleteEncloseEdItem
开头的name属性的按钮。这不起作用,$This->getRequest()->getPost()
将返回一个包含post变量的数组,并且没有名为'submit'
的变量。因此$This->getRequest()->getPost('submit')并不完全令人惊讶
不返回任何内容,因此无法与'label'
进行比较。您可以对通过的内容进行测试。通常,它是一个输入