ajax를 통해 선택 목록 값을 업데이트 할 때 "잘못된 선택이 감지되었습니다"를 피하는 방법은 무엇입니까?


10

양식에 사용자 엔티티에 대한 4 개의 엔티티 참조 필드가 있습니다. 호스트 양식은 노드 편집 양식입니다. 그중 세 개는 선택 목록이며 마지막은 인라인 엔터티 양식 입니다.

IEF를 통해 사용자 엔티티를 추가 한 후 선택 목록 값을 업데이트하려고합니다.

function ebep_users_feature_users_list_ajax($form, $form_state) {

  $ief = array_shift($form_state['inline_entity_form']);
  $options = array('_node' => t('- None -'));
  $commands = array();

  foreach($ief['entities'] as $data) {
    $options[$data['entity']->uid] = $data['entity']->name;
  }

  foreach(_ebep_users_feature_getUserListFieldNames() as $fieldName) {
    $form[$fieldName]['und']['#options'] = $options;
    $commands[] = ajax_command_replace('#'.$fieldName.'_wrapper', drupal_render($form[$fieldName]));
  }

  return array('#type' => 'ajax', '#commands' => $commands);
}

작동하지만 IEF를 통해 다른 사용자를 추가하려고하면 다음과 같은 결과가 나타납니다.

잘못된 선택이 감지되었습니다. 사이트 관리자에게 문의하십시오.


의 어느 한 Related오른쪽에 나열 여기에 질문이 해결?
Jimajamma

@ Jimajamma 그것은 아약스 콜백 양식 재구성이 작동하지 않는 것 같습니다. 어떻게 활성화합니까? $ form_state [ 'rebuild'] = TRUE는 아무것도하지 않습니다 ...
Codium

@Jimajamma 관련 솔루션이 작동하지 않습니다
Codium

중복 된 질문 이므로
Sina Salek

답변:


15

--- 원래 답변. 잘못되었습니다. 아래 업데이트를 확인하십시오.

그냥 설정

$bla['#validated'] = TRUE

선택하면 AJAX로 업데이트됩니다.

Checkout "잘못된 선택이 감지되었습니다"

--- 2019 년 12 월 17 일 업데이트 ---

사실 그것은 좋은 조언이 아니 었습니다.

Ajax 콜백 함수는 변경된 형식 또는 일부 ajax 명령 만 리턴해야합니다.

이 경우 양식 기능 또는 양식 변경 후크에서 양식을 수정해야합니다. 양식 작성 및 유효성 검증 기능은 Ajax 콜백이 호출 될 때마다 실행됩니다. 양식 빌드에서 $ form_state를 확인하거나 함수를 변경하고 그에 따라 값을 조정하십시오.

"잘못된 선택이 감지되었습니다 ..."오류 해결을 참조하십시오.


1
내가 잘 기억한다면 나는 내 경우에 성공하지 않고 이것을 시도했다, 감사합니다
Codium

1
나는 이것이 나에게도 효과가 없다는 것을 두려워한다.
kevin.coyle

이렇게하면 양식의 보안 성이 떨어지지 않습니까?
Binny

예, 모든 이전 의견이 맞습니다. 답변이 업데이트되었습니다.
jaimealsilva

3

Drupal 6 에서이 문제에 직면하여 Ajax를 통해 Select list의 값을 변경했습니다.

여기 당신이 할 수있는 것은

  1. 가능한 경우 필드 API에서 가능한 모든 값을 삽입하고 해당 필드를 편집 한 다음 값을 변경할 때 나열된 값만 목록에 있는지 확인해야합니다.
  2. 내가 구현 한 솔루션은 필드 유형을 선택 목록에서 텍스트 필드, 필드 API에서 변경하고 Drupal에 값을 그대로 저장하도록 요청할 수 있다는 것입니다. 이제 양식 런타임에서 양식을 변경하고 유형을 변경하여 목록을 선택한 다음 원하는 옵션을 입력해야합니다. 제출하는 동안 필드에 필요한 올바른 값을 지정해야합니다.이 값은 그대로 DB에 저장됩니다. 기본 양식 제출 핸들러보다 먼저 제출 핸들러를 호출해야합니다.array_merge

첫 번째 솔루션이 효과가 있다면 코딩 및 테스트 시간을 크게 절약 할 수 있습니다. 그러나 드롭 다운의 목록이 동적이고 제어 할 수없는 경우 두 번째 솔루션을 사용해야 할 수도 있습니다.

문제가 발생하면 게시하십시오.이 프로젝트에 대해이 프로젝트에 대해 많은 작업을 수행했으며 ~ 50 양식, PHEW !!! :)


3

#value선택 목록 에서 설정하는 것이 가장 좋습니다 .

formstate에 값이 있고 옵션에 있으면 오류가 발생하지 않습니다. 값이 옵션에 없으면 옵션에서 첫 번째 옵션을 선택하고 사용하십시오.

$form['example'] = array(
    '#type' => 'select',
    '#title' => t('Example'),
    '#options' => $options,
    '#value' => isset($form_state['values']['example']) && in_array($form_state['values']['example'],$options)?$form_state['values']['example']:key($options),
  );

2

내 해결책 :

/**
 * Implements hook_form_FORM_ID_alter()
 */
function ebep_users_feature_form_ebep_exhibitor_profile_node_form_alter(&$form, &$form_state, $form_id) {

  foreach(_ebep_users_feature_getUserListFieldNames() as $fieldName) {
    $form[$fieldName]['und']['#prefix'] = '<div id="'.$fieldName . '_wrapper">';
    $form[$fieldName]['und']['#suffix'] = '</div>';
    $form[$fieldName]['und']['#options'] = _ebep_users_feature_getOptionsValuesFromIEFList($form_state);
  }

  $form['#attached']['css'] = array(
    drupal_get_path('module', 'ebep_users_feature') . '/assets/styles.css',
  );

  $form['#attached']['js'] = array(
    drupal_get_path('module', 'ebep_users_feature') . '/assets/scripts.js',
  );

  $form['users_refresh'] = array(
    '#type' => 'submit',
    '#value' => t('Refresh users list'),
    '#ajax' => array(
      'callback' => 'ebep_users_feature_users_list_ajax',
    ),
  );
}

function ebep_users_feature_users_list_ajax($form, $form_state) {

  $commands = array();

  foreach(_ebep_users_feature_getUserListFieldNames() as $fieldName) {
    $form[$fieldName]['und']['#options'] = _ebep_users_feature_getOptionsValuesFromIEFList($form_state);
    $commands[] = ajax_command_replace('#'.$fieldName.'_wrapper', drupal_render($form[$fieldName]));
  }

  return array('#type' => 'ajax', '#commands' => $commands);
}

function _ebep_users_feature_getOptionsValuesFromIEFList($form_state) {
  static $options = array();

  if (empty($options)) {
    $ief = array_shift($form_state['inline_entity_form']);
    $options['_node'] = t('- None -');

    foreach($ief['entities'] as $data) {
      $options[$data['entity']->uid] = $data['entity']->name;
    }
  }

  return $options;
}

-1

ajax 콜백에서 다음을 추가하십시오.

...

drupal_get_messages();
form_get_errors();

return array('#type' => 'ajax', '#commands' => $commands);

보안 예방 조치로 핵심 _form_validate()기능은 요소의 #options 키가 원래 빌드에서 설정된 것과 다른 요소의 #options 키가 변경되었는지 확인합니다. 호출하여 drupal_get_messages()그리고 form_get_errors()우리는 기본적으로 우리의 아약스 요청을 실행하는 동안 오류 / 메시지를 무시하는 드루팔을 말한다. :)


오류 메시지는 사라졌지 만 select 요소에는 여전히 오류 클래스가 포함되어 있습니다.
Tejas Vaidya

Drupal은 차량의 대시 보드에 경고등 위에 테이프를 놓는 것과 같습니다.
Frank Robert Anderson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.