简体   繁体   中英

Symfony form dropdown for entries

I am starting with coding in Symfony and I have the following problem:

Assume I have two Entities 'Client' and 'Project'. They are stored with Doctrine.

A Client has a Id, Name and an Email A Project has a Id, client_id, name

So basically a project belongs to a Client and a Client has many projects.

My problem now:

When I'm creating a project, I want a dropdown with all possible clients. As I might be using a client drowpown somewhere else in my project I'm asking myself if there is a smart way to something like this:

class ProjectType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', 'text');
        $builder->add('client', new ClientListType()); 
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
                    'data_class' => 'AppBundle\Entity\Project'
                    ));
    }


    public function getName()
    {
        return 'project';
    }
}

class ProjectController extends Controller
{

    public function createAction(Request $request)
    {
        $project = new Project();
        $options = array( ... );
        $form = $this->createForm(new ProjectType(), $project, $options);
        $form->handleRequest($request);
        if($form->isValid()){
            // persist project
            return $this->redirectToRoute('show_projects');
        }
        return $this->render('AppBundle:Client:create.html.twig', array(
                    'form' => $form->createView()
                    ));
    }
}

Where ClientListType adds a select statement for all possible Clients to the form. And $form->isValid() checks if the client (id) is valid or not.

At the moment I have the followin code in ProjectType to generate the dropdown entries:

function __construct($clients)
{
    $this->clients = $clients;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('name', 'text');
    $builder->add('client', 'choice', array(
                'choices' => $this->buildChoices()
                ));
}

public function buildChoices()
{
    $res = array();
    foreach ($this->clients as $client) {
        $res[$client->getId()] = $client->getName();
    }
    return $res;
}

But I'm assuming there is a much better way to do this, because this seems like a common problem.

What I would do is simply this :

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('name', 'text')
            ->add('client', 'entity', array(
            'class'=>'AppBundle\Entity\Client',
            'property'=>'name'
        )); 
}

Hope this helps.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM