Sử dụng hook_form_alter, bạn sẽ cần làm hai việc
1) đảm bảo rằng đó là dạng nút 2) thêm trình xử lý gửi tùy chỉnh vào mỗi nút gửi.
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';
}
}
}
}
Sau đó, đối với chức năng gửi, bạn có thể sử dụng bất kỳ logic nào bạn muốn. Bạn có thể so sánh với NodeForm :: save, nơi nó sẽ gửi bạn đến trang nút chính tắc hoặc đến trang trước dựa trên quyền truy cập hiện tại của người dùng.
Nếu bạn muốn thay đổi hành vi này để nó vẫn ở dạng nút hiện tại, bạn có thể làm điều này:
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>');
}
}
}
Nếu bạn muốn sử dụng trang đích tùy chỉnh của mình, bạn chỉ cần thay thế chuyển hướng bằng mã bạn đang sử dụng:
$form_state->setRedirect('custom.landing.page');
Lưu ý rằng điều này sẽ không ghi đè khi có tham số $ _GET "đích", chẳng hạn như tại trang / admin / content.
Để xóa tham số đích khỏi trang / admin / nội dung, bạn sẽ muốn bỏ chọn hộp kiểm "đích" trong "Nội dung: Liên kết hoạt động (Hoạt động)" trong các trường xem đó.
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.