Làm thế nào để bạn triển khai trình xử lý gửi tùy chỉnh trong hook_form_alter ()?


16

Tôi đã cập nhật một trong các mô-đun Drupal 7 của mình lên 8 và tôi gặp vấn đề với thay đổi hình thức của mình. Tôi đang thêm chức năng xác nhận và trình xử lý trình. Chức năng xác nhận đang được gọi là tốt, nhưng chức năng gửi không bị sa thải. Tôi tự hỏi liệu điều này có nghĩa là có một cách tiếp cận theo kiểu Symfony cần được thực hiện để thêm trình xử lý trình vào các biểu mẫu hiện có. Tôi đã thực hiện rất nhiều tìm kiếm và tôi không thể tìm thấy bất kỳ ví dụ nào. Cũng đã xem qua một số mô-đun D8 đang thực hiện nhưng tôi thực sự không tìm thấy bất kỳ ví dụ hoạt động nào ở đó.

Có ai có ý tưởng gì về cách chính xác của Drupal 8 để làm điều này không?


2
Bạn nên đăng mã hiện tại của mình để mọi người có thể xem mã đó và phát hiện bất kỳ vấn đề / đề xuất thay thế nào.
Yuriy Babenko

Có, kể từ D8 beta9, getters và setters để gửi trình xử lý, nhưng tôi dường như không thể làm cho chúng hoạt động và sử dụng câu trả lời dưới đây. Tôi hy vọng giao diện nút sẽ nhận được một số sự kiện được gửi trong tương lai, vì tôi muốn đăng ký một sự kiện hơn là sử dụng hook.
Alex Finnarn

Câu trả lời:


13

Theo ví dụ trong tài liệu, nó giống như với Drupal 7:

$form['actions']['submit']['#submit'][] = 'mymodule_upload_enabled_types_submit';

Bạn có thể tìm thấy logic (làm việc) tương tự trong

Và một vài người khác bên cạnh.


1
Tôi không thể tranh luận với các tài liệu API. Có lẽ là một cái gì đó khó khăn với việc thực hiện của tôi, tôi sẽ đào sâu hơn.
Arbee

Xem cập nhật của tôi ở trên, ngoài các phần $ form ['hành động'] ['submit'] còn có các phần $ form ['hành động'] ['xuất bản'] và ['không xuất bản'] có thể có trình xử lý được đính kèm.
Arbee

Tôi đã phải sử dụng $ form ['hành động'] ['xuất bản'] ['# submit'] [] thay vì $ form ['hành động'] ['submit'] ['# submit'] [] cho trình xử lý trình của tôi để làm việc khi nút được xuất bản. Tuy nhiên, tôi dường như không thể gọi lại hoạt động khi nút đầu tiên được lưu dưới dạng chưa được công bố.
Alex Finnarn

6

Bạn có thể thêm số lượng trình xử lý bạn muốn bằng cách sử dụng mã sau đây:

 $form['actions']['submit']['#submit'][] = 'mymodule_what_ever_function';

Nếu bạn muốn thêm trình xử lý gửi sau trình xử lý gửi mặc định, (trình xử lý gửi sẽ được gọi sau khi gọi lại), bạn có thể sử dụng cách sau.

$form['#submit'][1] = test_function;

Để xóa trình xử lý trình:

unset($form["actions"]['submit']);

3

Hành vi được thay đổi hoặc khác nhau từ trường hợp này sang trường hợp khác. Với biểu mẫu xác nhận xóa nút

$form['actions']['submit']['#submit'][] = 'mymodule_upload_enabled_types_submit';

Mã của @ Clive khiến Drupal bỏ qua trình xử lý chính. Trong trường hợp này, thêm trình xử lý vào $form['#submit']phần:

$form['#submit'][] = 'mymodule_upload_enabled_types_submit';

1

Dưới đây là cách đính kèm trình xử lý gửi tùy chỉnh vào biểu mẫu thêm / chỉnh sửa nút bài viết trong Drupal 8:

<?php

use Drupal\Core\Form\FormStateInterface;

/**
 * Implements hook_form_alter().
 */
function my_module_form_alter(&$form, FormStateInterface $form_state, $form_id) {

  // Use this to reveal the form id.
  //drupal_set_message($form_id);

  // Use this with the devel module to inspect the button action(s).
  //kint($form['actions']);

  switch ($form_id) {

    case 'node_article_form':      // New article nodes.
    case 'node_article_edit_form': // Existing article nodes.

      // Attach our custom submit handler.
      $form['actions']['publish']['#submit'][] = 'my_module_node_article_form_submit';
      break;

  }

}

function my_module_node_article_form_submit($form, FormStateInterface $form_state) {
  drupal_set_message('Running custom submit handler...');
}

Tôi đã không thể nối thành công trình xử lý trình tùy chỉnh vào $form['#submit']và có chức năng kích hoạt đúng cách. Tôi đã phải đính kèm nó một cách rõ ràng vào nút Lưu và xuất bản khi tạo một bài viết mới và đính kèm nó vào nút Lưu và giữ xuất bản khi chỉnh sửa một bài viết hiện có.

Ngoài ra publish, đây là một số hành động nút khác có sẵn:

unpublish
preview
delete

Tôi đang ở Drupal 8.7.3, và my_module_node_article_form_submit($form, FormStateInterface $form_stateđã cho tôi TypeError: Argument 2 passed to _ccad_content_log_webform_submit() must be an instance of FormStateInterface, instance of Drupal\Core\Form\FormState given; thay đổi nó để _submit($form, $form_state)sửa lỗi.
dùng1359
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.