Điểm:2

Gọi lại Gửi tùy chỉnh chỉ kích hoạt khi Biểu mẫu hợp lệ khi ở trong Hộp thoại

lá cờ cg

Tôi đang cố tạo một nút trong hộp thoại có liên kết sau:

Nhập tiêu đề của biểu mẫu đăng ký hoặc <a class="use-ajax" 
    data-dialog-options="{"width":800}" 
    data-dialog-type="modal" 
    href="/node/add/mycontenttype?enableAjaxSubmit=true">
    tạo một mẫu đăng ký mới.
</a>

cuộc gọi lại _mymodule_close_dialog() chạy hoàn hảo khi không có lỗi xác thực. Nhưng khi có lỗi (ví dụ: tiêu đề trống) thì JS chỉ báo lỗi Uncaught TypeError: this.url không xác định.

Tôi có thể loại bỏ lỗi JS bằng cách ngăn các hành động biểu mẫu trở thành các nút mô hình, nhưng sau đó biểu mẫu chỉ âm thầm thất bại.

Làm cách nào để hiển thị thông báo lỗi của biểu mẫu khi tạo nút trong hộp thoại?

Cuộc gọi lại:

/**
 * Triển khai hook_form_BASE_FORM_ID_alter() cho \Drupal\node\NodeForm.
 */
function mymodule_form_node_mycontenttype_form_alter(&$form, FormStateInterface $form_state) {
    $enableAjaxSubmit = \Drupal::request()->query->get('enableAjaxSubmit');
    if (!empty($enableAjaxSubmit) && $enableAjaxSubmit === 'true') {    
      $form['#attached']['library'][] = 'core/drupal.dialog.ajax';
      $form['#attached']['library'][] = 'core/jquery.form';

      $form['actions']['submit']['#attributes']['class'][] = 'use-ajax-submit';
      $form['actions']['submit']['#submit'][] = '_mymodule_close_dialog';
    }
}

sử dụng Drupal\Core\Ajax\AjaxResponse;
sử dụng Drupal\Core\Ajax\CloseModalDialogCommand;
sử dụng Drupal\Core\Ajax\PrependCommand;
sử dụng Drupal\Core\Ajax\AlertCommand;

function _mymodule_close_dialog(mảng &$form, FormStateInterface $form_state) {
  $response = new AjaxResponse();

  // if (!$form_state->getErrors()) {
    $response->addCommand(CloseModalDialogCommand() mới);
  // }

  $messages = ['#type' => 'status_messages'];
  $response->addCommand(prependCommand mới('.some-wrapper', $messages));

  $form_state->setResponse($response);
}

Tôi đã làm theo:

Cập nhật

đã thay đổi:

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

Đến:

$form['actions']['submit']['#ajax']['callback'] = '_mymodule_close_dialog'; // Đổi tên hàm để loại bỏ `_`
$form['actions']['submit']['#ajax']['url'] = \Drupal\Core\Url::fromRoute('node.add', ['node_type' => $contentType]) ;
$form['actions']['submit']['#ajax']['options'] = [
  'truy vấn' => [
    \Drupal\Core\Form\FormBuilderInterface::AJAX_FORM_REQUEST => TRUE,
  ],
];

Nhưng gặp lỗi PHP:

Symfony\Component\HttpKernel\Exception\HttpException: Lệnh gọi lại #ajax được chỉ định trống hoặc không thể gọi được. trong Drupal\Core\Form\FormAjaxResponseBuilder->buildResponse()

Khi tôi gỡ lỗi($triggering_element) bên trong Biểu mẫuAjaxResponseBuilder tập tin, phần tử gửi không có #ajax chìa khóa hoặc sử dụng-ajax-gửi lớp. Do đó, yếu tố kích hoạt cuối cùng không bị thay đổi.

Bất kỳ ý tưởng?

Điểm:0
lá cờ ua

và một chút: https://www.drupal.org/project/drupal/issues/2934463#comment-13180158

Bạn đã bỏ lỡ việc thêm phần này vào thay đổi của mình, điều này sẽ khắc phục sự cố không xác định url của bạn.

$form['actions']['submit']['#ajax']['url'] = \Drupal\Core\Url::fromRoute('node.add');
$form['actions']['submit']['#ajax']['options'] = [
  'truy vấn' => [
    Drupal\Core\Form\FormBuilderInterface::AJAX_FORM_REQUEST => TRUE,
  ],
];
Chris Happy avatar
lá cờ cg
Tôi đã thử thêm mã bên dưới `$form['actions']['submit']['#submit'][] = '_mymodule_close_dialog';` nhưng sau đó mã ngừng lưu. Không phải đoạn mã trên để mở biểu mẫu `node.add` (và không phải khi lưu biểu mẫu nút) sao? Hay tôi không hiểu điều gì đó?
Chris Happy avatar
lá cờ cg
Tôi đã thêm một bản cập nhật với giải pháp của bạn. Thật không may, Drupal không sử dụng phần tử đã thay đổi bằng phím `#ajax`.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.