1
如果我使用ZF2和Doctrine開發一個項目,該對象具有與Doctrine hydrator tutorial類似的多對多關係,則父字段集將顯示像這樣:如何在ZF2和Doctrine中以多對一的關係引用子元素
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
元素不再是一個集合,因爲只有其中的一個。然而,標籤仍然是一個字段,所以我想它進入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 …
這應該如何編碼?