Symfony2 Custom Field Type to populate with values

This is an earlier Symfony2 Custom Type Type or Extension question.

I am trying to attach a custom field type for a product in an order. The name field will contain the product name, and the identifier field will be the product identifier.

I use FormEvents :: PRE_SET_DATA to try to fill in the data, but it throws an error, getData () returns Form \ Type \ ProductAutoCompleteType.

How can I fix the code?

OrderType has the following:

    $builder->add('product', new Type\ProductAutoCompleteType(), array(
        'data_class' => 'Acme\TestBundle\Entity\Product'
    ));        

ProductAutoCompleteType:

class ProductAutoCompleteType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
            ->add('name');
        $builder
            ->add('id');

    /* Turns out this is not needed any more
    $builder->addEventListener(
        FormEvents::PRE_SET_DATA, function (FormEvent $event) {
        $form = $event->getForm();
        $product = $form->getData();
        $form
            ->add('name', 'text', array('mapped' => false, 'data' => $product->getName()));
    }
    );  
    *//

    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
    }

    public function getParent()
    {
        return 'form';
    }

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

Update

Error: FatalErrorException: Error: calling the getProduct () member function for a non-object in the line /var/www/symblog/src/Acme/TestBundle/Form/Type/ProductAutoCompleteType.php 26

controller

    $em = $this->getDoctrine()->getManager();
    $order = $em->getRepository('AcmeTestBundle:Order')->find(6);

    $form = $this->createForm(new OrderType(), $order);

Updated 2

[product] [id] , , , [product] [id], [product]?

"id", "setId()", " set()" "__call()" "Proxies__CG\Acme\TestBundle\Entity\".

3

, submit , , , ?

        $data = $request->request->get($form->getName());
        if ($data['product']['id']) {
            $product = $em->getRepository('AcmeTestBundle:Product')->find($data['product']['id']);
            if ($product) {
                if ($product->getShop()->getId() != $order->getShop()->getId()) {
                    $form->get('product')->get('name')->addError(new FormError('Invalid shop product'));
                }
                $form->getData()->setProduct($product);
            } else {
                $form->get('product')->get('name')->addError(new FormError('A product must be selected'));
            }
        }
+4
1

. , .

, , , , $form->getData() null.

:

$form->getData() Product. $form->getParent()->getData() Order .

:

, , , .

:

findBy product, QueryBuilder . :

$order = $em->getRepository('AcmeTestBundle:Order')
  ->createQueryBuilder('order')
  ->select('order, product')
  ->innerJoin('order.product', 'product')
  ->where('order.id = :order_id')
  ->setParameter('order_id', $order_id)
  ->getQuery()
  ->getOneOrNullResult();

, , , , .

:

/**
 * @Entity(repositoryClass="Acme\TestBundle\Repository\OrderRepository")
 */
class Order {

class OrderRepository {
  public function findByIdWithProduct() {
    // $order = $this->createQueryBuilder...
    return $order;
  }
}
0

Source: https://habr.com/ru/post/1543575/


All Articles