webform számított mező

hszilard képe

A problémám a következő:
Készítenem kell egy online regisztrációs űrlapot egy konferenciához, amelynél a jelentkezők személyes adatainak megadásán túl be kell jelölniük, mely workshop(ok)on szeretnének részt venni, illetve hogy diákok-e vagy felnőttek. A részvételi díj ezen attribútumok függvénye.

Ehhez létrehoztam egy két lapból álló webformot. Az első lapon szerepelnek a fent már leírt beviteli mezők, a második lapon pedig egy összegzés, ahol kiírja az első lapon megadott adatokat (ha elrontotta, még vissza tudjon lépni), és a részvételi díjat, amit ezek alapján kalkulál ki a rendszer. Ehhez a második lapon egy markup (jelölő) űrlapelemet vettem fel, ebbe ugyanis lehetőség van php kódot is írni, illetve innen az első lapon felvett adatok is lekérhetők a $_POST tömbből.

Szeretném azonban letárolni egy űrlap elemben magát a kikalkulált részvételi díj végösszegét is. Erre nem találtam megoldást. Arra gondoltam, hogy létrehozok ehhez egy hidden elemet, de abba nem enged php kódot írni.

Valahol olvastam, hogy ilyesmire való a hook_form_alter függvény, amihez egy modult kellene írni. Vagy van egyszerűbb megoldás is?

A honlapon 6.20-as Drupal működik, a Webform modul verziója pedig 6.x-3.9.

Melyik modulhoz, modulokhoz kapcsolódik a téma?: 
Drupal verzió: 
janoka képe

Szia!

Külön modul írásával egy hasonló feladatot így oldottam meg. A kódot lerövidítettem, hogy csak egy rövid példa maradjon.

pelda.module:

  1. function pelda_form_webform_client_form_641_alter(&$form, &$form_state, $form_id ) {
  2. drupal_add_js( drupal_get_path('module', 'pelda').'/js/pelda.js');
  3. }
  4.  
  5. function pelda_webform_submission_presave($node, &$submission) {
  6. // Kezdeti értékek, amelyekkel dolgozunk
  7. $fizetendo = 0;
  8.  
  9. // ....
  10. // Értéke: 32: 18 felett, 16: 14-18 év, 8: 14 alatt
  11. $kor = $submission->data[23]['value'][0];
  12. // Ha valaki elmúlt 14, akkor kell csak szállást és 18 után ifa-t számolni.
  13. switch ($kor) {
  14. case 32: $szallas=3930; break;
  15. case 16: $szallas=3600; break;
  16. default: $szallas=0; break;
  17. }
  18. // Szállásnapok száma
  19. $szallasnapok_szama = count( $submission->data[6]['value'] );
  20. // Szállás értéke
  21. $fizetendo += $szallasnapok_szama*$szallas;
  22.  
  23. // Fizetési összeg aktualizálása a beküldés előtt.
  24. $submission->data[22]['value'][0] = $fizetendo;
  25. }

pelda.js:

  1. function changeFizetendo() {
  2. $fizetendo = 0;
  3.  
  4. // Ha valaki elmúlt 14, akkor kell csak szállást és 18 után ifa-t számolni.
  5. if( $("#edit-submitted-kor-1").is(":checked") ) {
  6. $szallas=3930;
  7. }
  8. else if( $("#edit-submitted-kor-2").is(":checked") ) {
  9. $szallas=3600;
  10. }
  11. else {
  12. $szallas=0;
  13. }
  14.  
  15. // Szállás kiszámolása
  16. $fizetendo += ($("#edit-submitted-szallasnapok-1").is(":checked"))?$szallas:0;
  17. $fizetendo += ($("#edit-submitted-szallasnapok-2").is(":checked"))?$szallas:0;
  18. $fizetendo += ($("#edit-submitted-szallasnapok-3").is(":checked"))?$szallas:0;
  19.  
  20. // Számolás végén az érték beállítása, mint fiezetendő
  21. $("#edit-submitted-fizetendo").val($fizetendo);
  22.  
  23. // Abban az esetben, ha nincs a kor kitöltve, akkor a focust a korra teszi.
  24. //if( $("#edit-submitted-kor").is(":empty") ) {
  25. // $("#edit-submitted-kor").focus();
  26. //}
  27. };
  28.  
  29. jQuery(document).ready(
  30. function($) {
  31.  
  32. // Fizetendő mező kikapcsolása, hogy ne legyen szerkeszthető
  33. $("#edit-submitted-fizetendo").attr("disabled", "disabled");
  34.  
  35. // Annak figyelése, hogy ha valamelyik beviteli mező változik, akkor a fizetendő értékét is újraszámoljuk.
  36. $("input").bind('change', changeFizetendo);
  37. }
  38. );
2
0
hszilard képe

Nagyon köszönöm, végre valami, amin el tudok indulni :)
A hook_webform_submission_presave lesz valószínű a kulcs, amivel ezt a problémát meg lehet oldani.

0
0
hszilard képe

A hook_webform_submission_presave függvénnyel kapcsolatban még az a kérdésem lenne, hogy a $node paraméter segítségével hogyan lehetne szűkíteni ennek a lefutását, hogy ne minden űrlapnál fusson le (ezen a honlapon több webform tartalom is van), hanem csak annál az egynél, ahol erre szükség van?
Gondolom, valahogy így kellene kezdeni:

  1. function sajatmodul_webform_submission_presave($node, &$submission) {
  2. if (isset($node->???)) {
  3. ...
  4. ...
  5. }
0
0
hszilard képe

Ez utóbbira itt megtaláltam a megoldást: http://drupal.org/node/49768

1
0