Symfony 2表单和DB表

时间:2014-06-01 11:16:20

标签: php forms symfony

我对symfony 2有另一个问题。

这是我的数据库架构: Database Schema

现在,问题。

当我在TranslationController中创建表单:addAction()来创建新的翻译时,我可以从lang表中选择语言,从字符串表中选择字符串。那没关系。问题是,我需要只选择项目所拥有的语言,并且只选择使用字符串id连接到此翻译的字符串。

我有这样的TranslationController:addAction():

/**
     * @Route("/project/{project_id}/string/{string_id}/translation/add/")
     * @Template()
     */
    public function addAction(Request $request)
    {
        $translation = new Translation();
        $translation->setCreatedBy('Vytvoril: ')
               ->setCorrectedBy('Koregoval: ')
               ->setText('Preklad: ')
               ->setNote('Poznámka');
        $form = $this->createFormBuilder($translation)
                ->add('createdBy', 'text')
                ->add('correctedBy', 'text')
                ->add('Text', 'text')
                ->add('note', 'text')
                ->add('lang', 'entity', array(
                    'class' => 'DomestosTranslatingBundle:Lang',
                    'expanded' => false,
                    'multiple' => false,
                    'property' => 'code',
                    ))
                ->add('string', 'entity', array(
                    'class' => 'DomestosTranslatingBundle:String',
                    'expanded' => false,
                    'multiple' => false,
                    'property' => 'code',
                    ))
                ->add('save', 'submit')
                ->getForm();

        $form->handleRequest($request);

        if($form->isSubmitted())
        {
            $em = $this->getDoctrine()->getManager();
            $em->persist($translation);
            $em->flush();
        }

        return $this->render('DomestosTranslatingBundle:Translation:add.html.twig', array(
            'form' => $form->createView(),
            )); 
    }

但是这段代码允许我选择在lang中创建的每种语言以及String表中的每个字符串,而不仅仅是那些已连接的语言。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

使用实体字段中的query_builder选项:

// ...
->add('string', 'entity', array(
    'class' => 'DomestosTranslatingBundle:String',
    'expanded' => false,
    'multiple' => false,
    'property' => 'code',
    'query_builder' => $em->getRepository('DomestosTranslatingBundle:String')
        ->createQueryBuilder('s')
        ->andWhere('s.project = :project')
        ->setParameter('project', $project)
))

将字符存储库中的查询构建器的创建移动到整理代码并且每次需要查询时都不要重复它可能会好得多。我假设上面的代码中有$em中的实体管理器和$project中的项目实例。

这里有一些要阅读的内容:http://symfony.com/doc/current/reference/forms/types/entity.html#query-builder

如果你想使用一个闭包:

// ...
->add('string', 'entity', array(
    'class' => 'DomestosTranslatingBundle:String',
    'expanded' => false,
    'multiple' => false,
    'property' => 'code',
    'query_builder' => function (EntityRepository $repository) use ($project) {
        return $repository->createQueryBuilder('s')
            ->andWhere('s.project = :project')
            ->setParameter('project', $project);
    }
))

请记住在您的类型定义或控制器中导入Doctrine\ORM\EntityRepository

由于您需要在表单类型中引用项目,因此可以向TranslationType类添加以下属性和方法:

protected $project;

public function setProject($p)
{
    $this->project = $p;

    return $this;
}

public function getProject()
{
    return $this->project;
}

在控制器中创建表单时,您可以执行以下操作:

$form = new TranslationType();
$form->setProject($project);

因此,在构建字段时,在定义闭包之前,您需要$project = $this->getProject(),并且项目实例可供闭包使用。