Symfony 2 - 每个实体实例的表单

时间:2014-08-25 11:53:50

标签: php forms symfony

我有一个时间段功能,用户必须能够编辑每个插槽的开头和结尾。

所以我想创建一个包含alle时隙的表单。我在symfony docs中将我的代码基于这篇文章:http://symfony.com/doc/current/cookbook/form/form_collections.html 问题是在本文中,应该将集合实例分配给某种父实体。在我的例子中,时间段是独立的,与另一个实体没有关系(在这个阶段是相关的)。

所以..我的问题:如何用我的时间段创建表单集合?

Controller.php这样

/**
 * @Route("/settings", name="settings")
 * @Template()
 */
public function settingsAction()
{
    $timeslots = $this->getDoctrine()->getRepository("ScheduleBundle:Timeslot")->findAll();

    $timeslots_form = $this->createFormBuilder()
        ->add('timeslots', 'collection', array(
            'type'   => new TimeslotType(),
        ))
        ->add('save', 'submit')
        ->getForm();

    return array(
        'timeslots' => $timeslots_form->createView()
    );
}

TimeslotType.php:

class TimeslotType extends AbstractType
{
        /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('start', 'time', array(
                'input'  => 'datetime',
                'widget' => 'choice',
            ))
            ->add('end', 'time', array(
                'input'  => 'datetime',
                'widget' => 'choice',
            ))
        ;
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Oggi\ScheduleBundle\Entity\Timeslot'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'timeslot';
    }
}

有什么想法? 提前谢谢!

1 个答案:

答案 0 :(得分:3)

将数组而不是实体传递给表单。表单可以处理得很好。

$timeslots = $this->getDoctrine()->getRepository("ScheduleBundle:Timeslot")->findAll();

$formData = array('timeslots' => $timeslots);

$timeslots_form = $this->createFormBuilder($formData) ...