php - zf2 表单和对象绑定(bind),不清除未传递的值

标签 php zend-form zend-framework2

我已经通读了 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_namenode_body 属性的字段。在验证表单并在提交表单后转储 Node 对象后,node_namenode_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_namenode_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/

相关文章:

php - ZF2 : Return JSON only for Ajax Call

php - 使用 Doctrine 插入数据 - 存储库与实体

php - 错误 : Unable to find the controller for path "/login_check". 路由配置错误。 (LexikJWTAuthentication)

javascript - 使图像在所有设备上响应

php - Zend 框架表单与 jquery

php - Zend RegEx Validator 的自定义有意义的错误消息

zend-form - 如何将 'plain text node'添加到zend表单中?

php - Zend Framework 2 在 View 中显示 View

javascript - 使用 jQuery.ajax 请求将对象数组发送到 PHP 函数

php - 加载页面时间过长 - 分析系统