Ajax查询在添加新帖子时有效,但在更新选择框中的实体时不起作用

时间:2015-02-10 00:46:04

标签: php ajax symfony

我有两个选择框用于国家/地区,第二个框用于城市,第二个框架取决于所选国家/地区。

添加新帖子时所有内容都正常工作,当我选择一个国家/地区时,相关的城市会正确显示,但是当尝试更新旅行时,显示城市的Ajax查询不会改变国家时的工作。

我必须点击提交按钮才能显示新的城市列表。我无法理解错误。问题是来自表单事件吗?

控制器

/**
* @ParamConverter("agence", options={"mapping": {"agence_slug":"slug"}})
*/
public function newAction(Agence $agence, Request $request)
{
    $em = $this->getDoctrine()->getManager();
    $travel = new Travel();
    $form = $this->createForm(new TravelType($agence), $travel);

    if ($request->getMethod() == 'POST')
    {
        //...
    }

    return $this->render('AppBundle:Dashboard/Travel:new.html.twig',
    array(
        'form'   => $form->createView() ,
        'agence' => $agence,
        ));
}

/**
* @ParamConverter("agence", options={"mapping": {"agence_slug":"slug"}})
* @ParamConverter("travel", options={"mapping": {"travel_id":"id"}})
*/
public function editAction(Travel $travel, Agence $agence, Request $request)
{

    $em = $this->getDoctrine()->getManager();

    $form = $this->createForm(new TravelEditType($agence), $travel);

    if ($request->getMethod() == 'POST')
    {
        //...
    }

    return $this->render('AppBundle:Dashboard/Travel:edit.html.twig',
    array(
        'form' => $form->createView() ,
        'travel' => $travel,
        'agence' => $agence,
        ));
}

travelType ,效果很好

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;

//........
use Symfony\Component\Form\FormInterface;
use AppBundle\Entity\Country;

class TravelType extends AbstractType
{
 public function buildForm(FormBuilderInterface $builder, array $options)
 {

  ->add('country', 'entity', array(
     'required' => true,
     'class' => 'AppBundle:Country',
     'property' => 'en',
     'multiple' => false,
     'expanded' => false,
     'label' => 'ِCountry',
     'empty_value' => ''ة ))
  //....

  $formModifier = function (FormInterface $form, Country $country = null) {
        $cities = null === $country ? array() : $country->getCities();

        $form->add('destination', 'entity', array(
            'class'       => 'AppBundle:CityWorld',
            'choices'     => $cities,
            'multiple' => false,
            'expanded' => false,
            'property'    => 'name',
            'label' => 'Destination'));
    };

    $builder->addEventListener(
        FormEvents::PRE_SET_DATA,
        function (FormEvent $event) use ($formModifier) {
            // this would be your entity, i.e. SportMeetup
            $data = $event->getData();

            $formModifier($event->getForm(), $data->getCountry());
        }
    );

    $builder->get('country')->addEventListener(
        FormEvents::POST_SUBMIT,
        function (FormEvent $event) use ($formModifier) {
            // It's important here to fetch $event->getForm()->getData(), as
            // $event->getData() will get you the client data (that is, the ID)
            $country = $event->getForm()->getData();

            // since we've added the listener to the child, we'll have to pass on
            // the parent to the callback functions!
            $formModifier($event->getForm()->getParent(), $country);
        }
    );

    $builder->addEventListener(FormEvents::POST_SUBMIT, function ($event) {
        $event->stopPropagation();
    }, 90000000000000); // Always set a higher priority than ValidationListener

}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'AppBundle\Entity\Travel'
    ));
}

public function getName()
{
    return null;
}
}

这是 TravelEditType

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
//........
use Symfony\Component\Form\FormInterface;
use AppBundle\Entity\Country;

class TravelEditType extends TravelType
{
 public function buildForm(FormBuilderInterface $builder, array $options)
 {
    parent::buildForm($builder, $options) ;

 }

 public function getName()
 {
    return null;
 }
}

这是表单和javascript代码

<form method="post" action="" class="form-horizontal" role="form" {{ form_enctype(form) }} >

 {{ form_widget(form.country, { 'id': 'country' }) }}

 {{ form_widget(form.destination, { 'id': 'city' }) }}

//.............
</form>

<script type="text/javascript">
var $county = $('#country');

$county.change(function () {
    // ... retrieve the corresponding form.
    var $form = $(this).closest('form');

    var data = {};
    data[$county.attr('name')] = $county.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 position field ...
            $('#city').replaceWith(
                    // ... with the returned one from the AJAX response.
                    $(html).find('#city')
            );
            // Position field now displays the appropriate positions.
        }
    });
});

我的代码是文档http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#cookbook-form-events-submitted-data

中提交表单的动态生成示例

0 个答案:

没有答案