Symfony 2表单以日期为关键但不在表单上

时间:2015-12-03 16:02:41

标签: php forms symfony

所以我在symfony中有这个简单的表单,我只有3个字段。所有在这里工作的ID都是一个不在表单上但在数据库中的实体是df_date列,它在DB中的类型为DATE。

以下是该实体:

 /**
 * @ORM\Column(type="date")
 * @ORM\Id
 */

 protected $df_date;

 /**
 * Set df_date
 *
 * @param \DateTime $dfDate
 * @return WeatherSpecials
 */

public function setDfDate($dfDate)
{
    $this->df_date = $dfDate;

    return $this;
}

/**
 * Get df_date
 *
 * @return \DateTime 
 */

public function getDfDate()
{
    return $this->df_date;
}

控制器:

    public function ajax_weather_specialsAction(Request $request, $main_id)
{

    $params = array();

    if (!$main_id) {
        /*
        $repository = $this->getDoctrine()
            ->getRepository('AppBundle:WeatherSpecials');
        $weather_specials = $repository->find($main_id);
        */
    } else {
        $weather_specials = new WeatherSpecials;
    }

    $form = $this->createFormBuilder($weather_specials)
        ->add('df_weather', 'choice', array(
            'choices'  => array(
                null, 'SU', 'PC', 'CL', 'RN'
            ),
            'label' => false, 'required' => true,
        ))
        ->add('df_temptur', 'number', array('label' => false, 'required' => true))
        ->add('df_specday', 'text', array('label' => false, 'required' => false))
        ->add('save', 'submit', array('attr' => array('class' => 'btn btn-primary')))
        ->getForm();

    $form->handleRequest($request);

    if ($form->isSubmitted()) {
        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($weather_specials);

            // How to set df_date here???

            $em->flush();
        }
    }

    $data['status'] = 'success';
    $data['html'] = $this->render('sales_tabs/weather_specials.twig', array('form' => $form->createView()))->getContent();

    return new JsonResponse($data);
}

问题是,如何在将表单保存到数据库之前设置df_date?

3 个答案:

答案 0 :(得分:0)

假设~/.vimrc是您要设置WeatherSpecials的实体,请先保留它;

df_date

或使用doctrine HasLifecycleCallbacks;

if ($form->isValid()) {
    $em = $this->getDoctrine()->getManager();
    $weather_specials->setDfDate(new \DateTime());
    $em->persist($weather_specials);
    $em->flush();
}

答案 1 :(得分:0)

您可以在保留实体之前手动设置日期。

考虑以下代码

if ($form->isSubmitted()) {
    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();

        $weather_specials->setDfDate(new \DateTime());

        $em->persist($weather_specials);
        $em->flush();
    }
}

这会将日期设置为当前日期和时间。您可以根据需要更改日期时间值。

您甚至可以使用Doctrine的preUpdateprePersist回调。

更新您的实体定义不正确。您应该将$df_date定义为\Datetime参数。在您的代码中更改此内容

/**
* @var \datetime
* @ORM\Column(type="date")
* @ORM\Id
*/

protected $df_date;

//the rest of your stuff

答案 2 :(得分:0)

我发现了这个问题,并且Doctrine可以用它的建议亲吻我的......花了我3天的时间来计算出这一个,我花了5分钟时间用PHP来计算它。 enter link description here