Score:1

อัปเดตการกำหนดค่าฟิลด์โดยทางโปรแกรม (ไม่ใช่ที่เก็บข้อมูล)

ธง ru

แก้ไขแล้ว ทั้งสองวิธีด้านล่างทำงานได้ดีอย่างสมบูรณ์ มันเป็นเพียงการพิมพ์ผิด

ฉันจำเป็นต้องอัปเดตการกำหนดค่าของฟิลด์โดยทางโปรแกรม hook_update. ฉันต้องทำสิ่งนี้ในหลายโปรเจ็กต์ ดังนั้นฉันจึงไม่สามารถใช้วิธีปกติกับ field UI และการซิงค์การกำหนดค่าได้ ฉันพบเอกสารวิธีการอัปเดตที่เก็บข้อมูลฟิลด์และ DB schema (1, 2) แต่ไม่มีเอกสารเกี่ยวกับวิธีอัปเดตการกำหนดค่าฟิลด์เท่านั้น ดังนั้นฉันจึงคิดว่าฉันสามารถใช้ ConfigFactory ทั่วไปได้

/**
 * เพิ่มย่อหน้าใหม่ของฉันในรายการบันเดิลที่อนุญาตในการกำหนดค่าฟิลด์โฮสต์
 */
ฟังก์ชัน MYMODULE_update_9001(&$แซนด์บ็อกซ์) {
  $config = \Drupal::configFactory()->getEditable('field.field.node.BUNDLE.FIELD_NAME');
  $existingAllowedParagraphs = $config->get('settings.handler_settings.target_bundles');
  ถ้า (!in_array('NEW_PARAGRAPH_BUNDLE', $existingAllowedParagraphs )) {
    $dependencies = $config->get('dependencies.config');
    $dependencies[] = 'paragraphs.paragraphs_type.NEW_PARAGRAPH_BUNDLE';
    $config->set('dependencies.config', $dependencies);
    $config->set('settings.handler_settings.target_bundles.NEW_PARAGRAPH_BUNDLE', 'NEW_PARAGRAPH_BUNDLE');
    $config->set('settings.handler_settings.target_bundles_drag_drop.NEW_PARAGRAPH_BUNDLE', ['เปิดใช้งาน' => จริง, 'น้ำหนัก' => 1234]);
    $config->save(จริง);
  }
}

สิ่งนี้ใช้ได้เฉพาะในการกำหนดค่าที่ใช้งานอยู่ (ดรัชซีเอ็กซ์ สร้างการกำหนดค่า YAML ที่คาดไว้ อัปเดตและถูกต้อง) แต่แปลกที่ไม่มีที่อื่น เช่น. ใน Field UI หรือในแบบฟอร์มแก้ไขโหนด ทุกอย่างทำงานเหมือนเก่า กำหนดค่าก่อนฮุค ไม่ใช้การกำหนดค่าที่ใช้งานอยู่ ฉันได้ลองนำเข้าการกำหนดค่าและล้างแคชหลายครั้ง แต่ฟิลด์นี้ไม่ได้ใช้ค่าจาก ConfigFactory ฉันแน่ใจอย่างยิ่งว่าการกำหนดค่าใหม่ของฉันถูกต้องและใช้งานได้ แต่อย่างใด ฟิลด์นี้ไม่ซิงค์กับการกำหนดค่าของตัวเอง

อัปเดต: ฉันได้ลองวิธีอื่นโดยใช้ FieldConfig แล้ว แต่ปัญหาก็เหมือนกันทุกประการ: การกำหนดค่าที่ใช้งานอยู่เหมาะสม แต่ไม่มีผลกระทบใน UI ของฟิลด์หรือรูปแบบการแก้ไขโหนด

/**
 * เพิ่มทัวร์ชมสไลด์ที่อนุญาตใน DGM TV
 */
ฟังก์ชัน wt_dgm_update_9011(&$แซนด์บ็อกซ์) {
  /** @var $config Drupal\field\FieldConfigInterface */
  $config = Drupal\field\Entity\FieldConfig::loadByName('โหนด', 'dgmtv', 'field_slides');
  $handlerSettings = $config->getSetting('handler_settings');
  $allowedParagraphs = $handlerSettings['target_bundles'];
  ถ้า (!in_array('dgmtour', $allowedParagraphs)) {
    $dependencies = $config->get('การพึ่งพา');
    $dependencies['config'][] = 'paragraphs.paragraphs_type.dgmtour';
    $config->set('การพึ่งพา', $การพึ่งพา);
    $handlerSettings['target_bundles']['dgmtour'] = 'dgmtour';
    $handlerSettings['target_bundles_drag_drop']['dgmtour'] = ['เปิดใช้งาน' => จริง, 'น้ำหนัก' => 1234];
    $settings = $config->get('การตั้งค่า');
    $settings['handler_settings'] = $handlerSettings;
    $config->set('การตั้งค่า', $settings);
    $config->save();
  }
}

ฉันต้องทำอะไรอีกเพื่อให้ฟิลด์ใช้การกำหนดค่าใหม่

4uk4 avatar
cn flag
มีเหตุผลที่คุณโหลดฟิลด์ config ผ่าน config factory หรือไม่ อาจจำเป็นหากการกำหนดค่าของคุณมีภาษาต้นฉบับผสมกัน หากคุณไม่มีปัญหานี้ ให้ลองโหลดการกำหนดค่าโดยตรงผ่าน `FieldConfig::loadByName()`
ru flag
โดยส่วนตัวแล้วฉันพบว่า `ConfigFactory` ใช้งานได้สะดวกกว่ามาก เพราะมันอนุญาตให้จัดการ `$config->get('very.deep.nested.settings')` ได้โดยตรง และใช้ได้กับการกำหนดค่าใดๆ พยายามด้วย `FieldConfig` เช่นกัน ปัญหาเดียวกัน
ru flag
เอ้ย มันเป็นแค่การพิมพ์ผิดเกี่ยวกับทักษะการซ่อนตัวระดับนินจา: สิ่งที่เกี่ยวข้องหลักนั้นถูกต้อง แต่ฉันมีข้อผิดพลาดในส่วนที่เกี่ยวข้องกับวิดเจ็ตฟิลด์ย่อหน้าของการกำหนดค่า

โพสต์คำตอบ

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