Hinzufügen JQuery Autocomplete in Symfony2 Entität Feld

Habe ich eine Stadt und Ihre Wähler Einheit in eins-zu-viele-Beziehungen.Ich möchte zum konvertieren der Entität Feld(Tausende von Datensätzen in einer dropdown), um eine Texteingabe, so dass ich umsetzen kann, das JQuery-autocomplete, wenn Benutzer beginnen Sie mit der Eingabe von 2 Buchstaben.Nach fast zwei Wochen habe ich erfolgreich die DataTransformer die Transformation entity-Feld in ein text-input.Nun mein problem ist, ich bin immer noch lernen, die JQuery/Ajax-und ich bin verwirrt, wie es zu implementieren, in Symfony2 forms.

//formtype.php


private $entityManager;

public function __construct(ObjectManager $entityManager)
{
  $this->entityManager = $entityManager;
}
$builder
        ->add('address', null, array(
        'error_bubbling' => true
      ))
        ->add('city', 'text', array(
        'label' => 'Type your city',
        //'error_bubbling' => true,
        'invalid_message' => 'That city you entered is not listed',
      ))
 $builder->get('city')
      ->addModelTransformer(new CityAutocompleteTransformer($this->entityManager));

//datatransformer.php

class CityAutocompleteTransformer implements DataTransformerInterface
{
private $entityManager;

public function __construct(ObjectManager $entityManager)
{
    $this->entityManager = $entityManager;
}

public function transform($city)
{
    if (null === $city) {
        return '';
    }

    return $city->getName();
}

public function reverseTransform($cityName)
{
    if (!$cityName) {
        return;
    }

    $city = $this->entityManager
        ->getRepository('DuterteBundle:City')->findOneBy(array('name' => $cityName));

    if (null === $city) {
        throw new TransformationFailedException(sprintf('There is no "%s" exists',
            $cityName
        ));
    }

    return $city;
 }
}

//controller.php

public function createAction(Request $request)
{
    $entity = new Voters();
    $form = $this->createCreateForm($entity);
    $form->handleRequest($request);

    $validator = $this->get('validator');
    $errors = $validator->validate($entity);
    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($entity);
        $em->flush();


        $this->addFlash('danger', 'You are successfully added!, Welcome to the growing Supporters, dont forget to share and invite this to your friends and relatives, click share buttons below, have a magical day!');

        //return $this->redirect($this->generateUrl('voters_show', array('id' => $entity->getId())));
        return $this->redirect($this->generateUrl('voters_list'));
    } else {

        $this->addFlash('danger', 'Oppss somethings went wrong, check errors buddy!');

        return $this->render('DuterteBundle:Voters:neww.html.twig', array(
            'entity' => $entity,
            'form'   => $form->createView(),
        ));
    }
}

/**
 * Creates a form to create a Voters entity.
 *
 * @param Voters $entity The entity
 *
 * @return \Symfony\Component\Form\Form The form
 */
private function createCreateForm(Voters $entity)
{   
    $entityManager = $this->getDoctrine()->getManager();
    $form = $this->createForm(new VotersType($entityManager), $entity, //here i passed the entity manager to make it work
array(
        'action' => $this->generateUrl('voters_create'),
        'method' => 'POST',
    ));

    $form->add('submit', 'submit', array(
        'label' => 'I Will Vote Mayor Duterte'
    ));

    return $form;
}

Mit diesem code kann ich erfolgreich erstellen Sie eine neue Wähler-und wirft Fehler bei der Validierung(invalid_message in formtype), wenn ein Benutzer eingetragen, der name einer Stadt, die nicht denen entsprechen, die bereits in der Datenbank gespeichert.Was fehlt mir da jetzt ist, ich will zur Umsetzung der JQuery-autocomplete, wenn der Benutzer geben Sie geben Sie mindestens zwei Buchstaben

Zweig Teil

//twig.php

  {{ form_start(form, {attr: {novalidate: 'novalidate'}} ) }}
        {{ form_errors(form) }}
        {{ form_row(form.comments,{'attr': {'placeholder': 'Why You Want '}}) }}
        {{ form_row(form.email,{'attr': {'placeholder': 'Email is optional, you may leave it blank.But if you want to include your email, make sure it is your valid email '}}) }}
        {{ form_end(form) }}    

Hinzufügen JQuery Autocomplete in Symfony2 Entität Feld

Wie Sie sehen können, die form selbst ist aus vielen Bereichen, abgesehen von der Feld Stadt.Hier ist die Stadt-Feld ist ein dropdown-besteht aus mehr als tausend Einträge aus der Datenbank.Ich kann erfolgreich konvertieren Sie diese dropdown in textfield mithilfe DataTransformer.Also das problem hier ist, wie zu implementieren JQuery Autocomplete in diesem Formular mit vielen Feldern.

Jede Hilfe ist willkommen

Update

Basierend auf Benutzer Frankbeen Antwort, ich habe eine action in meinem controller

public function autocompleteAction(Request $request)
{
    $names = array();
    $term = trim(strip_tags($request->get('term')));

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

    $entities = $em->getRepository('DuterteBundle:City')->createQueryBuilder('c')
       ->where('c.name LIKE :name')
       ->setParameter('name', '%'.$term.'%')
       ->getQuery()
       ->getResult();

    foreach ($entities as $entity)
    {
        $names[] = $entity->getName()."({$entity->getProvince()})";
    }

    $response = new JsonResponse();
    $response->setData($names);

    return $response;
}

Und auch die js-Datei

{% block javascripts %}
{{ parent() }}
<script src="//code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
<script>
    $(function() {
        function log( message ) {
            $( "<div>" ).text( message ).prependTo( "#log" );
            $( "#log" ).scrollTop( 0 );
        }

        $( "#project_bundle_dutertebundle_voters_city").autocomplete({
            source: "{{ path('city_autocomplete') }}",
            minLength: 2,
            select: function( event, ui ) {
            log( ui.item ?
                "Selected: " + ui.item.value + " aka " + ui.item.id :
                "Nothing selected, input was " + this.value );
            }
        });
    });
</script>
{% endblock %}

In diesem Fall, die

  $( "#project_bundle_dutertebundle_voters_city").autocomplete({

Teil ist eigentlich die Standard-id der Feld Stadt zur Verfügung gestellt von Symfony2 beim Rendern des Formular.Das JQuery autocomplete jetzt funktioniert , aber das problem ist , ich kann nicht speichern Sie die gewählte option, die invalid_message Validierung erstellte ich im inneren FormType.php wird ausgelöst, sowie die JQuery-Skript beim submit-button geklickt wird

Ausgewählt: Basista (Provinz Pangasinan) aka undefined

sagt, dass die Id des ausgewählten Werts nicht definiert ist

$( "#project_bundle_dutertebundle_voters_city").autocomplete({
            source: "{{ path('city_autocomplete') }}",
            minLength: 2,
            select: function( event, ui ) {
            log( ui.item ?
                "Selected: " + ui.item.value + " aka " + ui.item.id ://this throw undefined
                "Nothing selected, input was " + this.value );
            }
        });
Schreibe einen Kommentar