it-swarm-eu.dev

Přesměrování formuláře nefunguje, pokud je „cíl“ v adrese URL

V jednom z mých formulářů se snažím nastavit $form_state['redirect'], Takže formulář přejde do tohoto cíle poté, co uživatel klikne na jedno z akčních tlačítek.

Pokud zkontroluji $form_state['redirect'] Před i po přidání přesměrování, je NULL před a poté obsahuje správné pole. Takto nastavuji přesměrování:

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

Chci zachovat cíl z formuláře, který si uživatel prohlíží, na další cestu (proto volám drupal_get_destination(), která vrací pole s 'destination' => 'some/path/here' Uvnitř.

Zdá se, že protože v cestě aktuálního formuláře již existuje cíl, formulář přesměruje na tento cíl bez ohledu na to, co jsem do svého vlastního formuláře vložil popisovač (viz výše uvedený kód). Dokonce jsem se pokusil použít drupal_goto () a to také uživatele nepřesměrovalo.

20
geerlingguy

Při zpracování formuláře je hodnota $form_state['redirect'] Odeslána na drupal_goto() a drupal_goto() vždy upřednostňuje $_GET['destination'] Over vlastní parametr $path.

Kvůli úplnosti jste v Drupal= 6) měli jste trochu štěstí, aniž byste nastavili vlastní záhlaví v hook_exit() :

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

V Drupal 7, hook_drupal_goto_alter() byl přidán pro tento konkrétní případ použití:

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

Další možností pro Drupal 7, která je blíže tomu, co chcete udělat), je resetování statické mezipaměti pro drupal_get_destination() ve vašem handleru pro odeslání pomocí 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();
}

Protože voláte drupal_get_destination() bezprostředně po resetu, Drupal je blaženě nevědomý o cílovém parametru pro zbytek sestavení stránky, včetně toho, když volá drupal_goto().

Poznámka: Změnil jsem kód pro definování $form_state['redirect'], Protože už nikdy nechcete přepsat proměnnou: jiní obsluhující odesílatelé mohli definovat své vlastní přesměrování. Drupal bude vždy používat položku poslední v poli, takže pokud chcete, aby foo/bar Přepsal cílový parametr (a každé další přesměrování bylo definováno až do tohoto bodu), musí to být poslední.

27
user7

Díky za to, ale z nějakého důvodu to nefungovalo, když jsem to zkusil. Dostal jsem fatální chybu - data zaslaná v příkladu odpovědi výše nesplňují požadavky drupal_goto()

Může to být proto, že tato odpověď je dost stará, ale místo toho jsem s ní mohl pracovat:

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

}

Vím, že to porušuje tuto poznámku:

nikdy nechcete přepsat proměnnou: ostatní obslužné programy pro odesílání mohly definovat svá vlastní přesměrování.

Ale v tomto případě rozhodně chcete proměnnou přepsat. Tuto hodnotu byste nenastavovali, pokud byste nechtěli ignorovat nastavené hodnoty jiného modulu. Také si myslím, že musíte kvůli způsobu, jakým drupal_goto() pracuje s parametrem dotazu. To je také důvod, proč původní odpověď házela na mé stránky fatální chyby.

4
tmsimont