Sziasztok!
Van egy page típusú oldalam. Benne 2 db, a drupal_get_form()-al beágyazott form, amit egy modul rak össze. (Ez egy eléggé magas/hosszú oldal. A közepén és az alján található 2 form. Ugyanaz mindkettő, de különböző form id-val.)
2 problémát kellett volna megoldam:
- a form minden mezője kötelező, viszont ha egy vagy több üres, akkor csak annyi hibaüzenet legyen, hogy "minden adat megadása kötelező"
és ez az üzenet csak egyszer és közvetlenül a form felett jelenjen meg.
- ha hibásan van kitöltve a form vagy hiáynzik valamelyik adat, akkor újratöltés után ugorjon ahhoz form-hoz, amelyiket tölttö épp az user.
A következőképpen próbáltam megoldani:
Minden mezőnél beállítottam, hogy nem kötelező adat. A validate függvényben saját kóddal ellenőrzöm, hogy meg van e adva mindegyik. Ha bármelyik üres, akkor egy session változóba elmentem a hibaüzenetet:
$_SESSION['form_error'] = t('Kérjük töltsön ki minden mezőt!');
Egy $_SESSION['submitted_form'] változóban elmentem, hogy melyik form validálásnál volt a hiba.
A form-ban a legelején van egy value típusú mező, amiben ezt az üzenetet megjelenítem, ha létezik.
A submit függvényben ismét ellenőrzöm, hogy minden mező ki van e töltve, és ha nincs, akkor onnan újra a form-ra irányítom az oldalt:
$form_state['redirect'] = array('node/1/', NULL,$_SESSION['submitted_form'],301);
A $_SESSION['submitted_form'] értéke form1 vagy form2. Az átirányítás eredménye meg elvileg www.weboldalom.hu/#form1 vagy /#form2
A fent leírt módszer jól működik ff-ban és chrome-ba, viszont opera,ie,safari böngészőkben az átirányítás után eltűnik az url-ből a #formx rész, ezért ezekben a böngészőkben az oldal teteje látszódik miután hibásan töltötte ki a form-ot.
Ráadásul a mivel a form_set_error()-t nem használom, ezért az oldal tetején még hibaüzenet sem jelenik meg, azaz így a user észre sem veszi, hogy vmit rosszul töltött ki.
Szval a kérdés, hogy ebben a 3 böngészőben ez miért nem működik?
Vagy vki tud e más megoldást a fenti 2 problémára?
1. egy db hibaüzenet a form felett megjelenítve.
2. hibásan kitöltött form beküldés esetén ugorjon az oldal megfelelő részére
A segítséget előre is köszönöm!
Mindent a helyére
Submit függvényben már nem kell ellenőrizni semmit se, mert az összes ellenőrzés és form_set_error() hívás már megtörtént a *_validate() függvényben. Ezt így kell és pont.
Az nem tűnt fel, hogy amikor (szerinted) hibás az űrlap kitöltése és sikerült az átirányítás, akkor eltűnik minden adat az űrlapból, és lehet elölről kezdeni a kitöltést?
A $form_state['redirect']-nek úgy kell átadni a paramétereket mint az url() függvénynek. Tehát a fragment rész is megadható. De szerintem nem ez a helyes megközelítése a problémának.
Próbáld meg azt, hogy a $form['#action']-t helyesen kitöltöd. (Normál esetben ezt nem kell piszkálni) 'mymodule/path#mymodule-form'. Ebben szintén segítségedre lehet az url() függvény.
Az hogy ne az oldal tetején legyenek a hiba üzenetek, az már egy trükkösebb probléma.
Még egyiket sem próbáltam, de van rá modul. Több is.
http://drupal.org/project/inline_messages
http://drupal.org/project/ife
köszönöm a tippet!
köszönöm a tippet!
az http://drupal.org/project/inline_messages module megoldotta a problémát. főleg, hogy oda is görgeti az oldalt, ahol a form van, így a anchor-okkal sem kellett vacakolni.