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 csskivalaszto { 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.

#comment-form #edit-mail-wrapper {
  display: none;
}
#comment-form #edit-homepage-wrapper {
  display: none;
}
#comment-form #edit-subject-wrapper {
  display: none;
}

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

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

nodisplay.module

<?php
function nodisplay_form_alter(&$form, $form_state, $form_id) {
  if ($form_id == 'comment_form') {
    $form['mail']['#access'] = FALSE;
    $form['homepage']['#access'] = FALSE;
    $form['subject']['#access'] = FALSE;
  }
}

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!

<?php
function nodisplay_form_alter(&$form, $form_state, $form_id) {
  global $user;
  if ($form_id == 'comment_form') {
    $form['mail']['#access'] = FALSE;
    $form['homepage']['#access'] = FALSE;
    $form['subject']['#access'] = FALSE;
    if ($user->uid == 0) {
      $form['mail']['#value'] = 'anonymous@noreplay.com';
    }
  }
}

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.