Form gönderdikten sonra bir sayfaya nasıl yönlendirilir


24

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?

Yanıtlar:


31

Gönderim işleyicisinde

Drupal 7:

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

Drupal 8:

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

Bunu yapmanın alternatif bir yolu var mı? Yönlendirmem gereken formlar kendi #submit işleyicisiyle (gönderim işleyicileri benim özel modülüme yerleştirilmedi) oluşturulduğundan, koda erişemiyorum.
Carlos Muñiz

@Charlie kendi eklemek için form_alter kullan.
googletorp

Sizin için bir link ile ağırlıklı olarak erişilebilir ise @Charlie, URL'de bir hedef parametresi koyun: /my-form?destination=node/123.
tostinni

D7 üzerinde çalışmıyor ama bende olan bir şey buldum. Aşağıdaki mesajımı kontrol et.
Ignacio Segura Postigo

Sadece D7'ye cevap verdiğiniz için teşekkür eder, daha sonra D8'in cevabını güncellemek için 5 yıl sonra tekrar gelirim. <3
karınca

17

Yeniden yönlendirmeyi engelleyebilecek çeşitli tetikleyiciler olduğu belirtilmelidir:

  • $form_state['redirect'] === FALSE: Ayarlanırsa, form oluşturucu işlevi veya form doğrulama / gönderme işleyicisi bir kullanıcının yönlendirilmesini istemez, bu da drupal_goto()çağrılmadığı anlamına gelir . Çoğu form için, yeniden yönlendirme mantığı $form_state['redirect'], tanımlanmamış veya YANLIŞ olmamasına bakılmaksızın aynı olacaktır . Bununla birlikte, tanımlanmadığı ve mevcut isteğin bir 'hedef' sorgu dizesi içermesi drupal_goto()durumunda , bunun yerine verilen hedefe yönlendirilecektir. Yalnızca ayarı $form_state['redirect'], FALSEherhangi bir yeniden yönlendirmeyi önleyecektir.
  • $form_state['no_redirect'] === TRUE: Ayarlandığında, orijinal olarak formu oluşturan geri arama, içindeki yeniden yönlendirme değerinden bağımsız olarak herhangi bir yeniden yönlendirmeye açıkça izin vermez $form_state['redirect']. Örneğin, herhangi bir yeniden yönlendirmeyi önlemek için bir AJAX geri çağırma biçiminde bir form oluştururken ajax_get_form()tanımlar $form_state['no_redirect']. $form_state['no_redirect']form oluşturucu işlevler veya form doğrulama / gönderme işleyicileri tarafından değiştirilmemelidir.
  • $form_state['programmed'] === TRUE: form gönderimi genellikle yoluyla çağrılan anlamına gelir drupal_form_submit(), böylece herhangi bir yeniden yönlendirme çağrılan komut dosyasını kırar drupal_form_submit().
  • $form_state['rebuild'] === TRUE: formun yeniden yönlendirme olmadan yeniden oluşturulması gerektiği anlamına gelir.

7

Drupal 7 için bunu özel bir modülde denedim ve işe yarıyor. Ayrıca bir temada da 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 pasajı burada buldum: https://gist.github.com/postrational/5768796


4

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

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

Yardımcı olabileceği takdirde, bu sınıfı useanahtar kelime ve ad alanına dahil etmemiz gerekir :use Drupal\Core\Routing\TrustedRedirectResponse;
Sébastien Gicquel

2

D8'de böyle yaptım (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/

SetRedirect / setRedirectUrl'ın modül gönderildikten SONRA çalıştığını özlüyorum, bu D8'deki çalışma çözümü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


1

İçin drupal 7 sizin gibi parametreleri içeren url yönlendirme yapmak istiyorsanızsomeurl?param1=1&param2=2

$query = array(
  'param1' => '1',
   'param2' => '2',
 );
$form_state['redirect'] = array(
    'someurl',
    array(
      'query'    => $query,
      'fragment' => 'hash_fragment',
    ),
  );
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.