儘管這是一個老問題,以爲我反正回答。以前的答案不使用Doctrine的ObjectSelect
。
你說有OneToOne關係,不希望記錄添加到「單表」;我假設你在這裏有一個Uni-directional OneToOne的關係。
但是,如果你有「產品」和「品牌」作爲實體OneToMany Bi-directional關係可能更適合;)
與OneToOne然而去,你的實體應該是這樣的:
class Brand {
/**
* @var int
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
* @var string
* @ORM\Column(name="name", type="string", nullable=false, length=128)
*/
protected $name;
//Getters/Setters
}
class Product {
/**
* @var int
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
* @var string
* @ORM\Column(name="name", type="string", nullable=false, length=128)
*/
protected $name;
//Change below "OneToOne" to "ManyToOne" for proper product + brand relationship. Just this change will leave it as uni-directional.
/**
* @var Brand
* @ORM\OneToOne(targetEntity="Brand", fetch="EAGER")
* @ORM\JoinColumn(name="brand", referencedColumnName="id")
*/
protected $brand;
//Getters/Setters
}
假設你的實體是正確的,你應該使用ObjectSelect
構建成Doctrine。
class ProductForm
{
/** @var ObjectManager */
protected $objectManager;
public function __construct($name = 'product-form', $options = [])
{
parent::__construct($name, $options);
}
public function init()
{
$this->add([
'type' => 'DoctrineModule\\Form\\Element\\ObjectSelect',
'name' => 'brand',
'required' => true,
'attributes' => [
'id' => 'selectBrand',
'multiple' => false,
'value' => null,
],
'options' => [
'label' => 'Select brand',
'object_manager' => $this->getObjectManager(),
'target_class' => Brand::class,
'property' => 'id',
'is_method' => true,
'find_method' => [
'name' => 'findBy',
'params' => [
'criteria' => [],
'orderBy' => ['name' => 'ASC'],
],
],
'empty_option' => '--- Select Brand ---',
'label_generator' => function (Brand $entity) {
return $entity->getName();
}
],
]);
}
/**
* @return ObjectManager
*/
public function getObjectManager()
{
return $this->objectManager;
}
/**
* @param ObjectManager $objectManager
*/
public function setObjectManager(ObjectManager $objectManager)
{
$this->objectManager = $objectManager;
}
}
確保設置Module.php
以便能夠加載此表單。將getServiceConfig()
函數添加到它。
public function getServiceConfig()
{
/** @var ServiceManager $sm */
return [
'factories' => [
'product_form' => function ($sm)
{
$form = new ProductForm();
$form->setInputFilter(new ProductInputFilter());
/** @var EntityManager $entityManager */
$entityManager = $sm->get('doctrine.entitymanager.orm_default');
//Set Doctrine ObjectManager
$form->setObjectManager($entityManager);
//Set Doctrine Object as Hydrator
$form->setHydrator(new DoctrineObject($entityManager, Product::class));
//Set Doctrine Entity
$form->setObject(new Product());
//Initialize elements onto form
$form->init();
return $form;
},
],
];
}
}
接下來,在Controller中加載表單。
$form = $this->getServiceLocator()->get('product_form');
===========================
注:這工作,直到Zend框架2.5.2
有關如何使用ZF2水合器獲得此項工作的任何更新?我正在實現一個hack,它可以從一個實體手動構造一個數組,並使用'setValueOptions'來設置它。你如何鏈接關聯的實體與選擇下拉菜單?例如:用戶可以有多個客戶端(ManyToMany),所以當我編輯用戶時,我需要一個'
@hohner只需查看DoctrineModule的文檔(github上的docs文件夾),Bakura寫了一篇驚人的自述文件;) – Sam 2013-02-05 18:39:38