Webform modul használata

A Webform modul segítségével egy adatbázisban megadott lekérdezés eredményeként megadott rekord adatait lehet szerkeszteni, majd azokat elküldeni a szervernek és végül az adatbázis megfelelő táblájába feltölteni az eredményt.

A Webform modul a saját drupal_webform_submitted_data táblába automatikusan beírja a megadott adatokat. Ennél a data mező típusát célszerű LONGTEXT-re változtatni, mert bonyolultabb összefüggések esetén nem lehet az eredeti konfigurációba betölteni őket.

Egy WEBForm felépítése:

A Webform modul az alábbi módon néz ki:
Új űrlap létrehozása esetén az alábbi mezőket kell kitölteni:

Cím: Az űrlap címe

leírás: Az űrlap egy mondatos leírása. lehet PHP kódot ideírni és például feltételektől függő üzenetet kiírni.
Például:

<?php
global $user;
if ($user->name != "Admin" ) {
   drupal_set_message("Ezt az oldalt nem adminként látogatod!");
}
?>

Beküldés utáni üzenet vagy URL az átirányításhoz:  Ez a szöveg akkor jelenik meg, miután sikeresen elküldtük az ?rlap adatait a szervernek. Például valami ilyesmit:

Az adatfelvitel sikerült</br><a href="http://fzolee.hu/fw/info" target="_self">Személyek listája</a>

Itt megadhatunk dinamikusan generált PHP kódot is, ha úgy akarjuk, ha a beviteli formát PHP-ra állítjuk.
Ha csak annyit írunk ide, hogy: internal:node/22, akkor a megadott oldalra küldi el a webform a böngész?t.

A következő szakaszban a megadott mezőket lehet beállítani és megadni (Ez a szakasz változott az előz? verzió óta. Most már külön fülön jelentek meg a beviteli mezők)

összetevők

Név Típus Érték Szükséges Súly
Egy személy adatainak módosítása
fieldset -  
 
Azonosító
textfield %get[Adoszam]
 
 
Név
textfield %get[Nev]
 
 
Születési hely
textfield %get[SzulHely]
 
 
Születési idő
textfield %get[SzulNap]
 
 
Anyja neve
textfield %get[AnyjaNeve]
 
 
Irányítószám
textfield %get[ISZ]
 
 
Város
textfield %get[Varos]
 
 
Utca/Házszám
textarea %get[Cim]
 
 
Telefonszám 1
textfield %get[Telefon1]
 
 
Telefonszám 2
textfield %get[Telefon2]
 
 
Új összetevő hozzáadása:
Each component adds a new field to the form. Any number components (even of the same type) may be added to the form. Select a component type to add above.


A fenti mez?k lehetséges típusai:

date - Dátum - Dátumformátumot kell megadni, SQL adatbevitelhez nem a legjobban használható.
email - Email küldéshez szükséges paraméterek,
fájl - Fájl feltöltéséhez szükséges mez?
fieldset - Több mez?t összefogó keret,
grid  - Kulcs- érték párokat kell megadni, ennek alapján lehet választani rádiógombok között,
hidden - rejtett mez? (default paraméterek továbbadásához,
pagebrake - lapdobás, Az oldalról csak akkor lehet a következő oldalra navigálni, ha a kötelez? mezőket kitöltötte a felhasználó.
select - legördül? lista,
markup - HTML vagy PHP logikát lehet beírni ebbe a mez?be, pl feltételtől függő megjelenés stb...
time - időformátumot lehet bevinni
textfield - szövegmez?,
textarea - szövegterület,

A megadott mez? definiálásakor meg kell adni
- a mez? id-jét (azonosító - csupa kisbetű, aláhúzás és szám lehet)
- esetleg a formátumot,
- kötelez?en kitöltendő mez?-e,
- Hányadik legyen az ?rlapon a szokásos Drupálos sorrendbeállítással,
- honnan vegye a default értékeket.
- szerkeszthető-e a mez?!

Ha default módon nem szerkeszthető a mez? és egyúttal kötelez? is, akkor hibás adatbevitelnél hibásan működik a Webform, ezért ilyenkor ha nem szerkeszthető, akkor ne is legyen kötelez?en kitöltendő!

Az ?rlap meghívása default értékekkel:
Az alapértelmezett értékek jöhetnek az előz? oldalról a szokásos $_POST, $_GET, $_SESSION, $_SERVER változókból.
Ezeknek a változóknak a használata azonban úgy lehetséges, ha a megadott helyre a %post, %get, %session, stb... értékeket írjuk.
Például: %get[id], %post[nev], stb...

További hasonló szintaktikájú elérhető változók:

%username -  bejelentkezett user neve,
%usermail - bejelentkezett user email címe,
%site - az oldal címe,
%date - aktuális dátum.

A fenti változókat később a formban fel lehet használni.

Az ?rlap elküldésekor:
Az ?rlap elküldésekor a bővebb beállítások részt kell használnunk. Az alábbi mez?k vannak ott:

Additional Validation:
Ebben a mez?ben megadhatunk olyan kódot, amely az ?rlap adatainak validálást végzi szerver oldalon! Javasolt a <?php ...?> közötti PHP kódot használni. Javasolt itt egy saját PHP fájlt include-olni, és utána a megadott függvényt meghívni.

Ebben a kódban lehet használni a $form_id and $form_values változókat, amelyek tartalmazzák az ?rlap azonosítóját és az elküldött adatokat is tömb formájában. A tömbben indexnek a fenti ?rlap megadott mez?jének id-jét (azonosítóját) lehet használni.

Megjegyzés:

A $form_values tömb tartalmazza a $form_values["submitted_tree"] értéket, ami tartalmazza a valóban elküldött értékek tömbjét, ha van mez?csoport az ?rlapon.

Ha például az oldalunk a node/20-as oldal, akkor az oldalunkon lévő webform neve:

webform_client_form_20

Ebben a mez?ben létrehozhatjuk validálásra az alábbi függvényt, amely például ellenőrzi a 'name' mez? értékét, vagy meghívhatunk olyan függvényt, aminek átadjuk a $form_id és a $form_values értékeket.

function  webform_client_form_20

_validate($form, &$form_state) {<br>
	  if ($form_state['values']['name'] == '') {<br>
	    form_set_error('', t('You must select a name for this group of settings.'));<br>
	  }<br>
	}

Ha az értékek ellenőrzése során hibát kapunk, akkor a form_set_error("Hibaüzenet") megoldást alkalmazzuk. Ekkor a kód lefutása után az ?rlapra tér vissza a rendszer és az ?rlap felett megjelenik a mi hibaüzenetünk. Ha több hibát is talál az ellenőrzés, akkor célszerű egy stringbe összegyűjteni a hibaüzeneteket, <br /> taggel és bekezdésjellel és úgy kiiratni. Valahogy így:

<?php        

  $str ="";   <br>
	  $name = $form_values["submitted_tree"]["name"];    <br>
	  if(empty($name) ) $str .="- Kitöltendő név mez?<br />";    <br>
	  $ertek = $form_values["submitted_tree"]["ertek"];     <br>
	  if( $ertek <1 ) $str .="- Túl kis adat<br />";    <br>
	  if(!empty($str)) form_set_error($str);<br>
	?>

Additional Processing:
Az oldal elküldésekor lefutó függvényeket itt kell megadni. Hasonlóképpen, mint fent definiálhatjuk az alábbi függvényt:

<?php
function webform_client_form_20_submit($form, &$form_state) {
  db_query("INSERT INTO {table} (name, log, hidden) VALUES ('%s', %d, '%s')", $form_state['values']['name'], $form_state['values']['access']['log'],  $form_state['values']['hidden']);<br>
	  drupal_set_message(t('Your form has been saved.'));<br>
	}<br>
	?> 


Ez a kód feltölti az adatbázisba a megadott értékeket. Az is lehetséges, hogy az ilyen kódokat egy külön fájlba gyűjtjük össze és a fejlesztés során meghívjuk őket innen egy include segítségével.

Egy webform ?rlap elérése változó userekkel, változó jogokkal.
Sokáig törtem a fejemet, hogyan lehetne szabályozni azt, hogy xy user csak lássa az adatokat, a másik ne is lássa, a harmadik pedig szerkeszteni is tudja. Ehhez telepíteni kell a node_privacy_byole modult. Ennek segítségével a láthatóság és nem láthatóság kérdését el lehet intézni.
A szerkeszthető - nem szerkeszthető kérdését úgy sikerült elintéznem, hogy blokk szinten oldottam meg a kérdést:
Létrehoztam a lábléc területre egy új blokkot és a blokk tartalma az alábbi PHP kód lett:

<?php
    $q = str_replace("node/","",$_GET["q"]);
   
    switch($q){
        case 21:                // Folyamat módosítási lap!
        case 20:                // Személy módosítási lap
            if (!role("HR")){
                print('
                    <script type="text/javascript">
                        $("#edit-submitbutton").hide();                / /Submit gomb eldugása
                        $("input").attr("disabled","disabled");     // Minden input mez? letiltása
                        $("select").attr("disabled","disabled");    // SeleCT legördül? menü letiltása
                        $("textarea").attr("disabled","disabled");  //Textarea letiltása
                    </script>
                ');
            };
       
            break;
  
        default:
    }
      
}

Ez a kód röviden azt csinálja, hogyha nem megfelelő jogosultságokkal hívjuk meg az oldalt, akkor javascript JQuery kérésekkel a submit buttont és minden egyéb adatbeviteli mez?t letilt az oldalon. Persze a javascriptnek engedélyezve kell lennie.

Megjegyzés:
Természetesen az Additional Processing adatfeldolgozó résznél is ott kell lennie a jogosultságkezelésnek, ahogy a fenti példában is láthatjuk, valahogy így:
<?php
   if (role("HR")){
      include(dirname(dirname(__FIle__))."/lib/feldolgoz.php);
      feldolgoz();
  }
?>