Przekieruj na niestandardową stronę po dodaniu lub edycji węzła

15

Używając hook_form_alter, jak mogę przekierować użytkownika na niestandardową stronę po utworzeniu lub edycji węzła zamiast węzła, który został utworzony lub edytowany?

Obecny kod hook_form_alter()jest następujący:

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
źródło
„Jest do tego moduł”: Node Destination ( drupal.org/project/node_destination ), ale jest dostępny tylko dla D6. Może można to dostosować.
Benj

Odpowiedzi:

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

Kod przekierowuje formularz niezależnie od przycisku klikniętego w celu przesłania formularza. Jeśli chcesz przekierować formularz tylko po kliknięciu określonego przycisku przesyłania, powinieneś użyć następującego kodu.

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

 

  • Identyfikator formularza nie zawiera łączników. Identyfikator formularza to nazwa funkcji PHP, która generuje formularz (inaczej konstruktor formularzy), a funkcja PHP nie może zawierać łączników w nazwie.
  • Identyfikator formularza jest przekazywany do implementacji hook_form_alter () , hook_form_BASE_FORM_ID_alter () i hook_form_FORM_ID_alter () . hook_form_FORM_ID_alter()tak naprawdę nie potrzebuje go, ponieważ jest wywoływany dla konkretnego formularza, podczas gdy dwa pozostałe haki są wywoływane dla więcej niż jednego formularza.
  • Pierwszą funkcją jest implementacja hook_form_BASE_FORM_ID_alter () ; w tym przypadku podstawowym identyfikatorem formularza jest „formularz_węzła”, który jest formą podstawową dla formularza edycji węzła.
  • Formularz edycji węzła zawiera $form['#node']obiekt węzła dla edytowanego obiektu; „niestandardowy” to krótki identyfikator typu zawartości, który ma przekierowywać użytkowników po edycji węzła.
  • Zmiana $form_state['redirect']z hook_form_alter()nie ma żadnego efektu; należy ustawić w module obsługi przesyłania.
kiamlaluno
źródło
Dzięki za to. Należy zauważyć, że &w function custom_node_submit($form, &$form_state) {jest bardzo ważne. W przeciwnym razie stan nie zostanie przekazany jako odniesienie, a wprowadzone ręcznie zmiany nie będą miały wpływu.
Bram
9

Ten kod działa na stronie 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';
}
morze 26,2
źródło
Jaką odpowiedź nazywasz # 4?
Елин Й.
dlaczego to dla mnie nie działa? Używam tego samego kodu
ruby
Wyczyściłeś pamięć podręczną @ruby?
coderama
W przypadku istniejących węzłów lepiej najpierw odznaczyć miejsce docelowe, które zwykle jest dodawane do adresu URL po kliknięciu przycisku edycji na admin/contentstronie: drupal.stackexchange.com/a/192271/15055 .
leymannx
4

Można to zrobić, ustawiając $form_state['redirect']na przykład jedną z poniższych linii.

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

To są te same argumenty, które przekażesz drupal_goto().

Shoaib Nawaz
źródło
Dziękujemy za opinię @Shoaib Nawaz. Dodałem $ form_state ['redirect'] do haka hook_form_alter bez powodzenia.
Citricguy,
Przez całe życie nie mogę uzyskać $ form_state [„przekierowanie”], aby zadziałało w dowolnym miejscu.
Citricguy
To nie zadziała, jeśli spróbujesz przekierować po dodaniu lub edycji węzła. Aby zobaczyć dlaczego, spójrz na formularz przesłania węzła . Jakakolwiek przypisana wartość $form_state['redirect']zostanie nadpisana, jeśli zostanie ($node->nid)ustawiona na PRAWDA.
Bezpłatne radykalne
2

Nie jestem pewien, czy jest to dla Ciebie opcja, ale jeśli jest to typ zawartości, możesz to osiągnąć dość szybko, korzystając z modułu Reguły, ustawiając regułę uruchamianą przy aktualizacji lub tworzeniu określonego typu zawartości.

Aaron Ortega
źródło