it-swarm-tr.com

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

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

Yönlendirmeyi eklemeden önce ve sonra $form_state['redirect'] 'U incelersem, önce NULL olur ve sonra uygun diziyi içerir. Yönlendirmeyi şu şekilde ayarlıyorum:

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

Kullanıcının bir sonraki yola görüntüleme formundan hedef korumak istiyorum (bu yüzden içinde 'destination' => 'some/path/here' İle bir dizi döndüren drupal_get_destination() çağı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.

19
geerlingguy

Bir form işlendiğinde, $form_state['redirect'] Değeri drupal_goto() olarak gönderilir ve drupal_goto() her zaman $_GET['destination'] Değerini kendi başına alır $path Parametresi.

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

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

Bu özel kullanım örneği için Drupal 7, hook_drupal_goto_alter() içinde eklendi:

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

Drupal 7 için yapmak istediğiniz şeye daha yakın olan başka bir seçenek, gönderme işleyicinizdeki drupal_get_destination() için statik önbelleği 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();
}

Sıfırlamadan hemen sonra drupal_get_destination() öğesini aradığınızdan, Drupal, drupal_goto() çağrısı da dahil olmak üzere sayfa yapısının geri kalanı için hedef parametrenin farkında değildir.

Not: Asla değişkenin üzerine yazmak istemediğiniz için $form_state['redirect'] Tanımlamak için kodu değiştirdim: diğer gönderme işleyicileri kendi tanımlarını kendileri tanımlamış olabilir yönlendirmeler. Drupal dizideki her zaman son öğesini kullanır, bu nedenle foo/bar Öğesinin hedef parametreyi geçersiz kılmasını istiyorsanız (ve tanımlanan diğer tüm yönlendirmeler) o noktaya kadar), son olması gerekir.

27
user7

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

Bunun nedeni, bu cevabın oldukça eski olması olabilir, ancak bununla çalışmasını sağlayabildim:

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, drupal_goto() sorgu parametresi ile çalıştığı için yapmanız gerektiğini düşünüyorum. Orijinal cevabın siteme ölümcül hatalar atmasının nedeni de bu olabilir.

4
tmsimont