Reindirizzare a una pagina personalizzata dopo aver aggiunto o modificato un nodo


15

Utilizzando hook_form_alter, come posso reindirizzare un utente su una pagina personalizzata dopo aver creato o modificato un nodo anziché il nodo che è stato creato o modificato?

Il codice corrente per hook_form_alter()è il seguente:

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

"Esiste un modulo per questo": Node Destination ( drupal.org/project/node_destination ) ma è disponibile solo per D6. Forse può essere adattato.
Benj,

Risposte:


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

Il codice reindirizza il modulo indipendentemente dal pulsante selezionato per inviare il modulo. Se si desidera reindirizzare un modulo solo quando si fa clic su un pulsante di invio specifico, è necessario utilizzare il seguente codice.

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

 

  • L'ID modulo non contiene trattini. L'ID modulo è il nome della funzione PHP che genera il modulo (noto anche come generatore di moduli) e una funzione PHP non può contenere trattini nel suo nome.
  • L'ID modulo viene passato alle implementazioni di hook_form_alter () , hook_form_BASE_FORM_ID_alter () e hook_form_FORM_ID_alter () . hook_form_FORM_ID_alter()non ne ha davvero bisogno, come viene chiamato per un modulo specifico, mentre gli altri due hook vengono invocati per più di un modulo.
  • La prima funzione è l'implementazione di hook_form_BASE_FORM_ID_alter () ; in questo caso, l'ID del modulo di base è "forma_nodo" che è il modulo di base per il modulo di modifica del nodo.
  • Il modulo di modifica del nodo contiene $form['#node'], che è l'oggetto nodo per l'oggetto che si sta modificando; "personalizzato" è l'ID breve per il tipo di contenuto che si desidera reindirizzare gli utenti dopo aver modificato un nodo.
  • La modifica $form_state['redirect']da hook_form_alter()non ha alcun effetto; deve essere impostato da un gestore di invio.

Grazie per questo. Si noti che &in function custom_node_submit($form, &$form_state) {è molto importante. Altrimenti non si passa lo stato come riferimento e le modifiche apportate manualmente non avranno effetto.
Bram,

9

Questo codice funziona su un sito 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';
}

Quale risposta ti riferisci come # 4?
Елин Й.

perché questo non funziona per me? Sto usando lo stesso codice
ruby

Hai cancellato la cache @ruby?
coderama,

Per i nodi esistenti, è meglio assicurarsi di disinserire prima la destinazione, che normalmente viene aggiunta all'URL quando si fa clic sul pulsante Modifica sulla admin/contentpagina: drupal.stackexchange.com/a/192271/15055 .
leymannx,

4

Questo può essere fatto impostando $form_state['redirect'], ad esempio usando una delle seguenti righe.

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

Sono gli stessi argomenti a cui passeresti drupal_goto().


Grazie per il feedback @Shoaib Nawaz. Ho aggiunto $ form_state ['redirect'] all'hook hook_form_alter senza fortuna.
Citricguy,

Per la mia vita, non riesco a far sì che $ form_state ['redirect'] abbia effetto ovunque.
Citricguy il

Questo non funzionerà se si tenta di reindirizzare dopo che un nodo è stato aggiunto o modificato. Per capire perché, dai un'occhiata al modulo di invio . Qualsiasi valore assegnato $form_state['redirect']verrà sovrascritto se ($node->nid)valutato su VERO.
Free Radical

2

Non sono sicuro che si tratti di un'opzione per te, ma se si tratta di un tipo di contenuto puoi raggiungerlo abbastanza rapidamente utilizzando il modulo Regole impostando una regola da attivare in caso di aggiornamento o creazione di un determinato tipo di contenuto.

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.