1

Если я разрабатываю проект с использованием ZF2 и Doctrine, который увлажняет объект с отношением «Множество ко многим», подобное этому Doctrine hydrator tutorial, родительский набор полей будет выглядеть как это:Как ссылаться на дочерние элементы в отношениях «много-к-одному» в ZF2 и доктрине

namespace Application\Form; 

use Application\Entity\BlogPost; 
use Doctrine\Common\Persistence\ObjectManager; 
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator; 
use Zend\Form\Fieldset; 
use Zend\InputFilter\InputFilterProviderInterface; 

class BlogPostFieldset extends Fieldset implements InputFilterProviderInterface 
{ 
    public function __construct(ObjectManager $objectManager) 
    { 
     parent::__construct('blog-post'); 

     $this->setHydrator(new DoctrineHydrator($objectManager)) 
      ->setObject(new BlogPost()); 

     $this->add(array(
      'type' => 'Zend\Form\Element\Text', 
      'name' => 'title' 
     )); 

     $tagFieldset = new TagFieldset($objectManager); 
     $this->add(array(
      'type' => 'Zend\Form\Element\Collection', 
      'name' => 'tags', 
      'options' => array(
       'count'   => 2, 
       'target_element' => $tagFieldset 
      ) 
     )); 
    } 

    public function getInputFilterSpecification() 
    { 
     return array(
      'title' => array(
       'required' => true 
      ), 
     ); 
    } 
} 

и элементы формы могут быть доступны с точки зрения, как это:

// edit.phtml: 

// ... 

$bpfs=$form->get('blog-post'); 
$tfss=$bpfs->get('tags')->getFieldsets(); 
$tfs=$tfss[0]; 

$tagName = $tfs->get('name'); 

// ... 

Однако, если я хочу использовать много-к-одному, я не знаю, как для кодирования дочерних элементов. В BlogPost Fieldset я предполагаю, что элемент tag больше не является коллекцией, потому что будет только один из них. Тем не менее, тег еще FIELDSET, так что я думаю, что он идет в BlogPost Fieldset, как это:

$tagFieldset = new TagFieldset($objectManager); 
$this->add(array(
    'name' => 'tag', 
    'options' => array(
     'target_element' => $tagFieldset 
    ) 
)); 

(Это одна запись, поэтому я изменил название на tag Это не коллекция, не делает. это, кажется, какие-либо другие элементы формы ZF2, поэтому я упал заявление на type атрибут)

Тогда в представлении, я пытаюсь получить доступ к элементам формы, как это:.

// edit.phtml: 

// ... 

$bpfs=$form->get('blog-post'); 
$tfs=$bpfs->get('tag')->getFieldsets(); 

$tagName = $tfs->get('name'); 

// ... 

, но это дает ошибка,

Fatal error: Call to undefined method Zend\Form\Element::getFieldsets() in … 

Как это правильно закодировать?

ответ

1

Поскольку tag только один FIELDSET, вы должны сделать это:

$tfs=$bpfs->get('tag'); 
$tagName = $tfs->get('name');