CE_
CE_

Reputation: 1118

Symfony - Filter a form with a CollectionType of Entity

I have two entities, client and order.

I have an admin interface where I show all the orders of a client, where I can modify or delete every order.

To do that I use a Collection Type:

My controller:

$form = $this->createForm(ClientConfigType::class, $client);

This is my ClientConfigType :

<?php

namespace App\Form;

use App\Entity\Client;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class ClientConfigType extends AbstractMainType {
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
            ->add("orders",
            CollectionType::class,
            [
                'entry_type' => OrderConfigType::class,
                'allow_add' => true,
                'label' => false
            ]);
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver) {
        $resolver->setDefaults(array(
            'data_class' => Client::class,
            'allow_extra_fields' => true,
        ));
    }
}

And my OrderConfigType is a classic formType. Everything is working perfectly without any filtering.

But I want to be able to filter and display my collectionType of Order. For Exemple I would like to display the order of a specific date or the orders > 100$, etc

I tried to use query builder but it's only working for EntityType and not CollectionType I tried to pass a variable from my Controller to my Form then to my Entity "get" function like that:

$minimumPrice = $request->query->get('minimumPrice');
$form = $this->createForm(ClientConfigType::class, $client, ['minimumPrice' => $minimumPrice ]);

Then in my ConfigType I can retrieve my variable in the configureOptions function but Then, I can't do anything to use that value to filter my collection Type.

How can I filter my collectionType ?

Upvotes: 3

Views: 2039

Answers (1)

Alexandre Painchaud
Alexandre Painchaud

Reputation: 462

Instead of passing minutePrice you can query like you want your orders, and pass order's collection to the form.

Example here:

class ClientConfigType extends AbstractMainType {
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
            ->add("orders",
            CollectionType::class,
            [
                'entry_type' => OrderConfigType::class,
                'allow_add' => true,
                'label' => false,
                'data' => $options['orderCollection']
            ]);
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver) {
        $resolver->setDefaults(array(
            'data_class' => Client::class,
            'orderCollection' => null,
        ));
    }
}
$orderCollection = $em->getRepository(Order::class)->findAll(); //something like this or custom query it s an example
$form = $this->createForm(ClientConfigType::class, $client, ['orderCollection' => $orderCollection ]);

Upvotes: 1

Related Questions