Redirect ke halaman khusus setelah sebuah node ditambahkan atau diedit

15

Dengan menggunakan hook_form_alter, bagaimana saya bisa mengarahkan pengguna ke halaman khusus setelah membuat atau mengedit simpul, bukan simpul yang dibuat atau diedit?

Kode saat ini hook_form_alter()adalah sebagai berikut:

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
sumber
"Ada modul untuk itu": Tujuan Node ( drupal.org/project/node_destination ) tetapi hanya tersedia untuk D6. Mungkin itu bisa diadaptasi.
Benj

Jawaban:

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

Kode mengarahkan ulang formulir secara independen dari tombol yang diklik untuk mengirimkan formulir. Jika Anda ingin mengarahkan ulang formulir hanya ketika tombol pengiriman tertentu diklik, maka Anda harus menggunakan kode berikut.

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

 

  • ID formulir tidak mengandung tanda hubung. ID formulir adalah nama fungsi PHP yang menghasilkan formulir (alias pembangun formulir), dan fungsi PHP tidak dapat berisi tanda hubung dalam namanya.
  • ID formulir diteruskan ke implementasi hook_form_alter () , hook_form_BASE_FORM_ID_alter () , dan hook_form_FORM_ID_alter () . hook_form_FORM_ID_alter()tidak benar-benar membutuhkannya, karena disebut untuk bentuk tertentu, sedangkan dua kait lainnya dipanggil untuk lebih dari satu bentuk.
  • Fungsi pertama adalah implementasi hook_form_BASE_FORM_ID_alter () ; dalam hal ini, ID bentuk dasar adalah "node_form" yang merupakan bentuk dasar untuk bentuk edit simpul.
  • Bentuk edit simpul berisi $form['#node'], yang merupakan objek simpul untuk objek yang sedang diedit; "custom" adalah ID pendek untuk tipe konten yang ingin Anda redirect kepada pengguna begitu mereka mengedit sebuah node.
  • Mengubah $form_state['redirect']dari hook_form_alter()tidak memiliki efek apa pun; itu perlu diatur dari penangan pengajuan.
kiamlaluno
sumber
Terima kasih untuk ini. Perhatikan bahwa &in function custom_node_submit($form, &$form_state) {sangat penting. Kalau tidak, Anda tidak melewati status sebagai referensi dan pengeditan yang Anda lakukan secara manual tidak akan berpengaruh.
Bram
9

Kode ini berfungsi di situs 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';
}
laut26.2
sumber
Jawaban mana yang Anda maksud sebagai # 4?
Елин Й.
mengapa ini tidak berhasil untuk saya? Saya menggunakan kode yang sama
ruby
Membersihkan cache Anda @ruby?
coderama
Untuk node yang ada, Anda lebih baik memastikan untuk membatalkan tujuan terlebih dahulu, yang biasanya ditambahkan ke URL ketika Anda mengklik tombol edit pada admin/contenthalaman: drupal.stackexchange.com/a/192271/15055 .
leymannx
4

Ini dapat dilakukan dengan mengatur $form_state['redirect'], misalnya menggunakan salah satu dari baris berikut.

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

Argumen yang sama dengan yang akan Anda sampaikan drupal_goto().

Shoaib Nawaz
sumber
Terima kasih atas umpan balik @Shoaib Nawaz. Saya menambahkan $ form_state ['redirect'] ke hook_form_alter hook tanpa hasil.
Citricguy
Untuk kehidupan saya, saya tidak bisa mendapatkan $ form_state ['redirect'] untuk berlaku di mana saja.
Citricguy
Ini tidak akan berfungsi jika Anda mencoba untuk mengarahkan ulang setelah simpul telah ditambahkan atau diedit. Untuk mengetahui alasannya, lihat pada formulir node submit . Nilai apa pun yang Anda tetapkan $form_state['redirect']akan ditimpa jika ($node->nid)dievaluasi menjadi BENAR.
Radikal Gratis
2

Tidak yakin apakah ini pilihan bagi Anda, tetapi jika ini adalah jenis konten, Anda bisa mencapainya dengan cukup cepat dengan menggunakan modul Aturan dengan menetapkan aturan yang akan dipicu saat pembaruan atau pembuatan jenis konten tertentu.

Aaron Ortega
sumber