自定义FormType中的自定义变量

时间:2019-02-16 16:49:32

标签: symfony symfony-forms

关于将自定义变量传递到自定义FormType的一些问题

我有一个名为KontoType的自定义FormType:

我将一些自定义变量传递给它,并且它的工作原理与预期的一样,如果我重写方法buildForm并转储传递的$ options数组,则该mandant存在并且是一个实体。

但是我现在如何才能将此自定义变量传递给函数getChoices(),该函数将基于此自定义FormType中的要求加载选择内容?

即使我确实在覆盖buildForm函数中重置了$ options,例如$ options ['choices'] = $ this-> getChoices($ options ['mandant']),如果我呈现此表单,选择框也为空。

<?php

namespace App\Form\Type;

use App\Entity\Core\Finanzen\Konto;
use App\Entity\Core\Organisation\Mandant;
use App\Services\LocaleService;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Translation\TranslatorInterface;

class KontoType extends AbstractType
{

    /**
     * @var ObjectManager
     */
    private $manager;
    /**
     * @var TranslatorInterface
     */
    private $translator;
    /**
     * @var LocaleService
     */
    private $localeService;

    public function __construct(ObjectManager $manager, TranslatorInterface $translator, LocaleService $localeService)
    {
        $this->manager = $manager;
        $this->translator = $translator;
        $this->localeService = $localeService;

    }

    private function getChoices(Mandant $mandant=null)
    {
        return $this->manager->getRepository(Konto::class)->findBuchbar(true, $mandant);
    }


    public function configureOptions(OptionsResolver $resolver) {
        $resolver->setDefaults(array(
            'label' => 'konto.name',
            'help' => 'konto.help',
            'choices' => null,
            'attr' => array(
                'class' => 'bs-select',
                'aria-hidden' => 'true',
                'ref' => 'input',
                'multiple' => false,
                'tabindex' => 1,
                'data-live-search' => true,
                'data-size' => 6
            ),
            'choice_label' => function ($choiceValue, $key, $value) {
                return $choiceValue->getKonto()." ".$this->localeService->doTranslate($choiceValue);
            },
            'choice_value' => function(Konto $konto = null) {
                return $konto ? $konto->getId() : '' ;
            },
            'required' => true,
            'multiple' => false,
            'empty_data' => null,
            'label_attr' => array(
                'class' => 'control-label'
            ),
            'placeholder' => 'message.bitte wählen',
            'mandant' => null
        ));
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $options['choices'] = $this->getChoices($options['mandant']);
        parent::buildForm($builder, $options); // TODO: Change the autogenerated stub
    }


    public function getParent() {
        return ChoiceType::class;
    }
}

0 个答案:

没有答案