ajax를 사용하여 하나의 입력에서 여러 양식 요소를 대상으로 할 수 있습니까?


8

ajax를 사용하여 하나의 양식 입력 흐림에서 drupal 양식의 두 가지 부분을 업데이트하려고합니다.

입력에 표준 아약스가 있습니다.

$my_form['my_input']['#ajax'] = array(
  'callback' => 'my_callback',
  'wrapper' => 'my_target_div',
  'event' => 'blur',
);

이것은 입력이 업데이트 될 때 내 div를 바꾸어 잘 작동합니다 ... 하지만 원래 입력의 흐림으로 인해 다른 코드로 양식의 다른 곳에서 다른 양식 입력을 업데이트하고 싶습니다.

어떤 아이디어라도 가능합니까?

편집 : 명확성을 위해 다음은 실제 사례입니다.

  • 콘텐츠 유형 '영화'
  • 'primary_title'필드 추가
  • 'primary_title'이 업데이트되면 내 아약스 콜백이 비슷한 문자열을 확인하고 html을 반환합니다.
  • 콜백의 HTML이 빈 div에 삽입됩니다.

    그 부분은 잘 작동합니다!

표준 노드 'title'입력을 수정하려고하는데 문자열을 정리하기 위해 정규 표현식을 수행 한 후 'primary_title'값을 지정하려고합니다 (시작에서 "The"또는 "A"제거) 결과 는 제목이 'primary_title'이고 제목이 잘린 'title'인 두 개의 제목 필드가 레코드를 정렬하고 표시하는 데 유용합니다.


답변:


13

ajax 명령을 사용하여 양식의 다른 부분을 대상으로 지정할 수 있지만 다음 중 하나만 반환하도록 선택해야합니다 .

  • HTML 또는

  • 렌더링 가능한 배열 또는

  • AJAX 명령의 배열

원래 쓴 상황에서 AJAX 명령 배열 렌더링 가능한 배열을 모두 반환하려고했지만 불가능한 것 같습니다.

예제 모듈의 코드 는 AJAX 명령 배열을 사용하여 양식의 다른 부분을 대상으로하는 방법을 보여줍니다.

function ajax_example_advanced_commands_html_callback($form, $form_state) {
  $text = $form_state['values']['html_command_example'];

  $commands = array();
  $commands[] = ajax_command_html('#html_div', $text);
  $commands[] = ajax_command_replace("#html_status", "<div id='html_status'>Updated html_command_example with text=$text;  " . date('r') . "</div>");
  return array('#type' => 'ajax', '#commands' => $commands);
}

이 코드 샘플에서 #html_div는 $ text를 가져오고 별도로 #html_status는 "text = $ text;로 업데이트 된 html_command_example"을받습니다. 날짜 ( 'r'). ""

하나의 아약스 콜백에서 서로 다른 두 가지 정보가있는 양식의 두 가지 다른 위치!

내가하고있는 것을 다시 보면서 노드 제목 필드를 전혀 반환 할 필요가 없다는 것을 깨달았습니다. 목록에서 데이터를 정렬하는 데 사용되는 유틸리티 필드 일뿐입니다.

노드 양식에서 필드를 숨겼으며 원래 ajax 콜백이 트리거 될 때 양식이 두 번째로 작성 될 때 채워집니다.


0

나는 Drupal을 처음 접했지만 지금까지 Ajax 프레임 워크가 융통성이 없다는 것을 알았습니다. 의도 한대로 사용하는 한 훌륭하게 작동합니다. 따라서 JS를 알고 있다면 스크립트를 스스로 만드는 것이 가장 좋습니다.

행운을 빕니다!


제안에 감사드립니다 :) 노드 제목 필드를 반환 할 필요가 없다는 것을 깨달았습니다. 단순히 목록을 구성하는 유틸리티 필드로 사용되기 때문입니다. 기존의 아약스 콜백의 결과로 폼이 재 빌드 될 때 채워집니다.
Rick

0

drupal.org의 또 다른 옵션 :

가장 쉬운 경우 전체 양식을 쉽게 바꿀 수 있습니다. #prefix와 #suffix를 전체 폼 배열에 추가 한 다음 #ajax [ 'wrapper']로 설정하십시오. (이렇게하면 단일 ajax 호출을 통해 여러 양식 요소를 변경할 수 있습니다.)이를 수행하지 않는 유일한 이유는 적은 정보가 전송되면 프로세스가 더 빠르기 때문입니다.

콜백 함수는 다음과 같이 간단 할 수 있습니다.

function _callback($form, $form_state) {
  return $form;
}

#ajax배열을 테스트 하고 변경 하는 양식 요소 ( 또는 field_whatever아래의 예)에 대해 배열에서 호출해야합니다 .hook_form_FORM_ID_alter()$form_state$form

 if (isset($form_state['values']['field_whatever'])){
     $form['field_something']['#disabled'] = TRUE;
     $form['field_something_else']['#disabled'] = FALSE;
 } else {
     $form['field_something']['#disabled'] = FALSE;
     $form['field_something_else']['#disabled'] = TRUE;
 }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.