2012-05-31 104 views
0

这听起来很容易,但对我来说,这是令人困惑的。我一直在编写一个表单来编辑已经存在的数据库条目。其中一些字段是根据连接表中的记录创建和填充的。Zend表格删除按钮

这听起来有点粗略,所以我会试着说明它。我有一个名为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之间变化,具体取决于它推入表单的文件名数量。

我该如何做到这一点?任何提示或建议非常感谢:)

回答

1

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

服务器端

  1. 让所有的按钮,只需提交表单的action
  2. 在这次行动中,确定哪个按钮被点击通过检查post((由$this->setAction(...)在窗体的代码中设置)或get)变量
  3. 根据点击的按钮重定向到正确的动作

客户端

使用按钮的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; 
}); 
+0

您的客户端版本是可悲的不工作。它似乎无法找到最大的按钮被按下。 '$(“input.delete”)。点击(函数(){ '正在加速按钮与要删除的类型,无需提交按钮我不能设置按钮属性类型的我自己的扩展版本,它会无论是“按钮”正如我在置顶的帖子创建一个按钮元素,或提交如果我会决定创建一个提交按钮元素。 目前正在尝试在服务器端解决方案。 –

+0

我已经得到了服务器端版本的工作,如你的建议,我有行动弄清楚至极按钮被按下,并根据该有它转发到正确的行动,至极然后删除条目,然后重定向到以前的操作页面。 我会承认,起初我后再次转发删除条目只会在一个无限循环中结束,只会被第二次删除同一条记录时发生DB错误而中断,幸运的是' s改为使用重定向。 –

+0

很高兴你有服务器端版本的工作。至于客户端方法:你当然可以把'$('input.delete')'改成标识你的删除按钮的东西。如果您的删除按钮全部为'

0

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

+0

我已经研究过这个解决方案,可悲的是,它对我造成了另一个问题。虽然它确实按预期工作,但它确实造成了一个问题。它适用于表单上的所有提交按钮,其中包括我实际上只想提交表单的那个按钮。 所以它会工作,如果我能找到如何检查至极这些按钮被按下,然后决定至极追随。 我的问题找我知道我还没有提到这个按钮,所以我会编辑:) –

+0

@比约恩坦率地说,我不喜欢这样的解决方案,但无论如何在实施控制器和动作这是唯一的解决方案方面。我更喜欢单个控制器/操作并评估与POST一起提交的参数。根据表单我将直接调用模型或使用'_forward()'。请注意,操作也链接到视图。 –

0

解决这一问题将是只使用一个链接,删除操作,然后样式它作为一个按钮的最简单方法。

或者您可以使用一种形式两个按钮,你就必须以不同的方式和测试标签他们为POST标签名称。

if ($this->getRequest()->getPost('submit') == 'Label') 
+0

这是行不通的,'$ this-> getRequest() - > getPost()'将返回一个包含post变量的数组,并且没有变量叫'submit'。因此,它不完全是一个惊喜,'$这个 - > Request()方法 - >的getPost(“提交”)'返回任何内容,因此无法进行比较,以''label'' –

+0

你有一些被传递,你可以测试反对。通常,它将是type = submit的输入元素,通常name = submit = submit或delete或者Label或...此元素将通过请求对象以name =>值的形式传递。 – RockyFord