Bagaimana cara melakukan redirect ke halaman kustom setelah simpul menyimpan atau menghapus?

10

Apa yang saya coba lakukan tidak berhasil, saya masih diarahkan ke / node / {id}:

function hook_form_alter(&$form, $form_state, $form_id) {
  $form['actions']['submit']['#submit'][] = 'callback_set_redirect';
}
function callback_set_redirect($form, FormStateInterface $form_state) {
  $form_state->setRedirect('custom.landing.page');
}
olsav
sumber
2
Ini yang saya temukan di /core/modules/node/src/NodeForm.php If saving is an option, privileged users get dedicated form submit buttons to adjust the publishing status while saving in one go. @todo This adjustment makes it close to impossible for contributed modules to integrate with "the Save operation" of this form. Modules need a way to plug themselves into 1) the ::submit() step, and 2) the ::save() step, both decoupled from the pressed form button.
olsav
1
Anda dapat menggunakan modul [ drupal.org/project/rules[(Rules) .
Sumit Aggarwal
1
Apakah Anda yakin bahwa fungsi kirim kustom Anda bahkan dipanggil?
Eyal
1
Bisa juga bahwa fungsi kirim lain menimpa pengalihan kustom Anda nanti.
Eyal

Jawaban:

7

Pada dasarnya kode ini akan berfungsi untuk mengirimkan aksi saja, tetapi bentuk simpanan simpul drupal memiliki banyak tindakan, saya pikir Anda akan masuk sebagai admin dan mencobanya, kemudian ikuti kode di bawah ini.

jika Anda ingin ini berfungsi untuk tindakan lain juga, Itu berarti masuk sebagai admin dan lihat tombol simpan simpul, Anda akan memiliki opsi pilih "simpan dan publikasikan", "simpan dan batalkan publikasi". seperti yang telah disebutkan

use Drupal\Core\Form\FormStateInterface;

//hook_form_alter
function hook_form_alter(&$form, $form_state, $form_id) {
  foreach (array_keys($form['actions']) as $action) {
    if ($action != 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
      $form['actions'][$action]['#submit'][] = 'callback_submit';
    }
  }
}


function callback_submit($form, FormStateInterface $form_state) {
  $form_state->setRedirect('custom.page');
}
Karthikeyan Manivasagam
sumber
4

Menggunakan hook_form_alter, Anda harus melakukan dua hal

1) pastikan itu adalah bentuk simpul 2) tambahkan custom submit handler ke setiap tombol kirim.

function mymodule_form_alter(&$form, FormStateInterface $form_state, $form_id) {

  if (isset($form['#entity_type']) && $form['#entity_type'] == 'node') {
    foreach (array_keys($form['actions']) as $action) {
      if ($action != 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
        $form['actions'][$action]['#submit'][] = 'mymodule_node_form_submit';
      }
    }
  }
}

Kemudian untuk fungsi kirim, Anda dapat menggunakan logika apa pun yang Anda inginkan. Anda dapat membandingkan dengan NodeForm :: save, di mana ia mengirim Anda baik ke halaman simpul kanonik atau ke halaman depan berdasarkan izin akses pengguna saat ini.

Jika Anda ingin mengubah perilaku ini sehingga tetap pada bentuk simpul saat ini, Anda bisa melakukan ini:

function mymodule_node_form_submit($form, FormStateInterface $form_state) {
  $node = $form_state->getFormObject()->getEntity();
  if ($node->id()) {
    if ($node->access('edit')) {
      $form_state->setRedirect(
        'entity.node.edit_form',
        ['node' => $node->id()]
      );
    }
    else {
      $form_state->setRedirect('<front>');
    }
  }
}

Jika Anda ingin menggunakan halaman pendaratan khusus, Anda cukup mengganti pengalihan dengan kode yang sudah Anda gunakan:

$form_state->setRedirect('custom.landing.page');

Perhatikan bahwa ini tidak akan menimpa ketika ada parameter "tujuan" $ _GET, seperti di halaman / admin / konten.

Untuk menghapus parameter tujuan dari halaman / admin / konten, Anda harus menghapus centang pada "tujuan" di bawah "Konten: Tautan operasi (Operasi)" di bidang tampilan itu.

masukkan deskripsi gambar di sini

oknate
sumber
1

Saya berhasil menggunakan Symfony RedirectResponse:

function callback_set_redirect($form, FormStateInterface $form_state) {
  $url = Url::fromRoute("custom.landing.page")->toString();
  $response = new RedirectResponse($url);
  $response->send();
}
rpayanm
sumber
Anda tidak boleh menggunakan respons, karena itu tidak memungkinkan modul hover untuk mengubah pengalihan, jika perlu.
kiamlaluno
Bekerja untuk saya juga.
Insasse
0

Saya tidak dapat menemukan sesuatu yang salah dengan kode asli sehingga hal lain mungkin salah. Ini bekerja dengan baik untuk saya.

Namun, custom.landing.pageharus berupa rute dan parameter yang ditentukan (jika ada) perlu diteruskan seperti:

  $form_state->setRedirect("custom.landing.page", [
    'parameter1' => 42,
  ]);

Lihat FormState :: setRedirect () untuk detailnya.

colan
sumber
0

Saya selalu menggunakan modul Node Save Redirect untuk fungsi ini. Itu menambahkan opsi ke tipe konten yang mengatakan "apa yang harus dilakukan setelah menyimpan konten baru".

Apa ini?

Modul ini menyediakan metode menentukan lokasi untuk diambil pengguna setelah menyimpan sepotong konten.

Stef Van Looveren
sumber
Modul ini belum sepenuhnya porting ke Drupal 8.
dxvargas