Comment effectuer une redirection vers une page personnalisée après l'enregistrement ou la suppression d'un nœud?

10

Ce que j'essaie de faire ne fonctionne pas, je suis toujours redirigé vers / 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');
}
olsav
la source
2
C'est ce que j'ai trouvé dans /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
Vous pouvez utiliser le module [ drupal.org/project/rules
Sumit Aggarwal
1
Êtes-vous sûr que votre fonction d'envoi personnalisée est même appelée?
Eyal le
1
Il se peut également qu'une autre fonction d'envoi remplace votre redirection personnalisée ultérieurement.
Eyal le

Réponses:

7

Fondamentalement, le code fonctionnera uniquement pour soumettre une action, mais le formulaire de sauvegarde de nœud Drupal a de nombreuses actions, je pense que vous vous seriez connecté en tant qu'administrateur et que vous l'auriez essayé, puis suivez le code ci-dessous.

si vous voulez que cela fonctionne aussi pour d'autres actions, cela signifie que vous vous connectez en tant qu'administrateur et que vous voyez le bouton d'enregistrement du nœud, vous aurez l'option de sélection "enregistrer et publier", "enregistrer et annuler la publication". comme mentionné

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
la source
4

En utilisant hook_form_alter, vous devrez faire deux choses

1) assurez-vous qu'il s'agit d'un nœud. 2) ajoutez un gestionnaire d'envoi personnalisé à chaque bouton d'envoi.

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

Ensuite, pour la fonction de soumission, vous pouvez utiliser la logique de votre choix. Vous pouvez comparer avec NodeForm :: save, où il vous envoie soit à la page de noeud canonique ou à la page d'accueil en fonction des autorisations d'accès de l'utilisateur actuel.

Si vous souhaitez modifier ce comportement afin qu'il reste sur la forme de nœud actuelle, vous pouvez le faire:

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

Si vous souhaitez utiliser votre page de destination personnalisée, il vous suffit de remplacer la redirection par le code que vous utilisez déjà:

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

Notez que cela ne remplacera pas lorsqu'il y a un paramètre "destination" $ _GET, comme sur la page / admin / content.

Pour supprimer le paramètre de destination de la page / admin / content, vous voudrez décocher la case "destination" sous "Contenu: Liens d'opérations (Opérations)" dans les champs de cette vue.

entrez la description de l'image ici

oknate
la source
1

J'ai réussi à utiliser Symfony RedirectResponse:

function callback_set_redirect($form, FormStateInterface $form_state) {
  $url = Url::fromRoute("custom.landing.page")->toString();
  $response = new RedirectResponse($url);
  $response->send();
}
rpayanm
la source
Vous ne devez pas utiliser de réponse, car elle ne permet pas aux modules de survol de modifier la redirection, si nécessaire.
kiamlaluno
A aussi fonctionné pour moi.
Insasse
0

Je ne trouve rien de mal avec le code d'origine, donc quelque chose d'autre ne va probablement pas. Ça fonctionne bien pour moi.

Cependant, custom.landing.pagedoit être une route définie et les paramètres (s'il y en a) doivent être passés comme suit:

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

Voir FormState :: setRedirect () pour plus de détails.

colan
la source
0

J'utilise toujours le module Node Save Redirect pour cette fonctionnalité. Il ajoute une option à un type de contenu qui dit "que faire après avoir enregistré un nouveau contenu".

Qu'est-ce que c'est?

Ce module fournit une méthode pour spécifier un emplacement à prendre par l'utilisateur après avoir enregistré un morceau de contenu.

Stef Van Looveren
la source
Ce module n'était pas encore entièrement porté sur Drupal 8.
dxvargas