У меня есть две сущности с ассоциацией Gouvernorat -> Villes.
Это сущность Gouvernorat:
class Gouvernorat
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=100, nullable=false)
*/
private $name;
/**
* @ORM\OneToMany(targetEntity="EntiteBundle\Entity\Ville", mappedBy="idGouvernorat")
*/
private $villes;
//getters & setters & constructor
}
, а это городская сущность:
class Ville
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=200, nullable=false)
*/
private $name;
/**
* @var \Gouvernorat
*
* @ORM\ManyToOne(targetEntity="EntiteBundle\Entity\Gouvernorat",inversedBy="villes")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="id_gouvernorat", referencedColumnName="id")
* })
*/
private $idGouvernorat;
}
В третьем объекте под названием Etablissement у меня есть строка gouvernorat и строка string ville. Поэтому я пытаюсь создать тип EtablissementType.Эта форма содержит два типа сущностей для дочернего гувернората и краткую копию Вилле:
class EtablissementType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('nom')
->add('gouvernorat', EntityType::class, array(
'class' => 'EntiteBundle\Entity\Gouvernorat',
'choice_label' => 'name',
'multiple' => false
))
->add('ville',EntityType::class,
array(
'class' => 'EntiteBundle\Entity\Ville',
'choice_label' => 'name',
'multiple' => false
))
->add('Enregistrer',SubmitType::class)
-> setMethod('POST');
}
когда я выбираю гувернората, я хочу, чтобы все города этого гувернората загружались во втором ChoiceType, поэтому я добавил это событие:
public function buildForm(FormBuilderInterface $builder, array $options)
{
//$builder-> ...
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) {
$form = $event->getForm();
$data = $event->getData();
$gouv = $data-> getGouvernorat();
$villes = null === $gouv ? array() : $gouv->getVilles();
$names = array_map(function ($value) {
return $value['name'];
}, $villes);
$form->add('ville', ChoiceType::class,
array(
'choices' => $names
));
}
);
}
ярлык для данных (в формате json):
[
{
"id": 1,
"name": "ARIANA",
"villes": [
{
"id": 1,
"name": "RAOUED",
"idGouvernorat": null
},
{
"id": 2,
"name": "SIDI THABET",
"idGouvernorat": null
},
{
"id": 3,
"name": "ARIANA VILLE",
"idGouvernorat": null
},
{
"id": 4,
"name": "LA SOUKRA",
"idGouvernorat": null
},
{
"id": 5,
"name": "KALAAT LANDLOUS",
"idGouvernorat": null
},
{
"id": 6,
"name": "ETTADHAMEN",
"idGouvernorat": null
},
{
"id": 7,
"name": "MNIHLA",
"idGouvernorat": null
}
]
},
{
"id": 2,
"name": "BEJA",
"villes": [
{
"id": 8,
"name": "BEJA NORD",
"idGouvernorat": null
},
{
"id": 9,
"name": "NEFZA",
"idGouvernorat": null
},
{
"id": 10,
"name": "GOUBELLAT",
"idGouvernorat": null
},
{
"id": 11,
"name": "MEJEZ EL BAB",
"idGouvernorat": null
},
{
"id": 12,
"name": "AMDOUN",
"idGouvernorat": null
},
{
"id": 13,
"name": "TEBOURSOUK",
"idGouvernorat": null
},
{
"id": 14,
"name": "TESTOUR",
"idGouvernorat": null
},
{
"id": 15,
"name": "THIBAR",
"idGouvernorat": null
},
{
"id": 16,
"name": "BEJA SUD",
"idGouvernorat": null
}
]
},
и т.д.проблема, я не нашел проблему точно, я использовал документацию Symfony - Динамическая генерация для отправленных форм
<script>
var $gouvernorat = $('#etablissement_gouvernorat');
// When gouvernorat gets selected ...
$gouvernorat.change(function() {
// ... retrieve the corresponding form.
var $form = $(this).closest('form');
// Simulate form data, but only include the selected gouvernorat value.
var data = {};
data[$gouvernorat.attr('name')] = $gouvernorat.val();
// Submit data via AJAX to the form's action path.
$.ajax({
url : $form.attr('action'),
type: $form.attr('method'),
data : data,
success: function(html) {
// Replace current ville field ...
$('#etablissement_ville').replaceWith(
// ... with the returned one from the AJAX response.
$(html).find('#etablissement_ville')
);
// Ville field now displays the appropriate Villes.
}
});
});
</script>