Saját form készítése

Phoere képe

Sziasztok!

Úgy adódott, hogy el kellene készítenem egy saját formot. Elkészítettem hozzá a saját modult, de valamit nem sikerült jól összeraknom, mert a az eredmény oldalon hibaüzenetet kapok. Biztos valami tök egyszerű hiba van benne.
Az űrlap egyszerű (nyilván a végleges ennél bővebb lesz): két fieldset van, az elsőben egy textfield, a másodikban két checkbox.

Az űrlap rendben megjelenik, kitöltés után megnyílik kért eredményoldal.
Az eredményoldalon PHP-kódban van jelenleg a $result= function urlap_submit() utasítás.

  1. <?php
  2.  
  3. function urlap_menu() {
  4. $items['urlap/form'] = array(
  5. 'title' => t('Test'),
  6. 'page callback' => 'urlap-test',
  7. 'access callback' => TRUE,
  8. 'type' => MENU_CALLBACK,
  9. );
  10. return $items;
  11. }
  12.  
  13. function urlap_page() {
  14. $output = drupal_render(drupal_get_form('urlap_my_form'));
  15. return $output;
  16. }
  17.  
  18. function urlap_my_form() {
  19.  
  20. $form = array(
  21. '#action' => 'urlap-eredmeny',
  22. );
  23.  
  24. $form['elso_mezo'] = array (
  25. '#type' => 'fieldset',
  26.  
  27. '#prefix' => '<div id="elso-mezo">',
  28. '#suffix' => '</div>'
  29. );
  30.  
  31. $form['elso_mezo']['azonosito'] = array(
  32. '#type' => 'textfield',
  33. '#title' => t('Title'),
  34. '#size' => 15,
  35. '#maxlength' => 20
  36. );
  37.  
  38.  
  39. $form['masodik_mezo'] = array (
  40. '#type' => 'fieldset',
  41.  
  42. '#prefix' => '<div id="masodik-mezo">',
  43. '#suffix' => '</div>'
  44. );
  45.  
  46.  
  47. $form['masodik_mezo']['chbox_1'] = array(
  48. '#title' => t('Checkbox-1'),
  49. '#type' => 'checkbox',
  50. '#return_value' => 1,
  51. '#default_value' => 0
  52.  
  53. );
  54.  
  55.  
  56.  
  57. $form['masodik_mezo']['chbox_2'] = array(
  58. '#title' => t('Checkbox-2'),
  59. '#type' => 'checkbox',
  60. '#return_value' => 2,
  61. '#default_value' => 0
  62.  
  63. );
  64.  
  65.  
  66.  
  67. $form['submit'] = array(
  68. '#type' => 'submit',
  69. '#value' => t('Text'),
  70. '#submit' => 'urlap_submit',
  71. );
  72. return $form;
  73.  
  74.  
  75.  
  76. }
  77.  
  78.  
  79.  
  80. function urlap_validate($element, &$form_state) {
  81. if (! empty($element['#value'])) {
  82. if (! preg_match('(^[0-9a-zA-Z-öüóőúéáűíÖÜÓŐÚÉÁŰÍ\.\s]+$)', $element['#value'])) {
  83. unset($element['#value']);
  84. }
  85. }
  86. }
  87.  
  88. function urlap_submit($form, &$form_state) {
  89.  
  90.  
  91. $azonosito = urlap_validate($form_state['values']['elso_mezo']['azonosito'], &$form_state);
  92.  
  93. $ch_valasztott[] = $form_state['values']['"masodik_mezo']['chbox_1'];
  94. $ch_valasztott[] = $form_state['values']['"masodik_mezo']['chbox_2'];
  95.  
  96. return($result);
  97.  
  98. }

A hibaüzenet pedig:

  1. Warning: Missing argument 1 for urlap_submit(), called in /modules/php/php.module(80) : eval()'d code on line 3 and defined urlap_submit() függvényben (/sites/all/modules/urlap/urlap.module 90 sor).
  2. Warning: Missing argument 2 for urlap_submit(), called in /modules/php/php.module(80) : eval()'d code on line 3 and defined urlap_submit() függvényben (/sites/all/modules/urlap/urlap.module 90 sor).
  3. Notice: Undefined variable: form_state urlap_submit() függvényben (/sites/all/modules/urlap/urlap.module 94 sor).
  4. Notice: Undefined variable: form_state urlap_submit() függvényben (/sites/all/modules/urlap/urlap.module 95 sor).
  5. Notice: Undefined variable: form_state urlap_submit() függvényben (/sites/all/modules/urlap/urlap.module 96 sor).
  6. Notice: Undefined variable: result urlap_submit() függvényben (/sites/all/modules/urlap/urlap.module 98 sor).

Mit kellene az űrlap eredményeinek fogadásánál másképp írni?

Előre is köszönöm!

Drupal verzió: 
makgab képe

Ez pl. biztos nem helyes:

$ch_valasztott[] = $form_state['values']['"masodik_mezo']['chbox_2'];

['"masodik_mezo'] nem ['masodik_mezo'] akart lenni?
0
0
aruna képe

$ch_valasztott[] = $form_state['values']['"masodik_mezo']['chbox_1'];
$ch_valasztott[] = $form_state['values']['"masodik_mezo']['chbox_2'];

Mindkét sorban ez az extra macskaköröm: '"masodik_mezo'

0
0
Phoere képe

Köszi, ez a szintaktikai hiba valóban benne maradt, de nem oldotta meg a problémát a javítása.
Magát $form_state változót nem akarja felismerni a hibakód szerint a három kapott adatnál, illetve a függvény argumentumok hiányoznak
A hibakód sorszámai és az itt beillesztett kód sorszámok nem azonosak:
90. sor - a function sor
94,95,96 - az $azonosito és a két $ch_valasztott kezdetű sorok.

0
0

Csökönyi Ferenc

makgab képe

Nem a submit-nál van valami hiányérzete?

$form['submit'] = array(
 '#type' => 'submit',
 '#value' => t('Text'),
 // '#submit' => 'urlap_submit',
 '#submit' => array('urlap_submit'),
);
0
0
Phoere képe

Sajnos, ezzel sem megy. Szerintem rosszul hívom meg az urlap_submit() függvényt.

Mindent igyekeztem átnézni, amit a neten találtam, de valószínűleg az egésznek a logikájára nem érzek rá. :(
A form elkészítéséről, összeállításáról találtam egy csomó mindent (Google izzadt rendesen), szépen össze is áll az űrlap, a Form Builder modul már csak hab a tortán, csak az eredményeket nem tudom kinyerni további feldolgozásra. :(

0
0

Csökönyi Ferenc

makgab képe

Próbáld meg az "alapértelmezett" módszert:

function urlap_my_form() {
...
$form['submit'] = array(
 '#type' => 'submit',
 '#value' => t('Text'),
 // '#submit' => 'urlap_submit',      <-- erre így nincs szükség
 );
return $form;
}
 
 
function urlap_my_form_validate($form, &$form_state) {
...
}
 
function urlap_my_form_submit($form, &$form_state) {
...
}

Így működik?

0
0
Phoere képe

Ezzel is próbálkoztam, most újra ismét.

Milyen php-kóddal hívnád meg a urlap_my_form_submit() függvényt? Milyen paramétereket kell beírni a $form és a &$form_state átadáshoz? Mert egyértelmű a hibaüzenetből, hogy ezeket nem kapja meg a függvény. A &$form_state egy üres tömb.
Ha nem paraméterezem a függvényt, akkor az argumentumokat hiányolja.

Köszi a segítő szándékot.

0
0

Csökönyi Ferenc

aruna képe

de ezeket érdemes tudni:

"Milyen php-kóddal hívnád meg a urlap_my_form_submit() függvényt?"

Semmilyen php kóddal sem hívod meg az urlap_my_form_submit() függvényt, ezt a drupal hívja meg a formfeldolgozás megfelelő fázisában és átadja neki a form definícóját tartalmazó tömböt és a kitöltött form-ot (ez nálad speciel nem így van valamiért...).

"Milyen paramétereket kell beírni a $form és a &$form_state átadáshoz?"

Nincs ilyen "lehetőség". A form definícióban ahol a form tömböt definiálod, nem lehet szabályozni, hogy a drupal rendszer hány paraméterrel hívja meg a formhoz tartozó _validate() és _submit() függvényeket. Ez kötött, ezért van ez is így, nagyon helyesen: "Ha nem paraméterezem a függvényt, akkor az argumentumokat hiányolja."

---------------------------

Amit én csinálnék ilyen esetekben. Készítenék egy teljesen minimál modult a három függvénnyel (form definíció, validate és submit), lehetőleg egy működő példa kód átmásolásával. Ha ez megy, akkor ezt bővíteném, több form elemmel és egyedi form feldolgozással apróbb lépésekkel folyamatosan ellenőrízve, hogy megy-e még a kód.

A fordított megközelítés kezdőknek nehezebb, vagyis amikor megírod az egész kódot és csak a legvégén futtatod és kezded javítani a hibákat.

0
0
makgab képe

Ezt még próbáld meg:

function urlap_menu() {
$items['urlap/form'] = array(
 'title' => t('Test'),
 'page callback' => drupal_get_form,
 'page arguments' => array('urlap_my_form'),
 'access callback' => TRUE,
 'type' => MENU_CALLBACK,
 );
return $items;
}
 
// function urlap_page() nem kell
0
0
Phoere képe

Köszi, megpróbálom majd.

0
0

Csökönyi Ferenc

Phoere képe

Köszi, nyilván megint elölről fogom kezdeni az építkezést. A form nem bonyolult - direkt -, a végső verzió összetettebb lesz, de ahogy írtad, egyszerűn akarok működőképes verziót összehozni. Rengeteg mintakódot átnéztem, azokból raktam össze, ezért maga a form megjelenik és elvileg működik. Csak a finálé marad el. :)

Mivel másoknak sikerült már, előbb vagy utóbb összehozom. :)
Köszi a tanácsokat.

0
0

Csökönyi Ferenc

tamoca képe

Szia. Hasznos a saját fejlesztés.
A webform modul mit nem tud ami neked kell egyedi dolog?

0
0

tamoca

Phoere képe

Szia!

Nem akarom elmenteni az adatokat. A beküldött adatokat kell majd bizonyos szempontok szerint feldolgozni, kiértékelni és végül ezek alapján bizonyos node-k szűrt listáját visszaadni. Végül is egy speciális keresőnek nevezném.
De utána az eredmények nem kellenek, jelenleg legalábbis nem cél a keresések tárolása.
Ha webformmal csinálnám, akkor feleslegesen lenne egy mentés az adatbázisba, majd onnan kellene az eredményeket visszahívni, feldolgozni, végül törölni.
Webformmal már megoldottam volna, de ez egy jó alkalom és indok, hogy ezt a területet is megismerjem a Drupalban. :)

0
0

Csökönyi Ferenc

dj képe

A menüben létrehozod a két URL-t, a formot meghívod. Onnantól kezdve a form api dogozik helyetted. Ha implementálsz form_neve_validate és/vagy form_neve_submit függvényeket akkor azt hívja a submit gomb megnyomásakor.

Ilyenkor, ha másik URL-en jeleníted meg az eredményt akkor a form_neve_submit függvényben tudod átirányítani az oldalt:

/**
 * Implements hook_menu().
 */
function urlap_menu() {
  $items['urlap/form'] = array(
    'title' => 'Test form',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('urlap_my_form'),
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
  );
  $items['urlap/result'] = array(
    'title' => 'Test result',
    'page callback' => 'urlap_result',
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
  );
  return $items;
}
 
/**
 * Implements hook_form().
 */
function urlap_my_form($form, $form_state) {
  $form['elso_mezo'] = array(
    '#type' => 'fieldset',
    '#prefix' => '<div id="elso-mezo">',
    '#suffix' => '</div>',
  );
 
  $form['elso_mezo']['azonosito'] = array(
    '#type' => 'textfield',
    '#title' => t('Title'),
    '#size' => 15,
    '#maxlength' => 20,
    '#default_value' => isset($form_state['values']['azonosito']) ? $form_state['values']['azonosito'] : '',
  );
 
  $form['masodik_mezo'] = array(
    '#type' => 'fieldset',
    '#prefix' => '<div id="masodik-mezo">',
    '#suffix' => '</div>',
  );
 
  $form['masodik_mezo']['chbox_1'] = array(
    '#title' => t('Checkbox-1'),
    '#type' => 'checkbox',
    '#return_value' => 1,
    '#default_value' => isset($form_state['values']['chbox_1']) ? $form_state['values']['chbox_1'] : '',
  );
 
  $form['masodik_mezo']['chbox_2'] = array(
    '#title' => t('Checkbox-2'),
    '#type' => 'checkbox',
    '#return_value' => 2,
    '#default_value' => isset($form_state['values']['chbox_2']) ? $form_state['values']['chbox_2'] : '',
  );
 
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Text'),
  );
 
  return $form;
}
 
/**
 * Validate urlap_my_form.
 */
function urlap_my_form_validate($form, &$form_state) {
  if (empty($form_state['values']['azonosito'])) {
    // Do not process submit if form validate is false.
    // Go back to form and show error message.
    form_set_error('azonosito', t('Error message'));
  }
  else {
    if (!preg_match('(^[0-9a-zA-Z-öüóőúéáűíÖÜÓŐÚÉÁŰÍ\.\s]+$)', $form_state['values']['azonosito'])) {
      // Do not process submit if form validate is false.
      // Go back to form and show error message.
      form_set_error('azonosito', t('Error message'));
    }
  }
}
 
/**
 * Submit urlap_my_form.
 */
function urlap_my_form_submit($form, &$form_state) {
  $params = array(
    'azonosito' => $form_state['values']['azonosito'],
    'chbox_1' => $form_state['values']['chbox_1'],
    'chbox_2' => $form_state['values']['chbox_2'],
  );
  // Page redirect to urlap/result URL with GET parameters.
  $form_state['redirect'] = array('urlap/result', array('query' => $params));
}
 
/**
 * Result page. 
 * 
 * Called from urlap_menu.
 */
function urlap_result() {
  $results = array(
    '!id' => '',
    '!cb1' => t('off'),
    '!cb2' => t('off'),
  );
  if (isset($_GET['azonosito'])) {
    $results['!id'] = check_plain($_GET['azonosito']);
  }
  if (isset($_GET['chbox_1']) && !empty($_GET['chbox_1'])) {
    $results['!cb1'] = t('on');
  }
  if (isset($_GET['chbox_2']) && !empty($_GET['chbox_2'])) {
    $results['!cb2'] = t('on');
  }
 
  // Output results.
  return array(
    '#markup' => t('Form results id: !id, check box 1: !cb1, check box 2: !cb2', $results),
  );
}

Megoldható ugyanazon az oldalon is az eredmény kiíratása:

/**
 * Implements hook_menu().
 */
function urlap_menu() {
  $items['urlap/form'] = array(
    'title' => 'Test form',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('urlap_my_form'),
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
  );
  return $items;
}
 
/**
 * Implements hook_form().
 */
function urlap_my_form($form, $form_state) {
  if (!isset($form_state['values']['azonosito']) || empty($form_state['values']['azonosito'])) {
    // Create form.
    $form['elso_mezo'] = array(
      '#type' => 'fieldset',
      '#prefix' => '<div id="elso-mezo">',
      '#suffix' => '</div>',
    );
 
    $form['elso_mezo']['azonosito'] = array(
      '#type' => 'textfield',
      '#title' => t('Title'),
      '#size' => 15,
      '#maxlength' => 20,
      '#default_value' => isset($form_state['values']['azonosito']) ? $form_state['values']['azonosito'] : '',
    );
 
    $form['masodik_mezo'] = array(
      '#type' => 'fieldset',
      '#prefix' => '<div id="masodik-mezo">',
      '#suffix' => '</div>',
    );
 
    $form['masodik_mezo']['chbox_1'] = array(
      '#title' => t('Checkbox-1'),
      '#type' => 'checkbox',
      '#return_value' => 1,
      '#default_value' => isset($form_state['values']['chbox_1']) ? $form_state['values']['chbox_1'] : '',
    );
 
    $form['masodik_mezo']['chbox_2'] = array(
      '#title' => t('Checkbox-2'),
      '#type' => 'checkbox',
      '#return_value' => 2,
      '#default_value' => isset($form_state['values']['chbox_2']) ? $form_state['values']['chbox_2'] : '',
    );
 
    $form['submit'] = array(
      '#type' => 'submit',
      '#value' => t('Text'),
    );
  }
  else {
    // Create results.
    $results = array(
      '!id' => '',
      '!cb1' => t('off'),
      '!cb2' => t('off'),
    );
    if (isset($form_state['values']['azonosito'])) {
      $results['!id'] = check_plain($form_state['values']['azonosito']);
    }
    if (isset($form_state['values']['chbox_1']) && !empty($form_state['values']['chbox_1'])) {
      $results['!cb1'] = t('on');
    }
    if (isset($form_state['values']['chbox_2']) && !empty($form_state['values']['chbox_2'])) {
      $results['!cb2'] = t('on');
    }
 
    // Output results.
    $form['result'] = array(
      '#markup' => t('Form results id: !id, check box 1: !cb1, check box 2: !cb2', $results),
    );
  }
 
  return $form;
}
 
/**
 * Validate urlap_my_form.
 */
function urlap_my_form_validate($form, &$form_state) {
  if (empty($form_state['values']['azonosito'])) {
    // Do not process submit if form validate is false.
    // Go back to form and show error message.
    form_set_error('azonosito', t('Error message'));
  }
  else {
    if (!preg_match('(^[0-9a-zA-Z-öüóőúéáűíÖÜÓŐÚÉÁŰÍ\.\s]+$)', $form_state['values']['azonosito'])) {
      // Do not process submit if form validate is false.
      // Go back to form and show error message.
      form_set_error('azonosito', t('Error message'));
    }
  }
}
 
/**
 * Submit urlap_my_form.
 */
function urlap_my_form_submit($form, &$form_state) {
  $form_state['rebuild'] = TRUE;
}
4
0

Üdv!
Dudás József

Phoere képe

Köszönöm!

Ma már nem, de holnap nekiesek ezt átnézni és kipróbálni.

Kezdem kapisgálni a működést.

0
0

Csökönyi Ferenc

Phoere képe

Az első mintakódodat egy-az egyben áthelyezve tökéletesen működik (nekem az új oldalon való eredmény megjelenítés kell).

Úgyhogy most jön ennek a tökéletes alapnak továbbépítése. Nagyon köszönöm a segítséget!

0
0

Csökönyi Ferenc

Phoere képe

Egy kis visszajelzés, hogy mi is lehetett a hiba az én változatomban. Két lehetséges okot találtam:
- a MENU_CALLBACK részben megadott útvonalhoz tartozó node-t előzetesen létrehoztam. Ez feltehetően felülírta megjelenítéskor a form létrehozását. Ezért nem jelent meg eleinte semmi
- később én a drupal_get_form(urlap_my_form()) függvényt írtam be a drupal_get_form('urlap_my_form') helyett, így érthető, hogy miért volt mindenféle paraméterhiba.

Most már sikerült a működő űrlapot blokkban is megjeleníteni, ami szintén cél volt.

Köszönöm mindenkinek a segítséget!

2
0

Csökönyi Ferenc

Phoere képe

Sziasztok,

Az itteni instrukciók alapján készített form tökéletesen működik 5.2 PHP-n. Most költöztetem az odalt egy 5.3-as verziójú PHP-ra és ott az alábbi hibaüzenet jelenik meg:
Strict warning: Only variables should be passed by reference eval() függvényben (modules/php/php.module(80) : eval()'d code 3 sor).

A 3. sor pedig ez (tehát maga a function urlap_menu() ):

  1. function urlap_menu() {
  2. $items['urlap/form'] = array(
  3. 'title' => 'Test form',
  4. 'page callback' => 'drupal_get_form',
  5. 'page arguments' => array('urlap_my_form'),
  6. 'access callback' => TRUE,
  7. 'type' => MENU_CALLBACK,
  8. );
  9. $items['urlap/result'] = array(
  10. 'title' => 'Test result',
  11. 'page callback' => 'urlap_result',
  12. 'access callback' => TRUE,
  13. 'type' => MENU_CALLBACK,
  14. );
  15. return $items;
  16. }

Tudom, hogy az 5.3-as php verzió okozza, de mi a megoldás?

Előre is köszönöm!

0
0

Csökönyi Ferenc

nevergone képe

Ezt a kódot hova illesztetted be? Hogy jön ehhez a PHP modul? Ugye nem egy tartalomba akartad tenni, PHP beviteli formával?

0
0
Phoere képe

Nem. Tehát ez egy komplett modul, a fentebbi mintakód továbbfejlesztésével let véglegesítve és tökéletesen működik egy 5.3-es php-t futtató szerveren (tévesen 5.2-est írtam az előbb).

Most az oldal áttelepítés alatt van egy másik szerverre, ahol 5.4-es php verzió van és ott ugyanez a modul már ezt a hibakódot adja.

Viszont közben rájöttem, hogy nem ez a baj, hanem a függvény meghívása:

  1. $output = drupal_render(drupal_get_form('urlap_my_form'));

Ez generálja a hibakódot.

Így viszont már jó:

  1. $op = drupal_get_form('urlap_my_form');
  2. $output = drupal_render($op);
  3. print $output;
0
0

Csökönyi Ferenc

szantog képe

Ezt a

Only variables should be passed by reference eval() függvényben (modules/php/php.module(80) : eval()'d code 3 sor

sanszosan Mulder & Scully debugolhatja, lécci mondd már el, hogy ezt a 'komplett modulból' hogy sikerül előhozni!

1
0

----
Rájöttem, miért kérdezek olyan ritkán a drupal.hu-n. Amíg szedem össze az infokat a kérdéshez, mindig rájövök a megoldásra.

nevergone képe

Phoere képe

Mint írtam, közben kiderült, hogy nem a modulban van a "hiba", hanem a

  1. $output = drupal_render(drupal_get_form('urlap_my_form'));

formátum nem megfelelő, noha működik. Az űrlapot egy blokkban jelenítem meg, abban szerepel php-kódban.

Ezt kellett átalakítanom. De a PHP 5.3-as verziójánál ez nem generált hibaüzenetet, az 5.4-esnél igen.

A megoldást itt találtam meg.

http://drupal.stackexchange.com/questions/6322/strict-warning-only-varia...

0
0

Csökönyi Ferenc

nevergone képe

Szia!

Attól tartok, a „komplett modul” kifejezés számodra mást jelent, mint nekünk. Mindenesetre örülök, hogy megoldódott a problémád.

0
0
Phoere képe

Lehet, hogy rosszul fejezem ki magam, elnézést. Ez a modul egy saját űrlap megjelenítéséhez és feldolgozásához tartozó összes függvényt tartalmazza (sajat_urlap.module).
Az űrlapot egy blokkban jelenítem meg és ebben a blokkban PHP kódként csak az $output = drupal_render(....) függvénymeghívás és a print($output) található, ami megjelenítette az űrlapot. Lehet, hogy más módon is meg lehet oldani a megjelenítést egy blokkban, de én nem hiszem, hogy hibás lenne ez a megoldás. Ha mégis, szívesen veszem a javaslatokat.

Ott tévedtem, hogy azt hittem, magában a modulban lévő függvények egyike generálja a hibaüzenetet, holott a megjelenítő függvénymeghívás lett helytelen az új tárhelyen, míg a régin ez hibaüzenet nélkül működik most is. A két hely között a különbség a PHP verziója.

Most teljesen igaz volt az a helyzet, hogy korábban kérdeztem, mint kellett volna (vagy 5 perccel később jöttem rá a megoldásra, mint kellett volna? :) )

0
0

Csökönyi Ferenc

dj képe

akkor kár elspórolni a hook_block_info és hook_block_view függvények implementálását, hogy ne kelljen php kód az adatbázisba. Ha sok ez a két függvény akkor még szóba jöhet a hook_block_view_alter is, hogy kiváltsad a szerkesztő felületi php kódot.

0
0

Üdv!
Dudás József

Phoere képe

Köszi, át fogom ezeket tanulmányozni.

0
0

Csökönyi Ferenc