web-gelistirme-sc.com

Form gönderdikten sonra sayfaya nasıl yönlendirilirsiniz?

Bir form görüntüleyen özel bir modül var.

Formu gönderdikten sonra kullanıcıyı farklı bir sayfaya yönlendirmek istiyorum.

Bunu nasıl yapabilirim?

24
Carlos Muñiz

Gönderme işleyicisinde

Drupal 7:

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

Drupal 8:

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

Bir yönlendirmeyi önleyebilecek birkaç tetikleyici olduğuna dikkat edilmelidir:

  • $form_state['redirect'] === FALSE: Ayarlanırsa, form oluşturucu işlevi veya form doğrulama/gönderme işleyicisi kullanıcının yeniden yönlendirilmesini istemez, yani drupal_goto() çağrılmaz. Çoğu form için, yönlendirme mantığı $form_state['redirect'] Tanımsız veya FALSE olsun, aynı olacaktır. Ancak, tanımlanmadığı ve geçerli isteğin bir 'hedef' sorgu dizesi içermesi durumunda, drupal_goto() bunun yerine belirtilen hedefe yönlendirecektir. Yalnızca $form_state['redirect'] Öğesinin FALSE olarak ayarlanması yeniden yönlendirmeyi engelleyecektir.
  • $form_state['no_redirect'] === TRUE: Ayarlandığında, formu orijinal olarak oluşturan geri arama, $form_state['redirect'] İçindeki yönlendirme değerinden bağımsız olarak herhangi bir yönlendirmeye açıkça izin vermez. Örneğin, ajax_get_form(), yeniden yönlendirmeyi önlemek için AJAX geri aramaya bir form oluştururken $form_state['no_redirect'] 'U tanımlar. $form_state['no_redirect'] Tarafından DEĞİŞTİRİLMEMELİDİR form oluşturucu işlevleri veya form doğrulama/gönderme işleyicileri.
  • $form_state['programmed'] === TRUE: form gönderimi genellikle drupal_form_submit() aracılığıyla çağrıldığından, yeniden yönlendirmeler drupal_form_submit() komutunu çağıran komut dosyasını kırar.
  • $form_state['rebuild'] === TRUE: formun yeniden yönlendirilmeden yeniden oluşturulması gerektiği anlamına gelir.
17
trampjuice

Drupal 7 için, bunu özel bir modülde denedim ve çalışıyor. Ayrıca bir tema içinde kullanılabilir:

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';
}

BTW, bu snippet'i burada buldum: https://Gist.github.com/postrational/5768796

Drupal 8 içindeki harici bir URL'ye yönlendirmek için, aşağıdaki kodda olduğu gibi TrustedRedirectResponse sınıfını kullanın.

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

D8'de bunu beğendim (ama bu işe yaramayacak ... aşağıya bakın):

/**
* 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])
     );    
   }

}

Düzenle/

Ben modül gönderildikten SONRA setRedirect/setRedirectUrl çalışır eksik, bu yüzden bu D8 benim çalışma çözümü:

/**
 * 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 );
}

Umarım bu yardımcı olabilir

2
nessunluogo

drupal 7 için someurl?param1=1&param2=2 Gibi parametrelerle URL'ye yönlendirmek istiyorsanız

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