Bendy
Bendy

Reputation: 3576

How should a `FormType` be structured in order to include an `EntityType` field which doesn't exist in the `FormType` entity?

Taking the below as an example, OrderType is based on the entity Order. The form that is required needs to contain the following two EntityType dropdowns within it:

The identifying Category variables (Category_id and CatName) only exists within the Product entity (the Order can include multiple Products) and as a result, Symfony throws back an error saying:

Neither the property "category_id" nor one of the methods "getcategory_id()", "category_id()", "iscategory_id()", "hascategory_id()", "__get()" exist and have public access in class "AppBundle\Entity\Order".

Is there a way that this Category field can be included even though it doesn't exist in the Order entity?

It doesn't seem right to add category_id to the Order entity. I was thinking of something along the lines of below using 'mapped'=>'false' but I can't get it to work:

    $builder
        ->add('category_id','entity',array(
            'class'=>'AppBundle:Product',
            'placeholder' => '-- Choose --',
            'choice_label'=>'CatName',
            'mapped'=>'false',
            'query_builder'=>function(EntityRepository $er) {
                return $er->createQueryBuilder('p');
            }))

...and then after an Ajax response, feed in the category back in with $category?

        ->add('products','entity',array(
            'class'=>'AppBundle:Order',
            'placeholder' => '-- Choose --',
            'choice_label'=>'ProductName',
            'query_builder'=>function(EntityRepository $er, $category ) {
                return $er->createQueryBuilder('p')
                    ->where('p.category_id = :id')
                    ->setParameter('id', $category )
                    ->orderBy('p.ProductName','ASC');
            }));
    }

Upvotes: 1

Views: 153

Answers (1)

Cerad
Cerad

Reputation: 48883

As you say, adding a Category property to the Order entity just for forms is less than ideal. What I would do is make a OrderCategoryType and pass in Order and Category as an array.

// Controller
$order = new Order();
$category = new Category();  // Or create from $order->getProduct()
$data = ['order' => $order, 'category' => $category);

$form = $this->createFormBuilder($data)
  ->add('order',new OrderType(),
  ->add('category',new CategoryType()
);

You will have to do some messing around to keep everything in sync but it should work just fine.

Upvotes: 0

Related Questions