¿Cómo realizar una redirección a una página personalizada después de guardar o eliminar el nodo?

10

Lo que intento hacer no funciona, todavía me redirigen 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');
}
olsav
fuente
2
Esto es lo que encontré en /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
Puede usar el módulo [ drupal.org/project/rulesfont>(Rules) .
Sumit Aggarwal
1
¿Estás seguro de que incluso se llama a tu función de envío personalizada?
Eyal
1
También podría ser que otra función de envío anule su redirección personalizada más adelante.
Eyal

Respuestas:

7

Básicamente, el código funcionará solo para la acción de envío, pero el formulario de guardado del nodo drupal tiene muchas acciones, creo que debería haber iniciado sesión como administrador y probarlo, luego siga el código a continuación.

si desea que esto también funcione para otras acciones, eso significa iniciar sesión como administrador y ver el botón de guardar nodo, tendrá que seleccionar la opción "guardar y publicar", "guardar y no publicar". como se mencionó

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

Usando hook_form_alter, deberás hacer dos cosas

1) asegúrese de que sea un formulario de nodo 2) agregue un controlador de envío personalizado a cada botón de envío.

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

Luego, para la función de envío, puede usar la lógica que desee. Puede comparar con NodeForm :: save, donde lo envía a la página de nodo canónico o a la página de inicio en función de los permisos de acceso del usuario actual.

Si desea cambiar este comportamiento para que permanezca en el formulario de nodo actual, puede hacer esto:

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 desea usar su página de destino personalizada, simplemente reemplace la redirección con el código que ya está usando:

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

Tenga en cuenta que esto no se anulará cuando haya un parámetro "destino" $ _GET, como en la página / admin / content.

Para eliminar el parámetro de destino de la página / admin / content, desmarque la casilla de verificación "destino" en "Contenido: Enlaces de operaciones (Operaciones)" en esos campos de vistas.

ingrese la descripción de la imagen aquí

oknate
fuente
1

Tuve éxito usando Symfony RedirectResponse:

function callback_set_redirect($form, FormStateInterface $form_state) {
  $url = Url::fromRoute("custom.landing.page")->toString();
  $response = new RedirectResponse($url);
  $response->send();
}
rpayanm
fuente
No debe usar una respuesta, ya que no permite que los módulos de desplazamiento cambien la redirección, si es necesario.
kiamlaluno
A mí también me funcionó.
Insasse
0

No puedo encontrar nada malo con el código original, por lo que es probable que algo más esté mal. Funciona bien para mí.

Sin embargo, custom.landing.pagedebe ser una ruta definida y los parámetros (si los hay) deben pasarse de la siguiente manera:

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

Vea FormState :: setRedirect () para más detalles.

colan
fuente
0

Siempre uso el módulo Node Save Redirect para esta funcionalidad. Agrega una opción a un tipo de contenido que dice "qué hacer después de guardar contenido nuevo".

¿Que es esto?

Este módulo proporciona un método para especificar una ubicación para llevar al usuario después de guardar un contenido.

Stef Van Looveren
fuente
Este módulo aún no se ha portado completamente a Drupal 8.
dxvargas el