'Hedef' URL'deyse Form Yönlendirme çalışmıyor


20

Formlarımdan birinde $form_state['redirect'], kullanıcı eylem düğmelerinden birini tıklattıktan sonra form bu hedefe gidecek şekilde ayarlamaya çalışıyorum .

Ben incelemek Eğer $form_state['redirect']önce ve ben yönlendirme ekledikten sonra hem NULL öncedir ve sonrasında uygun diziyi içerir. Yönlendirmeyi şu şekilde ayarlıyorum:

$form_state['redirect'] = array(
  'my/custom/path/' . $nid,
  array('query' => drupal_get_destination()),
);

Hedefi kullanıcının bir sonraki yola görüntüleme formundan korumak istiyorum (bu yüzden, ben drupal_get_destination()bir dizi ile 'destination' => 'some/path/here'iç döner döndürüyorum .

Görünüşe göre, halihazırdaki formun yolunda bir hedef olduğundan, kendi form gönderme işleyicime ne koyarsam yapayım, bu hedefe yönlendirir (yukarıdaki koda bakın). Hatta drupal_goto () kullanarak denedim ve bu da kullanıcıyı yönlendirmedi.

Yanıtlar:


27

Bir form işlendiğinde, değeri kendi parametresine $form_state['redirect']gönderilir drupal_goto()ve drupal_goto()her zaman $_GET['destination']kendi $pathparametresinin üzerinde olur .

Tamlık uğruna, Drupal 6'da, kendi başlıklarınızı ayarlamadan biraz şansınız kalmamıştı hook_exit():

function mymodule_exit($destination = NULL) {
  $my_destination = 'foo/bar';
  header('Location: ' . url($my_destination));
  exit;
}

Drupal 7'de, hook_drupal_goto_alter()bu özel kullanım durumu için eklendi:

function mymodule_drupal_goto_alter(&$path, &$options, &$http_response_code) {
  $path = 'foo/bar';
}

Yapmak istediğiniz şeye daha yakın olan Drupal 7 için başka bir seçenek drupal_get_destination() , gönderme işleyicinizdeki statik önbelleği aşağıdakileri kullanarak sıfırlamaktır 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()Sıfırlamadan hemen sonra aradığınızdan , Drupal, çağrıldığında da dahil olmak üzere sayfanın geri kalanı için hedef parametrenin farkında değildir drupal_goto().

Not:$form_state['redirect'] Asla değişkenin üzerine yazmak istemediğiniz için tanımlama kodunu değiştirdim : diğer gönderme işleyicileri kendi yönlendirmelerini tanımlamış olabilir. Drupal her zaman dizideki son öğeyi kullanır , bu nedenle foo/barhedef parametresini (ve o noktaya kadar tanımlanan diğer tüm yönlendirmeleri) geçersiz kılmak istiyorsanız , son olması gerekir.


Mükemmel ve çok iyi bir açıklama. Aslında işlenmiş bir formun akışıyla çalışarak biraz daha buldum - drupal_goto () sonuçta benim basit 'yönlendirme'mizin çalışmamasının nedeni. Ben de $ _GET ['destination'] üzerine yazmak gerekiyordu.
19:11

Thanx! Bu gerçekten çok açıklayıcı.
zilverdistel

4

Bunun için teşekkürler, ama nedense bunu denediğimde işe yaramadı. Önemli bir hatayla karşılaştım - yukarıdaki örnek cevapta gönderilen veriler,drupal_goto()

Bu cevap oldukça eski olduğu için olabilir, ancak bunun yerine bununla çalışmayı başardım:

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();

}

Bunun bu notu ihlal ettiğini biliyorum:

değişkenin üzerine asla yazmak istemezsiniz: diğer gönderme işleyicileri kendi yönlendirmelerini tanımlamış olabilir.

Ancak, bu durumda, değişkenin kesinlikle üzerine yazmak istersiniz. Diğer modülün ayar değerlerini göz ardı etmek istemiyorsanız bu değeri ayarlamazsınız. Ayrıca, yolu nedeniyle drupal_goto()sorgu parametresi ile çalışır nedeniyle düşünüyorum . Orijinal cevabın siteme ölümcül hatalar atmasının nedeni de bu olabilir.


Bu yanıt, bazı durumlarda, tamamen geçersiz kılmak isteyebileceğinizi $form_state['redirect']veya rakip yönlendirmeler içeren bir WSOD alabileceğinizi anlamama yardımcı oldu.
tyler.frankenstein

-2

form # hareketini ayarla

global $base_path;
$form['#action'] = $base_path . '/node/'.$form_state['node']->nid.'/mytab';

-1 aramamın düşünüyorum drupal_goto()içinde hook_node_insert()(çünkü işleri batırmaya olacak drupal_goto()çağrılar drupal_exit()kaydedilmesini yeni düğüm önlenmesi).
Andy

true - bir node_insert kancasında .. (cevabı düzenledi)
rémy

1
Bu OP'nin istediği gibi bir yönlendirme yayınlamaz, ancak formu farklı bir yola gönderir.
Andy
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.