it-swarm.asia

لا يعمل نموذج إعادة التوجيه إذا كانت "الوجهة" في عنوان URL

في أحد النماذج الخاصة بي ، أحاول تعيين $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' في الداخل.

يبدو أنه نظرًا لوجود وجهة بالفعل في مسار النموذج الحالي ، فإن النموذج يعيد التوجيه إلى تلك الوجهة بغض النظر عن ما أضعه في معالج الإرسال الخاص بالنموذج (انظر الرمز أعلاه). حتى أنني حاولت استخدام drupal_goto () ولم يعيد توجيه المستخدم أيضًا.

19
geerlingguy

عند معالجة نموذج ، يتم إرسال قيمة $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 غير مدرك تمامًا لمعلمة الوجهة لبقية بنية الصفحة ، بما في ذلك عند استدعاء drupal_goto().

ملاحظة: لقد قمت بتغيير الرمز لتعريف $form_state['redirect'] لأنك لا تريد أبدًا استبدال المتغير: قد تكون معالجات الإرسال الأخرى قد حددت الخاصة بهم عمليات إعادة التوجيه. Drupal دائمًا العنصر last في الصفيف ، لذلك إذا كنت تريد foo/bar تجاوز معلمة الوجهة (وكل إعادة توجيه أخرى محددة حتى هذه النقطة) ، يجب أن تكون الأخيرة.

27
user7

شكرا لهذا ، ولكن لسبب ما لم يعمل هذا عندما حاولت ذلك. لقد حصلت على خطأ فادح - البيانات المرسلة في إجابة المثال أعلاه لا تستوفي متطلبات 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() مع معلمة الاستعلام. قد يكون هذا أيضًا السبب في أن الإجابة الأصلية كانت تسبب أخطاء فادحة على موقعي.

4
tmsimont