Score:0

ฉันจะใส่ฟิลด์หลายค่าอย่างถูกต้องได้อย่างไร

ธง kz

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

นี่คือวิธีที่ฉันสร้างฟิลด์ในรหัส:

คลาส MyItem ขยาย FieldItemBase {

  /**
   * {@inheritdoc}
   */
  สคีมาของฟังก์ชันสแตติกสาธารณะ (FieldStorageDefinitionInterface $field_definition) {
    กลับ [
      'คอลัมน์' => [
        'ค่า' => [
          'ประเภท' => 'ข้อความ',
          'ขนาด' => 'เล็ก',
          'ไม่เป็นโมฆะ' => FALSE
        ]
        'ค่าที่ปลอดภัย' => [
          'ประเภท' => 'ข้อความ',
          'ขนาด' => 'เล็ก',
          'ไม่เป็นโมฆะ' => FALSE
        ]
      ]
    ];
  }

  /**
   * {@inheritdoc}
   */
  คุณสมบัติฟังก์ชันคงสาธารณะคำนิยาม (FieldStorageDefinitionInterface $field_definition) {
    $properties['value'] = DataDefinition::create('สตริง')
      ->setLabel(t('ค่า'));
    $properties['safevalue'] = DataDefinition::create('สตริง')
      ->setLabel(t('มูลค่าที่ปลอดภัย'))
      ->setComputed(จริง);
    ส่งคืนคุณสมบัติ $;
  }

}

อย่างที่คุณเห็นมีสองคอลัมน์: ค่า ควรจะเก็บข้อมูลดิบของผู้ใช้ มูลค่าความปลอดภัย ควรจะจัดเก็บข้อมูลในเวอร์ชันที่ผ่านการฆ่าเชื้อแล้ว

สำหรับการทดสอบนี้ ฉันแค่ทำสิ่งนี้ภายใน hook_node_presave():

ฟังก์ชัน mymodule_node_presave (\ Drupal\Core\Entity\EntityInterface $entity) {
  สวิตช์ ($entity->getBundle()) {
    กรณี 'mybundle':
      $entity->field_myfield = ['หนึ่ง', 'สอง', 'สาม'];
      $entity->field_myfield->safevalue = ['หนึ่ง', 'สอง', 'สาม'];
      หยุดพัก;
  }
}

หากฟิลด์มีจำนวนสมาชิกเป็น 1 (เช่น ค่าที่แทรกเป็นสเกลาร์) วิธีนี้ใช้ได้ดี

อย่างไรก็ตาม ถ้าฉันแทรกอาร์เรย์ เมื่อฉันตรวจสอบฐานข้อมูล และดูที่ตาราง node__field_myfieldฉันเห็นว่าคอลัมน์ field_myfield_value และ field_myfield_safevalue ทั้งสองมีอยู่ด้วยการกำหนดค่าที่เหมือนกัน

ถ้าฉันสร้างโหนดโดยใช้ UI ฉันจะสังเกตสิ่งนี้:

  • field_myfield_value คอลัมน์มีสามแถวที่มีสตริง 'หนึ่ง' 'สอง' และ 'สาม' ถูกต้อง.
  • field_myfield_safevalue มีสตริง 'Array' ในแถวแรกและ NULL ในอีกสองแถว นั่นผิด

ฉันเดาว่าสิ่งที่ทำให้สิ่งต่าง ๆ ผิดพลาดคือฟิลด์นี้มีหลายค่าและฉันต้องใช้การกระทำอื่นเพื่อใส่ค่าให้ถูกต้อง

ฉันจะใส่ฟิลด์หลายค่าอย่างถูกต้องในไฟล์ได้อย่างไร มูลค่าความปลอดภัย คอลัมน์?

Score:3
ธง cn

เดลตาของฟิลด์นั้นสูงกว่าคุณสมบัติหนึ่งระดับ

$entity->field_myfield = [
  0 => [
    'ค่า' => 'หนึ่ง',
    'safevalue' => 'หนึ่ง',
  ],
  1 => [
    'value' => 'สอง',
    'safevalue' => 'สอง',
  ],
  2 => [
    'value' => 'สาม',
    'safevalue' => 'สาม',
  ],
];

BTW เมื่อคุณบันทึกคุณสมบัติของฟิลด์ อย่าระบุ >setComputed(TRUE) นี่เป็นเฉพาะเมื่อคุณคำนวณค่าฟิลด์ในปลั๊กอินข้อมูลที่พิมพ์

Free Radical avatar
kz flag
ฉันไม่แน่ใจว่าฉันเข้าใจ "BTW" ของคุณหรือไม่ จุดประสงค์คือเพื่อ *คำนวณ* ค่าที่ปลอดภัยโดยการเรียกใช้ค่าดิบผ่านฟังก์ชันการฆ่าเชื้อบางอย่าง ในตัวอย่าง ฉันไม่ได้ทำเช่นนี้เพื่อให้ตัวอย่างง่าย หากฉันคำนวณค่าที่ปลอดภัยตามที่อธิบายไว้ ฉันไม่ควรใช้ `->setComputed(TRUE)` หรือไม่
4uk4 avatar
cn flag
ค่าที่คำนวณได้จะคำนวณในหน่วยความจำ ไม่ได้บันทึกลงในฐานข้อมูล โดยปกติจะทำในปลั๊กอินข้อมูลที่พิมพ์ (ระบุไว้ใน `DataDefinition::create()` หรือแทนที่ใน `->setClass()` คุณไม่มีปัญหากับเดลตาของฟิลด์ เนื่องจากข้อมูลที่พิมพ์มีความละเอียดมากกว่า .
Free Radical avatar
kz flag
ตกลง ขอบคุณสำหรับคำอธิบายเพิ่มเติม ฉันได้นำทรัพย์สินออกแล้ว
Score:1
ธง cn

เมื่อคุณเข้าถึง

$entity->field_myfield->safevalue

นั้นเป็นไปโดยปริยาย แรก รายการในค่าที่ปลอดภัยของรายการฟิลด์ คุณไม่ได้ตั้งค่าที่ปลอดภัยสำหรับส่วนต่างทั้งหมดในฟิลด์นั้น

ในการทำเช่นนั้น คุณต้องตั้งค่าแต่ละค่าแยกกัน เช่น:

$ค่า = [
  ['value' => 'foo', 'safevalue' => 'บาร์'],
  ['value' => 'foo2', 'safevalue' => 'bar2'],
];
$entity->field_myfield = $values;

โปรดทราบว่ามีการเรียงสับเปลี่ยนที่แตกต่างกันหลายอย่างข้างต้น นี่เป็นเพียงหนึ่งในนั้น หากรูปแบบโค้ดปกติของคุณสำหรับการตั้งค่าคุณสมบัติของเอนทิตีแตกต่างกัน คุณสามารถใช้สิ่งนั้นแทนได้

โพสต์คำตอบ

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