【问题标题】:Zend framework 2 edit album not workingZend 框架 2 编辑专辑不工作
【发布时间】:2013-09-09 12:53:41
【问题描述】:

我在编辑专辑“SQLSTATE[23000]:完整性约束违规:1048 列'艺术家'不能为空”中收到 PDOException。我调试了代码,发现编辑表单操作运行后,所有列(id,title,artist)值在插入语句中更改为空值,而它应该是编辑表单的 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,
    );
}

【问题讨论】:

  • 您刚刚尝试调试代码吗? $form->getData() 中有什么?
  • 他说他用 $form->getData() 得到空表单
  • 他当然做到了。对不起。 :\

标签: php zend-framework zend-framework2


【解决方案1】:

按照ZF2的例子,不应该是这样

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

而不是

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

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

  1. 显示从具有唯一 ID 的专辑中获取的初始值
  2. 验证表单后,数据将放回模型中。

试试我的建议

【讨论】:

  • 另外,这个答案也不是 100% 正确的。 API 表示 getData 返回一个数组或一个对象。您可以像这样进行绑定:$form->bind(new Entity()); 并从$form->getData(); 接收对象请参阅zf2 github 的源代码
  • 在那种情况下,他完全按照你提到的那样做
  • 是的,我已更改为 $this->getAlbumTable()->saveAlbum($album);但仍然看到同样的异常。我尝试在 if 循环 $form->isValid() 中打印 $album 值,它返回(这里只是一个 sn-p)Album\Model\Album 对象([id] => [title] => [artist] => [inputFilter:protected] => Zend\InputFilter\InputFilter 对象
  • 您确定在编辑专辑之前,数据已经保存到数据库中,即该行的数据存在,如果存在,则可以在您的模型中访问该数据。我也会尝试在$album = $this->getAlbumTable()->getAlbum($id); 之后调试 $album 值
  • 是的,由于 $form->bind($album),数据在编辑之前仍然存在。 $request->getPost() 也正确获取 POST 值。语句后 $form->setData($request->getPost());我无法访问 $album 的新编辑值。甚至 $form->getData() 里面也有空值。
【解决方案2】:

也许您在创建要绑定到 FormEntity(模型对象)时遇到了同样的问题/em> 对象。

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

getInputFilter();

在调用$form->isValid() 之后,Zend Form 实际上正在查看是否有绑定到它的实体对象...如果是,那么它将调用$entity->getInputFilter(),在表单的$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 美分,希望能以某种方式提供帮助。

【讨论】:

    猜你喜欢
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    相关资源
    最近更新 更多