Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] dynamiczne pobieranie danych i zapis
Forum PHP.pl > Forum > PHP > Frameworki
AxZx
witam

taki dziwny problem mam, nie wiem czy sam go stworzyłem czy po prostu nie da się tego tak łatwo zrobić.

mam 6 różnych formularzy, 6 różnych modeli czyli 6 różnych tabel w bazie.
w kontrolerze chciałbym to w jednym miejscu zapisywać, ale tak, żebym nie musiał tam podawać, które dane zapisuje. po prostu wszystkie dane muszą być zapisane.
problem w tym, że w formularzu mam checkboxa, który ma wartość 0 lub 1.

dane zapisuje w ten sposób:
  1. <?php
  2. $dane->fromArray($this->getRequest()->getParameterHolder()->getAll(), BasePeer::TYPE_FIELDNAME);
  3. $dane->save();
  4. ?>


problem w tym, że gdy ten checkbox jest odznaczony (ma wartość 0) to nie występuje on w tabeli z parametrami - w bazie nie są zapisywane dane, że ktoś odhaczył tego checkboxa (czyli powinno zapisać się 0).

jak mógłbym to inaczej zrobić?
arecki
Może rozwiąż to za pomocą JS ? Zrób hidden_tag i zapisuj do niego w zdarzeniu 'onclick' wartość 'checked' z checkboxa. smile.gif
AxZx
chciałem unikać JS jak tylko się da, no ale jak innego wyjścia to tak właśnie zrobię.
właściwie to już zrobiłem i działa:)

dziękuje za pomoc.
jednak gdyby było inne lepsze rozwiązanie (raczej po stronie php) to bardzo chętnie zmienię.
jarek_bolo
A nie możesz ustawić domyślnej wartości na 0 w tej kolumnie w bazie questionmark.gif
AxZx
ustawiłem. ale co to da?
widzę jakie są wykonywane zapytania i właśnie dlatego poszukuję jakiegoś rozwiązania.
po prostu jak nie jest zaznaczony ten checkbox to w zapytanie nie pojawia się coś takiego jak status = 0.
jarek_bolo
Ty no ale ja chyba czegoś nie kumam.
Przecież jak mam sobie tabelę jakąś przykładową, powiedzmy, `produkt`:
| id | nazwa | cena | widoczny | <- jeśli widoczny to ma jeden, jeśli nie to zero.

I teraz dając:
  1. INSERT INTO `produkt` () VALUES();

Normalnie dodaje mi rekord do bazy. Mowa o bazie MySQL.

Więc jeśli metoda $dane->fromArray($this->getRequest()->getParameterHolder()->getAll(), BasePeer::TYPE_FIELDNAME); buduje Ci zapytanie bez pola przechowującego wartość tego checkboxa, bo nie zaznaczony jest nie przesyłany to i tak ta kolumna powinna być wypełniona domyślną wartością :/

Chyba, że to jest jakaś dziwna właściwość Propela :/ A może spróbuj w konfiguracji yml wpisać domyślną wartość tego pola (jeśli jest w ogóle taka opcja).
Cysiaczek
Czy w schema.yml dajesz pole typu boolean, czy tinyint/integer?
AxZx
Cytat(jarek_bolo @ 11.10.2008, 02:46:42 ) *
Ty no ale ja chyba czegoś nie kumam.
Przecież jak mam sobie tabelę jakąś przykładową, powiedzmy, `produkt`:
| id | nazwa | cena | widoczny | <- jeśli widoczny to ma jeden, jeśli nie to zero.

I teraz dając:
  1. INSERT INTO `produkt` () VALUES();

Normalnie dodaje mi rekord do bazy. Mowa o bazie MySQL.

Więc jeśli metoda $dane->fromArray($this->getRequest()->getParameterHolder()->getAll(), BasePeer::TYPE_FIELDNAME); buduje Ci zapytanie bez pola przechowującego wartość tego checkboxa, bo nie zaznaczony jest nie przesyłany to i tak ta kolumna powinna być wypełniona domyślną wartością :/

Chyba, że to jest jakaś dziwna właściwość Propela :/ A może spróbuj w konfiguracji yml wpisać domyślną wartość tego pola (jeśli jest w ogóle taka opcja).


podczas insertu okej, no ale ja pisałem przecież, że chodzi mi o Update:)

Cytat(Cysiaczek @ 11.10.2008, 03:05:02 ) *
Czy w schema.yml dajesz pole typu boolean, czy tinyint/integer?


boolean.
jarek_bolo
Aaa, no chyba, że tak no i jawnie tego nie napisałeś, a z tego co napisałeś wczoraj w nocy nie dałem rady się domyślić, że mowa o Update smile.gif
athabus
Możesz nadpisać metodę save, tak aby w razie braku parametru nadawala mu wartość 0
AxZx
chyba nie będzie to takie proste.

na podstawie parametru przesłanego z URL (lub innego) tworze odpowiedni model.

  1. <?php
  2. $nazwa_modelu = $this->getRequestParameter('nazwa_modelu');
  3.  
  4. $model = new $nazwa_modelu();
  5. $model->fromArray($this->getRequest()->getParameterHolder()->getAll(), BasePeer::TYPE_FIELDNAME);
  6. $model->save();
  7. ?>


więc jak? musiałbym każdemu modelowi taką metodę pisać. przy określonej ilości, powiedzmy 5 to jeszcze znośne jest. ale jak za kilka miesięcy wprowadzę kolejny model to takich poprawek może być więcej. bo to nie byłoby jedyne miejsce gdzie muszę to zmieniać.

hmm ale tak sobie myślę, że to mógłby być dobry pomysł. nie tyle dobry co jedyny rozsądny:) przy braku innych prostszych - mniej inwazyjnych w modele.
dzięki
woj_tas
  1. <input type="hidden" name="nazwa_pola" value="0" />
  2. <input type="checkbox" name="nazwa_pola" />
AxZx
wiedziałem, że musi być jakieś proste, normalne rozwiązanie:)
dzięki wielkie!
Wojciech Bańcer
Ja osobiście stosuję JEDNO pole hidden, które zawiera id wszystkich checkboxów z wartością (1)
Dzięki temu wykonuję potem tylko dwa zapytania SQL, przy aktualizacji
- 1-sze zeruje wartości z tego pola hidden
- 2-gie wstawia wartości "1" na zaznaczonych polach.

Trochę więcej zabawy jest przy stronnicowaniu (trzeba wiedzieć jeszcze które ID wolno ruszać, czyli dochodzi drugie pole HIDDEN, a w update dodajemy "where id in ()"), ale takie rozwiązanie wydaje mi się najbardziej optymalne pod kątem zapytań SQL i łatwości wykonania.
AxZx
a ja wykonuje tylko jedno zapytanie update....
smile.gif
Wojciech Bańcer
Jeden update zmienia Ci dwa rodzaje wartości? Podrzuć takie zapytanie, chętnie się douczę. smile.gif
AxZx
ja pisze na temat - w tym temacie wykonuje się jedno zapytanie, jak zostało przedstawione nie potrzeba więcej.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.