Score:1

ปิดใช้งานบางแถวของมุมมองแหล่งอ้างอิงเอนทิตี

ธง in

ฉันมีฟิลด์ที่เป็นข้อมูลอ้างอิงเอนทิตีในเนื้อหา ฉันสร้างมุมมองที่เป็น แหล่งอ้างอิงเอนทิตี และตั้งค่าประเภทการอ้างอิงบนฟิลด์เป็นมุมมองนั้น เมื่อแก้ไขเนื้อหา ฉันเห็นรายการช่องทำเครื่องหมายที่ใช้รายการนั้น แหล่งอ้างอิงเอนทิตี ดู.

ข้อมูลในรายการเป็นการแข่งขัน เมื่อการแข่งขันเสร็จสิ้น ฉันไม่ต้องการให้ผู้ใช้สามารถยกเลิกการเลือกทัวร์นาเมนต์นั้นเมื่อแก้ไขเนื้อหา พวกเขาสามารถสลับได้เฉพาะทัวร์นาเมนต์ "ที่จะเกิดขึ้น" เท่านั้น

ฉันได้ลองทำการแก้ไขแบบฟอร์มแล้ว แต่คนละอัน ตัวเลือก ใน $form['field_tournament']['widget']['#ตัวเลือก'] ดูเหมือนจะเป็น Drupal\Core\Field\FieldFilteredMarkup ดังนั้นฉันจึงไม่สามารถปิดการใช้งานแถวได้เนื่องจากเป็นเพียงมาร์กอัป HTML ซึ่งมีเฉพาะป้ายกำกับเท่านั้น ไม่ใช่ช่องทำเครื่องหมาย

ฟังก์ชัน MYMODULE_form_group_league_edit_form_alter(&$form, FormStateInterface $form_state) {
  foreach ($form['field_tournaments']['widget']['#options'] as $key => $option) {
    // ปิดการใช้งานที่นี่หากการแข่งขันถูกกำหนดให้เสร็จสิ้น
  }
}

ฉันเข้าใจในมุมมอง ฉันสามารถตั้งค่าให้แสดงเฉพาะทัวร์นาเมนต์ "ที่กำลังจะมีขึ้น" ได้ แต่ฉันต้องการให้พวกเขาเห็นว่ารายการใดเสร็จสิ้นแล้วขณะแก้ไข

in flag
ยิ่งฉันค้นคว้ามากเท่าไหร่ ดูเหมือนว่าวิดเจ็ตฟิลด์ที่กำหนดเองอาจเป็นวิธีที่จะไป
Score:0
ธง in

ดังนั้นฉันจึงคิดออกโดยใช้วิดเจ็ตที่กำหนดเองและ แอตทริบิวต์ตัวเลือกแบบฟอร์ม โมดูล แม้ว่าตอนนี้ฉันคิดว่าฉันน่าจะทำสิ่งเดียวกันได้สำเร็จในการแก้ไขแบบฟอร์ม เนื่องจากฉันเพิ่งโหลดคำศัพท์ผ่านคีย์ที่ฉันเคยเข้าถึงมาก่อน อย่างไรก็ตามฉันค้นหารหัสฐานของวิธี กล่องกาเครื่องหมาย/วิทยุ วิดเจ็ตถูกสร้างขึ้นและคัดลอกและแก้ไขโค้ดเพื่อเพิ่มแอตทริบิวต์ที่ปิดใช้งานให้กับตัวเลือก

<?php

เนมสเปซ Drupal\pick_dynasty_golf\Plugin\Field\FieldWidget;

ใช้ Drupal\Core\Field\FieldItemListInterface;
ใช้ Drupal\Core\Field\Plugin\Field\FieldWidget\OptionsButtonsWidget
ใช้ Drupal\Core\Form\FormStateInterface;

/**
 * กำหนดวิดเจ็ตฟิลด์ 'pick_dynasty_golf_tournament_selection'
 *
 * @ฟิลด์วิดเจ็ต(
 * id = "pick_dynasty_golf_tournament_selection",
 * label = @Translation("รอบคัดเลือก"),
 * field_types = {
 * "บูลีน"
 * "entity_reference",
 * "list_integer",
 * "list_float",
 * "list_string",
 * },
 * multiple_values ​​= จริง
 * )
 */
คลาส TournamentSelectionWidget ขยาย OptionsButtonsWidget {

  /**
   * {@inheritdoc}
   */
  ฟังก์ชันสาธารณะ formElement (FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
    $element = parent::formElement($items, $delta, $element, $form, $form_state);
    // รับตัวเลือกทั้งหมด
    $options = $this->getOptions($items->getEntity());
    // รับตัวเลือกที่เลือกไว้แล้ว
    $selected = $this->getSelectedOptions($รายการ);
    $tids = [];
    // ใช้คีย์จาก $options เพื่อรับ ID ของคำศัพท์ (ทัวร์นาเมนต์)
    foreach (ตัวเลือก $ เป็น $tid => $ ตัวเลือก) {
      $tids[] = $tid;
    }
    // โหลดการแข่งขันทั้งหมด
    $term_storage = \Drupal::entityTypeManager()->getStorage('taxonomy_term');
    $terms = $term_storage->loadMultiple($tids);
    $ปิดการใช้งาน = [];
    // วนซ้ำและปิดการแข่งขันที่มีสถานะ 'โพสต์'
    foreach (เงื่อนไข $ เป็น $ เทอม) {
      $status = $term->get('field_tournament_status')->value;
      ถ้า (สถานะ $ == 'โพสต์') {
        $disabled[$term->id()] = [
          'ปิดการใช้งาน' => จริง,
        ];
      }
    }

    $องค์ประกอบ += [
      '#type' => 'ช่องทำเครื่องหมาย',
      '#default_value' => $เลือกแล้ว
      '#options' => $ตัวเลือก,
      '#options_attributes' => $disabled, // สิ่งนี้มาจากโมดูล Form Options Attributes
    ];

    ส่งคืนองค์ประกอบ $;
  }

}

หนึ่ง ใหญ่ ปัญหาที่ฉันไม่ได้พิจารณาคือถ้าฟิลด์ถูกปิดใช้งาน (แม้ว่าจะเลือกไว้ก่อนหน้านี้) จะไม่ถูกส่ง ดังนั้นฉันจึงสูญเสียค่า อ่านเท่านั้น บนกล่องกาเครื่องหมายไม่ใช่ตัวเลือก โดยทั่วไปฉันต้องปิดการใช้งานใน JS โชคไม่ดีและเขียนตัวตรวจสอบที่กำหนดเองบนแบ็กเอนด์ที่ตรวจสอบว่าไม่มีการเพิ่ม / ลบรายการที่ปิดใช้งาน

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา