어떤 버튼을 클릭했는지 어떻게 알 수 있습니까?


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

그건 좋은 지적이야!
user1359

5
"clicked_button"은 여전히 ​​작동하지만 D7에서는 더 이상 사용되지 않으며 대신 "triggering_element"를 사용하는 것이 좋습니다. "clicked_button"을 사용하는 코드에만 영향을 미치는 #ajax 버그가 있다고 생각합니다. "triggering_element"를 사용해야하는 또 하나의 이유입니다. 그리고 결국 $ form_state의 다른 키일뿐입니다.
보얀 Zivanovic

1
이 방법은 효과가 있지만 더 이상 사용되지 않으며 문제가 발생하기 쉽습니다. 올바른 Drupal 7 방법에 대해서는 tunic의 답변을 참조하십시오.
Alice Heaton

3

$form_stateDrupal 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을 기억하면 Drupal 7에서 $ form_state] [ 'X']가 $ form_state [ 'X']
iStryker

왜이 두 값을 비교해야합니까?
iStryker

양식에 여러 개의 제출 단추가 포함 된 경우 이 비교는 단일 제출 핸들러에서 양식을 제출하는 데 사용 된 단추를 다르게하는 데 도움이됩니다. $ form_state [ 'clicked_button'] [ '# value'] = t ( '예')는 다국어 설정에서 다른 값을 생성합니다.
Shoaib Nawaz

다국어 설정에서 모든 언어 비교를 피하려면 단일 비교가 가장 좋습니다. :)
Shoaib Nawaz

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.

따라서 다음과 같은 두 개의 제출 단추가있는 양식의 경우 $ form [ 'submit'] = array ( '#type'=> 'submit', '#name'=> 'submit-1', '#value'=> t ( '제출 1'),); $ form [ 'submit2'] = array ( '#type'=> 'submit', '#name'=> 'submit-2', '#value'=> t ( 'Submit2'),); submitForm () 함수에서 $ form_state-> getTriggeringElement () [ '# name']을 확인하면됩니다.
Gaius

3

업데이트 2016 Drupal 8

여전히 트리거 된 이벤트에 액세스하는 방법을 알아 내려는 사람들을 위해 여기 Drupal 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

드루팔 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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.