Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]dzielenie formularza na pod strony
Forum PHP.pl > Forum > Przedszkole
Jugulator
Witam!

Nie bardzo wiedzialem gdzie umieścić tego posta, ale chyba ta lokalizacja bedzie najlepsza, bo raczkuje w temacie biggrin.gif. Mam klopot następujacego typu. Mam formularz, którego nie chcę wyświetlać jednym ciągiem na stronie, tylko chciałbym go podzielic tematycznie, a miedzy jego fragmentami przechodzic bądź to za pomocą jakichś przyciskow, lub linków. Kiedyś na praktyce w pewnej firmie przerabiałem takie formularze pisane xml'u, gdzie było to po prsotu rozwiązane znacznikami
  1. <zePages>
  2. treść pierwszej podstrony
  3. </zePages>
  4. <zePages>
  5. treść drugiej podstrony
  6. </zePages>

przydało by mi się tutaj właśnie coś podobnego, zeby później ten formularz móc wyslac za jednym razem jako całość.

Czytalem posty na temat klasy pager, ale wydaje mi sie, ze to zbyt ambitne rozwiazanie i nie wiem, czy w tym przypadku w ogóle prawidłowe. Nie ma czegos w stylu własnie jakichś znaczników smile.gif?

Z gory dzięki za pomoc
Lars
Utwórz sesję, trzymaj w niej dane, potem przy ostatniej stronie zrób
  1. <input type="hidden">

z wartościami danych z sesji... i wysyłaj. Albo te dane zapisz do bazy. Przynajmniej ja bym tak to zrobił.

hmm...tak dokładniej: przy każdej stronie formularz wysyłający metodą POST dane, na następnej stronie załadowanie
danych do sesji i kolejny formularz...a jeżeli chcesz zrobić to w formie takich znaczników, pozostaje napisanie skryptu.
Jugulator
Chciałem własnie sobie oszczędzić zabawy z sesjami... Po prostu jedna strona jeden formularz a wszystko podzielone na podstrony i później wszystko jednym submit'em idzie, jak w tym formularzu z którym kiedyś miałem do czynienia.. tylko nie mam pojecia jak to tam było zrobione...
Cysiaczek
Sesja to dużo zabawy? Robisz pola wg schematu:
  1. <?php
  2. <input type="text" name="form_part_1[nazwa_pola]" />
  3. ?>


Jedyne co robisz, to walidacja i przyrzucenie jednym poleceniem do sesji:
  1. <?php
  2. $_SESSION['form_part_1']=$_POST['form_part_1'];
  3. ?>


Analogicznie pozostałe strony formularza.
Ostatni submit zbiera wszystkie dane z sesji i je przetwarza - nie ma prostszego sposobu. Możesz też to zrobić z pomocą JS, albo nawet ajaxem. To już zależy od Twojej inwencji i tego, jaki interfejs planujesz.

Pozdrawiam
Zyx
Ja miałem całą bibliotekę do tego celu zrobioną, lecz tu już programowanie obiektowe wkracza, a skoro temat dałeś do działu "Przedszkole", zakładam, że nie bardzo Cię takie rozwiązanie interesuje. Mogę jednak opisać zasadę.

Otóż każdy krok formularza robiłem jako osobny formularz. Dodatkowo mam specjalny kod, który przy przechodzeniu pomiędzy poszczególnymi krokami odbierał wszystkie pola z poprzedniego kroku, sprawdzał ich poprawność na podstawie zdefiniowanych reguł i generował listę pól

Kod
<input type="hidden" name="nazwa_pola" value="wartosc" />


Gdy przechodziłeś do kolejnego kroku, jeszcze raz ten sam kod odbierał w ten sposób wartości pól ze wszystkich poprzednich kroków + ostatniego i w ten sposób po zakończeniu skrypt otrzymywał wszystkie dane. Przy tym sposobie musisz pamiętać, by przy generowaniu tych pól HIDDEN filtrować dane np. funkcją htmlspecialchars().

Alternatywny sposób to pamiętać dane ze wszystkich poprzednich kroków w sesji - moim zdaniem nie masz co się obawiać tego, przynajmniej jest mniej danych do przesyłania między użytkownikiem, a serwerem. Jeśli wykorzystasz sesje w PHP, to nie powinno być z tym problemów.

Edit: O, widzę, że Cysiaczek już odpisał w międzyczasie.
Jugulator
Cytat(Cysiaczek @ 25.07.2008, 20:19:58 ) *
Sesja to dużo zabawy? ..


No jeśli udało by mi się zrobić, tak jak to myślałem wyjściowo, no to jeśli bym miał do wyboru jednego submita i jeden formularz (podzielony tylko na podstrony), no to chyba oczywiste, ze to byłoby mniej zabawy, bo jednym submitem bym robił wszystko. Nie musialbym w ogóle zaprzęgać, rzadnych sesji winksmiley.jpg.

Nie twierdzę, ze to coś strasznie karkołomnego i już wczoraj tak zacząłem robić nie mogąc znaleść mojego rozwiązania. Do przesyłania poszczególnych podforzmularzy ze strony na strone uzywam JS, bo chcialem żeby przechodzenie do kolejnych etapów było przez linka. Także dzięki za chęci, ale wyjściowego kłopotu mi sie nie udało rozwiazać.. sad.gif

Co do programowania obiektowego, cos tam mialem z nim do czynienia, ale bardziej w c++ smile.gif ale jakoś generalnie nie czuję się za dobrze w tym temacie, . Ale możesz rozwinąć ten temat, moze akurat go strawię smile.gif
Zyx
Skoro Cię to interesuje, to proszę bardzo: po prostu zrobiłem sobie klasę, której obiekty reprezentowały formularze. Dodatkowo, takiemu tworowi nadawałem zawsze nazwę, żeby było wiadomo, co zostało wysłane. Przez dziedziczenie rozszerzałem sobie klasę bazową, tworząc właściwe rodzaje formularzy, np. do dodawania użytkowników itd.

Zrobienie kilku kroków sprowadzało się do tego, że dla każdego kroku robiłeś sobie klasę formularza, albo odpowiednio konfigurowałeś obiekt klasy bazowej. Później wszystko łączyłeś, tworząc formularz wielokrokowy:

Kod
// robimy obiekty dla poszczegolnych krokow
$form1 = new formularz1('foo');
$form2 = new formularz2('foo');
$form3 = new formularz3('foo');

// laczymy je
$form1->setNextStep($form2);
$form2->setNextStep($form3);

// wykonujemy
if($form1->execute())
{
   // formularz przetworzony, mamy wszystkie dane
}


Przy formularzu w HTML zapisuję numer kroku. Dzięki temu metoda execute() może określić, czy ma wyświetlać kolejny krok, czy zwrócić kontrolę skryptowi, bo doszliśmy do końca.

Oczywiście całość w moim przypadku była jeszcze zintegrowana mocno z systemem szablonów i systemem kontroli danych - niestety biblioteki nie doprowadziłem do etapu 100% stabilnego, ale będę za niedługo pisać coś działającego na podobnych zasadach, tylko już lepiej zaprojektowanego.
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.