मैं कैसे जान सकता हूं कि किस बटन पर क्लिक किया गया था?


12

मेरे पास "सबमिट" और "रद्द करें" बटन के साथ एक फॉर्म है। में hook_submit(), मुझे कैसे पता चलेगा कि किस बटन पर क्लिक किया गया था?


क्या आप hook_submit()एक फॉर्म सबमिट करने वाले हैंडलर की बात कर रहे हैं ? एक फॉर्म सबमिशन हैंडलर का कार्यान्वयन नहीं है hook_submit()
kiamlaluno

जवाबों:


23

आप triggering_elementसे उपयोग करना चाहिए $form_state['triggering_element']

सबसे अच्छा अभ्यास #nameआपके बटन के लिए एक विशेषता को परिभाषित करना है , इसलिए आपके पास यह मान हो सकता है triggering_element

उदाहरण के लिए:

$form['delete'] = array(
  '#type' => 'submit',
  '#value' => t('Delete'),
  '#name' => 'delete',
);

यदि आप परिभाषित नहीं करते हैं तो यह विशेषता triggering_elementबटन #value(उपयोगकर्ता द्वारा पढ़ा जा सकने वाला पाठ) को दबाए रखेगा , लेकिन यह हतोत्साहित किया जाता है क्योंकि अन्य मॉड्यूल इस मूल्य को बदल सकते हैं या स्थानीयकरण द्वारा बदल सकते हैं)।

आप भी उपयोग कर सकते हैं $form_state['clicked_button'], लेकिन यह पदावनत है

आप drupal_build_form फ़ंक्शन प्रलेखन पृष्ठ पर अधिक जानकारी पढ़ सकते हैं ।


7

$form_state['clicked_button']['#value'] आपको बताएगा कि फॉर्म पर किस बटन पर क्लिक किया गया था।


$form_state['clicked_button']['#value']:)
user1359

1
मुझे जोड़ना पसंद है, यदि आपके फॉर्म पर फ़ील्ड (ओं) की आवश्यकता होती है, और वे नहीं भरे जाते हैं, तो आप Drupal एक फॉर्म सत्यापन त्रुटि फेंक देंगे (form_submit form_validate के बाद कहा जाता है)। आपको इस तरह के कुछ काम करने की ज़रूरत है devengineering.com/best-practices/drupal/…
iStryker

ये एक अच्छा बिंदु है!
15:

5
जबकि "क्लिक किया गया_बटन" अभी भी काम करता है, इसे डी 7 में पदावनत किया गया है और इसके बजाय "ट्रिगरिंग_लेमेंट" का उपयोग करने की सिफारिश की गई है। मुझे याद है कि कुछ #ajax कीड़े थे (मुझे लगता है) कि केवल प्रभावित कोड "clicked_button" का उपयोग करता था, इसलिए "ट्रिगरिंग_लेमेंट" का उपयोग करने का एक और कारण है। और आखिरकार, यह $ form_state में एक अलग कुंजी है।
बोजान ज़िवानोविक

1
जबकि यह दृष्टिकोण काम करता है, यह पदावनत है और समस्याओं से ग्रस्त है। ऐसा करने के लिए सही Drupal 7 तरीके के लिए अंगरखा का जवाब देखें।
एलिस हेटन

3

इन मूल्यों की तुलना $form_stateमैं Drupal 6 में कर रहा हूं और Drupal7 में भी यही होगा

if($form_state['values']['ok'] == $form_state]['clicked_button']['#value']){
    //Process if OK is pressed
}else if($form_state['values']['cancel'] == $form_state]['clicked_button']['#value']) {
    //Process if Cancel is pressed
}

अगर मुझे याद है कि Drupal 6 $ form_state] ['X'] अब $ form_state है [Dr Xal 7 में
iStryker

आपको इन दो मूल्यों की तुलना करने की आवश्यकता क्यों है?
१४

यदि फॉर्म में कई सबमिट बटन हैं। यह तुलना एक बटन सबमिट हैंडलर में फॉर्म सबमिट करने के लिए किस बटन को अलग करने में मदद करेगी। $ form_state ['clicked_button'] ['# value'] = t ('Yes') बहुभाषी सेटअप पर अलग-अलग मान देगा।
शोएब नवाज

बहुभाषी सेटअप में सभी भाषा तुलनाओं से बचने के लिए एक एकल तुलना सबसे अच्छा है। :)
शोएब नवाज़

1
@iStryker मुझे यकीन नहीं है कि आप अपनी पहली टिप्पणी के साथ क्या मतलब है।
kiamlaluno

3

बटन को #nameविशेषता के साथ नाम दें , जैसे:

$form['delete'] = array(
    '#type' => 'submit',
    '#value' => t('Delete'),
    '#name' => 'delete',
);

और फिर उपयोग करें:

$values = $form_state['input'];
if (isset($values['delete'])) // 'delete' button was pressed.

तो इस तरह दो सबमिट बटन के साथ एक फॉर्म के लिए: $ फॉर्म ['सबमिट'] = सरणी ('# टाइप' => 'सबमिट', submit #name '=>' सबमिट -1 ’, val #value’ => t ('Submit1'),); $ फॉर्म [t सबमिट २ ’] = सरणी (= # टाइप’ => 'सबमिट ’, name #name’ =>, सबमिट -2 ’, val #value’ => t (2 Submit2 ’);); हमें सबमिटफ़ॉर्म () फ़ंक्शन में बस $ form_state-> getTriggeringElement () ['# नाम'] की जांच करनी होगी?
गयुस

3

अद्यतन 2016 ड्रुपल 8

उन लोगों के लिए अभी भी यह पता लगाने की कोशिश की जा रही है कि यहाँ ट्रिगर की गई घटना का उपयोग कैसे किया जाए।

$form_state->getTriggeringElement()

यह ट्रिगर सबमिट तत्व का सरणी देता है। यदि आप एक मार्कअप जोड़ते हैं, #nameतो आप इसे निम्न तरीके से एक्सेस करेंगे।

$button_clicked = $form_state->getTriggeringElement()['#name']

इस परिवर्तन के पीछे कारण यह है कि FormStateInterfaceअब एक readOnlyफ़ाइल है जिसमें केवल कक्षाएं जो विस्तारित होती FormStateInterfaceहैं वे चर तक पहुंच सकते हैं। इसलिए आपको getTriggeringElement()वेरिएबल एक्सेस करने के लिए एक्सेसर तरीके का उपयोग करना होगा।


मेरे पास 2018 में Drupal 8.4.4 के लिए एक अपडेट है: drupal.stackexchange.com/a/256112/1441
user1359

0

Drupal में 8.4.4 $form_state->getTriggeringElement()['#name'];आपको मूल्य देता है op। जब आप प्रपत्र राज्य के मान सरणी में उस #valueकुंजी को खोजते हैं , तो आपको बटन फ़ॉर्म तत्व की कुंजी मिलती है - दूसरे शब्दों में, वह स्ट्रिंग जो अंतिम उपयोगकर्ता पृष्ठ पर बटन पर देखता है।

मुझे नहीं पता कि क्या $form_state->getValues()['op']सभी रूपों के लिए सार्वभौमिक है, लेकिन मैं इसे अपने मॉड्यूल के रूप में हार्ड-कोडिंग कर रहा हूं।


0

Drupal 8.6.7

बटन को कुछ इस तरह बनाएं।

$form['my_button'] = [
    '#type' => 'button',
    '#value' => t('Custom Button'),
    '#name' => t('customButton'),
    '#weight' => 0,
    '#attributes' => [
      'class' => ['populate-bib-button', 'btn', 'btn-primary'],
    ],
  ];

आपके सबमिट फ़ंक्शन में नीचे दिए गए कोड की तरह बटन का नाम मिलता है।

$input = $form_state->getUserInput();
print $input['_triggering_element_name']; // customButton

तुलना की जा सकती है

if ($input['_triggering_element_name'] == 'customButton') {
  // Do something.
}

# Drupal8

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.