0

好的,这是我正在尝试做的事情的快速概述。我有一个与“ClientDomain”实体有关系的“Client”实体。我需要一个表格来显示给定客户端的所有 ClientDomain 列表。在控制器中,我知道我需要过滤哪些客户端,但我不确定如何将该信息传递给 formBuilder。

继承人我到目前为止:

//src/NameSpace/ClientBundle/Entity/Client.php
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Client{
/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $client_id;

/**
 * @ORM\Column(type="string")
 */
protected $name;

/**
 * @ORM\OneToMany(targetEntity="ClientDomain", mappedBy="client")
 */
protected $domains;

...
}

和形式:

//src/LG/ClientBundle/Form/ClientDomainSelectionForm.php
namespace LG\ProjectBundle\Form\Projects;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class ClientDomainSelectionForm extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('client_domain', 'entity', array(
            'class' => 'LG\ClientBundle\Entity\ClientDomain',
            'query_builder'=> function(EntityRepository $er) {
                return $er->createQueryBuilder('cd')
                /* NEEDS TO FIND DOMAINS BY CLIENT X */
            },
            'property' => 'domain',
            'label' => 'Domain: '
        ));
    }
}

最后是控制器:

//src/LG/ClientBundle/Controller/DomainSelectorController.php
namespace LG/ClientBundle/Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; 

use LG\ClientBundle\Entity\Client;
use LG\ClientBundle\Entity\ClientDomain;
use LG\ClientBundle\Entity\ClientActiveDomain;
use LG\ClientBundle\Form\ClientDomainSelectionForm;


/**
 * @Route("")
 */
class DomainSelectorController extends Controller{

    /**
     * @Route("/client/{client_slug}/select-domain", name="lg.client.clientdomainselection.selectclient")
     * @Template
     */
    public function selectDomainAction(Request $request, Client $client){
        $activeDomain = new ClientActiveDomain();
        $form = $this->createForm(new ClientDomainSelectionForm(), $activeDomain );
        if ($request->isMethod('POST')) {
            $form->bind($request);
            if ($form->isValid()) {
                $em = $this->getDoctrine()->getEntityManager();
                $em->persist($activeDomain );
                $em->flush();
                return $this->redirect(/*huge long url*/);
            }
        }
        return array(
            'form' => $form->createView(),
        );
    }

}

如您所见,我可以访问控制器中的客户端实体,我只是不确定如何将其提供给表单构建器,以便它只会返回当前客户端的域。

4

1 回答 1

0

我找到了答案,你只需要在表单中添加一个构造函数并从控制器传递客户端,如下所示:

//src/LG/ClientBundle/Form/ClientDomainSelectionForm.php
namespace LG\ProjectBundle\Form\Projects;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class ClientDomainSelectionForm extends AbstractType {

    protected $client;

    public function __construct(Client $client) {
        $this->client = $client;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $client = $this->client;
        $builder->add('client_domain', 'entity', array(
            'class' => 'LG\ClientBundle\Entity\ClientDomain',
            'query_builder'=> function(\Doctrine\ORM\EntityRepository $er) use ($client) {
                return $er->createQueryBuilder('cd')
                    ->where('cd.client = :client')
                    ->orderBy('cd.domain', 'ASC')
                    ->setParameter('client',$client->getClientId());
            },
            'property' => 'domain',
            'label' => 'Domain: '
        ));
    }
}

然后在控制器中:

//src/LG/ClientBundle/Controller/DomainSelectorController.php

...

public function selectDomainAction(Request $request, Client $client){

    ...

    $form = $this->createForm(new ClientDomainSelectionForm($client), $activeDomain );

    ...
}

...
于 2013-03-02T01:54:34.563 回答