Làm cách nào để thực hiện chuyển hướng đến trang tùy chỉnh sau khi lưu hoặc xóa nút?


10

Những gì tôi đang cố gắng không làm, tôi vẫn được chuyển hướng đến / 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');
}

2
Đây là những gì tôi tìm thấy trong /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
Bạn có thể sử dụng mô-đun [ drupal.org/project/rules[(Rules) .
Sumit Aggarwal

1
Bạn có chắc chắn rằng chức năng gửi tùy chỉnh của bạn thậm chí được gọi?
Mắt

1
Nó cũng có thể là một chức năng gửi khác ghi đè chuyển hướng tùy chỉnh của bạn sau này.
Mắt

Câu trả lời:


7

Về cơ bản mã sẽ hoạt động để gửi hành động một mình, nhưng hình thức lưu nút drupal có nhiều hành động, tôi nghĩ bạn sẽ đăng nhập với tư cách quản trị viên và thử nó, sau đó làm theo mã dưới đây.

nếu bạn cũng muốn nó hoạt động cho các hành động khác, điều đó có nghĩa là đăng nhập với tư cách quản trị viên và xem nút lưu nút, bạn sẽ có tùy chọn "lưu và xuất bản", "lưu và không xuất bản". như đã đề cập

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

3

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 đó.

nhập mô tả hình ảnh ở đây


1

Tôi đã thành công khi sử dụng Symfony RedirectResponse:

function callback_set_redirect($form, FormStateInterface $form_state) {
  $url = Url::fromRoute("custom.landing.page")->toString();
  $response = new RedirectResponse($url);
  $response->send();
}

Bạn không nên sử dụng phản hồi, vì nó không cho phép các mô-đun di chuột thay đổi chuyển hướng, nếu cần.
kiamlaluno

Làm việc cho tôi, quá.
Bẻ khóa

0

Tôi không thể tìm thấy bất cứ điều gì sai với mã ban đầu vì vậy một cái gì đó khác có thể là không ổn. Việc này ổn với tôi.

Tuy nhiên, custom.landing.pagephải là một tuyến đường được xác định và các tham số (nếu có) cần phải được truyền vào như vậy:

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

Xem FormState :: setRedirect () để biết chi tiết.


0

Tôi luôn sử dụng mô-đun Node Save Redirect cho chức năng này. Nó thêm một tùy chọn cho một loại nội dung có nội dung "phải làm gì sau khi lưu nội dung mới".

Cái này là cái gì?

Mô-đun này cung cấp phương pháp chỉ định vị trí để đưa người dùng sau khi lưu một phần nội dung.


Mô-đun này chưa được chuyển hoàn toàn sang Drupal 8.
dxvargas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.