2013-09-09 3 views
0

Я получаю PDOException в редактовом альбоме «SQLSTATE [23000]: Нарушение ограничения целостности: 1048« Художник-художник »не может быть нулевым». Я отлаживал код и обнаружил, что после того, как действие edit form выполнило все значения столбца (id, title, artist), изменилось на нулевое значение в инструкции insert, тогда как это должно быть значения POST формы редактирования. Я использую тот же код, что и учебник ZF2. $ request-> getPost() имеет правильные измененные значения, но $ form-> getData() возвращает значения пустой формы для (id, title, artist).Zend framework 2 редактировать альбом не работает

кто может помочь.

Мой код:

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, 
    ); 
} 
+0

Вы просто попробовали отладить код? Что находится в $ form-> getData()? –

+0

Он сказал, что он получает пустую форму с $ form-> getData() – 125369

+0

, конечно, он это сделал. Прости. : \ –

ответ

2

Согласно примеру ZF2, не должен он быть

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

вместо

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

Поскольку вы уже связывают $ альбом который придает модель форме. Это в основном делает две вещи

  1. Отображает начальные значения, получаемые из этого альбома с уникальным ID
  2. После проверки формы данные помещаются обратно в модель.

Просто попробуйте, что я предложил

+0

Кроме того, этот ответ не на 100% правилен. В [API] (http://framework.zend.com/apidoc/2.2/classes/Zend.Form.Form.html#getData) говорится, что getData возвращает либо массив, либо объект. Вы могли бы сделать привязку, как: '$ форма-> связывания (новый Entity());' и получить объект из '$ форма-> GetData();' См источники в [ zf2 github] (https://github.com/zendframework/zf2/blob/master/library/Zend/Form/Form.php#L522) –

+0

В этом случае он сделал это точно так, как вы упоминали – 125369

+0

Да, я изменил $ this-> getAlbumTable() -> saveAlbum ($ альбом); Но все же видя одно и то же исключение. Я попытался напечатать $ album values ​​в цикле if $ form-> isValid(), он вернулся (просто фрагмент здесь) Альбом \ Модель \ Альбом Объект ([id] => [title] => [artist] => [inputFilter: protected] => Zend \ InputFilter \ InputFilter Object – Desh

2

Возможно, вы испытывали тот же вопрос, как и я при создании Entity (Object Model), который должен был быть связан с формы объект.

Ошибку я сделал то, что я всегда обеспечивает новый экземпляр 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 цента в надежде помочь как-то, если это возможно.