अजाक्स के माध्यम से चयनित सूची मूल्यों को अपडेट करते समय "एक अवैध विकल्प का पता कैसे लगाया गया है" से कैसे बचें?


10

मेरे पास एक रूप में उपयोगकर्ता इकाई के लिए चार इकाई संदर्भ फ़ील्ड हैं। होस्ट फॉर्म नोड एडिट फॉर्म है। उनमें से तीन चुनिंदा सूचियां हैं, अंतिम इनलाइन एंटिटी फॉर्म है

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प्रश्न को सही हल करने के लिए सूचीबद्ध किया गया है?
जिमजम्मा

@ जिमाजम्मा ऐसा लगता है कि अजाक्स कॉलबैक फॉर्म पुनर्निर्माण पर काम नहीं कर रहा है। मैं इसे कैसे सक्षम कर सकता हूं? $ form_state ['rebuild'] = TRUE कुछ नहीं करते ...
Codium

@ जिमाजम्मा से संबंधित समाधान काम नहीं करते हैं
20

मैंने आपके प्रश्न का उत्तर यहां दिया है क्योंकि यह एक डुप्लिकेट प्रश्न है drupal.stackexchange.com/questions/15989/…
Sina Salek

जवाबों:


15

--- मूल उत्तर। गलत है, नीचे अपडेट की जांच करें।

बस सेट

$bla['#validated'] = TRUE

AJAX के साथ अपडेट होने वाले चयन पर।

चेकआउट "अवैध पसंद का पता चला है"

--- अपडेट 17 दिसंबर 2019 ---

वास्तव में यह अच्छी सलाह नहीं थी, यह बहुत समय पहले था, अब मैं बेहतर जानता हूं।

अजाक्स कॉलबैक फ़ंक्शन केवल उस फॉर्म के टुकड़े को वापस करने के लिए माना जाता है जो बदल गया है या कुछ अजाक्स कमांड।

इस स्थिति में प्रपत्र फ़ंक्शन या प्रपत्र परिवर्तन हुक पर संशोधन किया जाना चाहिए। फॉर्म निर्माण और सत्यापन कार्य हर बार चलाए जाते हैं जब अजाक्स कॉलबैक कहा जाता है। बस अपने फ़ॉर्म का निर्माण या परिवर्तन करने के लिए $ form_state जांचें और तदनुसार मान समायोजित करें।

त्रुटि का समाधान देखें "एक अवैध विकल्प का पता चला है ..."


1
अगर मुझे अच्छी तरह से याद है तो मैंने यह कोशिश की, मेरे मामले में सफलता के बिना, धन्यवाद
कोडिएन

1
मुझे डर है कि यह मेरे लिए भी काम नहीं करता है।
केविन.कॉइल

क्या इससे फॉर्म कम सुरक्षित नहीं है?
बिन्नी

हां, पिछली सभी टिप्पणियां सही हैं। उत्तर अपडेट कर दिया गया है।
jaimealsilva

3

मैंने Drupal 6 में कई बार इस समस्या का सामना किया है, अजाक्स के माध्यम से चयन सूची के मूल्यों को बदलते हुए।

यहाँ आप क्या कर सकते हैं

  1. यदि संभव हो, तो फ़ील्ड एपीआई में सभी संभावित मूल्यों को सम्मिलित करने का प्रयास करें, आपको उस फ़ील्ड को संपादित करने की आवश्यकता है, और फिर जब आप मान बदलते हैं, तो आपको यह सुनिश्चित करना होगा कि सूची में केवल सूचीबद्ध मान हैं।
  2. समाधान जो मैंने लागू किया था, आप फ़ील्ड प्रकार का चयन सूची से टेक्स्टफील्ड, फील्ड एपीआई से बदल सकते हैं, और ड्रुपल से मान को बचाने के लिए कह सकते हैं। अब, फॉर्म रनटाइम पर, आपको फ़ॉर्म को बदलना होगा, प्रकार को चयन सूची में बदलना होगा, और विकल्पों में धक्का देना होगा, जिसे आप चाहते हैं। साथ ही सबमिट करते समय, आपको फ़ील्ड द्वारा आवश्यक सही मान असाइन करना होगा, जो कि DB में सहेजा जाएगा। सुनिश्चित करें कि आपका सबमिट हैंडलर डिफ़ॉल्ट फॉर्म सबमिट हैंडलर से पहले बुलाया जाता है, इसके लिए आप उपयोग कर सकते हैंarray_merge

यदि पहला समाधान आपके लिए काम करता है, तो आप चीजों को कोडिंग और परीक्षण करने में बहुत समय बचाएंगे। लेकिन अगर ड्रॉप डाउन में सूची गतिशील है और आपका इस पर कोई नियंत्रण नहीं है, तो आपको दूसरे समाधान के साथ जाना पड़ सकता है।

पोस्ट करें अगर आप किसी भी मुद्दे का सामना करते हैं, तो मैंने इस समस्या पर काफी काम किया है, मेरी परियोजना के लिए, और मैंने ~ 50 रूपों के लिए किया, PHEW !!! :)


3

मैंने सबसे अच्छा तरीका पाया है यह #valueचयन सूची पर सेट करना है ।

यदि हमारे पास फॉर्मस्टेट में मूल्य है और यह हमारे विकल्पों में है तो हमें त्रुटि नहीं मिलेगी। यदि हमारा मान विकल्पों में नहीं है, तो हमारे विकल्पों में पहला विकल्प चुनें और उसका उपयोग करें।

$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

अपने अजाक्स कॉलबैक में, जोड़ें:

...

drupal_get_messages();
form_get_errors();

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

सुरक्षा एहतियात के तौर पर, मूल _form_validate()फ़ंक्शन यह जांचता है कि क्या मूल बिल्ड (जो उनके पास है) में सेट की गई किसी तत्व की #options कुंजी बदल गई है। कॉल करके drupal_get_messages()और form_get_errors()हम मूल रूप से Drupal से कहते हैं कि हमारे ajax अनुरोध को चलाते समय किसी भी त्रुटि / संदेश को अनदेखा करें। :)


त्रुटि संदेश चला गया है, लेकिन चयन तत्व में अभी भी त्रुटि वर्ग है। उसको हटाने या रोकने के लिए कैसे?
तेजस वैद्य

यह ड्रुपल है जो आपके वाहन के डैश बोर्ड पर चेतावनी प्रकाश पर टेप लगाने के बराबर है।
फ्रैंक रॉबर्ट एंडरसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.