Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Formularz podzielony na strony
Forum PHP.pl > Forum > PHP
panjarek
Witam.
Robię dodawanie artykułów na stronę i mam pewien problem.
Otóż jak zrobić aby po napisaniu tresci w formularzu na dole były przyciski:
zakończ - zapisałby to co wpisano w pola i wyszedł z edycji
dalej - zapisałby to co wpisano i otworzył kolejne pole aby można było pisać następną stronę artykułu.
Niebardzo wiem jak szukać odpowiedzi na moje pytanie dlatego kieruję je tutaj.
parzygnat
A do czego będziesz zapisywał te artykuły? Do bazy? Pliku?
panjarek
Zapis do bazy.
R4D3K
To jaki problem questionmark.gif
W skrypcie sprawdzasz czy zostały przesłane dane z POST np.
  1. if (isset($_POST['zapisz])) {
  2. // zapis do bazy
  3. }

Jeśli chodzi o następną stronę artykułu to nie wiem jaki masz algorytm wczytywania tych stron i zapisywania. Ja bym polecał napisanie algorytmy, który sam stronicuje w zależności od ilości treści. Poszukaj w necie pod hasłem paginacja.
thek
A ja bym zapytał w jaki sposób masz strukturę zapisu stron do bazy. Czy jest to na zasadzie, iż w tabeli są kolumny:
id_artykułu, numer_strony_artykułu, pola_różne
czy też może na zasadzie:
id_artykułu, pola_różne i w polu z treścią są jakieś znaczniki określające "łamanie" strony.
Bo w zależności od tego inaczej wygląda całość. Albo wtedy po każdej stronie jest zapis do bazy (wariant 1), albo czekasz na całość danych przenosząc ją pomiędzy "stronami" w zmiennych sesyjnych (wariant2).

EDIT: To tylko na szybko pomysły jakie mógł zastosować twórca skryptu. Mógł jednak inaczej i wtedy trzeba bardziej się wgryźć formę formularza.
darko
A ja użyłbym sprawdzonego przeze mnie pluginu do jQuery - jQuery babysteps. Tutaj masz demo wystarczy dostosować do potrzeb.
panjarek
Mam trzy tabele: tytuly, podtytuly, tresc.
Formularz chcę podzielić tak:
1 strona podaję tytuł i klikam dalej.
2 strona podaj podtytuł i treść i klikam zapisz lub dalej.
3 Jeżeli klikne zapisz dane zostają zapisane i kończy się edycja. Jeżeli kliknę dalej ponownie przechodzi do punktu 2 umożliwiając pisanie kolejnego działu artykułu.
Chodzi mi tylko o to, jak powinien wyglądać taki formularz w którym będę miał dwie takie możliwości ( dalej, zapisz ).
thek
OK... Ale nie podałeś struktury tych tabel. Co z tego, ze wiem jak się nazywają, skoro nie wiem jak się łączą? Nie wiem nadal, czy cała treść artykułu to jeden czy kilka wpisów do tabeli treść. Wiem na razie tylko tyle, że masz jeden tytuł do artykułu, więc zapewne ma on strukturę: id_artykułu, tytuł. Ale czy podtytuły i treść są na zasadzie wariantu 1 czy wariantu 2 to wciąż zagadka dla czytających temat i stąd nie można określić jak prawidłowo to zrobić. Jedyne co można teraz Ci podpowiedzieć to tyle, że po 1 podstronie z tytułem masz go zapisać do bazy i uzyskać w ten sposób id_nowego artykuły. Ten numer przepychasz sesją na kolejne podstrony dla zapisu podtytułów i stron w bazie. Guzik Zapisz zapisze aktualną stronę (lub wszystkie przechowywane w sesji jeśli to wariant 2) i przekieruje na główna stronę, zaś przycisk Dalej zapisze aktualną stronę i podtytuł do bazy (wariant 1) lub do sesji (wariant 2) i dodatkowo otworzy pustą stronę edycji do pisania kolejnej strony. Nic więcej na chwilę obecną nie mogę Ci powiedzieć więcej. Mi takie podpowiedzi wystarczyłyby bym sam zaczął ów sposób oprogramowywać, ale mam zapewne ciut większą praktykę w php.
parzygnat
Cytat
Chodzi mi tylko o to, jak powinien wyglądać taki formularz w którym będę miał dwie takie możliwości ( dalej, zapisz ).


Formularz taki będzie wyglądał identycznie jak inne:

Kod
<form action="twojplik.php" metod="post">
...
<button name="dalej" value="dalej" type="submit">
<button name="zapisz" value="zapisz" type="submit">
</form>


Natomiast to czy został wcisnięty przycisk "dalej" czy "zapisz" musisz obsługiwać w pliku twojplik.php
panjarek
A więc tak:
Tabela tytuly ma pola: id, tytul
Tabela podtytuly: id, idtytulu, podtytul
Tabela tresc: id, idpodtytulu, tresc

Artykuł ma jeden tytuł i kilka podtytułów ( taki spis treści ), do każdego podtytułu przypisana jest jedna tresc.

Cytat(parzygnat @ 2.03.2010, 12:49:47 ) *
Natomiast to czy został wcisnięty przycisk "dalej" czy "zapisz" musisz obsługiwać w pliku twojplik.php

A jak sprawdzić który z przycisków został wciśnięty?
parzygnat
Jeżeli masz metode POST przesyłąnia formularza to sprawdzasz

  1. isset($_POST['dalej']); //dla przycisku dalej
  2. isset($_POST['zapisz']);


Analogicznie będzie dla metody GET tylko wstawisz $_GET zamias $_POST
thek
No i teraz już wszystko wiemy smile.gif Z tym, że mylisz się, iż do jednego podtytułu masz jedną treść winksmiley.jpg Zauważ, że jeden tytuł musi mieć przynajmniej jeden podtytuł i tu się zgadzamy. Ale jeden podtytuł może mieć więcej niż jedną stronę treści. Na to Twoja struktura akurat także pozwala winksmiley.jpg Dzięki temu możesz mieć do jednego podtytułu kilka stron. No chyba, że masz indeks typu PRIMARY lub UNIQUE nałożony na kolumnę idpodtytułu w tabeli tresc. Ale raczej wątpię, by było tam coś innego niż zwykły INDEX.
Sprawdzenie który został wciśnięty najlepiej rozpoznać poprzez nadanie obu guzikom typu submit i unikalnych name, a potem wyłapywanie w pliku odczytującym, które name znajduje się wśród przesłanych postem smile.gif Najprościej chyba tak: if( array_key_exists( 'name_submita', $_POST ) )

EDITL: A dlaczego uważam, że ktoś zrobił celowo kilka stron do podrozdziału? Bo gdyby była to relacja 1 do 1 to by zwyczajnie podtytuł i treść zawarł w jednej tabeli jako osobne pola. Układ jaki Ty masz pozwala na utworzenie w X artykułów dowolna liczbę od 1 do Y podrozdziałów, a każdy z nich może mieć od 1 do Z stron smile.gif Dzięki temu możesz "obejść" nawet częściowo numerację rozdziałów i stron bez konieczności pamiętania ich id jeśli dobrze zastosujesz ORDER BY i LIMIT. Czyli zamiast pamiętać, że w artykule 4 w podrozdziale 3 o id = 15, chcesz zobaczyć stronę 2, o id = 56 możesz zamiast szukać kombinacji 4/15/56 szukać 4/3/2 winksmiley.jpg Ale jak? To już zostawiam Tobie do przemyślenia.
panjarek
Ja to sam robię. Jeżeli jest jakieś inne - lepsze rozwiązanie takiego podziału artykułu na strony to bardzo chętnie dowiedziałbym się jak smile.gif
thek
Jeśli zależy Ci tylko na tym, by dany Podtytuł miał jedną stronę to wystarczą takie struktury tabel:

tytuły: id (int - PRIMARY KEY), nazwa( varchar - 200? )
podrozdzialy: id(int - PRIMARY KEY), id_tytulu(int - INDEX), nazwa( varchar - 200? ), tresc( text )

Dzięki temu masz jedno łączenie mniej i jest zgodne z zamysłem który miałeś, czyli 1 podrozdział = 1 strona treści. Indeksy pozakładałem byś miał szybciej działający JOIN dla łączenia artykułu z jego rozdziałami smile.gif

EDIT: W chwili obecnej też możesz fajnie prosto zrobić wyświetlanie podrozdziałów w artykule bez odnoszenia się do faktycznego id podrozdziału. Jako że struktura jaką przyjmę tyczy określonej przeze mnie w tym poście struktury to pomyśl jak "złapać" 3 rozdział artykułu o id 7? To proste. Wybierz wszystkie podrozdziały go tyczące, uporządkuj po id rosnąco i wybierz konkretny jeden o offsecie 2 (bo liczenie od 0 jest, czyli trzeci to 0, 1, 2). Czyli masz mniej więcej zapytanie:
  1. SELECT kolumny FROM podrozdziały WHERE id_tytulu = 7 ORDER BY id ASC LIMIT 2,1
To szybsze niż wyciąganie z bazy jaki id ma ten akurat podrozdział by go potem pobrać. Poza tym takie potraktowanie pozwala zastosować SQL_CALC_FOUND_ROWS dla zrobienia łatwo paginacji. Poczytaj o tym co mam dużymi literkami a zobaczysz jak bazę odciążyć można. Bo wielu nieszczęśników zapewne by do paginacji jeszcze SELECT count(*) użyło dla tych samych warunków zapytania, nie wiedząc o alternatywie. Jedno ciężkie nieraz zapytanie + proste zamiast 2 nieraz ciężkich to duży w wielu przypadkach skok w wydajności.
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.