Azonos feliratú gombok közül melyiket nyomták meg?

Boobaa képe

Adott egy űrlap, rajta több azonos feliratú gomb (az űrlap generálásakor derül ki, hogy egy, kettő, vagy akár ötven), de természetesen különböző azonosítóval - azaz a #value egyforma, az #id különböző. JavaScript és gombonként különböző #submit használata nélkül (hogy ne kelljen előre lekódolni az ötven függvényt, hanem csak egyet) hogyan lehet megtudni a _submit() függvényben, melyik gombot nyomták meg?

Segítség:
1. Mivel a gombok felirata a #value alapján kerül megjelenítésre (lévén HTML-ben is így van), ezért nem lehetnek különböző #value értékek az egyes gombokhoz.
2. Ha mégis, és csak a theme_...() függvényben hozom egyforma alakra (azaz a drupal_render() hívása előtt állítom be a #value értékét egyformára), természetesen akkor is ugyanazt kapom vissza, lévén a HTML-ben ugyanaz lesz a type="submit" value-ja.
3. Volt olyan megjegyzés, miszerint nem szerencsés egy űrlapon belül több gombnak ugyanazt a feliratot adni - azonban ez kifejezetten a megrendelő igénye volt, így nem szabad máshogy megközelíteni.
4. JS használata az általános ok miatt van kizárva: nem biztos, hogy az ügyfél böngészőjében van JS támogatás. Ezért aztán az az út sem járható, hogy az űrlap megjelenésekor, kliensoldali jQuery-vel állítom egyformára a gombok feliratát, sőt az sem, hogy a gombok megnyomásakor az űrlap elküldése előtt állítok be valami rejtett űrlapelem-értéket.

Van-e erre bármiféle megoldás, vagy el kell hajtani a megrendelőt, hogy ezt így lehetetlen megcsinálni, és radio, checkbox vagy bármi egyébbel lehet csak?

Drupal verzió: 
Pasqualle képe

patch:

-  if ($form_state['values']['op'] == t('Save')) {
+  if ($form_state['clicked_button']['#id'] == 'edit-submit') {
0
0
Boobaa képe

Bármelyik gombot nyomom is meg, az űrlapon belül az első id-jét kapom így vissza.

0
0
Sweetchuck képe

...én úgy vettem észre hogy az utolsót, de a lényegen nem változtat

0
0
Pasqualle képe

bemasolod a formot es a submit codot? mert ennek mukodnie kellene. nem tudok rola, hogy bug lenne a ['clicked_button'] hasznalataban.. ket modulnak is bekuldtem ezt a patchet..

az image button-nal volt regebben gond, de azt is javitottak mar. http://drupal.org/node/209574

0
0
sgabe képe

Azért nem megy mert a feltétel nem teljesül, mivel nem "edit-submit" lesz az azonosító, legalábbis jó esetben nem.

0
0
Sweetchuck képe

tehát a [clicked_button][#id]-nak vagy ezt edit-g1-btn-1 vagy ezt edit-btn-2 kéne tartalmaznia. De az én tapasztalataim szerint minden esetben az edit-btn-2 értéket veszi fel.

0
0
sgabe képe

Én szépen visszakapom az általam módosított kódban az edit-proba-btn-1 vagy edit-proba-btn-2 azonosítókat az űrlap elküldésénél.

0
0
Sweetchuck képe

function boobaa_menu() {
 
  $items['boobaa'] = array(
    'title'            => 'Boobaa',
    'access arguments' => array('access content'),
    'page callback'    => 'drupal_get_form',
    'page arguments'   => array('boobaa_boobaa_form'),
  );
  return $items;
}
function boobaa_boobaa_form($form_state) {
  $form = array();
  $form['g1'] = array(
    '#tree' => TRUE,
  );
  $form['g1']['text_1'] = array(
    '#type'  => 'textfield',
    '#title' => 'text 1',
  );
 
  $form['g1']['btn_1'] = array(
    '#type'       => 'submit',
    '#title'      => t('title'),
    '#value'      => t('value'),
    '#attributes' => array('btnid' => '1'),
    '#name'       => 'btn_1',
  );
 
  $form['text_2'] = array(
    '#type'  => 'textfield',
    '#title' => 'text 2',
  );
  $form['btn_2'] = array(
    '#type'       => 'submit',
    '#title'      => t('title'),
    '#value'      => t('value'),
    '#attributes' => array('btnid' => '2'),
    '#name'       => 'btn_2',
  );
 
  return $form;
}
function boobaa_boobaa_form_submit($form, &$form_state) {
  drupal_set_message('Ez gomb lett menyomva: btnid='. $form_state['clicked_button']['#attributes']['btnid']);
  //drupal_set_message('<pre>F $form_state = '.check_plain(print_r($form_state, TRUE)).'</pre>');
}
0
0
sgabe képe

Ez működhet, de az attribútumok közé benyomni nem biztos, hogy jó ötlet. Legalábbis valid nem lesz az biztos. Lehet a gombnak saját azonosítója, azt kéne használni szerintem.

Egyébként miért kell ugyanaz a value? Ezt a részt nem igazán értem...

0
0
Sweetchuck képe

Nem kell, az csak próbálkozás volt, de ott maradt

0
0
sgabe képe

Bocsi, ezt a kérdést a téma indítónak címeztem.

0
0
Boobaa képe

...legalábbis tudomásom szerint.

Persze ez lehet, hogy öt percen belül megváltozhat, mire a végére érek ezen topic értő olvasásának...

0
0
sgabe képe

<?php $form_state['clicked_button']['#id'] ?>

Szerintem gyönyörűen működik.

<?php
function boobaa_boobaa_form($form_state) {
  $form = array();
  $form['proba'] = array(
    '#tree' => TRUE,
  );
  $form['proba']['text_1'] = array(
    '#type'  => 'textfield',
    '#title' => 'text 1',
  );
 
  $form['proba']['btn_1'] = array(
    '#type'       => 'submit',
    '#title'      => t('title'),
    '#value'      => t('value'),
    '#name'       => 'btn_1',
  );
 
  $form['proba']['text_2'] = array(
    '#type'  => 'textfield',
    '#title' => 'text 2',
  );
  $form['proba']['btn_2'] = array(
    '#type'       => 'submit',
    '#title'      => t('title'),
    '#value'      => t('value'),
    '#name'       => 'btn_2',
  );
 
  return $form;
}
 
function boobaa_boobaa_form_submit($form, &$form_state) {
  drupal_set_message('Ez gomb lett menyomva: '. $form_state['clicked_button']['#id']);
}
?>
0
0
Sweetchuck képe

Nem kell az #atrributes-t használni elég a #name. Nem értem miért nem vettem észre hogy jó is, mert ezt próbáltam elsőnek, aztán az #attributes-t

0
0
Boobaa képe

Már a postán sorbanállás közben gyanús volt, hogy ezt anno Drupal előtt az input type="button" value="foo" name="foo-1" alapján csináltuk (csak hogy hivatkozzak a HTML-re).
Ennek megfelelően nincs szükség sem a #tree-re (csak bonyolítja a feldolgozó kódot), sem az #attributesra (meg ugye ettől invalid is lesz a HTML), sem a #title-re (felesleges, úgysem használatos) - bőven elég, ha az ugyanolyan #value-val és #submittel bíró, de különböző #id-jú (ezt is felesleges saját modulban kódolni, a FAPI gondoskodik az egyediségéről is) #type='button' vezérlők egyedi #name-et kapnak a saját modulban. A $form_state['clicked_button']['#id'] viszont nem a #name, hanem továbbra is az #id alapján kerül kitöltésre - azaz ha ettől függ az elágazásom, akkor illik azt is kitölteni (legalábbis IMHO).

Köszönöm szépen a segítséget - erre igazán illett volna magam rájönnöm/emlékeznem... :S

0
0