передать данные в форму в коллекции типа Symfony - PullRequest
0 голосов
/ 26 декабря 2018

Я использую symfony4.1 и я создал форму с помощью компоновщика, например:

->add('products', CollectionType::class, array(
        'entry_type'    =>   FrontProductsType::class,
        'entry_options' => [
            'label' => 'Produkt',

        ],
        'label'        => 'Dodaj produkty',
        'allow_add'    => true,
        'allow_delete' => true,
        'prototype'    => true,
        'required'     => false,
        'attr'         => [
            'class' => 'products-select',
        ],
    ))

, и мой вопрос заключается в том, как передать данные в этот класс сущностей внутри типа коллекции?

Вот эта встроенная форма:

 public function buildForm(FormBuilderInterface $builder, array $options)
  {
    $builder
    ->add('product', EntityType::class, array(
      'placeholder' => 'Wyszukiwarka',
      'mapped' => false,
      'multiple' => false,
      'class' => Products::class,
      'data' => $options['product'],

      'attr' => [
        'class' => 'chosen-select order_product',
        'data-placeholder' => 'Wybierz produkt',
        ],
        'choice_attr' => function($product) {
          $cena = $product->getJson()["products"]["cena"];
          $stock = $product->getJson()["products"]["stock"];
          $vat = $product->getJson()["products"]["vat"];
          return array(
            'class' => 'single_option',
            'single_price' => $cena,
            'stock_available' => $stock,
            'single_vat' => $vat,
          );
          },

          'choice_label' => function ($product) {
            return '' . $product->getJson()["products"]["name"] . ' | Stan Magazynowy: ' . $product->getJson()["products"]["stock"] . ' | Cena netto: ' . $product->getJson()["products"]["cena"] .'';
            },
            'label' => 'Wybierz produkty'

          ))
          ->add('quantity', IntegerType::class, [
            'label_attr' => array('class' => 'bmd-label-floating'),
            'label' => 'Ilość',
            'mapped' => false,
            'required' => true,
            'data' => $options['quantity'],
            'attr' => [
              'class' => 'form-control single-quantity-field',
              ]])
              ->add('cena', TextType::class, [
                'label_attr' => array('class' => 'bmd-label-floating'),

                'label' => 'Koszt brutto',
                'mapped' => false,
                'required' => true,
                'data' => $options['cena'],
                'attr' => [
                  'read_only' => true,
                  'class' => 'form-control single-price-field'],
                ]);

                $builder->get('product')->addEventListener(
                  FormEvents::POST_SUBMIT,
                  function (FormEvent $event) {
                    $form = $event->getForm();
                    $json = $form->getData()->getJson();
                    $data = $form->getData();
                    foreach ($json as $prop) {
                      foreach ($prop as $key => $value) {
                        $$key = $value;
                      }
                    }
                    $cena = number_format($cena, 2);
                    $form->getParent()->add('cena',TextType::class, [
                      'label_attr' => array('class' => 'bmd-label-floating'),
                      'label' => 'Koszt brutto',

                      'mapped' => false,
                      'required' => true,
                      'data' => $cena,
                      'attr' => [
                        'read_only' => true,
                        'class' => 'form-control single-price-field', 'value' => $cena],
                      ])
                      ->add('quantity', IntegerType::class, [
                        'label_attr' => array('class' => 'bmd-label-floating'),
                        'label' => 'Ilość',
                        'mapped' => false,
                        'required' => true,
                        'attr' => [
                          'class' => 'form-control single-quantity-field',
                          'min' => 1,
                          'max' => $stock,
                          ]]);
                        }
                      );
                    }


                    public function getBlockPrefix()
                    {
                      return 'product';
                    }

                    public function configureOptions(OptionsResolver $resolver)
                    {
                      $resolver->setDefaults([
                        'data_class' => Products::class,
                        'product' => null,
                        'quantity' => null,
                        'cena' => null
                      ]);
                    }

                  }

Все выглядит хорошо, когда я сохраняю.Когда я пропускаю некоторые продукты, в массиве появляется ряд продуктов, но не передаются значения, которые нужно установить в расширенной форме.Любая идея, как передать данные, чтобы заполнить под форму из collectiontype?

1 Ответ

0 голосов
/ 14 июня 2019

Если основная форма (назовем ее YourFormType) не имеет data_class, вы можете установить данные через массив, индексируя по имени поля.

$form = $this->createForm(YourFormType::class, ["products" => $array_of_Products]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...