поэтому я пытаюсь установить выбранный параметр в своей форме, но не могу понять, как это сделать. Я погуглил, и все, похоже, для 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));
Параметры - это третий параметр функции createForm. Второй - это объект (или еще сглаживание) для обновления. $ form = $ this-> createForm (EditCategoryType :: class, $ myCategory, array ('guru' => $ guruName));
@ThisGuyHasTwoThumbs, если вы проверите документы версий 2,3 и 4, способ установки данных в форме не изменился. Так что, возможно, вы что-то делаете не так с массивом параметров. Забыв, что вы уже решили свой вопрос, не могли бы вы опубликовать действие и полную форму, чтобы проверить его? Я просто считаю, что вы занимаетесь плохой ненужной практикой.
Что вы использовали для значения параметра data_class для EditCategoryType? какое имя сущности?
вы можете получить лучшие результаты, если определите здесь объект, который будете редактировать. Я постараюсь объяснить ответ на примере




Как я уже сказал в своих комментариях, вы что-то делаете не так. Я объясню весь процесс:
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 я нашел ответ, единственная причина, по которой я добавил ниже в качестве ответа, а не пометил его как правильный, заключалась в том, что, похоже, есть небольшая разница в том, как это работает сейчас ... :
Контроллер теперь читает (спасибо @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];
},
])
Возможный дубликат Как установить значение по умолчанию для поля формы в Symfony2?