Я создаю форму следующим образом:
$form = $this->createFormBuilder($breed)
->add('species', 'entity', array(
'class' => 'BFPEduBundle:Item',
'property' => 'name',
'query_builder' => function(ItemRepository $er){
return $er->createQueryBuilder('i')
->where("i.type = 'species'")
->orderBy('i.name', 'ASC');
}))
->add('breed', 'text', array('required'=>true))
->add('size', 'textarea', array('required' => false))
->getForm()
Как установить значение по умолчанию для списка видов?
Спасибо за ваш ответ, извиняюсь, я думаю, что я должен перефразировать мой вопрос. Как только у меня есть значение, которое я извлекаю из модели, как установить это значение как SELECTED = "yes" для соответствующего значения в списке выбора вида?
Итак, этот вариант выбора, выводимый из представления TWIG, будет выглядеть следующим образом:
<option value="174" selected="yes">Dog</option>
Если вы используете решение Cristian, вам нужно ввести EntityManager
в свой класс FormType. Вот упрощенный пример:
class EntityType extends AbstractType{
public function __construct($em) {
$this->em = $em;
}
public function buildForm(FormBuilderInterface $builder, array $options){
$builder
->add('MyEntity', 'entity', array(
'class' => 'AcmeDemoBundle:Entity',
'property' => 'name',
'query_builder' => function(EntityRepository $er) {
return $er->createQueryBuilder('e')
->orderBy('e.name', 'ASC');
},
'data' => $this->em->getReference("AcmeDemoBundle:Entity", 3)
));
}
}
И ваш контроллер:
// ...
$form = $this->createForm(new EntityType($this->getDoctrine()->getManager()), $entity);
// ...
Из Doctrine Docs:
Метод EntityManager # getReference ($ entityName, $identifier) позволяет получить ссылку на объект, для которого известен идентификатор, без загрузки этого объекта из базы данных. Это полезно, например, для повышения производительности, когда вы хотите установить связь с сущностью, для которой у вас есть идентификатор.
Вы можете определить значение по умолчанию из атрибута data. Это часть абстрактного типа поля (http://symfony.com/doc/2.0/reference/forms/types/field.html)
$form = $this->createFormBuilder()
->add('status', 'choice', array(
'choices' => array(
0 => 'Published',
1 => 'Draft'
),
'data' => 1
))
->getForm();
В этом примере "Черновик" будет установлен как выбранное по умолчанию значение.
решение: для типа сущность использует опцию "данные", но значение - это объект. то есть:
$em = $this->getDoctrine()->getEntityManager();
->add('sucursal', 'entity', array
(
'class' => 'TestGeneralBundle:Sucursal',
'property'=>'descripcion',
'label' => 'Sucursal',
'required' => false,
'data'=>$em->getReference("TestGeneralBundle:Sucursal",3)
))
Я думаю, вы должны просто использовать $breed->setSpecies($species)
, например, в моей форме:
$m = new Member();
$m->setBirthDate(new \DateTime);
$form = $this->createForm(new MemberType, $m);
и устанавливает мой выбор по умолчанию на текущую дату. Должен работать одинаково для внешних объектов...
Если вы хотите передать массив сущностей Doctrine, попробуйте что-то вроде этого (Symfony 3.0 +):
protected $entities;
protected $selectedEntities;
public function __construct($entities = null, $selectedEntities = null)
{
$this->entities = $entities;
$this->selectedEntities = $selectedEntities;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('entities', 'entity', [
'class' => 'MyBundle:MyEntity',
'choices' => $this->entities,
'property' => 'id',
'multiple' => true,
'expanded' => true,
'data' => $this->selectedEntities,
]);
}
Настройка по умолчанию для переключателя symfony2
$builder->add('range_options', 'choice', array(
'choices' => array('day'=>'Day', 'week'=>'Week', 'month'=>'Month'),
'data'=>'day', //set default value
'required'=>true,
'empty_data'=>null,
'multiple'=>false,
'expanded'=> true
))
empty_data
вместо data
чтобы установить значение по умолчанию и все еще иметь возможность редактировать сущность.
Из документов:
public Form createNamed(string|FormTypeInterface $type, string $name, mixed $data = null, array $options = array())
mixed $data = null - это параметры по умолчанию. Так, например, у меня есть поле, называемое статусом, и я реализовал его так:
$default = array('Status' => 'pending');
$filter_form = $this->get('form.factory')->createNamedBuilder('filter', 'form', $default)
->add('Status', 'choice', array(
'choices' => array(
'' => 'Please Select...',
'rejected' => 'Rejected',
'incomplete' => 'Incomplete',
'pending' => 'Pending',
'approved' => 'Approved',
'validated' => 'Validated',
'processed' => 'Processed'
)
))->getForm();
Я не уверен, что вы здесь делаете неправильно, когда я создаю форму с помощью классов форм, Symfony позаботится о выборе правильной опции в списке. Вот пример одной из моих форм, которая работает.
В контроллере для действия редактирования:
$entity = $em->getRepository('FooBarBundle:CampaignEntity')->find($id);
if (!$entity) {
throw $this->createNotFoundException('Unable to find CampaignEntity entity.');
}
$editForm = $this->createForm(new CampaignEntityType(), $entity);
$deleteForm = $this->createDeleteForm($id);
return $this->render('FooBarBundle:CampaignEntity:edit.html.twig', array(
'entity' => $entity,
'edit_form' => $editForm->createView(),
'delete_form' => $deleteForm->createView(),
));
Класс типа объекта кампании (src: Foo\BarBundle\Form\CampaignEntityType.php):
namespace Foo\BarBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Doctrine\ORM\EntityRepository;
class CampaignEntityType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('store', 'entity', array('class'=>'FooBarBundle:Store', 'property'=>'name', 'em'=>'my_non_default_em','required' => true, 'query_builder' => function(EntityRepository $er) {return $er->createQueryBuilder('s')->orderBy('s.name', 'ASC');}))
->add('reward');
}
public function getName()
{
return 'foo_barbundle_campaignentitytype';
}
}
Я не думаю, что вы должны использовать параметр data
, потому что это больше, чем просто установка значения по умолчанию.
Вы также переопределяете любые данные, которые передаются форме во время создания. Так что, в основном, вы нарушаете
поддержка этой функции. - Что не имеет значения, когда вы позволяете пользователю создавать данные, но имеет значение, когда вы
хотите (когда-нибудь) использовать форму для обновления данных.
См. http://symfony.com/doc/current/reference/forms/types/choice.html#data
Я считаю, что было бы лучше передать любые данные по умолчанию во время создания формы. В контроллере.
Например, вы можете пройти в классе и определить значение по умолчанию в своем классе.
(при использовании значения по умолчанию Symfony\Bundle\FrameworkBundle\Controller\Controller
)
$form = $this->createForm(AnimalType::class, [
'species' => 174 // this id might be substituted by an entity
]);
Или при использовании объектов:
$dog = new Dog();
$dog->setSpecies(174); // this id might be substituted by an entity
$form = $this->createForm(AnimalType::class, $dog);
Еще лучше при использовании factory: (где собака, вероятно, простирается от животного)
$form = $this->createForm(AnimalType::class, DogFactory::create());
Это позволит вам разделить структуру и содержимое формы друг от друга и сделать ваша форма повторно используется в других ситуациях.
Или используйте параметр preferred_choices
, но у этого есть побочный эффект перемещения опции по умолчанию в начало вашей формы.
Смотрите: http://symfony.com/doc/current/reference/forms/types/choice.html#preferred-choices
$builder->add(
'species',
'entity',
[
'class' => 'BFPEduBundle:Item',
'property' => 'name',
'query_builder' => ...,
'preferred_choices' => [174] // this id might be substituted by an entity
]
);
Форма должна автоматически отображать значение вида- > id в выбранное поле выбора объекта. Например, если у вас есть объект Breed, который имеет отношение OnetoOne с объектом Species в таблице соединений, называемой "breed_species":
class Breed{
private $species;
/**
* @ORM\OneToOne(targetEntity="BreedSpecies", mappedBy="breed")
*/
private $breedSpecies;
public function getSpecies(){
return $breedSpecies->getSpecies();
}
private function getBreedSpecies(){
return $this->$breedSpecies;
}
}
Поле "вид" в классе формы должно поднять значение вида → id из объекта атрибута "вид" в классе породы, переданном в форму.
В качестве альтернативы вы можете явно установить значение, явно передав объект вида в форму с помощью SetData():
$breedForm = $this->createForm( new BreedForm(), $breed );
$species = $breed->getBreedSpecies()->getSpecies();
$breedForm->get('species')->setData( $species );
return $this->render( 'AcmeBundle:Computer:edit.html.twig'
, array( 'breed' => $breed
, 'breedForm' => $breedForm->createView()
)
);
Вы можете использовать "preferred_choices" и "push" имя, которое вы хотите выбрать в верхней части списка. Затем он будет выбран по умолчанию.
'preferred_choices' => array(1), //1 is item number
Вы можете определить правильное значение по умолчанию в модели, которую хотите изменить с помощью этой формы, или указать опцию empty_datastrong > , чтобы ваш код стал:
$form = $this
->createFormBuilder($breed)
->add(
'species',
'entity',
array(
'class' => 'BFPEduBundle:Item',
'property' => 'name',
'empty_data' => 123,
'query_builder' => function(ItemRepository $er) {
return $er
->createQueryBuilder('i')
->where("i.type = 'species'")
->orderBy('i.name', 'ASC')
;
}
)
)
->add('breed', 'text', array('required'=>true))
->add('size', 'textarea', array('required' => false))
->getForm()
;