Điểm:0

Làm cách nào để tôi có thể chèn đúng trường đa giá trị?

lá cờ kz

Tôi có một mô-đun tùy chỉnh tạo loại trường. Đó là một trường văn bản thuần túy và tôi đã thêm nó vào một loại nội dung bằng giao diện người dùng Drupal. Bản số của trường này là "Không giới hạn".

Đây là cách tôi tạo trường trong mã:

lớp MyItem mở rộng FieldItemBase {

  /**
   * {@inheritdoc}
   */
  lược đồ hàm tĩnh công khai (FieldStorageDefinitionInterface $field_definition) {
    trở lại [
      'cột' => [
        'giá trị' => [
          'loại' => 'văn bản',
          'kích thước' => 'nhỏ',
          'không rỗng' => SAI,
        ],
        'giá trị an toàn' => [
          'loại' => 'văn bản',
          'kích thước' => 'nhỏ',
          'không rỗng' => SAI,
        ],
      ],
    ];
  }

  /**
   * {@inheritdoc}
   */
  public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
    $properties['value'] = DataDefinition::create('string')
      ->setLabel(t('Giá trị'));
    $properties['safevalue'] = DataDefinition::create('string')
      ->setLabel(t('Giá trị an toàn'))
      -> setComputing(TRUE);
    trả lại thuộc tính $;
  }

}

Như bạn có thể thấy, có hai cột: giá trị được cho là lưu trữ đầu vào thô của người dùng. giá trị an toàn được cho là lưu trữ một phiên bản dữ liệu đã được làm sạch.

Để thử nghiệm điều này. Tôi chỉ làm điều này bên trong hook_node_presave():

function mymodule_node_presave(\Drupal\Core\Entity\EntityInterface $entity) {
  switch ($entity->getBundle()) {
    trường hợp 'mybundle':
      $entity->field_myfield = ['một', 'hai', 'ba'];
      $entity->field_myfield->safevalue = ['one', 'two', 'three'];
      nghỉ;
  }
}

Nếu trường có lực lượng 1 (nghĩa là các giá trị được chèn là vô hướng), thì điều này hoạt động tốt.

Tuy nhiên, nếu tôi chèn mảng, khi tôi kiểm tra cơ sở dữ liệu và xem bảng nút__field_myfield, tôi thấy rằng các cột trường_myfield_valuetrường_myfield_safevalue cả hai tồn tại với cấu hình giống hệt nhau.

Nếu tôi tạo một nút bằng giao diện người dùng, tôi quan sát thấy điều này:

  • trường_myfield_value cột chứa ba hàng với các chuỗi 'một', 'hai' và 'ba'. Đúng rồi.
  • trường_myfield_safevalue có chuỗi 'Mảng' ở hàng đầu tiên và NULL ở hai hàng khác. Sai rồi.

Tôi đoán rằng điều khiến mọi thứ trở nên sai lầm là do đây là trường đa giá trị và tôi cần sử dụng một số hành động khác để đưa các giá trị vào chính xác.

Làm cách nào để tôi có thể chèn đúng trường đa giá trị vào giá trị an toàn cột?

Điểm:3
lá cờ cn

Vùng đồng bằng của trường cao hơn một cấp so với thuộc tính.

$entity->field_myfield = [
  0 => [
    'giá trị' => 'một',
    'giá trị an toàn' => 'một',
  ],
  1 => [
    'giá trị' => 'hai',
    'giá trị an toàn' => 'hai',
  ],
  2 => [
    'giá trị' => 'ba',
    'giá trị an toàn' => 'ba',
  ],
];

BTW khi bạn lưu thuộc tính trường thì không chỉ định> setComputed (TRUE). Điều này chỉ xảy ra khi bạn tính toán giá trị trường trong plugin dữ liệu đã nhập.

Free Radical avatar
lá cờ kz
Tôi không chắc mình có hiểu "BTW" của bạn không. Mục đích là *tính toán* các giá trị an toàn bằng cách chạy các giá trị thô thông qua một số chức năng khử trùng. Trong ví dụ này, tôi không làm điều này để giữ cho ví dụ đơn giản. Nếu tôi tính toán các giá trị an toàn như được mô tả, thì tôi có nên sử dụng `->setComputed(TRUE)` không?
4uk4 avatar
lá cờ cn
Các giá trị được tính toán được tính toán trong bộ nhớ, không được lưu vào cơ sở dữ liệu. Điều này thường được thực hiện trong plugin dữ liệu đã nhập (được chỉ định trong `DataDefinition::create()` hoặc được ghi đè trong `->setClass()`. Khi đó, bạn không gặp vấn đề gì với trường delta, vì dữ liệu đã nhập chi tiết hơn .
Free Radical avatar
lá cờ kz
OK, cảm ơn vì lời giải thích bổ sung. Tôi đã xóa tài sản.
Điểm:1
lá cờ cn

Khi bạn truy cập

$entity->field_myfield->safevalue

Đó ngầm hiểu là đầu tiên mục trong giá trị an toàn của danh sách trường. Bạn không đặt giá trị an toàn cho tất cả các vùng đồng bằng trong trường đó.

Để làm điều đó, bạn cần đặt riêng từng giá trị. Như vậy:

giá trị $ = [
  ['giá trị' => 'foo', 'giá trị an toàn' => 'thanh'],
  ['value' => 'foo2', 'safevalue' => 'bar2'],
];
$entity->field_myfield = $values;

Lưu ý rằng có một số hoán vị khác nhau ở trên, đây chỉ là một trong số đó, nếu kiểu mã thông thường của bạn để đặt thuộc tính thực thể khác thì bạn có thể sử dụng kiểu đó thay thế.

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