まず、私の英語で申し訳ありません。
私の注文エンティティ
* @ORM\Entity
* @ORM\Table(name="orders")
class Order implements InputFilterAwareInterface
{
...
/**
* Order status
*
* @ORM\OneToOne(targetEntity="Admin\Entity\OrdersStatus")
* @ORM\JoinColumn(name="status_id", referencedColumnName="id")
**/
private $status;
...
}
My Order's Statues Entity
* @ORM\Entity
* @ORM\Table(name="orders_statuses")
class OrdersStatus implements InputFilterAwareInterface
{
/**
* @var Zend\InputFilter\InputFilter
*/
protected $inputFilter;
/**
* @ORM\Id
* @ORM\Column(type="integer");
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string")
*/
protected $title;
}
私の注文フォーム
class OrderForm extends Form
{
public function __construct(EntityManager $entityManager)
{
parent::__construct('Order');
$this->setAttribute('method', 'post');
$this->setAttribute('class', 'itemForm');
$this->add(array(
'name' => 'id',
'attributes' => array(
'type' => 'hidden',
),
));
$this->add(array(
'name' => 'status',
'type' => 'DoctrineModule\Form\Element\ObjectSelect',
'options' => array(
'label' => 'Status',
'object_manager' => $entityManager,
'empty_option' => '--- Select status ---',
'target_class' => 'Admin\Entity\OrdersStatus',
'property' => 'title'
),
'attributes' => array(
'required' => false
)
));
}
}
私の注文コントローラー
class OrderController extends AbstractActionController
{
...
public function editAction()
{
$em = $this->getEntityManager();
$id = (int) $this->getEvent()->getRouteMatch()->getParam('id');
$item = new Stock\Entity\Order;
if ($id) {
$item = $em->getRepository($this->entity)->find($id);
}
$form = new Stock\Form\OrderForm($em);
$form->setHydrator(new DoctrineEntity($em, Stock\Entity\Order, false));
$form->bind($item);
$request = $this->getRequest();
if ($request->isPost()) {
$post = $request->getPost();
$form->setInputFilter($item->getInputFilter());
$form->setData($post);
if ($form->isValid()) {
$em->persist($item);
$em->flush();
return $this->redirect()->toRoute('stock/order', array('action' => 'index'));
}
}
...
}
注文ステータスを選択せずにフォームを検証しようとすると、次のエラーが発生しました:「値は必須であり、空にすることはできません」。
この入力フィルターを使用している場合:
public function getInputFilter()
{
if (!$this->inputFilter) {
$inputFilter = new InputFilter();
$factory = new InputFactory();
$inputFilter->add($factory->createInput(array(
'name' => 'client',
'required' => false,
)));
$inputFilter->add($factory->createInput(array(
'name' => 'status',
'allow_empty' => true,
'required' => false,
'filters' => array(
array('name' => 'Null'),
),
)));
}
}
私はこれを得ました: Admin\Entity\OrdersStatus のクエリの識別子 ID がありません
Null フィルターなし:
「SELECT t0.id AS id1, t0.title AS title2, t0.description AS description3 FROM orders_statuses t0 WHERE t0.id = ?」の実行中に例外が発生しました パラメータ付き [""]:
SQLSTATE[22P02]: 無効なテキスト表現: 7 エラー: 整数の無効な入力構文: ""
注文のステータスで空の値を許可する正しい方法は何ですか?