it-swarm.asia

كيفية إعادة التوجيه إلى الصفحة بعد إرسال نموذج

لدي وحدة مخصصة تعرض نموذجًا.

عند إرسال النموذج ، أريد إعادة توجيه المستخدم إلى صفحة مختلفة.

كيف أقوم بذلك؟

24
Carlos Muñiz

في معالج الإرسال الذي تقوم به

دروبال 7:

$form_state['redirect'] = 'url';

دروبال 8:

$form_state->setRedirect('route', $args, $options);
$form_state->setRedirectUrl(\Drupal\Core\Url);
31
googletorp

تجدر الإشارة إلى أن هناك العديد من المحفزات التي قد تمنع إعادة التوجيه:

  • $form_state['redirect'] === FALSE: إذا تم تعيينها ، فإن وظيفة منشئ النموذج أو معالج التحقق من صحة النموذج/الإرسال لا تريد إعادة توجيه المستخدم ، مما يعني أن drupal_goto() لا يتم استدعاءه. بالنسبة لمعظم النماذج ، سيكون منطق إعادة التوجيه هو نفسه بغض النظر عما إذا كان $form_state['redirect'] غير معرف أو FALSE. ومع ذلك ، في حالة عدم تحديده وكان الطلب الحالي يحتوي على سلسلة استعلام "وجهة" ، فإن drupal_goto() سيعيد التوجيه إلى تلك الوجهة المحددة بدلاً من ذلك. سيؤدي تعيين $form_state['redirect'] على FALSE فقط إلى منع إعادة التوجيه.
  • $form_state['no_redirect'] === TRUE: عند التعيين ، فإن رد الاتصال الذي أنشأ النموذج في الأصل لا يسمح بأي إعادة توجيه ، بغض النظر عن قيمة إعادة التوجيه في $form_state['redirect']. على سبيل المثال ، يحدد ajax_get_form()$form_state['no_redirect'] عند إنشاء نموذج في رد اتصال AJAX لمنع أي إعادة توجيه. $form_state['no_redirect'] لا يجب تغييره من خلال وظائف منشئ النماذج أو التحقق من صحة النموذج/معالجات الإرسال.
  • $form_state['programmed'] === TRUE: يعني عادةً أنه تم استدعاء إرسال النموذج عبر drupal_form_submit() ، لذا فإن أي إعادة توجيه ستكسر البرنامج النصي الذي استدعى drupal_form_submit().
  • $form_state['rebuild'] === TRUE: يعني أنه يجب إعادة إنشاء النموذج بدون إعادة توجيه.
17
trampjuice

من أجل Drupal 7 ، جربت هذا على وحدة مخصصة وتعمل بشكل جيد ويمكن استخدامه أيضًا في السمة:

function my_theme_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'contact_site_form') {
    $form['#submit'][] = 'contact_form_submit_handler';
  }
}

function contact_form_submit_handler(&$form, &$form_state) {
  $form_state['redirect'] = 'thank-you-page-alias';
}

راجع للشغل ، لقد وجدت هذا المقتطف هنا: https://Gist.github.com/postrational/5768796

7
Ignacio Segura Postigo

لإعادة التوجيه إلى عنوان URL خارجي في Drupal 8 ، استخدم TrustedRedirectResponse ، كما في التعليمات البرمجية التالية.

$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);
4
DRUPWAY

في D8 أعجبني هذا (لكن هذا لن يعمل ... انظر أدناه):

/**
* Implements hook_form_FORM_ID_alter().
*/
function MYMODULE_form_FORM_ID_form_alter( array &$form, FormStateInterface $form_state, $form_id ) {

   // Force redirect to "/thankyou" page
   $url = "/thankyou";
   $path = \Drupal::service('path.alias_manager')->getPathByAlias($url);
   if(preg_match('/node\/(\d+)/', $path, $matches)) {
     $form_state->setRedirect('entity.node.canonical',
       array('node' => $matches[1])
     );    
   }

}

تعديل/

كنت في عداد المفقودين أن يعمل setRedirect/setRedirectUrl بعد تقديم الوحدة ، لذلك هذا هو حل عملي على D8:

/**
 * Implements hook_form_FORM_ID_alter().
 */
function MYMODULE_form_FORM_ID_form_alter( array &$form, FormStateInterface $form_state, $form_id ) {
  $form['actions']['submit']['#submit'][] = 'MYFORM_redirect_handler';
}

function MYFORM_redirect_handler($form, FormStateInterface $form_state) {
  // Force redirect to "/sent"
  $dest_url = "/sent";
  $url = Url::fromUri('internal:' . $dest_url);
  $form_state->setRedirectUrl( $url );
}

آمل أن يساعد هذا

2
nessunluogo

بالنسبة إلى drupal 7 إذا كنت تريد إعادة التوجيه إلى url باستخدام معلمات مثل someurl?param1=1&param2=2

$query = array(
  'param1' => '1',
   'param2' => '2',
 );
$form_state['redirect'] = array(
    'someurl',
    array(
      'query'    => $query,
      'fragment' => 'hash_fragment',
    ),
  );
1
berramou