我使用Ajax开发一个symfony动态表单。我尝试动态填充下拉列表,我希望在第二次选择结果时显示结果。我的第三个选择也是如此。实际上,第一个下拉列表允许用户选择一个parc,当他们选择一个parc时,第二个选择使用属于parc的Ensembles.php结果填充,然后用户可以在第三个下拉列表中选择属于Ensembles.php的包。这是一个示例
当我想要添加时,就会显示此表单。以下是我的实体之间的关系:
Parcsimmobilier.php <= ManyToOne Ensembles.php <= ManyToOne Batiments.php <= ManyToOne Zonestechnique.php
这是我的表格ZonestechniqueType.php:
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Doctrine\ORM\ParcsimmobilierRepository;
use Doctrine\ORM\EnsemblesRepository;
use Doctrine\ORM\BatimentsRepository;
class ZonestechniqueType extends AbstractType
{
/* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('parcsimmobilier', 'entity', array(
'mapped' => false,
'class' => 'MySpaceDatabaseBundle:Parcsimmobilier',
'property' => 'nom',
'empty_value' => '-- choose a parc parc --',
'label' => 'choose a parc immobilier : ',
'multiple' => false,
))
->add('ensembles', 'entity', array(
'mapped' => false,
'multiple' => false,
'class' => 'MySpaceDatabaseBundle:Ensembles',
'property' => 'nom',
'empty_value' => '-- choose an ensemble --',
'label' => 'choose an ensemble : ',
))
->add('batiments','entity', array(
'class' => 'MySpaceDatabaseBundle:Batiments',
'property' => 'nom',
'empty_value' => '-- choose a batiment --',
'label' => 'choose a batiment : ',
))
->add('categorieszonestechnique')
->add('nom')
->add('localisation')
->add('commentaire')
;
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'MySpace\DatabaseBundle\Entity\Zonestechnique'
));
}
/**
* @return string
*/
public function getName()
{
return 'mySpace_databasebundle_zonestechnique';
}
}我在控制器中创建了两个方法。一个显示/添加一个Zonestechnique,另一个用Ajax填充我的下拉列表。现在,我尝试使用前两个select,我选择了一个parc,然后第二个下拉列表中填充了属于我选择的parc的所有组件的名称。
下面是我的控制器方法:
public function formZonesAction() {
$request = $this->getRequest();
$em = $this->getDoctrine()->getEntityManager();
if($request->isXmlHttpRequest()) {
$id = '';
$id = $request->get('id');
if ($id != '') {
$ensembles = $em->getRepository('MySpaceDatabaseBundle:Ensembles')
->getEnsemblesByParcsimmobilierQueryBuilder($id);
$tabEnsembles = array();
$i = 0;
foreach($ensembles as $ensemble) {
$tabEnsembles[$i]['id'] = $ensemble->getId();
$tabEnsembles[$i]['nom'] = $ensemble->getNom();
$i++;
}
$response = new Response();
$data = json_encode($tabEnsembles); // formater le résultat de la requête en json
$response->headers->set('Content-Type', 'application/json');
$response->setContent($data);
return $response;
}
} else {
return new Response('no ajax');
}
}
/**
*
* @Route("/gestionzonestechniquesconformites/addform", name="formZones")
* @Method("GET")
*/
public function addZonesConformitesAction() {
$em=$this->getDoctrine()->getManager();
$zones = $em->getRepository('MySpaceDatabaseBundle:Zonestechnique');
$zones = new Zonestechnique;
$form=$this->createForm(new ZonestechniqueType(), $zones);
$request = $this->getRequest();
if($request->isMethod('POST') | $form->isValid()) {
$form->bind($request);
$zoneConformite = $form->getData();
$em->persist($zones);
$em->flush();
return $this->redirect($this->generateUrl('indexRechercheZones'));
}
else {
return $this->render('MySpaceGestionEquipementsTechniquesBundle:ZonesTechnique:addZonesTechniqueConformites.html.twig', array('form' => $form->createView(), 'zone' => $zones ));
}
}这是用于的EnsemblesRepository.php存储库:
class EnsemblesRepository extends EntityRepository
{
public function getEnsemblesByParcsimmobilierQueryBuilder($id)
{
return $this
->createQueryBuilder('e')
->where('e.parcsimmobilier = :parcsimmobilier')
->setParameter('id', $id);
;
}
}您可以在我的控制器中为Ajax方法找到这个请求。
显示表单/页面时没有错误,但Ajax请求不起作用。这是我的路由文件:
addZonesConformites:
path: /gestionzonestechniquesconformites/add
defaults: { _controller: MySpaceGestionEquipementsTechniquesBundle:GestionZonesTechniques:addZonesConformites }
requirements:
methods: GET
# Ajax
formZones:
pattern: /gestionzonestechniquesconformites/addform
defaults: { _controller: MySpaceGestionEquipementsTechniquesBundle:GestionZonesTechniques:formZones }
requirements:
methods: GET
addZonesConformites_process:
path: /gestionzonestechniquesconformites/add/process
defaults: { _controller: MySpaceGestionEquipementsTechniquesBundle:GestionZonesTechniques:addZonesConformites }
requirements:
methods: POST如您所见,我有3条路径,一条用于显示表单,一条用于填充Ajax下拉列表,最后一条用于验证表单。
当然,在我的树枝上,我做了这样的表格:
<form action="{{ path('addZonesConformites_process') }}" method="POST">
<div class="row">
<div class="col-md-6">
<div>
{{ form_errors(form) }}
</div>
<div>
{{ form_label(form.parcsimmobilier, "choisir un parc", {'label_attr': {'class': 'control-label'}}) }}
{{ form_errors(form.parcsimmobilier) }}
{{ form_widget(form.parcsimmobilier, {'attr': {'class': 'form-control', 'id': 'parcsimmobilier', 'onChange':'populateEnsembles();'}}) }}
</div>
<div>
{{ form_label(form.ensembles, "choisir un ensemble:", {'label_attr': {'class': 'control-label'}}) }}
{{ form_errors(form.ensembles) }}
{{ form_widget(form.ensembles, {'attr': {'class': 'form-control', 'id': 'ensembles'}}) }}
</div>
<div>
{{ form_label(form.batiments, "Appartenant au bâtiment:", {'label_attr': {'class': 'control-label'}}) }}
{{ form_errors(form.batiments) }}
{{ form_widget(form.batiments, {'attr': {'class': 'form-control'}}) }}
</div>
<div class="row">
<div class="clo-md-4"></div>
<input onclick="clear_form_elements(this.form)" type="reset" value="Vider les champs" class="btn btn-xs btn-default"/>
</div>
<br>
<div class="clo-md-4"></div>
<input type="submit" value="add" class="btn btn-small btn-success"/>
</div>
</div>
</form>在这个脚本的末尾:
<script type="text/javascript">
function populateEnsembles(){
var id_select = $('#mySpace_databasebundle_zonestechnique_parcsimmobilier').val();
$.ajax({
url: "{{ path('addZonesConformites') }}",
type: 'GET',
data: {'id': id_select},
dataType: 'json',
success: function(json){
$('#mySpace_databasebundle_zonestechnique_ensembles').html('');
$.each(json, function(index, value) {
$('#mySpace_databasebundle_zonestechnique_ensembles').append('<option value="'+ value.id +'">'+ value.nom +'</option>');
});
}
});
}
</script>这是我第一次使用Ajax。因此,我真的不知道这是否是正确的方法,但目前没有任何匹配,并显示我试图用这个动态的形式。
有人能帮我吗?
这是一个屏幕截图:

如您所见,我选择了一个parc,ajax请求可以工作(底部是symfony工具栏绿色号)。当我在浏览器中进行调试时,在网络选项卡中,ajax请求可以工作,并返回我选择的parc的好id。但它并没有排在第二个下拉队的名单上。在第二选择合奏,我有我的数据库的所有组合。提前谢谢你。
发布于 2015-03-25 08:53:19
我找到了解决办法,其实这是个新手的错误。
我必须选择ajax路由的url路径,而不是表单路径。这就是我调试应用程序时控制台中没有代码错误的原因。这是我在ajax脚本中更改的一行:url: "{{ path('addZonesConformites') }}" to url: "{{ path('formRoute') }}"
https://stackoverflow.com/questions/29207281
复制相似问题