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

"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.

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

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().


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.