Điểm:1

AJAX ở dạng plugin dẫn đến "Gọi lại #ajax được chỉ định trống hoặc không thể gọi được."

lá cờ in

Tôi có một biểu mẫu cấu hình cho plugin Điều kiện mà tôi muốn có ajax. Khi chọn từ trường này, tôi muốn nhận danh sách hiển thị cho Chế độ xem đó:

  chức năng công khai buildConfigurationForm(mảng $form, FormStateInterface $form_state) {
    $form = parent::buildConfigurationForm($form, $form_state);
    $views = $this->entityTypeManager->getStorage('view')->loadMultiple();
    tùy chọn $ = [];

    /** @var \Drupal\views\Views $view */
    foreach ($lượt xem dưới dạng $view) {
      $options[$view->id()] = $view->nhãn();
    }

    $form['#prefix'] = '<div id="views-settings">';
    $form['#suffix'] = '</div>';

    $view_id = $form_state->getValue('view_id');

    nếu (trống($view_id)) {
      $view_id = $form_state->getUserInput()["conditions"]["sfp_condition_view_not_empty"]["view_id"] ?? VÔ GIÁ TRỊ;
    }

    nếu (trống($view_id)) {
      $view_id = $this->configuration['view_id'] ?? VÔ GIÁ TRỊ;
    }

    $displays = isset($view_id) ? $this->getViewsDisplays($view_id) : [];

    $form['view_id'] = [
      '#type' => 'chọn',
      '#title' => $this->t('Xem'),
      '#required' => ĐÚNG,
      '#options' => $options,
      '#default_value' => $view_id ? $options[$view_id] : '',
      '#ajax' => [
        'trình bao bọc' => 'cài đặt chế độ xem',
        'gọi lại' => '::updateViewsDisplay',
        'sự kiện' => 'thay đổi',
      ],
    ];

    if (!empty($displays)) {
      $form['view_display'] = [
        '#type' => 'chọn',
        '#title' => $this->t('Xem màn hình'),
        '#required' => ĐÚNG,
        '#options' => $displays,
        '#default_value' => $displays[$this->configuration['view_display']] ?? $displays['default'],
      ];
    }

    trả về biểu mẫu $;
  }

      /**
       * Xây dựng lại hình thức kích hoạt.
       *
       * @param mảng $form
       * @param \Drupal\Core\Form\FormStateInterface $form_state
       * @return mảng
       */
      cập nhật chức năng công khaiViewsDisplay(mảng $form, FormStateInterface $form_state) {
        trả về biểu mẫu $;
      }

Xdebug xử lý tốt phương thức, nhưng tôi gặp lỗi AJAX này:

"Gọi lại #ajax được chỉ định trống hoặc không thể gọi được."

và không có gì xảy ra sau đó.

Tôi đã kiểm tra ở nơi khác nơi tôi đã thực hiện việc này và điểm khác biệt duy nhất mà tôi có thể thấy là những cái đã hoạt động là các biểu mẫu API Biểu mẫu Drupal thông thường và đây là một biểu mẫu phần bổ trợ được chuyển từ buildConfigurationForm. Bên ngoài đó, tôi không nhìn thấy vấn đề.

lá cờ cn
Có bất kỳ cơ hội nào bạn đang sử dụng điều này trong biểu mẫu Giao diện người dùng ngữ cảnh (trái ngược với khả năng hiển thị của khối chẳng hạn) không? Tôi nhớ mình đã gặp sự cố khủng khiếp khi cố gắng để AJAX hoạt động với mô-đun Ngữ cảnh
Kevin avatar
lá cờ in
Vâng, đó chính xác là nơi tôi đang ở. Thay đổi gọi lại thành chức năng thủ tục trong .module hoạt động, nhưng tôi không biết tại sao. Đây không phải là một phương pháp có thể truy cập nếu được đặt ở trạng thái tĩnh sao? Dường như không có gì để làm việc. Điều kỳ lạ là xdebug không bao giờ thất bại trong việc đánh trúng nó. Trạng thái biểu mẫu cũng không phải lúc nào cũng có giá trị được chọn, không giống như các biểu mẫu thông thường.
lá cờ cn
Cách đây đã lâu nhưng IIRC có liên quan đến giao diện người dùng ngữ cảnh có điểm vào riêng cho biểu mẫu AJAX, nó không sử dụng `/system/ajax`. Tôi chắc chắn rằng tôi nhớ điều tương tự đã xảy ra, cuộc gọi lại chắc chắn bị tấn công nhưng kết quả không được đưa vào biểu mẫu mới. Bất cứ điều gì tôi đã làm để giải quyết nó đều ở đâu đó trong mô-đun này nếu nó hữu ích: https://www.drupal.org/project/request_data_conditions
Kevin avatar
lá cờ in
Ồ. Ừ. Ai biết? Đăng câu trả lời.
Kevin avatar
lá cờ in
Điều đó thực sự đã sửa lỗi AJAX, nhưng cuối cùng lại nhận được lỗi 'phát hiện lựa chọn bất hợp pháp'. Tôi chỉ kết thúc AJAX và cung cấp toàn bộ mảng trong một danh sách.
lá cờ cn
Đừng đổ lỗi cho bạn, tôi vừa đọc lại nhận xét lan man mà tôi đã viết cách đây nhiều năm để cố gắng giải thích điều gì đang xảy ra (dòng 152 của BaseCondition) và nó lại tràn về. Đây là những con rồng.
Điểm:3
lá cờ in

Nhờ liên kết Clive, vì lý do tôi không hoàn toàn tin tưởng 100% vào các biểu mẫu cấu hình cho plugin Ngữ cảnh, lệnh gọi lại AJAX cần thực hiện việc này:

  /**
   * Xây dựng lại hình thức kích hoạt.
   *
   * @param mảng $form
   * @param \Drupal\Core\Form\FormStateInterface $form_state
   * @return mảng
   */
  cập nhật chức năng công khaiViewsDisplay(array $form, FormStateInterface $form_state) {
    $triggering_element = $form_state->getTriggeringElement();
    $parents = array_slice($triggering_element['#array_parents'], 0, -1);
    trả về NestedArray::getValue($form, $parents);
  }

Sau đó, nó bắt đầu làm việc.

Ngoài ra, khai báo AJAX cần phải là:

'callback' => [$this, 'updateViewsDisplay'],

Tôi cho rằng điều này liên quan đến việc nó là một 'hình thức bên trong một hình thức'.

4uk4 avatar
lá cờ cn
Có, khai báo biểu mẫu trong plugin thường không độc lập, đó là cây con mà mã sử dụng plugin có thể đặt ở dạng riêng. Bạn cũng thấy thủ thuật cắt mảng này trong các tiện ích trường. BTW dựa trên cuộc gọi lại trên $this không được khuyến nghị, bạn có thể không nhận được phiên bản biểu mẫu mà bạn đang mong đợi. Tôi sẽ sử dụng `'[static::class, 'updateViewsDisplay']` nếu `'::updateViewsDisplay'` không hoạt động. Nếu sau đó bạn cần tham chiếu đối tượng biểu mẫu, bạn có thể lấy nó từ $form_state.
Kevin avatar
lá cờ in
Tôi thấy, cũng lưu ý rằng static::class cũng yêu cầu gọi lại là tĩnh hoặc lỗi vẫn tiếp diễn.

Đă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.