Űrlap elem eltűntetése avagy Joe Black eljövetele

A drupal.hu fórumán már többször felmerült a kérdés, hogy hogyan tudunk űrlap elemeket eltüntetni. Amikor erre bárki is a jól bevett megoldást javasolja, a kivalaszto { display : none;} használatát elszabadulnak az indulatok. A javaslat tevőjét megbélyegzik és a megoldást az ördög művének, egyes esetekben magának az ördögnek kiáltják ki. VESSZEN A SÁTÁN üvöltik. A dogmák értelem nélküli ismételgetése azonban nem vezet sehova. Egyszóval álljunk meg és gondolkodjunk el egy picit. Miért is nem javasoljuk ezt a megoldást? Miért írtjuk tűzzel vassal? Mi az oka, hogy ez a megoldás nem javasolt? Na miért? Mert a keresők büntetik, ha manipulatív célból rejtett szövegeket és rejtett linkeket helyezünk el az oldalunkon. Oké, oké. Tehát amit nem akarunk megmutatni az ott se legyen. Na igen ám de a form elemek egy icipicit különböznek a sima szövegektől és linkektől. Ezeket ugyanis a program rakja bele a kódba és bizony várni fogja őket nagy szeretettel vissza. Nagyon nem mindegy számára, hogy egy értéken nem változtattunk, vagy nem létezik az adott érték. Nem lehet egy form elemet csak úgy ukmukfuk kidobni. Komoly problémákat tud ugyanis okozni a hiánya. A legjobb esetben az űrlap feldolgozó alrendszerünk állandóan hibát fog dobálni a hiányzó elem miatt. A legrosszabb ami történhet pedig, hogy az adatbázisunkba inkonzisztens adatok kerülnek és az egész oldalunk használhatatlanná válik. Ilyenkor tökéletes megoldás az, ha a HTML forrásból nem töröljük az elemet, hanem csak láthatatlanná tesszük a felhasználó számára. Ilyenkor nem a sátán műve az, hanem égi áldás. Azonban, ha meg vagyunk győződve arról, hogy a forrásban se szabad benne lennie ezeknek akkor azt úgy kell eltüntetni, hogy arról a programunk is értesüljön. Nézzük meg tehát a két megoldás használatát a Drupal tartalom kezelő rendszer segítségével.

A feladat:

Csak egyszerűen egy olyan hozzászólási formát akarok kialakítani, ahol a regisztrálatlan felhasználók CSAK a nevük megadásával írhassanak hozzászólást. -kree-

Első megoldás

Fogjuk és a következő kódot betesszük a sminkünk megfelelő css fájljába.

  1. #comment-form #edit-mail-wrapper {
  2. display: none;
  3. }
  4. #comment-form #edit-homepage-wrapper {
  5. display: none;
  6. }
  7. #comment-form #edit-subject-wrapper {
  8. display: none;
  9. }

Második megoldás

Készítenünk kell egy modult, mely értesíti a rendszert, hogy nem szeretnénk kitöltetni a felhasználóinkkal ezeket a mezőket. Legyen a neve nodisplay. Hozzunk létre tehát két fájlt.
nodisplay.info

  1. name = nodisplay
  2. description "Hide mail, hompage and subject fileds in comment form"
  3. core = 6.x

nodisplay.module

  1. <?php
  2. function nodisplay_form_alter(&$form, $form_state, $form_id) {
  3. if ($form_id == 'comment_form') {
  4. $form['mail']['#access'] = FALSE;
  5. $form['homepage']['#access'] = FALSE;
  6. $form['subject']['#access'] = FALSE;
  7. }
  8. }

Másoljuk ezeket a sites/all/modules/nodisplay mappába majd engedélyezzük a modulunkat. Ez utóbb megoldás úgy rejti el a form elemeket, hogy azok a forrásban sem lesznek láthatóak. Az #access tulajdonság ugyanis azt jelenti, hogy a felhasználó számára nem tölthető a mező. A FormAPI ilyenkor a felhasználótól jövő értékeket eldobja. Vagy ahogyan Chx írta a drupal.hu IRC csatornán:

ha #access FALSE-t teszel rá, akkor nem jelenik meg ÉS a user inputot ignorálja jó nagy ívben a rendszer

Az eredeti írásban a #type tulajdonságot állítottam value értékre, de mint a hozzászólásokban Chx rámutatott ez nem a helyes megoldás. A value egyébként azt jelenti, hogy ezek az elemek nem kerülnek kiküldésre a klienshez ezek mindig a szerveren "maradnak". Természetesen csak akkor, ha beállítottuk a #value tulajdonságot. Ezt elhagyva ugyanis egy hagyományos beviteli mezőt kapunk, ami történetesen nem látszik. Ezt aztán az ügyesebb felhasználóink különböző turpisságokkal ki is tölthetik. Amennyiben hidden értéket állítottunk volna be rájuk akkor már kiküldésre kerültek volna de látszódnának a forrásban. Ez utóbbit pedig nem akartuk.

De mi lesz a kötelező elemekkel?

Amennyiben akár csak egy kötelező is volt az elrejtett elemek között, akkor nem fogjuk tudni beküldeni az űrlapot. A rendszer ugyanis állandóan hiányolni fogja azt. Megoldást jelenthet ilyenkor, ha a második megoldásban megismert módszerben a megfelelő mező értéket automatikusan feltöltjük. Amennyiben azt állítottuk be a tartalom típus beállításainál, hogy a felhasználónak mindig meg kell adnia kapcsolati adatot akkor az email mező kötelező lesz. Oldjuk meg ezt a problémát!

  1. <?php
  2. function nodisplay_form_alter(&$form, $form_state, $form_id) {
  3. global $user;
  4. if ($form_id == 'comment_form') {
  5. $form['mail']['#access'] = FALSE;
  6. $form['homepage']['#access'] = FALSE;
  7. $form['subject']['#access'] = FALSE;
  8. if ($user->uid == 0) {
  9. $form['mail']['#value'] = 'anonymous@noreplay.com';
  10. }
  11. }
  12. }

Ne feledjük tehát: az űrlap elem az nem olyan valami amit a sminkünkben eltüntethetnénk úgy, hogy kidobjuk a HTML forrásból. Ezen nem segít se a theme_form sem semmilyen előfeldolgozó. Ezt
a problémát nem azon a szinten kell kezelnünk hisz ez nem a megjelenítési logikához (smink) tartozik, hanem a működési logika szerves része. Amennyiben a második megoldás értelmezhetetlen lenne számunkra és idegenkedünk a modul fejlesztéstől akkor nyugodtan maradjunk az elsőnél. A keresők egy nem látható div-ben elhelyezett form elemért nem fognak büntetni minket.

Hozzászólások

Ez a Drupal 4.7-ben volt divatos (mondjuk ott egyes elvetemultek kepesek voltak unset-telni). Drupal 5 es felette mar van #access $form['foo']['#access'] = FALSE oszt kesz.

...és mindezt az MVC megemlítése nélkül. ;)

Köszönjük - az ilyeneket nem lehetne összegyűjteni egy trükktarisznyában?

Köszönjük, hogy érthetővé tetted ezt számunkra. Nekem ezekre a modulírásokra lesz akkor szükségem.

És még idézve is lettem! :D

én a display:none sátáni voltának _indokaival_ ebben a speciális esetben nem értek egyet. olyan űrlapokat amiket csak regisztrált tölthet ki eleve nem lát a robot (nincs ugye neki regje) az ott használt botorságokért így nem is fog büntetni. azok az űrlapok, amik elérhetők névtelenek számára, de saját útvonallal is rendelkeznek, tilthatók a robotnak a robots.txt -ben.

szerintem űrlapelemek esetében főleg azért nem jó a display:none megoldás, mert az űrlapelem ettől még ott lesz az oldalon és a szemfüles rosszakaró meg is fogja találni, firebuggal kiszedi szépen a display:none -t és máris kitöltheti az űrlapelemet, amit pedig mi nem akarunk, nem számítunk rá, hogy ott érték lesz, így a beérkező adat szépen eltöri (vagy minimum berondítja) a sminkünket.

Ilyen is van - bár ez a kereső űrlapot piszkálja (most találtam, nem próbáltam): http://drupal.org/project/custom_search_box

Ha kell egy érték de usernek nem kell, hogy megjelenjen akkor elsőre input:hidden jusson ember eszébe HTML megoldásként. Aztán ha ez nem (elég könnyen) megoldható lehet mást keresni.

Ez igaz, de itt egy picit másról szól a történet. A Drupal elég szépen szétválasztja a kódot a megjelenéstől. Van a smink ami a megjelenítésért felel és vannak a modulok ami a működésért. Több szinten is bele tudsz nyúlni a rendszerbe. A legkülső hártya a css a legbelső pedig a modul írás. Ezek között vannak egyéb pontok, ahol bele lehet nyúlni egy form megjelenésébe, de egyrészt azok korrekt megvalósításához picit több kód kell, másrészt ilyenre mutattam már példát egy korábbi bejegyzésben.

A sokan akik elkezdenek Drupalozni nagy valószínűséggel láttak már weboldalt. (sokan még azt se) Ezeknek az embereknek egy része úgy gondolja érti a HTML/CSS-t. Ami persze nem igaz, de arra elég bátorságot ad nekik, hogy beleturkáljanak a kódba. Számukra a legjobb megoldás a display:none. Miért? Azért mert sem a működési logikába (modul) sem a megjelenítési logika kritikus részeibe nem kell belenyúlniuk. Nem kell érteniük, hol mit kell átírni. Csak felvenni egy újabb szabályt a CSS fájl végére. Ez számukra egy érthető és jól kontrollálható lépés, ha nem is a legjobb. Ahhoz, hogy rejtetté (hidden) tegyék az elemet létre kéne hozni egy template.php fájlt és PHP kódot turkálni benne vagy fejleszteni egy modult. Ez utóbbi azért kerül megemlítésre itt, mivel ez is egy jól szeparálható - tehát átlátható - egységet képez. (Kopipészt mestereknek száraz tiszta érzést nyújt.)

Tehát ez a megoldás azoknak való, akik egy két hónap klikkelgetés után eljutottak a majdnem tökéletes weboldalig, már csak ez az icipici lépés hiányzik nekik. Ekkor egy biztonságosan használható, ámbár nem tökéletes megoldást kapnak. Aztán természetesen rájönnek, hogy tökéletes weboldal nincsen (Ezt kivéve persze. Első PHP Konf idején indult. :D) és ekkor már megjelenik az igény a komolyabb tanulás irányába. Azonban ha már az elején egy olyan megoldást nyújtunk nekik amivel a suck faktort erősen megnöveljük elképzelhető, hogy abbahagyja a Drupallal való foglalkozást. Esetleg megállapítja, hogy a Drupal eszméletlen bonyolult, hisz egy ilyen apró változtatáshoz neki vagy iszonyú és átláthatatlan dolgokat kell csinálni, vagy modult kell fejleszteni.

Abban viszont igazad van, hogy egy HTML/CSS vagy PHP fejlesztő tanfolyamon ez mint kerülendő megoldás lesz bemutatva.

pp

Oh, csak a teaser alapján írtam, most elolvastam a hidden elleni indokot is.

Új hozzászólás