Como executar um redirecionamento para uma página personalizada após o nó salvar ou excluir?

10

O que estou tentando fazer não funciona, ainda sou redirecionado para / 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
fonte
2
Isto é o que eu encontrei em /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
11
Você pode usar o módulo [ drupal.org/project/rules{(Rules) .
Sumit Aggarwal
11
Tem certeza de que sua função de envio personalizada é chamada?
Eyal
11
Também pode ser que outra função de envio substitua seu redirecionamento personalizado posteriormente.
Eyal

Respostas:

7

Basicamente, o código funcionará apenas para a ação de envio, mas o formulário drupal de salvamento do nó tem muitas ações, acho que você teria feito o login como administrador e tentado, depois siga o código abaixo.

se você quiser que isso funcione para outras ações também, isso significa fazer login como administrador e ver o botão salvar nó, você terá a opção "salvar e publicar", "salvar e cancelar a publicação". como mencionado

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
fonte
4

Usando hook_form_alter, você precisará fazer duas coisas

1) verifique se é um formulário de nó 2) adicione um manipulador de envio personalizado a cada botão de envio.

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

Em seguida, para a função de envio, você pode usar qualquer lógica que desejar. Você pode comparar com o NodeForm :: save, onde ele envia você para a página do nó canônico ou para a página inicial com base nas permissões de acesso do usuário atual.

Se você quiser alterar esse comportamento para que ele permaneça no formulário do nó atual, faça o seguinte:

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 você deseja usar sua página de destino personalizada, basta substituir o redirecionamento pelo código que já está usando:

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

Observe que isso não será substituído quando houver um parâmetro $ _GET de "destino", como na página / admin / content.

Para remover o parâmetro de destino da página / admin / content, desmarque a caixa de seleção "destination" em "Content: Links de operações (operações)" nos campos de exibição.

insira a descrição da imagem aqui

oknate
fonte
1

Tive sucesso usando o Symfony RedirectResponse:

function callback_set_redirect($form, FormStateInterface $form_state) {
  $url = Url::fromRoute("custom.landing.page")->toString();
  $response = new RedirectResponse($url);
  $response->send();
}
rpayanm
fonte
Você não deve usar uma resposta, pois ela não permite que os módulos suspensos alterem o redirecionamento, se necessário.
kiamlaluno
Trabalhou para mim também.
Insasse
0

Não consigo encontrar nada de errado com o código original, então provavelmente algo está errado. Isso funciona bem para mim.

No entanto, custom.landing.pagedeve haver uma rota definida e os parâmetros (se houver) precisam ser passados ​​da seguinte forma:

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

Consulte FormState :: setRedirect () para obter detalhes.

colan
fonte
0

Eu sempre uso o módulo Redirecionamento de economia de nó para essa funcionalidade. Ele adiciona uma opção a um tipo de conteúdo que diz "o que fazer depois de salvar novo conteúdo".

O que é isso?

Este módulo fornece um método para especificar um local para levar o usuário após salvar uma parte do conteúdo.

Stef Van Looveren
fonte
Este módulo ainda não estava totalmente portado para o Drupal 8.
Dxvargas 1/11