Zend框架2编辑相册不起作用

时间:2013-09-09 12:53:42

标签: php zend-framework zend-framework2

我在编辑相册中遇到PDOException“SQLSTATE [23000]:完整性约束违规:1048列'艺术家'不能为空”。我调试了代码,发现在编辑表单操作运行后,所有列(id,title,artist)值都会更改为insert语句中的null值,而它应该是编辑表单的POST值。我使用与ZF2教程相同的代码。 $ request-> getPost()具有正确的已编辑值,但$ form-> getData()返回(id,title,artist)的空表单后置值。

任何人都可以帮忙。

我的代码是:

public function editAction()
{
    $id = (int) $this->params()->fromRoute('id', 0);
    if (!$id) {
        return $this->redirect()->toRoute('album', array(
            'action' => 'add'
        ));
    }
    $album = $this->getAlbumTable()->getAlbum($id);

    $form  = new AlbumForm();
    $form->bind($album);
    $form->get('submit')->setAttribute('value', 'Edit');

    $request = $this->getRequest();
    if ($request->isPost()) {
        $form->setInputFilter($album->getInputFilter());
        $form->setData($request->getPost());

        if ($form->isValid()) {
            $this->getAlbumTable()->saveAlbum($form->getData());

            // Redirect to list of albums
            return $this->redirect()->toRoute('album');
        }
    }

    return array(
        'id' => $id,
        'form' => $form,
    );
}

2 个答案:

答案 0 :(得分:2)

根据ZF2的例子,不应该是

$this->getAlbumTable()->saveAlbum($album);

而不是

$this->getAlbumTable()->saveAlbum($form->getData());

因为您已经绑定了将模型附加到表单的$ album。这基本上做了两件事

  1. 显示从该相册中获取的具有唯一ID
  2. 的初始值
  3. 验证表格后,数据将被放回模型中。
  4. 试试我的建议

答案 1 :(得分:2)

也许您遇到了与创建 (模型对象)时绑定到 表单<的问题相同的问题/ em> 对象。

我犯的错误是我总是从实体的方法提供一个新的InputFilter实例

  

getInputFilter();

在调用$form->isValid()之后,Zend Form实际上是在查看是否有绑定到它的实体对象......如果是这样,那么它会在表单内调用$entity->getInputFilter()。 ; s $this->bindValues()方法,在收到过滤器对象后,代码将返回$filter->getValues()来填充绑定模型。由于实体始终返回新的 InputFilter 实例,因此值自然为空/ null。

对我来说,错误是在实体(模型)中写了这样的东西:

    public function getInputFilter()
    {
        return new SomeInputFilter();
    }

但实际上,我需要编写这样的方法:

    public function getInputFilter()
    {
        if(empty($this->inputFilter)){
            $this->inputFilter = new SomeInputFilter();
        }

        return $this->inputFilter;
    }

正如您所看到的,解决方案是设置受保护的属性$inputFilter,并仅在InputFilter对象的新实例为空时填充它。在编写代码时没有彻底关注文档,并且在尝试插入记录时遇到了与您一样的问题(绑定模型中的空数据)。

希望你会发现这很有用,但如果没有,我很抱歉浪费你的时间阅读这篇文章。 :)

PS:感谢您阅读我的回答,我知道我对该主题的回答有点迟,但我最近开始使用Zend 2 Framework,我遇到了类似的问题,所以我试图分享我的2美分,希望尽可能以某种方式帮助。