Опция не существует ошибка при передаче опции из контроллера во встроенную форму Symfony

Я получаю следующую ошибку при попытке передать параметр моему методу buildForm в одной из моих форм.

Параметр «numOfHoles» не существует. Определенные параметры: «действие», «allow_extra_fields», «attr», «auto_initialize», «block_name», «by_reference», «cascade_validation», «соединение» "," ограничения "," csrf_field_name "," csrf_message "," csrf_protection "," csrf_provider "," csrf_token_id "," csrf_token_manager "," data "," data_class "," disabled "," empty_data " error_mapping, extra_fields_message, inherit_data, «намерение», «invalid_message», «invalid_message_parameters», «label», «label_attr», «label_format», «mapped», «max_length», «method», «шаблон» "," post_max_size_message "," property_path "," read_only "," required "," translation_domain "," trim "," validation_groups "," virtual ".

В моем контроллере:

// hardcoded here for brevity in this example
$form = $this->createForm('crmpicco_course_row', $courseRow, array('numOfHoles' => 18));

В crmpicco_course_row классе формы:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name', 'text')
        ->add('course', 'crmpicco_course', array('numOfHoles' => $options['numOfHoles']))
    ;
}

В crmpicco_course классе формы:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    for ($i = 0; $i < $options['numOfHoles']; $i++) {
        $builder->add($i, 'text', array('required' => 'false'));
    }
}

/**
 * @return string name
 */
public function getName()
{
    return 'crmpicco_course';
}

Кто-нибудь может понять, почему не протягивает вариант numOfHoles?


person crmpicco    schedule 26.10.2015    source источник
comment
Вы должны добавить параметр numOfHoles, используя функцию setDefaults или setRequired внутри configureOptions(OptionsResolver $resolver) вашего конструктора форм.   -  person gp_sflover    schedule 26.10.2015


Ответы (3)


Как вы обнаружили, у каждого типа формы есть предопределенный список опций. Добавление нового параметра требует небольшой корректировки. Фактический метод изменился в ходе разработки Symfony, поэтому вы можете столкнуться с некоторыми устаревшими устаревшими решениями.

Здесь обсуждается самое последнее решение: http://symfony.com/blog/new-in-symfony-2-7-form-and-validator-updates#deprecated-setdefaultoptions-in-favor-of-configureoptions

Так что в основном добавьте

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'AppBundle\Entity\Whatever',
        'numOfHoles' => 0,
    ));

К вашим типам форм, и вам должно быть хорошо.

person Cerad    schedule 26.10.2015
comment
какой класс установить в data_class? - person Darius.V; 01.10.2018

Я видел в видео, что вам нужно создать расширение типа формы, чтобы «изобретать» варианты:

https://symfonycasts.com/screencast/symfony-forms/form-type-extension#play

«Оказывается, нельзя просто« изобретать »новые параметры и передавать их: каждое поле имеет конкретный набор допустимых параметров. Но в TextareaSizeExtension мы можем изобретать новые параметры».

Например, когда необходимо добавить атрибут строк, в расширении сделано следующее:

   public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['attr']['rows'] = $options['rows'];
    }

public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'rows' => 10
        ]);
    }

И теперь в методе buildForm, когда вы добавляете поле, вы можете передать параметр следующим образом:

->add('content', null, ['rows' => 15])

Это должно, по крайней мере, работать с symfony 4, как говорилось в видео, вероятно, также с 3.4.

Только что посмотрел другое видео https://symfonycasts.com/screencast/symfony-forms/form-options-data и увидел, что делает то же, что и Cerad. Итак, теперь, как я понимаю, нам нужно formExtention только в том случае, если мы хотим расширить сторонний тип формы.

person Darius.V    schedule 04.01.2020

Попробуйте сделать это:

$numOfHoles = array('numOfHoles' => $options['numOfHoles']));

тогда:

$oForm = $this->createForm(new CompanyForm($numOfHoles));

Затем вам нужно вызвать его перед вашей buildForm:

public function __construct($contacts))
{
$this->vnumOfHoles = $numOfHoles;
}
person Besbes Riadh    schedule 26.10.2015