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) }}
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 );
}
});
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste, Sie haben zu Beginn der Erstellung einer route und Aktion, gibt json-Daten. JQuery autocomplete remote gibt Ihnen eine $_GET-variabele mit dem index 'Begriff' und erhalten will, JSON zurück. Hier ist ein Beispiel, ein Unternehmen mit dem Namen Stadt und eine Eigenschaft $name
Sekundären man kann einen Zweig nur wie die Quelle von jQuery-autocomplete. Der einzige Unterschied ist die Quelle variable in der autocomplete() Funktion . Dort müssen Sie angeben, te Zweig ist Pfad() Funktion mit der route-Taste zB city_autocomplete.
(Diese Ansicht muss eine andere route und eine andere (normale) Aktion.)
Und endlich können Sie leicht ändern Sie diese Ansicht, und verwenden Sie Ihre eigene form.
Schließlich, nach dem Graben tiefer in mein Symfony code habe ich endlich die Lösung gefunden.Mit dem code von Benutzer Frankbeen, ich fügen Sie einige 'zwicken' inorder für die JQuery-endlich Arbeit.Der Täter ist in den controller.
Die Stadt Einrichtung ist es, die Provinz Entität in einer zu vielen-Beziehung.Da die Stadt Unternehmen hat Tausende von Namen(Datensätze) sind die Chancen, dass einige Werte haben denselben Namen,also Anhängen Verwandte Provinz ist nützlich, um zu vermeiden, Verwirrung Benutzer
Nun, da die Namen dort, wo jetzt die 'andere' im Namen schon gespeichert in der Datenbank, die invalid_message Validierung löst die Fehler aus.Meine Lösung ist "sauber" die eingereichten Daten durch das entfernen der angehängten Provinzen vor dem Vergleich der eingereichten Werte, um die Werte in der Datenbank.
Innerhalb der DataTransformer, ich habe einige code
Nun die JQuery endlich das arbeiten und speichern in der Datenbank ist auch erfolgreich.Und zu guter Letzt,
Geändert
Nun das "Undefined" - Fehler ist Weg.
Hier eine Lösung, um ein Feld hinzuzufügen in Bezug auf die Reaktion der Symfony-Controller.
In Erfolg, fügen Sie Felder, die Sie möchten, indem du ein Objekt.
Dann, in der wählen, können Sie darauf zugreifen, indem ui.Element.Felder
JS: