2015-05-06 8 views
5

Pracuję nad formularzem używanym do wysyłania powiadomień. W formularzu mam, między innymi pola, jedno pole pliku wejściowego. W tym polu ładuję plik CSV. Z pliku CSV (zawierającego kolumnę wiadomości e-mail) wyodrębniam dane za pomocą https://code.google.com/p/jquery-csv/ i dodam je do wybranego pola tylko do odczytu z wszystkimi wybranymi opcjami.Symfony2 Forms - sposób korzystania z dynamicznych opcji wyboru

Uwaga: formularz został utworzony przy użyciu typów formularzy (w książce Symfony2) - class NotificationType extends AbstractType; Formularz jest przesyłany za pośrednictwem AJAX;

1. Strike jeden Biorąc pod uwagę, że pole select jest dynamicznie zaludnionych, zdecydowałem nie, aby dodać go do konstruktora formy, ale wstrzyknąć go przy użyciu JavaScript.

To był zły ruch, ponieważ podczas przesyłania formularza Symfony2 potwierdza, że ​​pola dodane w formularzu to dokładnie te, które zostały przesłane. Zwrócony błąd to: Ten formularz nie powinien zawierać dodatkowych pól.

2. Strike dwa Przechodząc od jednego uderzenia Chciałem zobaczyć, czy mogę obejść, że tak dodałem pola select w budowniczy formie, ale bez opcji, również wstrzykiwanie opcje za pośrednictwem JavaScript.

Nadal nie ma szczęścia. Symfony2 zapewnia również, że nie możesz przesłać opcji, która nie została dodana do kreatora formularzy podczas dodawania pola. Zwrócony błąd to: Ta wartość jest nieprawidłowa.

3. Strike trzy Od Strike 1 i 2, zgaduję, że jedynym sposobem, aby to dzieło byłoby dodać wszystkie możliwe opcje w konstruktora formularza w tablicy wyborów podczas dodawania pola . W ten sposób pole i opcje będą prawidłowe do przesłania.

Ale nie jest to coś, co uważam za realną opcję, szczególnie, że w polu wyboru oczekuję 10000 możliwych wyników, o których nie wiem, dopóki nie załaduję pliku CSV.

Czy możesz zaproponować inne podejście do tego?

Dzięki!

+0

Korzystanie z dokumentacji [this] (http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#cookbook-form-events-submitted-data) byłoby najlepszą opcją. Ale jesteś już prawie przy trzeciej implementacji. Zamiast dodawać wszystkie możliwe opcje, dlaczego nie można dodać tylko wybranej wartości do opcji w tablicy opcji. – xiidea

Odpowiedz

4

Zobacz, jak wykonać dynamically modify forms (przykład nr 3).

Będziesz musiał to zrobić, ponieważ formularz będzie sprawdzany w odniesieniu do opcji konstruktora, więc jeśli dodasz nowe pole lub zmienisz jego opcje, renderowanie nie będzie o tym wiedzieć.

Albo nie zamapujesz formularza na model/obiekt i nie przetworzysz go samodzielnie.

+0

Moje pola są wyborami, a nie jednostkami i nie mam żadnych zdefiniowanych klas jednostek, z których mogę skorzystać, dziękuję za skierowanie mnie do dokumentacji. Jakiekolwiek inne podejście, które możesz zaproponować? – Radu

+0

@Radu możesz nadal używać zasady, jeśli pola nie są elementami.Zamiast sprawdzać istnienie, sprawdź wartość pola pierwszego i odpowiednio ustaw opcje. Jak na przykładzie wiersza '$ positions = null === $ sport? array(): $ sport-> getAvailablePositions(); 'możesz zrobić coś takiego jak' if ($ field1value == 'foo') {$ choices = array ('alice', 'bob', 'malfoy'); } ' – Rooneyl

+0

Nieznaczna zmiana wymagań. Zaktualizowałem wstępne szczegóły. – Radu

Powiązane problemy