यदि URL में 'गंतव्य' है, तो फॉर्म रीडायरेक्ट काम नहीं कर रहा है


20

मेरे किसी एक फॉर्म में, मैं यह सेट करने की कोशिश कर रहा हूं $form_state['redirect']कि उपयोगकर्ता द्वारा एक्शन बटन में से किसी एक पर क्लिक करने के बाद फॉर्म उस गंतव्य पर जाएगा।

यदि मैं $form_state['redirect']रीडायरेक्ट को जोड़ने से पहले और बाद में दोनों का निरीक्षण करता हूं, तो यह NULL से पहले है, और उसके बाद उचित सरणी समाहित करता है। यहां बताया गया है कि मैं रीडायरेक्ट कैसे सेट कर रहा हूं:

$form_state['redirect'] = array(
  'my/custom/path/' . $nid,
  array('query' => drupal_get_destination()),
);

मैं गंतव्य को इस रूप से संरक्षित करना चाहता हूं कि उपयोगकर्ता अगले पथ पर दिखाई दे (इसीलिए मैं कॉल कर रहा हूं drupal_get_destination(), जो एक सरणी को 'destination' => 'some/path/here'अंदर से लौटाता है।

ऐसा लगता है कि, क्योंकि वर्तमान फॉर्म के रास्ते में पहले से ही एक गंतव्य है, फॉर्म उस गंतव्य पर पुनर्निर्देशित करता है, चाहे मैं अपने स्वयं के फॉर्म सबमिट हैंडलर में डालूं (ऊपर कोड देखें)। मैंने drupal_goto () का उपयोग करने का भी प्रयास किया और उपयोगकर्ता को पुनर्निर्देशित नहीं किया।

जवाबों:


27

जब कोई प्रपत्र संसाधित किया जाता है, का मान $form_state['redirect']भेजा जाता है drupal_goto(), और drupal_goto()हमेशा $_GET['destination']अपने स्वयं के $pathपैरामीटर पर एहसान करता है ।

पूर्णता के लिए, Drupal 6 में, आप अपने खुद के हेडर को सेट किए बिना कुछ हद तक भाग्य से बाहर थे hook_exit():

function mymodule_exit($destination = NULL) {
  $my_destination = 'foo/bar';
  header('Location: ' . url($my_destination));
  exit;
}

Drupal 7 में, hook_drupal_goto_alter()इस विशिष्ट उपयोग के मामले में जोड़ा गया था:

function mymodule_drupal_goto_alter(&$path, &$options, &$http_response_code) {
  $path = 'foo/bar';
}

Drupal 7 के लिए एक अन्य विकल्प, जो आप करना चाहते हैं, उसके करीब है, drupal_get_destination() अपने सबमिट हैंडलर के लिए स्थैतिक कैश को रीसेट करना है drupal_static_reset():

function mymodule_form_submit($form, &$form_state) {
  // See note
  $form_state['redirect'][] = drupal_get_destination();
  $form_state['redirect'][] = 'foo/bar';

  unset($_GET['destination']);
  drupal_static_reset('drupal_get_destination');
  drupal_get_destination();
}

चूंकि आप drupal_get_destination()रीसेट के तुरंत बाद कॉल करते हैं, इसलिए ड्रूपल शेष पेज निर्माण के लिए गंतव्य पैरामीटर से अनजान है, जब आप कॉल करते हैं, तो drupal_goto()

नोट: मैंने परिभाषित करने के लिए कोड बदल दिया है $form_state['redirect']क्योंकि आप चर को कभी भी अधिलेखित नहीं करना चाहते हैं: अन्य सबमिट हैंडलर ने अपने स्वयं के रीडायरेक्ट को परिभाषित किया हो सकता है। ड्रुपल हमेशा सरणी में अंतिम आइटम का उपयोग करेगा , इसलिए यदि आप foo/barगंतव्य पैरामीटर को ओवरराइड करना चाहते हैं (और उस बिंदु तक परिभाषित प्रत्येक अन्य रीडायरेक्ट), तो इसे अंतिम होना चाहिए।


बिल्कुल सही, और बहुत अच्छी व्याख्या। मैं वास्तव में एक संसाधित रूप के प्रवाह के माध्यम से काम करके थोड़ा अधिक पाया गया - ड्रुपाल_गेटो () अंततः मेरे साधारण 'पुनर्निर्देशन' के काम नहीं करने का कारण है। मुझे $ _GET ['गंतव्य'] को भी अधिलेखित करने की आवश्यकता थी।
geerlingguy

Thanx! यह वास्तव में बहुत स्पष्ट है।
zilverdistel

4

इसके लिए धन्यवाद, लेकिन किसी कारण से यह काम नहीं किया जब मैंने इसे आज़माया। मुझे एक घातक त्रुटि मिली - ऊपर दिए गए उदाहरण के उत्तर में भेजा गया डेटा आवश्यकताओं की पूर्ति नहीं करता हैdrupal_goto()

यह हो सकता है क्योंकि यह उत्तर बल्कि पुराना है, लेकिन मैं इसके बजाय इसके साथ काम करने में सक्षम था:

function mymodule_form_submit($form, &$form_state) {


  $form_state['redirect'] = array(
    'foo/bar', array(
      'query' => drupal_get_destination()
    )
  );

  unset($_GET['destination']);
  drupal_static_reset('drupal_get_destination');
  drupal_get_destination();

}

मुझे पता है कि यह इस नोट का उल्लंघन करता है:

आप चर को कभी भी अधिलेखित नहीं करना चाहते हैं: अन्य सबमिट हैंडलर ने अपने स्वयं के रीडायरेक्ट को परिभाषित किया हो सकता है।

लेकिन, इस मामले में, आप निश्चित रूप से चर को अधिलेखित करना चाहते हैं। जब तक आप अन्य मॉड्यूल के सेट मानों की अवहेलना नहीं करना चाहते हैं, तब तक आप यह मान सेट नहीं करेंगे। इसके अलावा, मुझे लगता है कि आपके पास drupal_goto()क्वेरी पैरामीटर के साथ काम करने के तरीके के कारण है । यह भी हो सकता है कि मूल उत्तर मेरी साइट पर घातक त्रुटियों को क्यों फेंक रहा था।


इस उत्तर ने मुझे यह महसूस करने में मदद की कि कुछ परिस्थितियों में, आप पूरी तरह से ओवरराइड करना चाह सकते हैं $form_state['redirect'], या आपको प्रतिस्पर्धी रीडायरेक्ट के साथ एक WSOD मिल सकता है।
tyler.frankenstein

-2

सेट फार्म #action

global $base_path;
$form['#action'] = $base_path . '/node/'.$form_state['node']->nid.'/mytab';

-1 मैं बुला लगता drupal_goto()में hook_node_insert()चीजों को पेंच (क्योंकि drupal_goto()कॉल drupal_exit()सहेजे जाने से नए नोड को रोकने)।
एंडी

सच है - एक नोड_इन्टर हुक में .. (उत्तर को संपादित किया)
rémy

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