Form adat tárolása és redirect

Psysoul képe

Elég sok tutorialt/quickquideot/api-t olvastam, de nem találtam szép megoldást.

Van egy blokk modulom, jobb oldalt, 2 input text mezővel. Azt szeretném megoldani, hogy a form_submit-ben elmenteni az összes adatot, és a usert átirányítani a modul fő oldalára.

function test_form_submit($form, &$form_state) {
$form_state['redirect'] = 'testmodule/' . $form_state['values']['name'] . '/' . $form_state['values']['ertek'];
}

A fenti megoldás működik, de nem szép. Hogy tudom az egész form_state-t átadni itt a testmodule-nak, hogy adott esetben mind a 10 mezőm mentésre kerüljön?

Persze átirányítás nélkül működik ezzel, de nekem kéne az átirányítás:

$form_state['redirect'] = FALSE;
global $myform_form_state;
$myform_form_state = $form_state;

Kicsit részletesebben, hogy mire kéne ez:
- user a jobb oldali menüben kitölti az adatokat -> küldés -> a modul oldalára kerül, ott megjlennek az adatok amit beírt, és még néhány adat, amit a php számol.

- user a modul oldalon tölti ki a formot -> küldés: nyilván itt már nem kell redirect -> adatok megjelenítése.

- miután megjelentek az adatok egy gomb megnyomása után még megjelenne néhány input mező a felhasználó elérhetőségeinek, és ha azt kitöltötte, csak ezután kéne az egészet adatbázisba menteni.

Köszönöm a tippeket.

Drupal verzió: 
Bálint képe

Úgy látom, már eleve úgy redirecteled, hogy a két bevitt érték megjelenik az url-ben.
Akkor itt miért akarod átadni a $form_state-et? Az url-ből ki tudod olvasni, ami kell.
Vagy rosszul értelmezem a problémát?

0
0
Psysoul képe

Amit írtam az jó megoldás, de nem szép, ha mondjuk 10 mezőm van a formban, és azokat mind az URL-ben adná át a rendszer.

Erre szeretnék egy megoldást, ami az összes változót átadja, és elérem azokat az oldalon ahova a redirect történik.

0
0
pp képe

Ha kiindulunk abból, hogy a web emlékezet nélküli, akkor könnyedén rájöhetsz, hogy egy redirect után csak úgy tudsz átvinni adatokat, ha azokat eltárolod:

  1. URL-ben, ez az ami nem tetszik neked.
  2. Session/munkamenetben ezt csak akkor tedd, ha ez a júzer állapotát hivatott tárolni, de a form_id-vel egész ügyes dolgokat lehet csinálni.
  3. Adatbázisban, amit nem akarsz rejtélyes okokból.
  4. Rejtett mezőkben. Ilyenkor persze nincs redirect ez a több lépcsős form kérdésköre.

Azt kéne világosan leírnod, hogy felhasználói kosarat akarsz (3) vagy több lépcsős formot(4). Mert az egyiknél adatbázisba kell tárolnod az adatokat a másiknál meg nincs redirect. A munkamenetes módszer meg csak szemfényvesztés, mert az is adatbázisban tárolja ugyebár, csak abba user állapotot tárolunk nem útvonal állapotot.(a júzer egyszerre több útvonalat is bejárhat a weboldalon ugye, mivel indíthat több böngészőt) Az URL-es módszer meg nyílván csak kis számú adatnál jó, vagy az adatbázisosnál amikor is egy azonosítóvá sűrítettük az adatokat. (lásd node és node/id mechanizmus)

pp

0
0
Psysoul képe

Köszönöm a válaszod. Természetesen tisztában vagyok azzal, hogy valamilyen módon tárolni kell az adatokat, de úgy gondoltam, hogy a form API elintézi ezt valamilyen módon (pl session).

Mivel a jobb oldali blokkban csak néhány textbox, vagy lenyíló menü lesz, ezért maradok az URL-es megoldásnál.

Maga a modul, már valószínűleg sima form, vagy többlépcsős form lesz.

Írnál pár szót mire szolgál a form_id a session esetében? Ez magát a formot azonosítja?

0
0
joebacsi képe

Csak próbáld ki, mert imádni fogod, tömböt is betolhatsz, egy mozdulattal:
variable_set()

variable_get()

majd:
variable_del()

Változó névben legyen benne a modulod neve, tömb kulcsnak meg használd a sessionID-t, és akkor tuti nem gabalyodik össze.

0
0
Sweetchuck képe

Amennyiben feltétlenül muszáj 2 lépésben megadni az adatokat, de a végleges adat tárolás csak az összes adat beérkezése után történhet meg, akkor én elgondolkoznék azon a megoldáson, hogy az adatbázisban a tárolás is több lépésben történjen.

Az DB táblát ki kell egészíteni egy timestamp mezővel ami az első beküldés idejét tárolja, ennek lesz egy azonosítója, ezt kell tovább küldeni URL-ben.

Időzített feladatok futtatásánál (cron) törölni kell az olyan rekordokat melyek X idővel régebbiek mint a jelen idő és nincsenek kitöltve a második lépcső adatai.

Ha kell külön lehet bontani 2 táblára is.

0
0