Wie führe ich nach dem Speichern oder Löschen des Knotens eine Umleitung zu einer benutzerdefinierten Seite durch?


10

Was ich versuche zu tun, funktioniert nicht, ich werde trotzdem zu / node / {id} umgeleitet:

function hook_form_alter(&$form, $form_state, $form_id) {
  $form['actions']['submit']['#submit'][] = 'callback_set_redirect';
}
function callback_set_redirect($form, FormStateInterface $form_state) {
  $form_state->setRedirect('custom.landing.page');
}

2
Dies ist, was ich in /core/modules/node/src/NodeForm.php If saving is an option, privileged users get dedicated form submit buttons to adjust the publishing status while saving in one go. @todo This adjustment makes it close to impossible for contributed modules to integrate with "the Save operation" of this form. Modules need a way to plug themselves into 1) the ::submit() step, and 2) the ::save() step, both decoupled from the pressed form button.
olsav


1
Sind Sie sicher, dass Ihre benutzerdefinierte Übermittlungsfunktion überhaupt aufgerufen wird?
Eyal

1
Es kann auch sein, dass eine andere Übermittlungsfunktion Ihre benutzerdefinierte Umleitung später überschreibt.
Eyal

Antworten:


7

Grundsätzlich funktioniert der Code nur für die Übermittlung von Aktionen, aber das Formular zum Speichern von Drupal-Knoten enthält viele Aktionen. Ich denke, Sie hätten sich als Administrator angemeldet und es versucht. Befolgen Sie dann den folgenden Code.

Wenn Sie möchten, dass dies auch für andere Aktionen funktioniert. Dies bedeutet, dass Sie sich als Administrator anmelden und die Schaltfläche zum Speichern des Knotens sehen. Sie haben dann die Option "Speichern und veröffentlichen", "Speichern und nicht veröffentlichen". wie erwähnt

use Drupal\Core\Form\FormStateInterface;

//hook_form_alter
function hook_form_alter(&$form, $form_state, $form_id) {
  foreach (array_keys($form['actions']) as $action) {
    if ($action != 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
      $form['actions'][$action]['#submit'][] = 'callback_submit';
    }
  }
}


function callback_submit($form, FormStateInterface $form_state) {
  $form_state->setRedirect('custom.page');
}

3

Mit hook_form_alter müssen Sie zwei Dinge tun

1) Stellen Sie sicher, dass es sich um ein Knotenformular handelt. 2) Fügen Sie jeder Senden-Schaltfläche einen benutzerdefinierten Übermittlungs-Handler hinzu.

function mymodule_form_alter(&$form, FormStateInterface $form_state, $form_id) {

  if (isset($form['#entity_type']) && $form['#entity_type'] == 'node') {
    foreach (array_keys($form['actions']) as $action) {
      if ($action != 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
        $form['actions'][$action]['#submit'][] = 'mymodule_node_form_submit';
      }
    }
  }
}

Dann können Sie für die Submit-Funktion eine beliebige Logik verwenden. Sie können mit NodeForm :: save vergleichen, wo Sie entweder zur kanonischen Knotenseite oder zur Startseite weitergeleitet werden, basierend auf den Zugriffsberechtigungen des aktuellen Benutzers.

Wenn Sie dieses Verhalten so ändern möchten, dass es auf dem aktuellen Knotenformular bleibt, können Sie Folgendes tun:

function mymodule_node_form_submit($form, FormStateInterface $form_state) {
  $node = $form_state->getFormObject()->getEntity();
  if ($node->id()) {
    if ($node->access('edit')) {
      $form_state->setRedirect(
        'entity.node.edit_form',
        ['node' => $node->id()]
      );
    }
    else {
      $form_state->setRedirect('<front>');
    }
  }
}

Wenn Sie Ihre benutzerdefinierte Zielseite verwenden möchten, ersetzen Sie einfach die Weiterleitung durch den Code, den Sie bereits verwenden:

$form_state->setRedirect('custom.landing.page');

Beachten Sie, dass dies nicht überschrieben wird, wenn ein "Ziel" -Parameter $ _GET vorhanden ist, z. B. auf der Seite / admin / content.

Um den Zielparameter von der Seite / admin / content zu entfernen, deaktivieren Sie das Kontrollkästchen "Ziel" unter "Content: Operations-Links (Operationen)" in diesen Ansichtsfeldern.

Geben Sie hier die Bildbeschreibung ein


1

Ich hatte Erfolg mit Symfony RedirectResponse:

function callback_set_redirect($form, FormStateInterface $form_state) {
  $url = Url::fromRoute("custom.landing.page")->toString();
  $response = new RedirectResponse($url);
  $response->send();
}

Sie sollten keine Antwort verwenden, da Hover-Module die Umleitung bei Bedarf nicht ändern können.
Kiamlaluno

Hat auch für mich gearbeitet.
Insasse

0

Ich kann mit dem Originalcode nichts falsch machen, daher stimmt wahrscheinlich etwas anderes nicht. Es funktioniert gut für mich.

Es custom.landing.pagemuss jedoch eine definierte Route sein und Parameter (falls vorhanden) müssen wie folgt übergeben werden:

  $form_state->setRedirect("custom.landing.page", [
    'parameter1' => 42,
  ]);

Weitere Informationen finden Sie unter FormState :: setRedirect () .


0

Ich verwende für diese Funktionalität immer das Node Save Redirect- Modul. Es fügt einem Inhaltstyp eine Option hinzu, die besagt, was nach dem Speichern neuer Inhalte zu tun ist.

Was ist das?

Dieses Modul bietet eine Methode zum Festlegen eines Speicherorts für den Benutzer nach dem Speichern eines Inhalts.


Dieses Modul wurde noch nicht vollständig auf Drupal 8 portiert.
Dxvargas
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.