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');
}
olsav
quelle
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
Sie können das Modul [ drupal.org/project/rules lightboxes ( Rules] verwenden .
Sumit Aggarwal
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');
}
Karthikeyan Manivasagam
quelle
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

oknate
quelle
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();
}
rpayanm
quelle
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 () .

colan
quelle
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.

Stef Van Looveren
quelle
Dieses Modul wurde noch nicht vollständig auf Drupal 8 portiert.
Dxvargas