Ho un'entità Product
. Il mio prodotto può avere più nomi in diverse lingue. Un nome in francese, un nome in inglese, ecc. Non voglio usare una traduzione automatica.Symfony3: Tipo scelta campo riempito con matrice di oggetti
L'utente dovrà scrivere i nomi nella forma del prodotto e selezionare la lingua corrispondente. Può aggiungere tanti nomi come vuole grazie a un pulsante Aggiungi.
Tutte le lingue vengono creati dall'utente amministratore (in un'altra forma). Quindi, Language
è anche un'entità che ha un nome (es: inglese) e un codice (es: EN).
Ho creato l'entità ProductName
che ha un nome e una lingua (conformi a ciò che l'utente scrive nel modulo Prodotto).
In tal caso, non è necessario associare Entità ProductName
all'entità Language
. Voglio solo il codice della lingua. Quindi, a mio ProductName
entità, ho questo immobile:
/**
* @ORM\Column(name="Language_Code", type="string", length=2)
*/
private $language;
La mia forma del prodotto (ProductType) ha un campo CollectionType al fine di aggiungere diversi nomi.
// Form/ProductType.php
->add('infos', CollectionType::class, array(
'entry_type' => ProductInfosType::class,
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
'label' => false,
'mapped' => false
))
E forma ProductInfosType ha 2 campi:
// Form/ProductInfosType.php
->add('name', TextType::class, array(
'attr' => array('size' => 40)
))
->add('language', EntityType::class, array(
'placeholder' => '',
'class' => 'AppBundle:Language',
'choice_label' => 'code',
'attr' => array('class' => 'lang'),
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('l')->orderBy('l.code', 'ASC');
}
))
Così, quando vado sulla mia pagina del modulo, ho un blocco che contiene un campo di testo di input (Nome) e un campo di selezione (la lingua). Il campo di selezione è come questo:
<select id="product_infos_0_language" required="required" name="product[infos][0][language]">
<option value=""></option>
<option value="DE">DE</option>
<option value="EN">EN</option>
<option value="ES">ES</option>
<option selected="selected" value="FR">FR</option>
</select>
A questo punto, tutto funziona bene. Ho creato un pulsante di aggiunta in modo che l'utente possa aggiungere altri nomi, ecc ...
Tuttavia, quando invio il modulo, quando controllo i dati del modulo nel mio ProductController, ho notato che non corrisponde a quello che desidera memorizzare nel database.
print_r($form->get('infos')->getData());
// returns :
Array
(
[0] => AppBundle\Entity\ProductName Object
(
[language:AppBundle\Entity\ProductName:private] => AppBundle\Entity\Language Object
(
[code:AppBundle\Entity\Language:private] => FR
[name:AppBundle\Entity\Language:private] => Français
)
[name:AppBundle\Entity\ProductName:private] => Ceinture lombaire LombaSkin
)
)
Quello che vorrei è:
Array
(
[0] => AppBundle\Entity\ProductName Object
(
[language:AppBundle\Entity\ProductName:private] => FR
[name:AppBundle\Entity\ProductName:private] => Ceinture lombaire LombaSkin
)
)
Non voglio l'oggetto linguaggio ma direttamente il codice della lingua!
Ecco perché penso che non dovrei usare EntityField
nel campo ProductNameType ma nel campo ChoiceType
.
Come posso caricare tutte le lingue memorizzate in dB nel campo scelta? Spero che questa spiegazione sia più comprensibile ;-)
Se ho capito bene: hai provato a creare un metodo '__toString()' che restituisce la proprietà 'code' dell'entità' Language'? – Delphine
No. Non penso che mi aiuti. Il codice della mia lingua è già una stringa. Es: Nome = inglese e codice = EN. Invece di ottenere una lingua oggetto quando invio il mio modulo, voglio solo il codice che ho selezionato nel mio elenco. – Felurian
Non capisco cosa intendi per "ottenere" dopo l'invio – Delphine