我已经通读了 Zend-Framework 2 中 Form-Component 的教程/引用,也许我不知何故错过了它,所以我在这里问。
我有一个名为 Node
的对象并将其绑定(bind)到一个表单。我正在使用 Zend\Stdlib\Hydrator\ArraySerializable
-Standard-Hydrator。所以我的 Node
-object 有 exchangeArray()
和 getArrayCopy()
两个方法,如下所示:
class Node
{
public function exchangeArray($data)
{
// Standard-Felder
$this->node_id = (isset($data['node_id'])) ? $data['node_id'] : null;
$this->node_name = (isset($data['node_name'])) ? $data['node_name'] : null;
$this->node_body = (isset($data['node_body'])) ? $data['node_body'] : null;
$this->node_date = (isset($data['node_date'])) ? $data['node_date'] : null;
$this->node_image = (isset($data['node_image'])) ? $data['node_image'] : null;
$this->node_public = (isset($data['node_public'])) ? $data['node_public'] : null;
$this->node_type = (isset($data['node_type'])) ? $data['node_type']:null;
$this->node_route = (isset($data['node_route'])) ? $data['node_route']:null;
}
public function getArrayCopy()
{
return get_object_vars($this);
}
}
在我的 Controller 中,我有一个 editAction()
。我想修改这个 Node
对象的值。所以我正在使用表单的 bind
方法。我的表单只有修改 node_name
和 node_body
属性的字段。在验证表单并在提交表单后转储 Node
对象后,node_name
和 node_body
-properties 现在包含提交表单的值.然而,所有其他字段现在都是空的,即使它们之前包含初始值也是如此。
class AdminController extends AbstractActionController
{
public function editAction()
{
// ... more stuff here (getting Node, etc)
// Get Form
$form = $this->_getForm(); // return a \Zend\Form instance
$form->bind($node); // This is the Node-Object; It contains values for every property
if(true === $this->request->isPost())
{
$data = $this->request->getPost();
$form->setData($data);
// Check if form is valid
if(true === $form->isValid())
{
// Dumping here....
// Here the Node-object only contains values for node_name and node_body all other properties are empty
echo'<pre>';print_r($node);echo'</pre>';exit;
}
}
// View
return array(
'form' => $form,
'node' => $node,
'nodetype' => $nodetype
);
}
}
我只想覆盖来自表单(node_name
和 node_body
)的值,而不是其他值。它们应该保持不变。
我认为一个可能的解决方案是将其他属性作为隐藏字段提供给表单,但我不想这样做。
是否有可能不覆盖表单中不存在的值?
最佳答案
我重新检查了\Zend\Form 的代码,老实说,我只是猜到了如何解决我的问题。
我唯一改变的是 Hydrator。 Zend\Stdlib\Hydrator\ArraySerializable
似乎不适合我的情况。因为我的 Node
-Object 是一个对象而不是一个数组,所以我检查了其他可用的水化器。我找到了 Zend\Stdlib\Hydrator\ObjectProperty
-hydrator。它工作得很好。只有表单中可用的字段才会填充到绑定(bind)对象中。这正是我所需要的。似乎 ArraySerializable
-hydrator 重置了对象属性,因为它调用了绑定(bind)对象 (Node
) 的 exchangeArray
方法。在这种方法中,我将未给定的字段设置为 null
(请参阅我的问题中的代码)。另一种方法可能是更改 exchangeArray
方法,以便它仅在值不可用时设置值。
所以代码中的解决方案很简单:
$form = $this->_getForm();
$form->setHydrator(new \Zend\Stdlib\Hydrator\ObjectProperty()); // Change default hydrator
关于php - zf2 表单和对象绑定(bind),不清除未传递的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14029821/