Как установить выбранную по умолчанию опцию для выбора типа объекта?

поэтому я пытаюсь установить выбранный параметр в своей форме, но не могу понять, как это сделать. Я погуглил, и все, похоже, для 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));

Возможный дубликат Как установить значение по умолчанию для поля формы в Symfony2?

Juan I. Morales Pestana 31.05.2018 13:49

Параметры - это третий параметр функции createForm. Второй - это объект (или еще сглаживание) для обновления. $ form = $ this-> createForm (EditCategoryType :: class, $ myCategory, array ('guru' => $ guruName));

G1.3 31.05.2018 13:58

@ThisGuyHasTwoThumbs, если вы проверите документы версий 2,3 и 4, способ установки данных в форме не изменился. Так что, возможно, вы что-то делаете не так с массивом параметров. Забыв, что вы уже решили свой вопрос, не могли бы вы опубликовать действие и полную форму, чтобы проверить его? Я просто считаю, что вы занимаетесь плохой ненужной практикой.

Juan I. Morales Pestana 31.05.2018 14:03

Что вы использовали для значения параметра data_class для EditCategoryType? какое имя сущности?

Deniz Aktürk 31.05.2018 14:46

вы можете получить лучшие результаты, если определите здесь объект, который будете редактировать. Я постараюсь объяснить ответ на примере

Deniz Aktürk 31.05.2018 14:49
JS - События опций формы
JS - События опций формы
В продолжение предыдущей статьи CSS - стили, связанные с вводом формы , в этой статье мы будем использовать JS для взаимодействия с формами, на этот...
CSS - Стили, связанные с вводом формы
CSS - Стили, связанные с вводом формы
Общими стилями ввода для форм являются Input (включая Text, Radio, checkbox), Select и Textarea, из которых Input относительно прост, поэтому в этой...
Создание многостраничной формы заявления о приеме на работу с помощью Angular
Создание многостраничной формы заявления о приеме на работу с помощью Angular
Наличие на корпоративном сайте форм заявлений о приеме на работу, или "трудовых анкет", экономит время и деньги как для соискателей, так и для...
0
5
3 697
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

calling the form in the controller

$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
  }
]

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

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

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

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

EDITED IN THE SYMFONY 4 WAY(with out namespaces bundles)

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

The controller

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

The form

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

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

        ]);

    }

The options array value which proves that you are accessing wrong

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 - это сущность или данные, а не параметры, которые, по вашему мнению, являются данными.

$parentCategory = $categoryRepository->repository->find(2);
$category = new Category();
$category->setParentCategory(parentCategory);
$form = $this->createForm(CategoryType::class, $category);

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

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

Пожалуйста, прочтите полный документ, прежде чем делать предложение ... Этот параметр определяет, какое значение будет возвращать поле, если отправленное значение пусто (или отсутствует). Он не устанавливает начальное значение, если оно не указано при отображении формы в представлении.. Вопрос в том, как установить выбранную по умолчанию опцию ...

Juan I. Morales Pestana 31.05.2018 15:40
Ответ принят как подходящий

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

Контроллер теперь читает (спасибо @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'} }) }}
<a href = "{{ path('register_new', { idpackage: p.id }) }}" class = "btn_packages">

//sends to form type the package id
$fromPackage = '';
if ($request->query->get('idpackage')) {
$fromPackage = $request->query->get('idpackage');
}

$form = $this->createForm(RegisterFormType::class, $register, ['fromPackage' => $fromPackage]);

in formType set the param in options: 
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Register::class,
'fromPackage' => null
]);
}

->add('package',EntityType::class, [
'label' => 'Select one item',
'class' => Package::class,
'choice_label' => function($package) {
    return $package->getTitle() . ' | crédits : ' . $package->getAmount();
},
'attr' => ['class' => 'input-text', ],
'placeholder' => '...',
'required' => false,
'choice_attr' => function($package) use ($idFromPackage) {
    $selected = false;
    if ($package->getId() == $idFromPackage) {
        $selected = true;
    }
    return ['selected' => $selected];
},
])

Другие вопросы по теме