'গন্তব্য' URL এ থাকলে ফর্ম পুনঃনির্দেশ কাজ করছে না working


20

আমার ফর্মগুলির একটিতে, আমি একটি সেট সেট করার চেষ্টা করছি $form_state['redirect']যাতে ব্যবহারকারী ক্রিয়া বোতামগুলির একটিতে ক্লিক করার পরে ফর্মটি সেই গন্তব্যে চলে যায়।

আমি $form_state['redirect']পুনঃনির্দেশ যুক্ত করার আগে এবং পরে উভয়ই যদি পরিদর্শন করি তবে এটি পূর্বে ন্যূনাল এবং তার পরে যথাযথ অ্যারে রয়েছে। আমি কীভাবে পুনর্নির্দেশটি সেট আপ করছি তা এখানে:

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

আমি যে ফর্মটি ব্যবহারকারীর পরবর্তী পথে দেখছে সেখান থেকে গন্তব্যটি সংরক্ষণ করতে চাই (এজন্যই আমি ফোন করছি drupal_get_destination()যা 'destination' => 'some/path/here'অভ্যন্তরের সাথে একটি অ্যারের ফিরিয়ে দেয়) ।

দেখে মনে হচ্ছে যে, বর্তমান ফর্মের পথে ইতিমধ্যে একটি গন্তব্য রয়েছে, ফর্মটি সেই গন্তব্যে পুনঃনির্দেশ করে যা আমি নিজের ফর্মটিতে হ্যান্ডলার জমা দেই না কেন (উপরের কোডটি দেখুন)। এমনকি আমি ড্রুপাল_গোটো () ব্যবহার করার চেষ্টা করেছি এবং এটি ব্যবহারকারীর পুনর্নির্দেশও করতে পারেনি।

উত্তর:


27

যখন কোনও ফর্মটি প্রক্রিয়া করা হয়, এর মান $form_state['redirect']প্রেরণ করা হয় drupal_goto()এবং drupal_goto()সর্বদা $_GET['destination']তার নিজস্ব $pathপ্যারামিটারের পক্ষে হয়।

সম্পূর্ণতার স্বার্থে, ড্রুপাল 6 এ, আপনি নিজের শিরোনামটি সেট না করেই ভাগ্যের বাইরে ছিলেন hook_exit():

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

ড্রুপাল 7-এ, hook_drupal_goto_alter()এই নির্দিষ্ট ব্যবহারের ক্ষেত্রে যুক্ত করা হয়েছিল:

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

ড্রুপাল for এর জন্য অন্য একটি বিকল্প, যা আপনি যা করতে চান তার নিকটতম, এটি ব্যবহার 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গন্তব্য প্যারামিটারটিকে ওভাররাইড করতে চান (এবং সেই বিন্দুতে সংজ্ঞায়িত অন্য সমস্ত পুনঃনির্দেশ), এটি শেষ হওয়া দরকার।


নিখুঁত, এবং খুব ভাল ব্যাখ্যা। আমি আসলে একটি প্রক্রিয়াজাত ফর্মের প্রবাহের মাধ্যমে কাজ করে আরও কিছুটা খুঁজে পেয়েছি - drupal_goto () শেষ পর্যন্ত আমার সরল 'পুনর্নির্দেশ' কাজ না করার কারণ। আমারও overw _GET ['গন্তব্য'] ওভাররাইট করা দরকার।
geerlingguy

ধন্যবাদ! এটি প্রকৃতপক্ষে খুব স্পষ্ট করা হয়।
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'], বা আপনি প্রতিযোগিতামূলক পুনঃনির্দেশগুলির সাথে একটি ডাব্লুএসওডি পেতে পারেন।
tyler.frankenstein

-2

ফর্ম # অ্যাকশন সেট করুন

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

-1 আমি কলিং মনে drupal_goto()মধ্যে hook_node_insert()জিনিষ আপ স্ক্রু হবে (কারণ drupal_goto()কল drupal_exit()সংরক্ষিত হচ্ছে থেকে নতুন নোডের প্রতিরোধ)।
অ্যান্ডি

সত্য - একটি node_insert হুক মধ্যে .. (সম্পাদিত উত্তর)
Rémy

1
এটি ওপির অনুরোধ অনুসারে পুনর্নির্দেশ জারি করে না, তবে ফর্মটি অন্য কোনও পথে জমা দেয়।
অ্যান্ডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.