$ Form_state किसके लिए उपयोग किया जाता है?


33

क्या है $form_stateआम तौर पर अगर यह एक तर्क के रूप में प्रयोग किया जाता फार्म एपीआई के संदर्भ में लिए प्रयोग किया जाता?

विशेष रूप से, मैं एक उदाहरण की तलाश कर रहा हूं जब इसका उपयोग किया जाता है।

जवाबों:


48

$form_stateप्रपत्र सबमिट हैंडलर, या फ़ॉर्म सत्यापन हैंडलर में दिए गए तर्कों में से एक है; इसका मुख्य उपयोग उपयोगकर्ता से उस मान को प्राप्त करने के लिए है जिस रूप में सामग्री देखी गई है $form_state['values']), लेकिन इसमें अन्य मूल्य शामिल हैं जिनका उपयोग अन्य उद्देश्यों के लिए किया जा सकता है। Drupal_build_form () के
लिए प्रलेखन में उस सरणी में निहित अन्य मूल्यों की सूची है, जिसमें निम्नलिखित शामिल हैं:

  • पुनर्निर्माण: आम तौर पर, पूरे फॉर्म की प्रोसेसिंग पूरी होने के बाद और हैंडलर चलाने के लिए सबमिट किया जाता है, एक फॉर्म माना जाता है और drupal_redirect_form () उपयोगकर्ता को GET अनुरोध का उपयोग करके एक नए पृष्ठ पर रीडायरेक्ट करेगा (इसलिए ब्राउज़र रीफ़्रेश पुन: सबमिट नहीं होता है फार्म)। हालाँकि, यदि, पुनर्निर्माण ’को TRUE पर सेट किया गया है, तो फॉर्म की एक नई प्रति तुरंत रीडायरेक्ट के बजाय ब्राउज़र में बनाई और भेजी जाती है। इसका उपयोग बहु-चरण रूपों, जैसे कि जादूगरों और पुष्टि रूपों के लिए किया जाता है। आम तौर पर, $form_state['rebuild']एक सबमिट हैंडलर द्वारा सेट किया जाता है, क्योंकि यह आमतौर पर सबमिट हैंडलर के भीतर तर्क होता है जो यह निर्धारित करता है कि कोई फ़ॉर्म किया गया है या उसे किसी चरण की आवश्यकता है। हालाँकि, एक सत्यापन हैंडलर पहले से ही सेट $form_state['rebuild']प्रसंस्करण को हैंडलर को बायपास करने और फॉर्म को फिर से बनाने के लिए सेट कर सकता है, भले ही कोई सत्यापन त्रुटि न हो।
  • रीडायरेक्ट: सबमिट करने पर फॉर्म को रीडायरेक्ट करने के लिए उपयोग किया जाता है। यह या तो गंतव्य URL युक्त एक स्ट्रिंग हो सकता है, या उसके साथ संगत तर्कों की एक सरणी हो सकती है drupal_goto()drupal_redirect_form()पूरी जानकारी के लिए देखें
  • कैश: यदि TRUEमूल पर सेट किया गया है, तो असंसाधित फॉर्म संरचना को कैश किया जाएगा, जो पूरे फॉर्म को कैश से पुनर्निर्माण करने की अनुमति देता है। एक विशिष्ट प्रपत्र वर्कफ़्लो में दो पृष्ठ अनुरोध शामिल होते हैं; सबसे पहले, एक फॉर्म बनाया जाता है और उपयोगकर्ता को भरने के लिए प्रदान किया जाता है। फिर, उपयोगकर्ता फॉर्म को भरता है और इसे सबमिट करता है, जिससे दूसरे पेज का अनुरोध शुरू हो जाता है जिसमें फॉर्म को बनाना और संसाधित करना होता है। डिफ़ॉल्ट रूप से, $formऔर $form_stateइनमें से प्रत्येक पृष्ठ अनुरोध के दौरान खरोंच से बनाया जाता है। अक्सर, यह प्रारंभिक पृष्ठ अनुरोध से $formऔर $form_stateचर को जारी रखने के लिए आवश्यक या वांछित है जो सबमिशन को संसाधित करता है। ऐसा करने के लिए 'कैश' को TRUE पर सेट किया जा सकता है। एक प्रमुख उदाहरण अजाक्स-सक्षम रूप है, जिसमेंajax_process_form()सभी रूपों के लिए कैशिंग को सक्षम करता है जिसमें # एजाक्स संपत्ति के साथ एक तत्व शामिल होता है। (अजाक्स हैंडलर के पास स्वयं फॉर्म बनाने का कोई तरीका नहीं है, इसलिए कैश्ड संस्करण पर निर्भर रहना चाहिए।) ध्यान दें कि (मल्टी-स्टेप) फॉर्म के लिए स्वचालित रूप से 'रीबिल्ड' फ्लैग सेट के लिए, की दृढ़ता $formऔर उसके लिए $form_stateहोता है। 'कैश'।
  • भंडारण: $form_state['storage']एक विशेष कुंजी नहीं है, और फॉर्म एपीआई में इसके लिए कोई विशेष समर्थन प्रदान नहीं किया गया है। परंपरा से यह वह स्थान था जहाँ एप्लिकेशन-विशिष्ट डेटा को सबमिट, सत्यापन और प्रपत्र बिल्डर फ़ंक्शन के बीच संचार के लिए संग्रहीत किया जाता था, विशेष रूप से एक बहु-चरण-शैली के रूप में। $form_stateइस तरह के भंडारण के लिए फॉर्म कार्यान्वयन किसी भी कुंजी (ओं) का उपयोग कर सकते हैं (यहां सूचीबद्ध कुंजियों के अलावा और फॉर्म एपीआई इंटर्नल द्वारा उपयोग किए गए अन्य आरक्षित)। यह सुनिश्चित करने का अनुशंसित तरीका है कि चुनी गई कुंजी फॉर्म एपीआई या अन्य मॉड्यूल द्वारा उपयोग किए गए लोगों के साथ संघर्ष नहीं करती है, कुंजी नाम के रूप में मॉड्यूल नाम या कुंजी नाम के लिए एक उपसर्ग का उपयोग करना है। उदाहरण के लिए, नोड मॉड्यूल का उपयोग करता है$form_state['node'] नोड संपादन रूपों में संपादित किए जा रहे नोड के बारे में जानकारी संग्रहीत करने के लिए, और यह जानकारी "पूर्वावलोकन" बटन के क्रमिक क्लिकों के साथ-साथ "सेव" बटन पर क्लिक करने पर अंत में उपलब्ध रहती है।

अन्य कार्य जो $form_stateतर्क के रूप में मिलते हैं, वे हैं हुक_फॉर्म_अल्टर () और हुक_फॉर्म_फॉर्म_फाइटर_ल्टर ()

उस तर्क का उपयोग करने वाले कोड के उदाहरण के रूप में आप comment_form_submit () को देख सकते हैं , जिसमें निम्न कोड हैं:

function comment_form_submit($form, &$form_state) {
  $node = node_load($form_state['values']['nid']);
  $comment = comment_form_submit_build_comment($form, $form_state);
  if (user_access('post comments') && (user_access('administer comments') || $node->comment == COMMENT_NODE_OPEN)) {
    // Save the anonymous user information to a cookie for reuse.
    if (user_is_anonymous()) {
      user_cookie_save(array_intersect_key($form_state['values'], array_flip(array('name', 'mail', 'homepage'))));
    }

    comment_save($comment);
    $form_state['values']['cid'] = $comment->cid;

    // Add an entry to the watchdog log.
    watchdog('content', 'Comment posted: %subject.', array('%subject' => $comment->subject), WATCHDOG_NOTICE, l(t('view'), 'comment/' . $comment->cid, array('fragment' => 'comment-' . $comment->cid)));

    // Explain the approval queue if necessary.
    if ($comment->status == COMMENT_NOT_PUBLISHED) {
      if (!user_access('administer comments')) {
        drupal_set_message(t('Your comment has been queued for review by site administrators and will be published after approval.'));
      }
    }
    else {
      drupal_set_message(t('Your comment has been posted.'));
    }
    $query = array();
    // Find the current display page for this comment.
    $page = comment_get_display_page($comment->cid, $node->type);
    if ($page > 0) {
      $query['page'] = $page;
    }
    // Redirect to the newly posted comment.
    $redirect = array('node/' . $node->nid, array(
        'query' => $query,
        'fragment' => 'comment-' . $comment->cid,
      ));
  }
  else {
    watchdog('content', 'Comment: unauthorized comment submitted or comment submitted to a closed post %subject.', array('%subject' => $comment->subject), WATCHDOG_WARNING);
    drupal_set_message(t('Comment: unauthorized comment submitted or comment submitted to a closed post %subject.', array('%subject' => $comment->subject)), 'error');
    // Redirect the user to the node they are commenting on.
    $redirect = 'node/' . $node->nid;
  }
  $form_state['redirect'] = $redirect;
  // Clear the block and page caches so that anonymous users see the comment
  // they have posted.
  cache_clear_all();
}

यह समझने के लिए कि क्या $form_state['values']शामिल है, आपको comment_form ()$form में जोड़े गए मानों को देखना होगा । उदाहरण के लिए, समाहित है क्योंकि इसमें समाहित है । आम तौर पर, यदि कोई प्रपत्र फ़ील्ड है, तो इसमें शामिल होगा ।$form_state$form_state['values']['name']$form$form['author']['name']$form['field']$form_state$form_state['values']['field']


अगर हम फॉर्म वैल्यू में फेरबदल करना चाहते हैं या हुक_फॉर्म_ल्टर का उपयोग करके मल्टीवैल्यू फील्ड बटन को अक्षम करना चाहते हैं, तो किस वेरिएबल को $ फॉर्म या $ from_state बदल दिया जाना चाहिए? (AJAX का उपयोग किए बिना या AJAX के बिना)। $ Form_state विशेष रूप से अजाक्स के लिए उपयोग किया जाता है?
किरनिंग

1
सामान्य रूप से, एक AJAX कॉलबैक $formसरणी का एक हिस्सा देता है ; यह फॉर्म बिल्डर है जो की सामग्री की जाँच करता है $form_state। यह वही है जो मैंने सभी AJAX कॉलबैक में मॉड्यूल द्वारा कार्यान्वित देखा, जो सही काम करते हैं।
kiamlaluno
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.