Seçim listesi değerlerini ajax aracılığıyla güncellerken “Geçersiz bir seçim algılandı” nasıl önlenir?


10

Bir formda kullanıcı varlık için dört varlık başvuru alanları var. Ana bilgisayar formu, düğüm düzenleme formudur. Bunlardan üçü seçili listeler, sonuncusu Satır İçi Varlık Formu .

IEF aracılığıyla bir kullanıcı varlığı ekledikten sonra seçme listeleri değerlerini güncellemeye çalışıyorum:

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);
}

Çalışıyor, ancak IEF aracılığıyla başka bir kullanıcı eklemeye çalıştığımda:

Geçersiz bir seçim tespit edildi. Lütfen site yöneticisiyle iletişime geçin.


Relatedburada sağda listelenen sorulardan herhangi biri bunu çözdü mü?
Jimajamma

@Jimajamma, ajax geri arama formunda yeniden oluşturmanın işe yaramadığı anlaşılıyor. Nasıl etkinleştirebilirim? $ form_state ['rebuild'] = DOĞRU hiçbir şey yapma ...
Codium

@Jimajamma böylece ilgili çözümler çalışmıyor
Codium

Sorunuzu burada yinelenen bir soru olduğu için cevapladım drupal.stackexchange.com/questions/15989/…
Sina Salek

Yanıtlar:


15

--- Orijinal cevap. Yanlış, aşağıdaki güncellemeyi kontrol edin.

Sadece ayarla

$bla['#validated'] = TRUE

AJAX ile güncellenecek olan seçimde.

Ödeme "Yasadışı Choice tespit edildi"

--- Güncelleme 17 Ara 2019 ---

Aslında bu iyi bir tavsiye değildi, uzun zaman önceydi, şimdi daha iyi biliyorum.

Ajax geri arama işlevinin yalnızca değişen form parçasını veya bazı ajax komutlarını döndürmesi gerekir.

Bu durumda, form işlevinde veya bir form değiştirme kancasında form değişikliği yapılmalıdır. Form oluşturma ve doğrulama işlevleri, bir ajax geri çağrısı her çağrıldığında çalıştırılır. Form oluşturma veya değiştirme işlevinizde $ form_state öğesini kontrol etmeniz ve değerleri buna göre ayarlamanız yeterlidir.

Bkz. "Geçersiz bir seçim tespit edildi ..." hatasını çözme


1
İyi hatırlıyorsam, bunu denedim, benim durumumda bir başarı olmadan, teşekkürler
Codium

1
Korkarım bu benim için de işe yaramıyor.
kevin.coyle

Bu formu daha az güvenli hale getirmiyor mu?
Binny

Evet, önceki tüm yorumlar doğrudur. Yanıt güncellendi.
jaimealsilva

3

Ajax üzerinden Seçim listesinin değerlerini değiştirerek, Drupal 6'da bu sorunla birçok kez karşılaştım.

İşte yapabileceğiniz şey

  1. Mümkünse, Alan API'sındaki tüm olası değerleri eklemeyi deneyin, bu alanı düzenlemeniz gerekir ve ardından değerleri değiştirdiğinizde, listede yalnızca listelenen değerlerin bulunduğundan emin olmanız gerekir.
  2. Uyguladığım çözüm, alan türünü Seçim listesinden metin alanına, Alan API'sından değiştirebilir ve Drupal'dan değeri olduğu gibi kaydetmesini isteyebilirsiniz. Şimdi, form çalışma zamanında, formu değiştirmeniz, listeyi seçmek için türü değiştirmeniz ve istediğiniz seçenekleri iletmeniz gerekecektir. Sunum sırasında da alanın gerektirdiği doğru değeri atamanız gerekir, bu DB'ye olduğu gibi kaydedilir. Gönderme işleyicinizin varsayılan form gönderme işleyicisinden önce çağrıldığından emin olun;array_merge

İlk çözüm sizin için işe yararsa, şeyleri kodlamak ve test etmek için çok zaman kazandıracaksınız. AMA açılır menüdeki liste dinamikse ve üzerinde kontrolünüz yoksa ikinci bir çözüm bulmak zorunda kalabilirsiniz.

Herhangi bir sorunla karşı karşıya kalırsanız, projem için bu sorun üzerinde oldukça fazla iş yaptım ve ~ 50 form, PHEW için yaptım !!! :)


3

Bu #valueseçim listesinde ayarlamak için en iyi yolu bulduk .

Formtate değerine sahipsek ve seçeneklerimizde yer alıyorsa, hata almayacağız. Değerimiz seçeneklerde değilse, seçeneklerimizde ilk seçeneği seçin ve bunu kullanın.

$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

Çözümüm:

/**
 * 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 geri aramanıza şunu ekleyin:

...

drupal_get_messages();
form_get_errors();

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

Güvenlik önlemi olarak, temel _form_validate()işlev bir öğenin #options anahtarının orijinal yapıda ayarlanandan (sahip oldukları) değişip değişmediğini kontrol eder. Arayarak drupal_get_messages()ve form_get_errors()temelde Drupal'a ajax isteğimizi çalıştırırken herhangi bir hata / mesajı yok saymasını söyleriz. :)


Hata mesajı gitti ancak select öğesi hala hata sınıfını içeriyor.
Tejas Vaidya

Bu, aracınızın gösterge panosundaki uyarı ışığının üzerine bant yapıştırmanın Drupal eşdeğeri.
Frank Robert Anderson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.