sziasztok!
olyan kérdésem lenne, mikor egy több oldalas kérdőívet készítek a form api-val, akkor hogyan csinálok saját validation-t
addig ok, h írok egy
function kerdoiv_validate(($form_id, $form_values) {
if ($form_values['q1']['q1a']=='') {
drupal_set_message(t('q1a mezo kitoltese kotelezo'));
}
}
viszont hogy tudom visszairányítani arra az oldalra?
Fórum:
A navigációs gombjaid submitok?
Én is egy többoldalas bonyolult formot készítek éppen, és én következő képpen oldottam meg az oldalak közötti váltogatást:
Először is mindig az egész formom, tehát az összes oldal lerenderelődik. Az elementek attribúlumai közé létrehoztam egy "#page" attribútumot, amely azon oldalszámok tömbje, amelyen az adott form element meg kell, hogy jelenjen. Utána form_alter()-ben lefut egy függvényem, ami végigjárja az elementeket, és amiknek nem kell megjelennie az adott oldalon, azokat elrejti ($elem["#prefix"] = '<div style="display: none">', $elem["#suffix"] = '</div>'). Így az előző oldalakon megadott értékek mindig ott vannak POST-ban, nem kell session-ökkel szívni, még a böngésző frissítését és a historyban előre-hátra ugrálást is jól tűri a kód.
Ezen kívül minden gombom submit gomb, az előre-hátra navigációs gomboknak van saját submit függvénye megadva a "#submit" attribútumban, a legvégső, ultimate submit button, ami végleg elmenti a formot, csak az utolsó oldalon jelenik meg, addig rejtett. A navigációs submit függvény megnöveli(vagy lecsökkenti) az aktuális oldal számát (amit hidden fieldben tárolok minden oldalon) és $form_state["rebuild"]-et TRUE-ra állítja, így a form újra felépül, de másodjára a form_alter-ben a láthatóságot kezelő függvényem már az előző/következő oldalon lévő formokat teszi láthatóvá. Viszont ha a validáción elbuktak a megadott adatok, akkor a navigációs submit függvény meg sem hívódik, így az aktuális oldalszám se fog változni, a felhasználó visszakapja ugyanazt az oldalt, ahol éppen járt.
Ez mondjuk Drupal 6-tal van így, de hasonló úton érdemes elindulni 5-ös Drupalban is szerintem(ott talán nem $form_state["rebuild"] van, hanem a form létrehozásánál kell a form #multistep attribútumát TRUE-ra a #redirect-et meg FALSE ra állítani, de ennek nézz utána jobban). Drupal 5-ben nem tudom, hogy pont így meg tudod-e csinálni, én abban buttonokat használtam submit helyett(a buttonokra kattintva nem hívódik meg a submit függvény), és a formnak #pre_render-ben megadott függvényben növeltem meg csökkentettem az aktuális oldalszámokat, de ez egy elég béna megoldás volt, a validation-nal is voltak gondjaim.
Ha az egész formom elkészül, és működik rendesen, lehet, hogy csinálok belőle egy tutorialt, mert vannak benne szerintem érdekes megoldások, amik másoknak is hasznára lehetnek(ismétlődő, többször megadható fieldsetek, amelyek módosíthatók/törölhetők, többoldalas navigáció, stb.).
Aki mostanában ilyesmibe
Aki mostanában ilyesmibe botlik [mint én] annak:
http://drupal.org/project/multistep
Ha közben elkészült a tutorial, azt szívesen olvasnám.
form_set_error
Ne message-t küldj, hanem nyomj egy form_set_error-t!
Minden mást elintéz a formAPI!
pp
Palócz István
https://palocz.hu | https://tanarurkerem.hu