Come eseguire un reindirizzamento alla pagina personalizzata dopo il salvataggio o l'eliminazione del nodo?


10

Quello che sto cercando di fare non funziona, vengo comunque reindirizzato a / node / {id}:

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
Questo è quello che ho trovato 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 il


1
Sei sicuro che venga persino chiamata la tua funzione di invio personalizzata?
Eyal

1
Potrebbe anche essere che un'altra funzione di invio abbia la precedenza sul reindirizzamento personalizzato.
Eyal

Risposte:


7

Fondamentalmente il codice funzionerà solo per l'invio dell'azione, ma il modulo di salvataggio del nodo drupal ha molte azioni, penso che avresti effettuato l'accesso come amministratore e provandolo, quindi segui il codice qui sotto.

se vuoi che funzioni anche per altre azioni, ciò significa accedere come amministratore e vedere il pulsante di salvataggio del nodo, avrai l'opzione selezionata "salva e pubblica", "salva e non pubblicare". come accennato

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');
}

4

Usando hook_form_alter, dovrai fare due cose

1) assicurarsi che sia un modulo nodo 2) aggiungere un gestore di invio personalizzato a ciascun pulsante di invio.

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';
      }
    }
  }
}

Quindi, per la funzione di invio, è possibile utilizzare la logica desiderata. Puoi confrontare con NodeForm :: save, dove ti invia alla pagina del nodo canonico o alla prima pagina in base alle autorizzazioni di accesso dell'utente corrente.

Se si desidera modificare questo comportamento in modo che rimanga nel modulo nodo corrente, è possibile effettuare ciò:

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>');
    }
  }
}

Se desideri utilizzare la tua pagina di destinazione personalizzata, devi semplicemente sostituire il reindirizzamento con il codice che stai già utilizzando:

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

Nota che questo non avrà la precedenza quando c'è un parametro $ _GET "destinazione", come nella pagina / admin / content.

Per rimuovere il parametro di destinazione dalla pagina / admin / content, deselezionare la casella di controllo "destinazione" in "Contenuto: collegamenti operazioni (operazioni)" nei campi delle viste.

inserisci qui la descrizione dell'immagine


1

Ho avuto successo usando Symfony RedirectResponse:

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

Non è necessario utilizzare una risposta, poiché non consente ai moduli hover di modificare il reindirizzamento, se necessario.
kiamlaluno

Ha funzionato anche per me.
Insasse

0

Non riesco a trovare nulla di sbagliato nel codice originale, quindi qualcos'altro probabilmente non va. Funziona bene per me.

Tuttavia, custom.landing.pagedeve essere un percorso definito e i parametri (se presenti) devono essere passati in questo modo:

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

Vedi FormState :: setRedirect () per i dettagli.


0

Uso sempre il modulo di reindirizzamento Node Save per questa funzionalità. Aggiunge un'opzione a un tipo di contenuto che dice "cosa fare dopo aver salvato il nuovo contenuto".

Cos'è questo?

Questo modulo fornisce un metodo per specificare una posizione in cui prendere l'utente dopo aver salvato un contenuto.


Questo modulo non è stato ancora completamente portato su Drupal 8.
dxvargas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.