"फ़ॉर्म पुराना हो गया है" त्रुटि हो रही है


12

मेरे पास एक मल्टीस्टेप नोड फॉर्म है। पॉपअप संवाद उपयोगकर्ता के माध्यम से फ़ॉर्म के माध्यम से आधे रास्ते में लॉग इन करने के लिए कहा जाता है यदि उन्होंने पहले से लॉग इन नहीं किया है।

नोड फॉर्म के अगले पृष्ठ के साथ आगे बढ़ने पर सफल लॉगिन करने पर, मुझे यह सत्यापन त्रुटि मिलती है:

रूप पुराना हो गया है। नीचे दिए गए फ़ॉर्म में किसी भी सहेजे गए कार्य को कॉपी करें और फिर इस पृष्ठ को पुनः लोड करें।

मैं समझता हूं कि यह drupal_validation_form()सत्यापित है $form['#token']और $form_state['values']['form_token']समान हैं।

मैं इससे कैसे बचूं, क्योंकि यह एक विशेष उपयोग का मामला है (और यह कुछ बाहरी सामानों से जालसाजी नहीं है)।

इस मोर्चे पर कोई इनपुट?


1
शायद जवाब के लिए बहुत देर हो चुकी है लेकिन मैंने उसी समस्या को प्रोत्साहित किया है। मुझे $ फ़ॉर्म ["# # टोकन"] = drupal_get_token ($ फ़ॉर्म ['# form_id']) के साथ एक समस्या मिली है; जब मैं अपना $ फॉर्म तैयार करूंगा।

1
मैं वास्तव में एक पृष्ठ में एक फॉर्म को हार्ड-कोडिंग कर रहा था, और टोकन को जोड़ने की आवश्यकता थी। <input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>फॉर्म जोड़कर ठीक से सबमिट करने में सक्षम था।
थर्डेंडर

जवाबों:


2

आपकी पोस्ट ने मुझे गंभीर दुखों से बचाया। पता नहीं कैसे वह कनेक्शन बनाया गया था, लेकिन आपके पोस्ट ने मुझे मेरे मॉड्यूल कोड में एक छोटे से बदलाव के लिए प्रेरित किया। यह समझना आसान है कि "फ़ॉर्म पुराना हो गया है" त्रुटि अब क्यों हो रही थी। तो देखें कि क्या यह आपके विचारों और आपके मामले के लिए मदद कर सकता है।

मेरे पृष्ठ व्यवस्थापक / mymod में एक मेनू आइटम सेट था जिसमें निम्नलिखित शामिल थे।

'page callback' => 'drupal_get_form', 
'page arguments' => 'mymod_main',

में mymod_main($op = '')मैं सशर्त 2 रूपों में से एक का निर्माण कर रहा हूँ, लेकिन हर निर्माण पाठ्यक्रम एक नया रूप है, जैसे की है $build['mymod_admin'] = drupal_get_form('mymod_admin')या $build['mymod_delete'] = drupal_get_form('mymod_delete')

जब पृष्ठ व्यवस्थापक / mymod को पहले लोड किया गया और mymod_admin कहा जाता है तो कोई समस्या नहीं है। लेकिन जब mymod_admin में बने सबमिट बटन पर क्लिक किया जाता है तब mymod_delete कहलाता है और इसे फॉर्म बनाता है। "फ़ॉर्म पुराना हो गया है" त्रुटि आई जिसने फ़ॉर्म प्रसंस्करण को बर्बाद कर दिया। फिक्स mymod_main()पेज कॉलबैक के रूप में उपयोग करने के लिए बस है ।

जब प्रत्येक प्रपत्र के लिए व्यवस्थापक / mymod पृष्ठ पुनः लोड हो जाता है, तो वहाँ प्रपत्रों की कोई क्रॉसिंग नहीं होती है क्योंकि मनु कॉलबैक से प्रारंभ फ़ॉर्म नहीं होता है और फिर दूसरे रूप में परिभाषित किया जाता है $build


क्या आप अपने 'फिक्स' की व्याख्या कर सकते हैं, मुझे लगता है कि मेरे पास एक ही मुद्दा है, लेकिन मुझे समझ में नहीं आता कि आप '---' और '+++' का क्या मतलब है, धन्यवाद
iain maitland

इसका मतलब है कि पेज कॉलबैक को बदल दिया गया था mymod_main()
kiamlaluno

0

त्रुटि का अर्थ है कि form_tokenआवश्यकताएं अमान्य हैं और उन्हें पुनर्जीवित करने की आवश्यकता है। यह मूल रूप से एक छिपा हुआ रूप क्षेत्र है (आमतौर पर क्रॉस-साइट फोरजीज़ के खिलाफ सुरक्षा के लिए उपयोग किया जाता है)।

आम तौर पर एक टोकन तत्व स्वचालित रूप से प्रत्येक ड्रुपल फॉर्म में जुड़ जाता है drupal_prepare_form(), इसलिए आपको आम तौर पर एक स्वयं को जोड़ना नहीं पड़ता है, जब तक कि आप अपना कोड नहीं लिख रहे हों।

यदि आप कुछ बहु-पृष्ठ फ़ॉर्म को प्रोग्राम करने की कोशिश कर रहे हैं, तो आपको संभवतः प्रत्येक सबमिट का उपयोग करके पुनः टोकन उत्पन्न करने की आवश्यकता है drupal_get_token(), जैसे कि यहाँ दिखाया गया है :

$form_state['input']['form_token'] = drupal_get_token($form['#token']);

Form_alter में फॉर्म टोकन के पुनर्जनन को मजबूर करने के लिए वर्कअराउंड के लिए, निम्न उदाहरण देखें:

/**
 * Implements hook_form_alter().
 */
function mymodule_form_alter(&$form, &$form_state, $form_id) {
    if ($form_id === 'your_form_entityform_edit_form' && !empty($form_state['input']['form_id'])) {
      $form_id = $form_state['input']['form_id'];
      $form ['#token'] = $form_id;
      $form ['form_token'] = array(
        '#id' => drupal_html_id('edit-' . $form_id . '-form-token'),
        '#type' => 'token',
        '#default_value' => drupal_get_token($form['#token']),
        '#parents' => array('form_token'),
      );
    }
}

समस्या निवारण

  • यदि आपका फॉर्म हार्डकोड नहीं है, तो दोबारा जांचें, अन्यथा @thirdender द्वारा सुझाए गए टोकन जोड़ें :

    <input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>
  • जांचें कि क्या त्रुटि आपके फॉर्म में होती है, क्योंकि यह अन्य फॉर्म (जैसे फॉर्म के भीतर फॉर्म) पर हो सकती है।

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