Redireccionar a una página personalizada después de que se haya agregado o editado un nodo

15

Utilizando hook_form_alter, ¿cómo puedo redirigir a un usuario a una página personalizada después de crear o editar un nodo en lugar del nodo que se creó o editó?

El código actual para hook_form_alter()es el siguiente:

function custom_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#id'] == 'custom-node-form') {
    $form['actions']['submit']['#value'] = t('Add Entry');
    $form['field_custom_email']['und'][0]['value']['#element_validate'] = array('_custom_form_validate_email');
  }
}
Citricguy
fuente
"Hay un módulo para eso": Node Destination ( drupal.org/project/node_destination ) pero solo está disponible para D6. Quizás se pueda adaptar.
Benj

Respuestas:

16
function custom_form_node_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#node']->type == 'custom') {
    $form['actions']['submit']['#value'] = t('Add Entry');
    $form['field_custom_email']['und'][0]['value']['#element_validate'] = array('_custom_form_validate_email');
    $form['#submit'][] = 'custom_node_submit';
  }
}

function custom_node_submit($form, &$form_state) {
  $form_state['redirect'] = 'choose/your/path';
}

El código redirige el formulario independientemente del botón en el que se hizo clic para enviar el formulario. Si desea redirigir un formulario solo cuando se hace clic en un botón de envío específico, debe usar el siguiente código.

function custom_form_node_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#node']->type == 'custom') {
    $form['actions']['submit']['#value'] = t('Add Entry');
    $form['field_custom_email']['und'][0]['value']['#element_validate'] = array('_custom_form_validate_email');
    $form['actions']['submit']['#submit'][] = 'custom_node_submit';
  }
}

function custom_node_submit($form, &$form_state) {
  $form_state['redirect'] = 'choose/your/path';
}

 

  • El ID del formulario no contiene guiones. El ID del formulario es el nombre de la función PHP que genera el formulario (también conocido como el generador de formularios), y una función PHP no puede contener guiones en su nombre.
  • El ID del formulario se pasa a las implementaciones de hook_form_alter () , hook_form_BASE_FORM_ID_alter () y hook_form_FORM_ID_alter () . hook_form_FORM_ID_alter()realmente no lo necesita, ya que se llama para un formulario específico, mientras que los otros dos ganchos se invocan para más de un formulario.
  • La primera función es la implementación de hook_form_BASE_FORM_ID_alter () ; en este caso, el ID del formulario base es "node_form", que es el formulario base para el formulario de edición del nodo.
  • El formulario de edición de nodo contiene $form['#node'], que es el objeto de nodo para el objeto que se está editando; "personalizado" es la ID corta para el tipo de contenido que desea redirigir a los usuarios una vez que editan un nodo.
  • La alteración $form_state['redirect']de hook_form_alter()no tiene ningún efecto; debe configurarse desde un controlador de envío.
kiamlaluno
fuente
Gracias por esto. Tenga &en cuenta que la entrada function custom_node_submit($form, &$form_state) {es muy importante. De lo contrario, no pasará el estado como referencia y las ediciones que realice manualmente no tendrán efecto.
Bram
9

Este código funciona en un sitio Drupal 7.

/**
 * Implements hook_form_alter()
 */

function custom_form_alter(&$form, &$form_state, $form_id) {    
  if ($form_id == 'article_node_form') {
    $form['actions']['submit']['#submit'][] = 'mysubmit_node_submit';
  }     
}

function mysubmit_node_submit($form, &$form_state) {
  $form_state['redirect'] = '/homepage';
}
mar26.2
fuente
¿A qué respuesta te refieres como # 4?
Елин Й.
¿Por qué esto no funciona para mí? Estoy usando el mismo código
ruby
¿Has borrado tu caché @ruby?
coderama
Para los nodos existentes, es mejor asegurarse de desarmar el destino primero, que normalmente se agrega a la URL cuando hace clic en el botón editar en la admin/contentpágina: drupal.stackexchange.com/a/192271/15055 .
leymannx
4

Esto se puede hacer configurando $form_state['redirect'], por ejemplo, usando una de las siguientes líneas.

$form_state['redirect'] = "some-internal-path";
$form_state['redirect'] = array($path, $options_array, $http_code);

Son los mismos argumentos a los que pasarías drupal_goto().

Shoaib Nawaz
fuente
Gracias por los comentarios @Shoaib Nawaz. Agregué $ form_state ['redirect'] al hook_form_alter hook sin suerte.
Citricguy
Por mi vida, no puedo conseguir que $ form_state ['redirect'] surta efecto en ningún lado.
Citricguy
Esto no funcionará si intenta redirigir después de que se haya agregado o editado un nodo. Para ver por qué, eche un vistazo al envío de formulario de nodo . Cualquier valor que asigne $form_state['redirect']se sobrescribirá si se ($node->nid)evalúa como VERDADERO.
Radical libre
2

No estoy seguro de si esta es una opción para usted, pero si se trata de un tipo de contenido, puede lograrlo rápidamente utilizando el módulo Reglas configurando una regla que se activará al actualizar o crear un determinado tipo de contenido.

Aaron Ortega
fuente