it-swarm-ko.tech

버튼 값을 변경하는 Ajax 양식

사용자가 ajax로 표시된 버튼 요소를 누르면 콜백이 버튼 값 (버튼에 표시된 텍스트)을 수정하고 브라우저와 양식 상태에서 모두 업데이트하도록하고 싶습니다. ajax_command_replace 호출을 반환하면 브라우저에서 쉽게 업데이트 할 수 있습니다. 그러나 다음에 버튼을 누를 때 업데이트 된 버튼 값을 기억하기 위해 양식을 업데이트하면 운이 없습니다.

자바 스크립트 페이지의 콜백 함수가 정의 된 위치에서 버튼의 초기 값이 하드 코딩 된 아약스 양식이 작성되는 방식 인 것 같습니다. 아약스 콜백으로 반환 된 버튼 요소가 표시된 값과 일치하지 않는 이유를 설명합니다 브라우저에서 (ajax_command_replace로 변경 한 후).

그러나 이전 콜백 호출에서 button 요소의 새로운 값을 실제로 기억하기 위해 form (또는 form_state)을 얻을 수 있다면 그와 함께 살 수 있습니다.

또한 양식 validate 후크에서 form/form_state 값을 수정하려고했지만 성공하지 못했습니다.

따라서 이것이 작동하지 않는다는 것을 이미 알고 있지만 다음 코드는 내가하려는 일을 설명하려고합니다.

function testajax_callback($form, &$form_state) {
  $form['mybtn']['#value'] = 'New value';
  return array(
    '#type' => 'ajax',
    '#commands' => array(
      ajax_command_replace('#mybtnwrapper' => drupal_render($form['mybtn']))
  );
}

이 작업을 수행하는 방법에 대한 도움은 Drupal 7) 방법으로 감사하겠습니다.

업데이트 1 :

Drupal 포럼에 대한 힌트를 얻었습니다. 다음 코드는 아마도 Drupal 7 디자인 및 스타일에 따라 다름)


function betapp_testajax_callback($form, &$form_state) {
  $form['mybtn']['#value'] = 'New value';
  return $form['mybtn'];
}

function betapp_testajax_form($form, &$form_state) {
  $form['mybtn'] = array(
    '#type' => 'button',
    '#id' => 'mybtn',
    '#prefix' => '',
    '#suffix' => '',
    '#default_value' => 'Default value',
    '#ajax' => array(
      'callback' => 'betapp_testajax_callback',
      'wrapper' => 'testajaxwrapper',
      'method' => 'replace',
      'effect' => 'fade'
    )
  );
  return $form;
}

코드는 버튼 모양 (버튼 값)으로 변경되도록 관리하지만 업데이트 된 값으로 버튼을 누를 때 이전 값은 여전히 ​​전송 된 것이므로 실제로 폼의 값은 변경되지 않고 버튼 모양 만 변경됩니다.

Html 페이지의 콜백 정의에서 하드 코딩 된 값과 관련이있을 수 있습니다 (한 번만로드 됨). 다음과 같은 항목을 찾습니다.


{"callback":"betapp_testajax_callback","wrapper":"testajaxwrapper","method":"replaceWith","effect":"fade","event":"mousedown","keypress":true,"url":"\/d7\/system\/ajax","submit":{"_triggering_element_name":"op","_triggering_element_value":"Default value"}}

요소의 실제 값에 관계없이 _triggering_element_value를 사용하는 경우 새 값이 선택되지 않은 이유를 설명합니다. 콜백이 활성화 될 때 런타임에 _triggering_element_value를 찾아야합니까?

해결 방법/수정에 대한 아이디어가 있습니까?

4
Marius Kjeldahl

내 원래 질문에 대한 짧은 해결책은 다음과 같이 코딩 할 수 있습니다.


function betapp_testajax_callback($form, &$form_state) {
  return $form['mybtn'];
}

function betapp_testajax_form($form, &$form_state) {
  dd('');
  dd('betapp_testajax_form');
  $form['mybtn'] = array(
    '#type' => 'button',
    '#id' => 'mybtn',
    '#default_value' => 'Ignored default value',
    '#prefix' => '',
    '#suffix' => '',
    '#ajax' => array(
      'callback' => 'betapp_testajax_callback',
      'wrapper' => 'testajaxwrapper',
      'method' => 'replace',
      'effect' => 'fade'
    )
  );
  $prevval = '(blank)';
  if (isset($form_state['values']['mybtn'])) {
    $prevval = $form_state['values']['mybtn'];
    dd('prevval : ' . $prevval);
  }

  $form['mybtn']['#value'] = 'Newval ' . Rand(0, 100);

  dd('newval  : ' . $form['mybtn']['#value']);
  return $form;
}

다음과 같은 출력으로 이어집니다.


betapp_testajax_form
newval  : Newval 48

betapp_testajax_form
prevval : Newval 48
newval  : Newval 62

betapp_testajax_form
prevval : Newval 62
newval  : Newval 0

betapp_testajax_form
prevval : Newval 0
newval  : Newval 59

내 사용법은 조금 더 필요합니다. 버튼이 변경 될 때마다 업데이트해야 할 다른 요소가 있습니다. 그러나 나는 그것을 뽑아 내고 (지금은 올바르게 보입니다) 공유의 정신으로, 내가 함께 붙일 수있는 것은 다음과 같습니다.


function betapp_testajax_callback2($form, &$form_state) {
  return array(
    '#type' => 'ajax',
    '#commands' => array(
      ajax_command_replace('#mybtn', drupal_render($form['mybtn'])),
      ajax_command_replace('#inp', drupal_render($form['inp']))
    )
  );
}

function betapp_testajax_form2($form, &$form_state) {
  dd('');
  dd('betapp_testajax_form');
  $form['mybtn'] = array(
    '#type' => 'button',
    '#id' => 'mybtn',
    '#default_value' => 'Ignored default value',
    '#prefix' => '',
    '#suffix' => '',
    '#ajax' => array(
      'callback' => 'betapp_testajax_callback',
      'wrapper' => 'testajaxwrapper',
      'method' => 'replace',
      'effect' => 'fade'
    )
  );
  $prevval = '(blank)';
  if (isset($form_state['values']['mybtn'])) {
    $prevval = $form_state['values']['mybtn'];
    dd('prevval : ' . $prevval);
  }

  $form['mybtn']['#value'] = 'Newval ' . Rand(0, 100);

  $form['inp'] = array(
    '#type' => 'textfield',
    '#value' => $prevval,
    '#id' => 'inp'
  );
  dd('newval  : ' . $form['mybtn']['#value']);
  return $form;
}

이 코드는 원래 버튼을 업데이트하고 입력 필드를 버튼의 이전 값으로 설정합니다. 필자의 경우 다른 버튼을 수정해야하지만 잘 작동 할 것입니다. 그렇지 않으면이 스레드에서 다시 버그를 범할 것입니다.

감사합니다.

0
Marius Kjeldahl

그리고 정보를 더 완성하기 위해 여기 조금 더 있습니다.

버튼을 통한 특수 관리 게시자 : kjeldahl

많은 버튼이있는 양식이 있고 위에 표시된 것처럼 아약스를 사용하는 경우 버튼 이름을 고유 값으로 설정해야합니다 (ID 속성과 동일하게 설정) 또는 Drupal 버튼 값을 수정할 때 실제로 어떤 버튼이 클릭되었는지 인식하는 데 어려움이 있습니다. 기본적으로 Drupal 모든 버튼의 이름을 "op")으로 지정합니다.

$ form_state [ 'triggering_element']와 관련된 또 다른 문제점 : kjeldahl이 2011 년 5 월 18 일 오후 8시 47 분에 게시

내 응용 프로그램 (간단한 게임)에는 my Drupal 모듈에 대한 아약스 콜백을 트리거하는 일련의 버튼이 있습니다. 버튼의 ID와 이름은 값과 다릅니다. 버튼은 사용자가 읽을 수있는 정보를 사용자에게 보여주기 위해 사용됩니다. 여기에서 보여준 코드와 유사하게, 버튼을 누르면 값을 토글하는 일련의 버튼을 만드는 경우 (예 : 버튼 값의 접두사를 별표 또는 하나의 버튼을 계속 누르고 있으면 제대로 작동하지만 다른 버튼을 누르면 Drupal 푸시 된 내용을 잃어 버리고 설정하는 다른 기본 동작을 트리거 함) 기본적으로 정의 된 첫 번째 단추에 대한 triggering_element. form.inc 및 관련 코드를 간략히 살펴 보았으며 첫 번째 단추를 선택하는 동작은 "설계 상"인 것 같습니다.

그러나 의도적으로 설계되지 않은 것은 Drupal 내가 아래에 설명 된 유스 케이스에서 triggering_element를 추적 할 수 없다는 사실입니다. 그러나 $ form_value 상태를 덤프하면 사용하려고 시도했습니다. 내가 대신 "비공개"상태 값, 즉 $ form_state [ 'input'] [ '_ triggering_element_name']이라고 생각하는 것은 $ form_state [ 'triggering_element']와는 달리 항상 내 아약스 애플리케이션에서 올바른 값으로 채워진 것 같습니다 .

나는 이것이 버그라고 생각하지만 지금 정확한 세부 사항을 추적 할 시간이 없습니다. form.inc 내부에는 버튼 ID가 이름 및/또는 값과 같은지 여부에 따라 다르게 동작하는 코드가 있지만이 동작의 디자인 목표가 실제로 무엇인지 알 수 없습니다. 그러나 _triggering_element_name을 사용하지 않으면 Drupal 작동하지 않는 버튼 요소에 제대로 작동하지 않는 것 같습니다.

0
Marius Kjeldahl

하나 더. 많은 버튼이있는 양식이 있고 위에 표시된 것처럼 아약스를 사용하는 경우 버튼 이름을 고유 값으로 설정해야합니다 (ID 속성과 동일하게 설정) 또는 Drupal 버튼 값을 수정할 때 실제로 어떤 버튼이 클릭되었는지 인식하는 데 문제가 있습니다. 기본적으로 Drupal 모든 버튼의 이름을 "op"로 지정하면 여러 버튼 중 하나를 눌렀을 때의 값.

0
Marius Kjeldahl