Button Zend表单删除按钮

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) {

这听起来很简单,但对我来说,这也很让人困惑。我一直在制作一个表单来编辑一个已经存在的数据库条目。一些字段是根据联接表中的记录创建和填充的

这听起来有点粗略,所以我将尝试举例说明。我有一个名为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函数,因此可以介于
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'
    进行比较。您可以对通过的内容进行测试。通常,它是一个输入