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?
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:
Gönderim işleyicisinde
Drupal 7:
$form_state['redirect'] = 'url';
Drupal 8:
$form_state->setRedirect('route', $args, $options);
$form_state->setRedirectUrl(\Drupal\Core\Url);
/my-form?destination=node/123
.
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']
, FALSE
herhangi 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.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
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);
use
anahtar kelime ve ad alanına dahil etmemiz gerekir :use Drupal\Core\Routing\TrustedRedirectResponse;
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