0

好吧,这听起来很容易,但对我来说,这真是令人困惑。我一直在处理一个表单来编辑一个已经存在的数据库条目。一些字段是根据连接表中的记录创建和填充的。

这听起来有点粗略,所以我将尝试说明它。我有一个名为 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 函数因此可以介于deleteencloseditem1deleteencloseditem5000取决于它推送到表单中的文件名的数量。

我怎样才能完成这项工作?任何提示或建议都非常感谢:)

4

3 回答 3

1

一个 HTML<form>只能有一个action属性,表单在提交时路由到该属性。但是,客户端和服务器端都有解决此问题的方法。

服务器端

  1. 让所有按钮简单地提交到您的表单action$this->setAction(...)在您的表单代码中设置)
  2. post在此操作中,通过检查(或get)变量来确定单击了哪个按钮
  3. 根据单击的按钮重定向到正确的操作

客户端

使用按钮的click事件来确定单击了哪个按钮。我假设该按钮会ID告诉您有关您要删除的文件的信息。假设您给所有删除按钮 a 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;
});
于 2012-06-01T07:49:46.300 回答
0

只需使用路由。表单的路由意味着将其定向action到相应的路由。您在表单操作中的路径将导致 ZF 中的路由使用关联的控制器和操作。

于 2012-05-31T15:03:59.037 回答
0

解决此问题的最简单方法是仅使用删除操作的链接,然后将其设置为按钮。

或者,您可以在一个表单中使用两个按钮,您只需对它们进行不同的标记并在 POST 上测试标签名称。

if ($this->getRequest()->getPost('submit') == 'Label')
于 2012-06-01T11:31:44.297 回答