Symfony2复选框表单,根据复选框更改日期

时间:2012-01-23 07:07:17

标签: forms validation symfony checkbox

出于测试目的,我使用Symfony2创建了一个轻型库在线工具。

我有一个链接到其他实体的Borrow实体。我想创建一个表单来验证给定用户借用的图书的返还。

我收集了与用户未归还的图书相对应的所有Borrow条记录。

现在,我想创建一个带有复选框列表的表单,以验证用户返回的图书。 在那之后,我可以做出类似的事情(这不是问题)。

if ($this->getRequest()->getMethod() == 'POST')
{
    $form->bindRequest($this->getRequest());

    if ($form->isValid())
    {
        $obj_list = $form->getData();
        foreach ($obj_list as $obj)
        {
                $obj->setBorrowEndDate(...); // Today's datetime

                $em = $this->getDoctrine()->getEntityManager();
                $em->persist($obj);
                $em->flush();
        }
        return $this->redirect($this->generateUrl('index'));
    }
    else
    {
        $args['problem']=$form->errors();
    }
}
// Continuation : creation of the form

2 个答案:

答案 0 :(得分:0)

我真的不明白你的问题,但我会尽力帮助你:

1)在您的实体(借阅)中创建一个名为“check”的类属性,例如,这取决于您的数据库:

private $check;

public function setCheck($check)
{
     $this->check = $check;
}

public function getCheck()
{
     return $this->check;
}

2)将其作为复选框输入添加到您的班级表单中。

$builder->add('check', 'checkbox')

3)然后,你有2个解决方案:

像这样更新它的setter:

public function setCheck($check)
{
    $this->check = $check;

    // Update borrow endtime
    if ($this->check === true && !$this->getBorrowEndDate()) {
        $this->setBorrowEndDate(new \DateTime());
    }
}

或使用学说lifecycles

/**
   * Called before persisting your entity
   * 
   * @ORM\prePersist
   */
public function prePersist()
{
    // Update borrow endtime
    if ($this->check === true && !$this->getBorrowEndDate()) {
         $this->setBorrowEndDate(new \DateTime());
    }
}

希望这能帮到你!

答案 1 :(得分:0)

而不是创建实体属性,您可以这样做:

    $builder->add('check', 'checkbox', [
        'mapped' => false
    ]);


    $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event)
    {
        $form = $event->getForm();
        $object = $event->getData();

        if($form->get('check')->getData() && !$object->getBorrowEndDate()) {
            $object->setBorrowEndDate(new \DateTime());
        }

        $event->setData($object);
    });