Symfony2 Ustawianie domyślnego wyboru pola wyboru
Tworzę formularz w następujący sposób:
$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()
Jak mogę ustawić domyślną wartość listy gatunków?
Dziękuję za odpowiedź, przepraszam, myślę, że powinienem sformułować swoje pytanie. Jak ustawić tę wartość jako SELECTED = " yes " dla odpowiedniej wartości na liście wyboru gatunku?
Tak, że wyjście opcji select z widoku gałązki będzie wyglądać tak:
<option value="174" selected="yes">Dog</option>
12 answers
Jeśli użyjesz roztworu Cristiana, musisz wstrzyknąć EntityManager
do swojej klasy FormType. Oto uproszczony przykład:
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)
));
}
}
I twój kontroler:
// ...
$form = $this->createForm(new EntityType($this->getDoctrine()->getManager()), $entity);
// ...
Z Doktryny Docs :
Metoda EntityManager # getReference ($entityName, $identifier) pozwala uzyskać odniesienie do encji, dla której identyfikator jest znany, bez ładowania tego encji z bazy danych. Jest to przydatne, na przykład, jako zwiększenie wydajności, gdy chcesz utworzyć powiązanie z podmiotem, dla którego masz identyfikator.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:03:02
Możesz zdefiniować wartość domyślną z atrybutu 'data'. Jest to część abstrakcyjnego typu "pole" ( 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();
W tym przykładzie, 'Draft' będzie ustawiony jako domyślna wybrana wartość.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-13 14:20:18
Rozwiązanie: dla encji typu użyj opcji "data", ale wartość jest obiektem. ie:
$em = $this->getDoctrine()->getEntityManager();
->add('sucursal', 'entity', array
(
'class' => 'TestGeneralBundle:Sucursal',
'property'=>'descripcion',
'label' => 'Sucursal',
'required' => false,
'data'=>$em->getReference("TestGeneralBundle:Sucursal",3)
))
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-11 09:59:26
Myślę, że powinieneś po prostu użyć $breed->setSpecies($species)
, na przykład w mojej formie mam:
$m = new Member();
$m->setBirthDate(new \DateTime);
$form = $this->createForm(new MemberType, $m);
I ustawia mój domyślny wybór na bieżącą datę. Powinno działać w ten sam sposób dla podmiotów zewnętrznych...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-05 15:19:10
Jeśli chcesz przekazać tablicę encji doktryn, spróbuj czegoś takiego (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,
]);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-31 12:04:51
Myślę, że nie powinieneś używać opcji data
, ponieważ robi to więcej niż tylko ustawianie wartości domyślnej.
Nadpisujesz również wszelkie dane przekazywane do formularza podczas tworzenia. Więc w zasadzie, łamiesz
wsparcie dla tej funkcji. - Co może nie mieć znaczenia, kiedy pozwalasz użytkownikowi tworzyć dane, ale ma znaczenie, gdy
chcesz (kiedyś) użyć formularza do aktualizacji danych.
Zobacz http://symfony.com/doc/current/reference/forms/types/choice.html#data
Uważam, że lepiej byłoby przekazać wszelkie domyślne dane podczas tworzenia formularza. W kontrolerze.
Na przykład, możesz przekazać klasę i zdefiniować domyślną wartość w samej klasie.
(przy użyciu domyślnego Symfony\Bundle\FrameworkBundle\Controller\Controller
)
$form = $this->createForm(AnimalType::class, [
'species' => 174 // this id might be substituted by an entity
]);
Lub podczas używania obiektów:
$dog = new Dog();
$dog->setSpecies(174); // this id might be substituted by an entity
$form = $this->createForm(AnimalType::class, $dog);
Jeszcze lepiej, gdy korzystasz z fabryki: (gdzie pies prawdopodobnie wywodzi się od zwierzęcia)
$form = $this->createForm(AnimalType::class, DogFactory::create());
To pozwoli Ci oddzielić od siebie strukturę formy i treść oraz dokonać twoja forma może być wielokrotnego użytku w większej liczbie sytuacji.
Lub użyj opcji preferred_choices
, ale spowoduje to przesunięcie domyślnej opcji na górę formularza.
Zobacz: 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
]
);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-23 12:09:04
Nie jestem pewien, co robisz źle tutaj, kiedy buduję formularz za pomocą klas form Symfony dba o wybranie odpowiedniej opcji na liście. Oto przykład jednego z moich formularzy, który działa.
W kontrolerze dla akcji edycji:
$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(),
));
Klasa typu entity kampanii (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';
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-18 00:50:30
From the docs:
public Form createNamed(string|FormTypeInterface $type, string $name, mixed $data = null, array $options = array())
Mixed $data = null jest domyślną opcją. Na przykład mam pole o nazwie status i zaimplementowałem je tak:
$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();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-10 11:29:35
Ustawienie domyślnego wyboru przycisku radiowego 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
))
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-31 05:01:42
Formularz powinien automatycznie mapować wartość species - > id do wybranego pola wyboru encji. Na przykład, jeśli masz podmiot rasy, który ma związek OnetoOne z podmiotem gatunku w tabeli łączenia o nazwie "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;
}
}
Pole "species" w klasie formularza powinno pobierać wartość species->id z obiektu "species" atrybutu w klasie rasy przekazanego do formularza.
Alternatywnie, można jawnie ustawić wartość przez jawne przekazywanie gatunków encja do formularza za pomocą 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()
)
);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-01 03:48:49
Możesz albo zdefiniować właściwą wartość domyślną w modelu, który chcesz edytować za pomocą tego formularza, albo możesz określić opcję empty_data , aby Twój kod stał się:
$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()
;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-10 07:43:05
Możesz użyć "preferred_choices" i "push" nazwę, którą chcesz wybrać na górę listy. Wtedy zostanie wybrany domyślnie.
'preferred_choices' => array(1), //1 is item number
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-16 21:31:07