Hangi düğmenin tıklandığını nasıl bilebilirim?


12

"Gönder" ve "İptal" düğmelerini içeren bir form var. Olarak hook_submit(), nasıl tıklandığı düğmesi biliyoruz?


hook_submit()Form gönderme işleyicisinden mi bahsediyorsunuz ? Form gönderme işleyicisi uygulaması değildir hook_submit().
kiamlaluno

Yanıtlar:


23

Kullanmalısınız $form_state->getTriggeringElement().

En iyi yöntem, #namedüğmeniz için bir özellik tanımlamaktır , böylece bu değeri triggering_element.

Örneğin:

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

Bu örnekte: $form_state->getTriggeringElement()['#name']içinde çağrıldığında "sil" ifadesini döndürürpublic function submitForm(&$form, $form_state)

Bu özniteliği tanımlamazsanız triggering_elementdüğmenin #value(kullanıcının okuyabileceği metin) tutacağı , ancak diğer modüllerin bu değeri değiştirebileceği veya yerelleştirme ile değiştirilebileceği için bu önerilmez.

Siz de kullanabilirsiniz $form_state['clicked_button'], ancak bu kullanımdan kaldırılmıştır .

Daha fazla bilgi için drupal_build_form işlevi dokümantasyon sayfasını okuyabilirsiniz .


Drupal 8.8'den (belki daha önce) $ form_state-> getTriggeringElement () ['# value'] (veya #name veya istediğiniz tetikleyici dizi dizini dizini) kullanırsınız. $ Form_state özelliklerine doğrudan dizi öğesi başvurusu olarak erişmek artık bir hata verecektir.
Neil Davis

7

$form_state['clicked_button']['#value'] formda hangi düğmenin tıklandığını söyleyecektir.


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

1
Formunuzda gerekli alan (lar) varsa ve doldurulmamışsa, Drupal bir form doğrulama hatası atar (form_validate'dan sonra form_submit çağrılır) eklemek isterim. Bunun gibi bir şey yapmanız gerekiyor devengineering.com/best-practices/drupal/…
iStryker

İyi bir noktaya değindin!
user1359

5
"Clicked_button" çalışmaya devam ederken, D7'de kullanımdan kaldırılmıştır ve bunun yerine "triggering_element" kullanılması önerilir. Ben sadece "clicked_button" kullanılan kodu etkileyen bazı # ajax hatalar olduğunu düşünüyorum, bu yüzden "triggering_element" kullanmak için bir neden daha. Sonuçta, $ form_state içinde sadece farklı bir anahtar.
Bojan Zivanovic

1
Bu yaklaşım işe yararken, kullanımdan kaldırılmış ve sorunlara eğilimlidir. Bunu yapmanın doğru Drupal 7 yolu için tunik cevabına bakın.
Alice Heaton

3

$form_stateDrupal 6'da yaptığım bu değerleri karşılaştırın ve Drupal7'de aynı olurdu

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
}

Doğru hatırlıyorsam Drupal 6 $ form_state] ['X'] artık Drupal 7'de $ form_state ['X']
iStryker

Neden bu iki değeri karşılaştırmanız gerekiyor?
iStryker

Formda birden fazla gönderme düğmesi varsa. Bu karşılaştırma, formu tek bir gönderme işleyicisinde göndermek için kullanılan düğmenin farklı olmasına yardımcı olacaktır. $ form_state ['clicked_button'] ['# value'] = t ('Evet'), çok dilli kurulumda farklı değerlere yol açacaktır.
Shoaib Nawaz

Çok dilli kurulumda tüm dil karşılaştırmalarından kaçınmak için tek bir karşılaştırma en iyisidir. :)
Shoaib Nawaz

1
@iStryker İlk yorumunuzla ne demek istediğinizden emin değilim.
kiamlaluno

3

Düğmeleri #nameözniteliğe şu şekilde adlandırın:

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

ve sonra şunu kullanın:

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

Bunun gibi iki gönderme düğmesi olan bir form için: $ form ['send'] = dizi ('#type' => 'gönder', '#name' => 'gönder-1', '#value' => t ('Gönder1'),); $ form ['send2'] = dizi ('#type' => 'gönder', '#name' => 'gönder-2', '#value' => t ('Gönder2'),); SubmitForm () işlevinde $ form_state-> getTriggeringElement () ['# name'] 'ı kontrol etmemiz mi gerekiyor?
Gaius

3

GÜNCELLEME 2016 Drupal 8

Hala tetiklenen olaya nasıl erişileceğini anlamaya çalışanlar için Drupal 8 çözümü.

$form_state->getTriggeringElement()

Bu, tetikleyici gönderme öğesinin dizisini döndürür. Çağrılan bir işaretleme eklerseniz #name, buna şu şekilde erişirsiniz.

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

Bu değişikliğin arkasındaki neden FormStateInterface, artık readOnlyyalnızca genişleyen sınıfların FormStateInterfacedeğişkenlere erişebileceği bir dosya olmasıdır . Bu nedenle getTriggeringElement(), değişkene erişmek için gibi erişimci yöntemlerini kullanmanız gerekir .


Drupal 8.4.4 için 2018'de bir güncellemem var: drupal.stackexchange.com/a/256112/1441
user1359

0

Drupal 8.4.4 $form_state->getTriggeringElement()['#name'];size değerini verir op. Bu anahtarı form durumunun değerler dizisinde aradığınızda #value, düğme form öğesinin anahtarını alırsınız - başka bir deyişle, son kullanıcıların sayfadaki düğmede gördüğü dize.

$form_state->getValues()['op']Tüm formlar için evrensel olup olmadığını bilmiyorum , ancak modülümün formunda zor kodluyorum.


0

Drupal 8.6.7

Düğme aşağıdaki gibi bir şey oluşturun.

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

Gönderme fonksiyonunuzda aşağıdaki kod gibi düğme adı alın.

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

Karşılaştırma şöyle yapılabilir

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

# Drupal8

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.