0

ここで、私がやろうとしていることの簡単な概要を示します。「ClientDomain」エンティティとの関係を持つ「Client」エンティティがあります。特定のクライアントのすべての ClientDomains のリストを表示するフォームが必要です。コントローラーでは、どのクライアントをフィルター処理する必要があるかはわかっていますが、その情報を 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 に答える