Weiterleiten zu einer benutzerdefinierten Seite, nachdem ein Knoten hinzugefügt oder bearbeitet wurde

15

Mit hook_form_alter, wie kann ich nach dem Erstellen oder Bearbeiten einen Knotens anstelle des Knotens, der erstellt oder bearbeitet wurde um einen Benutzer zu aa benutzerdefinierten Seite umleiten?

Der aktuelle Code für hook_form_alter()ist der folgende:

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
quelle
"Es gibt ein Modul dafür": Node Destination ( drupal.org/project/node_destination ), aber es ist nur für D6 verfügbar. Vielleicht kann es angepasst werden.
Benj

Antworten:

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

Der Code leitet das Formular unabhängig von der Schaltfläche weiter, auf die zum Senden des Formulars geklickt wird. Wenn Sie ein Formular nur umleiten möchten, wenn Sie auf eine bestimmte Übergabeschaltfläche klicken, sollten Sie den folgenden Code verwenden.

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

 

  • Die Formular-ID enthält keine Bindestriche. Die Formular-ID ist der Name der PHP-Funktion, die das Formular generiert (auch bekannt als Form Builder), und eine PHP-Funktion darf keine Bindestriche im Namen enthalten.
  • Die Formular-ID wird an die Implementierungen von hook_form_alter () , hook_form_BASE_FORM_ID_alter () und hook_form_FORM_ID_alter () übergeben . hook_form_FORM_ID_alter()braucht es nicht wirklich, da es für ein bestimmtes Formular aufgerufen wird, während die anderen beiden Hooks für mehr als ein Formular aufgerufen werden.
  • Die erste Funktion ist die Implementierung von hook_form_BASE_FORM_ID_alter () ; In diesem Fall lautet die Basisformular-ID "node_form", dh das Basisformular für das Knotenbearbeitungsformular.
  • Das Knotenbearbeitungsformular enthält $form['#node']das Knotenobjekt für das zu bearbeitende Objekt. "custom" ist die Kurz-ID für den Inhaltstyp, den Sie an die Benutzer weiterleiten möchten, sobald diese einen Knoten bearbeiten.
  • Ändern $form_state['redirect']von hook_form_alter()hat keine Auswirkung; Es muss von einem Submission-Handler festgelegt werden.
kiamlaluno
quelle
Danke dafür. Beachten Sie, dass die &in function custom_node_submit($form, &$form_state) {sehr wichtig ist. Andernfalls übergeben Sie den Status nicht als Referenz und die von Ihnen manuell vorgenommenen Änderungen werden nicht wirksam.
Bram
9

Dieser Code funktioniert auf einer Drupal 7-Site.

/**
 * 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';
}
sea26.2
quelle
Auf welche Antwort beziehen Sie sich als # 4?
Елин Й.
Warum funktioniert das bei mir nicht? Ich benutze den gleichen Code
Ruby
Cache geleert @ruby?
Coderama
Bei vorhandenen Knoten sollten Sie zunächst das Ziel deaktivieren , das normalerweise zur URL hinzugefügt wird, wenn Sie auf die Schaltfläche Bearbeiten auf der admin/contentSeite klicken : drupal.stackexchange.com/a/192271/15055 .
Leymannx
4

Dies kann beispielsweise durch Setzen $form_state['redirect']einer der folgenden Zeilen erfolgen.

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

Es sind die gleichen Argumente, die Sie weitergeben würden drupal_goto().

Shoaib Nawaz
quelle
Danke für das Feedback @Shoaib Nawaz. Ich habe den Hook $ form_state ['redirect'] ohne Glück zum Hook hook_form_alter hinzugefügt.
Citricguy
Für mein Leben kann ich $ form_state ['umleiten'] nirgendwo in Kraft setzen.
Citricguy
Dies funktioniert nicht , wenn Sie versuchen, umzuleiten, nachdem ein Knoten hinzugefügt oder bearbeitet wurde. Um zu sehen , warum nehmen Sie einen Blick auf Knoten Formular einreichen . Jeder Wert, den Sie zuweisen, $form_state['redirect']wird überschrieben, wenn er ($node->nid)mit TRUE bewertet wird.
Free Radical
2

Sie sind sich nicht sicher, ob dies eine Option für Sie ist. Wenn es sich jedoch um einen Inhaltstyp handelt, können Sie dies mithilfe des Moduls Regeln schnell erreichen, indem Sie eine Regel festlegen, die beim Aktualisieren oder Erstellen eines bestimmten Inhaltstyps ausgelöst wird.

Aaron Ortega
quelle