一页上显示的几个类别的Symfony 3评级表

时间:2017-06-21 20:15:10

标签: php forms symfony twig symfony-3.3

在某个Company(实体)页面上,我显示了公司可能拥有的多个Categories(实体)。对于显示的每个类别,我需要添加具有评级值的简单表单。因此,我创建了名为Rating的实体,并且我已生成RatingType。 现在我有问题显示每个显示的类别此表单,我只能在第一次category出现时显示表单,但是在Rating表单中它不能显示名称(id)应该连接的类别。

Rating实体已定义与ManyToOne(@ORM)相关的CategoryCompany

我很感激你的帮助,我该怎样处理。

我认为这个技巧位于Controller中,所以下面是我的代码:

    /**
     * @Route("/catalog/{id}.html", name="card_show")
     */
    public function cardShowAction(Company $company, Request $request)
    {
        $form = null;

        // @TODO: add verification if user is logged on => if ($user = $this->getUser()) 
        $rating = new Rating();
        $rating->setCompany($company);

        $form = $this->createForm(RatingType::class, $rating);
        $form->handleRequest($request);

        if ($form->isValid() && $form->isSubmitted()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($rating);
            $em->flush();
            $this->addFlash('success', "Your vote has been saved!");

            return $this->redirectToRoute('card_show', array('id' => $company->getId()));
        }


        return $this->render("default/catalog/show.html.twig", array(
            'card' => $company,
            'form' => is_null($form) ? $form : $form->createView()
        ));
    }

以下是RatingType代码:

class RatingType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('comment')
                ->add('vote')
                // ->add('userName')
                // ->add('ip')
                // ->add('createdAt')
                ->add('service')
                // ->add('company')
                ;
    }

    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Rating'
        ));
    }
}

1 个答案:

答案 0 :(得分:0)

每个Symfony表单只能在视图中呈现一次(至少没有讨厌的黑客攻击)。

我提出另一种方法。在你的模板中呈现尽可能多的简单html表单(根本没有与Symfony Forms绑定!),你有很多类别。然后,给每个形成另一个动作属性(例如" / catalog / {company_id} / category / {category_id} / vote")。然后,创建新操作,您将在其中解析,验证和使用Request对象中的数据。

如果您真的想使用Symfony表单完成所有这些操作,则需要生成尽可能多的Symfony Forms实例,以及您将拥有的多个类别。每个表单都需要具有唯一的名称和操作(或一些隐藏字段),以便用户投票。