Как установить выбранную по умолчанию опцию для выбора типа объекта? - PullRequest
0 голосов
/ 31 мая 2018

, поэтому я пытаюсь установить выбранную опцию в своей форме, но я не могу понять, как это сделать.Я гуглил и все вроде бы для Symfony2, где default была вещь, похоже, это больше не относится к Symfony4.

Я пытался использовать data и empty_data, но оба не выбирают правильное значение ..

# weirdly, setting to ['guru'] gets undefined index error,
# setting to $options doesn't error
->add('guru', EntityType::class, array(
    'class' => User::class,
    'choice_label' => 'username',
    'data' => $options['guru'] 
 ))

и как я передаю параметры $:

$form = $this->createForm(EditCategoryType::class, array('guru' => $guruName));

Ответы [ 4 ]

0 голосов
/ 31 мая 2018

Итак, с помощью @Juan I. Morales Pestana я нашел ответ, единственная причина, по которой я добавил приведенный ниже ответ в качестве ответа вместо того, чтобы пометить его как правильный, заключалась в том, что, кажется, есть небольшая разница в том, как он работаетnow ..:

Контроллер теперь читает (Спасибо @Juan):

$category = $this->getDoctrine()->getRepository(Category::class)->find($id);
$category->setGuru($category->getGuru());

$form = $this->createForm(EditCategoryType::class, $category);

Мой класс EditCategoryType:

->add('guru', EntityType::class, array(
    'class' => User::class,
    'choice_label' => 'username',
    'mapped' => false,
    'data' => $options['data']->getGuru()
))

обновленный шаблон веточки:

{{ form_widget(form.guru, { 'attr': {'class': 'form-control'} }) }}
0 голосов
/ 31 мая 2018
$parentCategory = $categoryRepository->repository->find(2);
$category = new Category();
$category->setParentCategory(parentCategory);
$form = $this->createForm(CategoryType::class, $category);

мы выбрали предопределенную верхнюю категорию, она работает, если вы используете ее таким образом.

0 голосов
/ 31 мая 2018

попробуйте это: документация empty_data

0 голосов
/ 31 мая 2018

Как я уже сказал в моих комментариях, вы делаете что-то не так.Я объясню весь процесс:

вызов формы в контроллере

$person = new Person();
$person->setName('My default name');
$form = $this->createForm('AppBundle\Form\PersonType', $person);
$form->handleRequest($request);

затем выполняется функция createForm здесь код

Symfony \ Bundle \ FrameworkBundle \ Controller \ ControllerTrait

    protected function createForm($type, $data = null, array $options = array())
    {
        return $this->container->get('form.factory')->create($type, $data, $options);
    }

Как вы видите, данные или параметры не устанавливаются непосредственно в форме, вызывается другая функция, а затем создается форма

Это результат, когда я делаю дамп внутри PersonType

PersonType.php on line 20:
array:35 [▼
  "block_name" => null
  "disabled" => false
  "label" => null
  "label_format" => null
  "translation_domain" => null
  "auto_initialize" => true
  "trim" => true
  "required" => true
  "property_path" => null
  "mapped" => true
  "by_reference" => true
  "inherit_data" => false
  "compound" => true
  "method" => "POST"
  "action" => ""
  "post_max_size_message" => "The uploaded file was too large. Please try to upload a smaller file."
  "error_mapping" => []
  "invalid_message" => "This value is not valid."
  "invalid_message_parameters" => []
  "allow_extra_fields" => false
  "extra_fields_message" => "This form should not contain extra fields."
  "csrf_protection" => true
  "csrf_field_name" => "_token"
  "csrf_message" => "The CSRF token is invalid. Please try to resubmit the form."
  "csrf_token_manager" => CsrfTokenManager {#457 ▶}
  "csrf_token_id" => null
  "attr" => []
  "data_class" => "AppBundle\Entity\Person"
  "empty_data" => Closure {#480 ▶}
  "error_bubbling" => true
  "label_attr" => []
  "upload_max_size_message" => Closure {#478 ▶}
  "validation_groups" => null
  "constraints" => []
  "data" => Person {#407 ▼ // Here is the data!!!
    -id: null
    -name: "My default name"
    -salary: null
    -country: null
  }
]

Как вы можете видеть, данные индексируются по данным, поэтому вы получаете неопределенную ошибку индекса

Таким образом, правильный способ - установить значение сущности из контроллера или использовать вашу форму в качестве службы, вызвать хранилище и задать значение, используя параметр данных, который не изменился со времени версии 2. Я хочу сказать, что выНеправильное использование формы.

Пожалуйста, измените свой код.

Надеюсь, это поможет

РЕДАКТИРОВАНИЕ В SYMFONY 4 WAY (без пакетов пространств имен)

Давайте посмотрим, пожалуйста, у меня есть Person Person с именем только для этого примера

Контроллер

    $person = new Person(); //or $personsRepository->find('id from request')
    $person->setName('My default name');
    $form = $this->createForm(PersonType::class, $person);
    $form->handleRequest($request);

Форма

public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder->add('name',TextType::class,[
            //'data' => 'aaaaa' // <= this works too

        ]);

    }

Значение массива параметров, которое доказывает, что вы обращаетесь неправильно

PersonType.php on line 20:
array:35 [▼
  "block_name" => null
  "disabled" => false
  "label" => null
  "label_format" => null
  "translation_domain" => null
  "auto_initialize" => true
  "trim" => true
  "required" => true
  "property_path" => null
  "mapped" => true
  "by_reference" => true
  "inherit_data" => false
  "compound" => true
  "method" => "POST"
  "action" => ""
  "post_max_size_message" => "The uploaded file was too large. Please try to upload a smaller file."
  "error_mapping" => []
  "invalid_message" => "This value is not valid."
  "invalid_message_parameters" => []
  "allow_extra_fields" => false
  "extra_fields_message" => "This form should not contain extra fields."
  "csrf_protection" => true
  "csrf_field_name" => "_token"
  "csrf_message" => "The CSRF token is invalid. Please try to resubmit the form."
  "csrf_token_manager" => CsrfTokenManager {#457 ▶}
  "csrf_token_id" => null
  "attr" => []
  "empty_data" => Closure {#480 ▶}
  "error_bubbling" => true
  "label_attr" => []
  "upload_max_size_message" => Closure {#478 ▶}
  "validation_groups" => null
  "constraints" => []
  "data" => Person {#407 ▼
    -id: null
    -name: "My default name" //Here is the data
    -salary: null
    -country: null
  }
]

AppBundle - это просто еще одна папка в моей структуре папок.Будь рад проверить себя.Второй параметр функции formCreate - это объект или данные, а не параметры, которые, как вы думаете, эти параметры являются данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...