Điểm:0

entity_form cách lập trình thêm tham chiếu và cập nhật biểu mẫu một cách trực quan (entity_browser)

lá cờ gr

Tôi đang có một thực thể có thể nhập trường với trường tham chiếu đến các đoạn văn trường_đoạn và một đoạn_type có trường tham chiếu đến sự kiện content_type trường_sự kiện.

Những gì tôi đang cố gắng trong biểu mẫu thực thể là có một nút trong biểu mẫu con sự kiện đoạn_type mà khi nhấp vào sẽ điền trước trường_sự kiện của đoạn_kiểu có nội dung. Hình thức hiển thị của trường_sự kiện sử dụng một entity_browser để cho phép người dùng cũng chọn hoặc bỏ chọn các sự kiện được thêm theo chương trình theo cách thủ công và tôi đoán đây là nơi tôi bị kẹt.

Tôi nghĩ rằng tôi khá gần với giải pháp, hãy để tôi thử mô tả:

Khi nhấp vào nút, các sự kiện đã thêm sẽ không hiển thị, nếu tôi sử dụng entity_browser ngay bây giờ để chèn một sự kiện, thì tất cả các sự kiện mà tôi đã thêm theo chương trình sẽ hiển thị.

Vì vậy, bằng cách nào đó, tôi cần nói với entity_browser trong cuộc gọi lại của mình để trả về danh sách đã cập nhật, tôi đoán vậy (Tôi là người mới bắt đầu sử dụng Drupal, vì vậy hãy cứ thoải mái với tôi) mà không làm như vậy? Ý tôi là chỉ cần thêm các tham chiếu và để "biểu mẫu xây dựng lại độc lập với màn hình biểu mẫu" ... Tôi không biết, đây là mã cho đến nay:

/**
 * Triển khai hook_field_widget_WIDGET_TYPE_form_alter().
 */
chức năng module_field_widget_paragraphs_form_alter(&$element, &$form_state, $context) {

  switch ($element['#paragraph_type']) {
   trường hợp 'sự kiện':

      $replace_id = $element['subform']['field_events']['widget']['#id'];

      $element["subform"]['add_tomorrows_events_button'] = [
        '#type' => 'nút',
        '#thuộc tính' => [
          'name' => 'add_tomorrows_events',
        ],
        '#value' => t('Thêm sự kiện ngày mai'),
        '#ajax' => [
          'gọi lại' => 'module_insert_tomorrows_events_into_paragraph_events',
          'trình bao bọc' => $replace_id,
          'phương pháp' => 'thay thế',
          'sự kiện' => 'nhấp chuột',
        ]
      ];

     nghỉ;

   mặc định:
     // mã số...
     nghỉ;
 }

}

/**
 * Gọi lại Ajax.
 */
chức năng module_insert_tomorrows_events_into_paragraph_events( &$form, FormStateInterface &$form_state) {

  /* Lấy chỉ mục của đoạn văn trong field_paragraphs */
  $triggering_element = $form_state->getTriggeringElement();
  $paragraph_index = $triggering_element["#parents"][1];


  /* Hiện tại chỉ cần thử thêm 10 sự kiện */
  $results = \Drupal::entityQuery('nút')
  ->điều kiện('loại', 'sự kiện')
  -> phạm vi (0, 10)
  ->thực thi();

  /* Ở đây, tôi đang cố tạo chuỗi giống như trong khóa target_id của tiện ích con 
     e.G "nút:3213 nút:54354 nút:432423"
  */
  $ target_ids = "";
  foreach ($kết quả là $res) {
    $target_ids .= " nút:".$res;
  }


  

  $form["field_paragraphs"]['widget'][$paragraph_index]["subform"]["field_events"]["widget"]["target_id"]['#value'] = $target_ids;

  /* chỉ những thứ khác tôi đã thử */
  /*$form["field_paragraphs"]['widget'][$paragraph_index]["subform"]["field_events"]["widget"]["target_id"]['#default_value'] = $target_ids;*/
  /* $form_state->setValue(['field_paragraphs', $paragraph_index, 'subform', 'field_events', 'target_id'], $target_ids);
  $form_state->setRebuild(true);
    */
/* đã cố cập nhật EB nhưng `hiện tại` không được cập nhật :/
   $t = EntityReferenceBrowserWidget::updateWidgetCallback($form, $form_state); 
   return $t["field_paragraphs"]["widget"][$paragraph_index]["subform"]["field_events"]["widget"];
*/




  return $form["field_paragraphs"]['widget'][$paragraph_index]["subform"]["field_events"]["widget"];
}

TL; DR: Các sự kiện được thêm vào nhưng entity_form/entity_browser không được cập nhật trực quan, sau khi sử dụng entity_browser, tất cả các sự kiện được thêm theo chương trình sẽ được hiển thị, làm cách nào để hiển thị chúng ở vị trí đầu tiên?

Điểm:0
lá cờ gr

Tôi đã làm cho nó hoạt động, tôi đang chia sẻ điều này nếu có ai tình cờ gặp phải trường hợp tương tự, cuối cùng, việc sử dụng ReplaceCommand và InvokeCommand là chuyện nhỏ

chức năng module_field_widget_paragraphs_form_alter(&$element, &$form_state, $context) {
  switch ($element['#paragraph_type']) {
    trường hợp 'đoạn_sự kiện':

      // Chỉ thêm nút nếu biểu mẫu con đoạn văn được mở rộng.
      if ($element['top']['summary']['fields_info']['#expanded']) {
        $element["subform"]['add_tomorrows_events_button'] = [
          '#type' => 'nút',
          '#thuộc tính' => [
            'name' => 'add_tomorrows_events',
          ],
          '#value' => t('chèn sự kiện ngày mai'),
          '#ajax' => [
            'gọi lại' => '_module_insert_tomorrows_events_into_paragraph_events',
            'sự kiện' => 'nhấp chuột',
          ],
        ];
      }

      nghỉ;


      ...

và cuộc gọi lại

function _module_insert_tomorrows_events_into_paragraph_events(&$form, FormStateInterface $form_state): AjaxResponse {

  $triggering_element = $form_state->getTriggeringElement();
  $paragraph_index = $triggering_element["#parents"][1];


  // Tải kết quả từ view.
  $view = Lượt xem::getView('sự kiện');
  if (!$view || !array_key_exists('tomorrows_events', $view->storage->get('display'))) {
    trả về "xem \"sự kiện\" hoặc hiển thị \"tomorrows_events\" bị thiếu";
  }

  $view->setDisplay('tomorrows_events');
  $view->execute();
  $results = $view->kết quả;

  $ target_ids = "";
  foreach ($kết quả là $res) {
    $target_ids .= " nút:" . $res->nid;
  }


  $form["field_paragraphs"]['widget'][$paragraph_index]["subform"]["field_events"]["widget"]["target_id"]['#value'] = $target_ids;
  $response = new AjaxResponse();

  $sel = '#' . $form["field_paragraphs"]["widget"][$paragraph_index]["subform"]['field_events']['widget']['target_id']["#id"];
  $response->addCommand(new ReplaceCommand($sel, $form["field_paragraphs"]["widget"][$paragraph_index]["subform"]['field_events']['widget']['target_id'])) ;
  $response->addCommand(new InvokeCommand($sel, 'trigger', ['entity_browser_value_updated']));

  trả lại phản hồi $;

}

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