AJAX 콜백에서 $ form_state 변경


16

양식 API '#ajax'속성 을 사용하는 양식 을 작성 $form_state중이며 AJAX 사용 가능 단추를 누르면 변경해야합니다 . 내가 가진 것은 다음과 같습니다.

양식 작성기 함수 내부 :

...
$form['some_fieldset']['add_more'] = array(
      '#type' => 'button',
      '#value' => t('Add more rows'),
      '#ajax' => array(
        'wrapper' => 'some-fieldset',
        'callback' => 'my_module_settings_ajax',
        'method' => 'replace',
        'effect' => 'fade',
      ),
    );

...

콜백 함수는 다음과 같습니다.

function my_module_settings_ajax($form, $form_state) { 
  // Make a change to $form_state
  if ($form_state['some_fieldset']['add_more']) {
    $form_state['values']['some_fieldset']['table'][] = array('first_field' => '',
                                                                'second_field' => '');
  }

  return $form['some_fieldset'];
}

$form_state콜백이 끝나면 변경 한 내용이 손실 된 것 같습니다. $form_state이 기능을 변경하는 방법이 있습니까 , 아니면 대신이 기능을 사용해야하는 다른 기능이 있습니까?

편집하다

결과적으로 콜백은이 논리를 수행하기에 잘못된 장소입니다. 대신 폼 빌더 함수의 맨 위에 다음을 추가했습니다.

// Respond to AJAX-triggger:
// Add new row
if ($form_state['triggering_element']['#name'] == 'add_more') {
  $form_state['values']['some_fieldset']['table'][] = array('first_field' => '',
                                                                'second_field' => '');
}

물론 버튼 이름을 지정해야했습니다.

$form['some_fieldset']['add_more'] = array(
  '#type' => 'button',
  '#name' => 'add_more', // <-- Right here
  '#value' => t('Add more rows'),
  '#ajax' => array(
    'wrapper' => 'some-fieldset',
    'callback' => 'my_module_settings_ajax',
    'method' => 'replace',
    'effect' => 'fade',
  ),
);

그리고 지금 작동합니다!

답변:


3

$form_state참조 로 전달해야합니다 . AJAX 함수는 다음 예제와 같이 정의해야합니다.

function mymodule_settings_ajax($form, &$form_state) { /* … */ } 

명확히하기 위해 값이 아닌 참조로 &를 전달해야합니다. 그것없이 당신은 $ form_state의 사본 만 수정하고 있습니다.
Malks

예, 이렇게하지 않으면 로컬 변수 만 수정합니다.
영양

1
물론 그렇게 생각하지 않았습니다. 불행히도 아무런 영향을 미치지 않았습니다. $ form_state에 대한 변경은 폼 빌더에서 무시되며 다음에 AJAX 호출이있을 때 $ form_state는 되돌려집니다. 콜백이 실행될 때까지 양식이 이미 생성되었을 수 있습니까? 이 버튼에 대해 사용자 정의 제출 핸들러를 실행하는 방법이 있습니까?
MW.

버튼에서 제출 형식을 변경하려고
영양

0

귀하의 질문에 대한 직접적인 답변인지 확실하지 않지만 사용 사례에 적합 할 수 있습니다. $ form_state add 값을 $ form에 변경하는 대신 표시하지 않으려면을 사용하십시오 #hidden.

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