2016-11-08 3 views
1

Проблема: несколько полей в форме не заполняются/не гидратируются при использовании $ form-> bind ($ object). Как вы заполняете 2 разных поля в форме vai 2 разных объекта сущности? У меня 2 fieldsets: FieldsetA, FieldsetBzf2/zf3 Гидрат Несколько полей с объектами

форма RegisterFrom называет их в своей инициализации() метод

class RegisterForm extends Form 
{ 
    public function init(){ 
     $this->add(array(
       'name' => 'service_provider_fieldset', 
       'type' => ServiceProviderFieldset::class, // this is one model/entity 
     )); 

     $this->add(array(
       'name' => 'location_fieldset', 
       'type' => LocationFieldset::class, // this is a separate model/entity 
     )); 
} 
} 

Создание fieldsets: (обратите внимание закомментированы попыток гидратации)

class ServiceProviderFieldset extends Fieldset 
{ 
    public function init(){ 
     //parent::__construct($name); 
     /* 
     $this 
     ->setHydrator(new ClassMethodsHydrator(false)) 
     ->setObject(new ServiceProvider()) 
     ; 
     */ 

     /* 
     $this 
     ->setHydrator(new ReflectionHydrator(false)) 
     ->setObject(new ServiceProvider()) 
     ; 
     */ 

     $this->add(array(
       'type'=>'Hidden', 
       'name'=>'id', 
       'options'=>array(
         'label' => 'Service Provider Id' 
       ), 
       'attributes'=>array(
         'id'=>'providerId' 
       ) 
     )); 
} 
} 

Контроллер:

$provider = $this->findServiceProviderById($providerId); // this is set from DB call and correctly creates a Provider() object with populated values. 
    $location = $this->findServiceProviderLocationById($locId); 
    $form = $formManager->get(RegisterForm::class); 
    $form->bind($provider); 
    $form->bin($location); 
// $form->get('service_provider_fieldset')->bindValues(...); 

Вид:

$formElement = $form->get('service_provider_fieldset')->get('email'); 
etc... 

Форма отображается правильно, но без заполненных данных.

ПРИМЕЧАНИЕ: НЕ использовать Доктрину, но я извлекаю данные из БД ОК. ПРИМЕЧАНИЕ: ЕСЛИ я устанавливаю этот флаг 'use_as_base_fieldset' => true,, тогда 1 из объектов (ServiceProvider) заполняет, наоборот, если я установил поля местоположения в значение «истина», то это заполняется. Я искал пару часов, проб и ошибок без успеха, и я надеюсь, что это просто моя усталость, которая пропустила простой шаг настройки/конфигурации, чтобы заставить это работать.

Резюме: Как вы заполняете 2 или более поля с 2 или более объектами внутри формы? Bind(), fieldset-> bindValues ​​() ?,

Пробовал:

$form->get('service_provider_fieldset')->allowObjectBinding(true); 
     $form->get('service_provider_fieldset')->allowedObjectBindingClass(\Provider\Form\ServiceProviderFieldset::class); 

Вот некоторые ссылки, которые близки, но до сих пор не могут заполнить оба набора полей через отдельные объекты. ZF2 Form Hydration with multiple objects and fieldsets https://framework.zend.com/manual/2.4/en/modules/zend.form.collections.html hydrating multiple objects from fieldsets ZF2

Коллекция (продукт/бренд/категория) пример подразумевает 'единую' коллекцию с помощью 'use_as_base_fieldset' => верно, используется для связывания() ...?

+0

UPDATE: Я смог обработать процесс, используя пример документа коллекции в приведенной выше ссылке. Используйте один набор полей, который имитирует модель, которая имеет отношения 1: 1, 1: многие. Вопрос по-прежнему стоит - Как заполнить форму двух или более полей с несвязанными объектами –

+0

Пример включает регистрационную форму с капчей. Я могу создать функцию addRecaptcha в форме, которая работает (но тогда я должен повторить это для каждой формы [или расширить абстрактную форму]) –

+0

Вы решили свою проблему? У меня одно и то же ... одно предложение. форма 'init()' используется при получении набора полей с фабрики. если у вас просто простые входы, вы можете просто включить их в метод '__construct()' для набора или формы поля. –

ответ

0

На веб-странице проверьте имена элементов формы, которые относятся к вашим полям. Они должны быть примерно такими: yourFieldsetName[yourElementName]. Если вы просто видите yourElementName, это, скорее всего, означает, что забыли prepare() вашу форму в сценарии просмотра.

Это именно то, что случилось со мной, и после того, как я создал форму, все объекты были увлажнены без проблем.

UPDATE = ответ на вопросы комментариев: не разрешено как таковое. Это плохой дизайн? Примечание. Я использую prepare() в представлении.

Если все работает нормально, ваши 2 объекта должны гидратироваться. Флаг use_as_base_fieldset используется, в основном, для того, чтобы сказать: «Эй, это я (набор полей), вы должны только увлажнять объект данными/извлекать данные из объекта». Итак, что вы получаете, когда один объект гидратируется, а другой нет, и наоборот предсказуем. Трудно сказать, что происходит, не глядя на ваш полный код.Я боюсь, что публикация слишком много займет время, когда собеседник сможет понять, и мой опыт заключается в том, что такие вопросы, как правило, остаются без ответа. То, что я обычно делаю в таких ситуациях, как ваш, заключается в том, что я шаг за шагом иду по методам Zend Form и Fieldset s, используемым для гидратации/извлечения. Я использую \Zend\Debug\Debug::dump($somethingThatYouWantToCheck); die();. Это не лучший метод, который я предполагаю, но он работает.

Если бы я был вами, я бы тоже сделал следующее.

  1. С вашего поста, не ясно, почему вы используете метод init() формы. Метод init() используется, когда вы хотите, чтобы некоторые элементы в вашей форме заполнялись из БД (например, <select>). Form запускает метод init(), когда некоторые вещи, которые недоступны в методе __construct(), пока не созданы, но только после того, как создается экземпляр формы (не уверен на это, дважды проверьте это).

  2. Не беспокойтесь о хорошем/плохом дизайне. Дизайн - это очень хорошо, но если у вас небольшая или средняя система, соображения дизайна не повлияют на производительность/сложность системы. Но скорее вы потратите действительно много времени, делая все правильно, чем просто делаете это, и если он работает нормально, забывая об этом.

  3. Если вы не хотите идти с \Zend\Debug\Debug::dump($somethingThatYouWantToCheck); die(); (это может быть довольно утомительно, я знаю), создайте один набор полей и приложите к нему желаемые 2 поля. Затем включите этот набор полей в форму и используйте use_as_base_fieldset = true в этом наборе полей (конечно, вам также необходимо создать объект, соответствующий этому набору полей, с двумя вложенными объектами, которые привязаны к вашим текущим полям, и привязать объект к набору полей).

Надеюсь, что это поможет хотя бы немного.

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