Symfony3 Ändern Sie dynamisch Formulare mit Ereignissen

8

Problem ist, dass im Gemeindefeld nichts geladen ist, es wird undefiniert. Im AJAX-Code bekomme ich den Wert der Provinz gut. Aber in der Klasse addMunicipioField.php nimmt nicht den Wert der $ province, es ist immer nul

Ich versuche, ein Registrierungsformular zu erstellen, wo ein Teil der üblichen Felder ( name, nick, password, ... ) ich auch zwei abhängige Felder Municipality und Province hinzufügen.

Der Codec-Controller:

%Vor%

Die Entität , die das Formular erstellt, ist DbUsuario mit dem Feld idMunicipio .

%Vor%

Dann die Entität von DbMunicipio , die sich mit 'province' verbindet:

%Vor%

Und die Entität DbProvincia , die nur die Felder ( id (integer), slug (String) and province (String) ) enthält.

Ich definiere das Formular wie folgt:

%Vor%

Ich definiere innerhalb des AppBundle \ Form \ eventListener \ AddProvinciaField die Klassen, die im folgenden Formular aufgerufen werden:

%Vor%

Und später definiere ich AddMunicipioField .php:

%Vor%

}

Und schließlich die AJAX Anfrage:

%Vor%

Ich habe var_dump und alert () im Code hinzugefügt. Dies ist die Art der Ausgabe.

In diesem Fall ist der Wert von province immer null .

%Vor%

AJAX:

%Vor%

Ein anderer Gesichtspunkt Die Entitäten sind gleich. In diesem Fall funktioniert es, aber ich muss den Senden-Knopf drücken. Wie könnte ich es tun, ohne den Knopf zu drücken, dass es automatisch geändert wurde?

Die Klasse RegistreUserType erweitert den AbstractType um die folgenden Zeilen.

%Vor%

Die neue Klasse AddMunicepioField () :

%Vor%

Codec Ajax:

%Vor%

});

    
Merche 12.03.2017, 20:37
quelle

2 Antworten

0

Gelöst !!

In meiner Form habe ich den Aufruf zu den zwei neuen Klassen hinzugefügt:

%Vor%

Die erste Wahl ist Provinz, das ist die Klasse:

%Vor%

Die zweite Klasse ist Municipi:

%Vor%

Die kontrollierten fügen diese Funktion hinzu:

%Vor%

Wo die Funktion findByProvinceId ist, erstelle ich sie als Repository der Entität DbMunicipio.

%Vor%

Und de Codec AJAX.

%Vor%     
Merche 24.03.2017, 00:19
quelle
3

Ich habe weder in Ihrer Entität noch in der Hauptform ein Feld oder eine Eigenschaft mit dem Namen 'select_provincia' bemerkt, daher werde ich versuchen, zu raten, dass es wahrscheinlich einfach 'provincia' genannt wird, denn das ist der Name für beide die Eigenschaft in der Gemeinde Entität und in der Form Abonnent für die Gemeinde. Auch in AddMunicipioField.php sollten Sie diesen Code ändern:

%Vor%

dazu:

%Vor%

seit dem Abfragen werden Sie provincia mit der ID der Provinz vergleichen.

Stellen Sie außerdem sicher, dass Sie die Methode __toString () in der Gemeinde-Entität implementiert haben, so dass symfony wissen würde, wie dieses Objekt in eine Zeichenfolge konvertiert werden kann, um es in der Auswahlliste anzuzeigen.

Hoffe das hilft:)

Da Sie neue Informationen hinzugefügt haben, werde ich meine Antwort aktualisieren:

Erstens, in der AddMainicioField.php haben Sie immer noch grundsätzlich den gleichen Fehler: Der Array-Schlüssel wird genauso benannt, wie Sie Ihr Feld benennen, in diesem Fall nicht 'provincia_input', sondern 'provincia'. Sie können die Daten sehen, die an Sie gesendet wurden, indem Sie "dump ($ data); die;" Kurz bevor Sie überprüfen, ob der Array-Schlüssel vorhanden ist (prüfen Sie, ob der Name des Schlüssels "provincia" lautet, da der Name dem entspricht, was Sie beim Hinzufügen des Feldes zum Formular angegeben haben (AddProvinciaField.php):

%Vor%

Eine andere Sache, die ich in dem ersten js-Ausschnitt bemerkt habe, den Sie gepostet haben, ist der in diesem Teil des Codes:

%Vor%

Du nimmst die Eingabe von $ (". provincia-input") und sendest sie als Wert für ein Feld namens "idMunicipio", was in deiner Situation keinen Sinn ergibt.

Zuletzt werde ich die Fehler besprechen, die im letzten Teil des von Ihnen geposteten JS gemacht wurden:

%Vor%

Zunächst sollten Klassennamen nicht zur Identifizierung der von Ihnen verwendeten Felder verwendet werden. Per Definition sollen sie mehrere Male im Dokument verwendet werden und nur Stil beschreiben, was zu einem unerwarteten Verhalten führen kann, wenn Ihre Codebasis wächst. Bitte weisen Sie den Eingängen, die Sie abfragen und insbesondere ersetzen, korrekte ID-Werte zu, damit Sie sie richtig identifizieren können.

Zweitens lesen Sie bitte den JS-Code, der im offiziellen Symfony-Tutorial veröffentlicht wurde, indem Sie dem link . Wie Sie sehen können, ist die richtige Methode, um Daten zurück an den Server zu senden, nicht das Senden einer einzelnen Eigenschaft, wie Sie es in dieser Zeile versuchen:

%Vor%

, sondern indem Sie die Eigenschaft als Teil der Formulardaten senden. Wie in dem Tutorial, das ich gepostet habe, bitte zuerst ein leeres Datenobjekt erstellen:

%Vor%

füge dann den Provinzwert hinzu:

%Vor%

Drittens ist dieser Teil des Codes eindeutig falsch:

%Vor%

Wie Sie sehen können, ist die HTML-Variable in diesem Teil des Codes nicht definiert. Das liegt natürlich daran, dass die Variable, die Sie in diesem Fall verwenden sollen, Daten (die Antwort, die Sie vom Server erhalten haben) genannt wird. Also ändere es bitte so:

%Vor%

Wenn Sie noch SF- und Webprogrammierung lernen, würde ich Ihnen vorschlagen, den Bottom-up-Ansatz zu nutzen, um Ihr Programmierwissen zu verbessern, da dieser Fall ziemlich komplex ist und Probleme, die das Funktionieren des Codes verhindern, noch tieferes Verständnis erfordern der Technologien, die Sie verwenden. Ich persönlich würde vorschlagen, HTML-Attribut-Verwendung, Symfony-Formularbehandlung zu lesen, zu lesen, welche Daten für Sie während jedes Symfony-Formularereignisses verfügbar sind und vielleicht versuchen, die Dumper-Komponente von Symfony mehr zu verwenden, um Ihren Code zu debuggen, da var_dump wirklich sehr ist ineffiziente Möglichkeit, SF-Code zu debuggen (hätte viele Probleme für Sie gelöst).

    
grssn 15.03.2017 14:30
quelle