2012-12-24 3 views
3

Я использую AnnotationForms, и я изменил свое стандартное действие редактирования из учебника, чтобы использовать аннотацию, а не стандартные формы.Zend Framework 2 - Форма аннотации - Bind не работает

Все работает, кроме $form->bind(), не заполняет значения. Поля формы остаются пустыми.

Я проверил свою переменную, которая должна быть привязана, и она установлена ​​и выглядит хорошо.

Вот мои действия:

$id = (int)$this->getEvent()->getRouteMatch()->getParam('id'); 
    if (!$id) { 
     return $this->redirect()->toRoute('album', array('action'=>'add')); 
    } 
    $album = $this->getEntityManager()->find('Album\Entity\Album', $id); 

    $builder = new AnnotationBuilder(); 
    $form = $builder->createForm(new \Album\Entity\Album()); 
    $form->add(new \MyVendor\Form\MyFieldset()); 
    $form->setBindOnValidate(false); 
    $form->bind($album); 

ответ

2

Хорошо, это было легко один!

Хитрость заключается в преобразовании объекта в массив и использовании setData() вместо привязки.

Я нашел решение hint here.

Для сохранения изменений вам по-прежнему нужен bind(). Если вы его не заметите, ошибка не произойдет, но она не сохранит ее.

$album = $this->getEntityManager()->find('Album\Entity\Album', $id); 
... 
$form->bind($album); 
$form->setData($album->getArrayCopy()); 
2

ClassMethods увлажняющие на самом деле работает на затруднительном, но имена элементов формы должны соответствовать формату строчного-подчеркивания (например:. Свойство объекта $moduleDisplayName, ClassMethods и ObjectProperty увлажняющих ожидать элемента формы Имени module_display_name

Zend\Form\Annotation по умолчанию создает элемент формы с именем moduleDisplayName Поэтому извлечение объекта в форме не работает

решение 1:.. Добавить в @Name Аннотация к объекту для ClassMethods для работы.

Пример:

/** 
* @Form\Name("module_display_name") 
protected $moduleDisplayName 

Раствор 2: Инстанцировать в ClassMethods Hydrator с помощью дополнительного параметра underScoreSeperatedKeys набор для false (по умолчанию true) или использовать ClassMethods::setUnderScoreSeperatedKeys(false). Затем ClassMethods будет вести себя как любой другой гидратор.

Гидратор ObjectProperty работает только по заявленным свойствам public. Но именование - это то же самое, что и с ArraySerializable (т. Е. Свойство $moduleDisplayName, элемент формы Name moduleDisplayName).

Гидратор Reflection работает на всех объектах. Именование совпадает с ArraySerializable.

Вывод: ClassMethods является одним из четырех гидрометок, который ожидает другую схему именования элементов элемента. Не слишком круто.

 Смежные вопросы

  • Нет связанных вопросов^_^