Điểm:0

Phần tử tệp được quản lý trong mô-đun trường tùy chỉnh không lưu id đích

lá cờ in

Tôi đã suy nghĩ về vấn đề này trong vài ngày nay. Sử dụng Drupal 9.2.x, tôi đang xây dựng mô-đun trường tùy chỉnh cho ứng dụng khách có nhiều trường. Hiện tại, tôi đã tách riêng sự cố bằng cách chỉ bao gồm một trường tệp được quản lý vì các trường khác không gây ra sự cố này.

Tôi đã xác định một phần tử tệp được quản lý trong lớp Widget của mình, lớp này mở rộng WidgetBase:

hàm công khai formElement(FieldItemListInterface $items, $delta, mảng $element, mảng &$form, FormStateInterface $form_state) {

    $element['target_id'] = [
      '#type' => 'tệp được quản lý',
      '#title' => $this->t('Hình bên phải'),
      '#upload_location' => 'public://disco-field-images/',
      '#upload_validators' => mảng(
        'file_validate_extensions' => mảng('gif png jpg jpeg')
      ),
      '#default_value' => mảng($items[$delta]->target_id),
    ];

    trả lại phần tử $;

  }

Tôi đã định nghĩa lược đồ của mình như sau trong lớp Mục của mình:

 lược đồ hàm tĩnh công khai (FieldStorageDefinitionInterface $field_definition) {
trở lại [
  'cột' => [
    'id_mục tiêu' => [
      'description' => 'ID của thực thể tệp',
      'loại' => 'int',
      'không dấu' => ĐÚNG,
    ],
  ],
  'chỉ mục' => [
    'id_mục_tiêu' => ['id_mục_tiêu'],
  ],
  'khóa ngoại' => [
    'id_mục tiêu' => [
      'bảng' => 'file_managed',
      'cột' => ['id_mục tiêu' => 'fid'],
    ],
  ],
];

}

Và cuối cùng, tôi đã thêm một định nghĩa thuộc tính cho trường:

public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {

$properties['target_id'] = ListDataDefinition::create('integer')
  ->setLabel(t('ID mục tiêu'))
  -> setRequired(FALSE);

 trả lại thuộc tính $;

  }

Bằng cách nào đó, điều này dẫn đến việc tệp được tải lên bảng tệp được quản lý, nhận được fid và tất cả đều ổn từ đó. Tuy nhiên, bảng trường (node__fieldname) chứa target_id tham chiếu đến bảng file_managed bằng cách nào đó luôn mặc định là 1. Vì vậy, không có tham chiếu nào được tạo cho tệp đã tải lên. Tôi đã thử làm việc với các định nghĩa thuộc tính khác:

    $properties['target_id'] = DataDefinition::create('integer')
  ->setLabel(t('ID mục tiêu'));

$properties['target_id'] = DataReferenceTargetDefinition::create('integer')
 ->setLabel('Tệp được quản lý tham chiếu khóa ngoại')
 ->setSetting('không dấu', TRUE)
 -> setRequired(FALSE);

Nhưng không có may mắn ở đó. Tuy nhiên, có vẻ hơi lạ đối với tôi, id mục tiêu cơ sở dữ liệu cần phải là số nguyên và tiện ích tải lên tệp hoạt động với một mảng. Đó là lý do tại sao tôi nhắm đến các định nghĩa/lược đồ thuộc tính như một nguyên nhân ở đây. Nếu tôi cố gắng làm việc với một giá trị thuộc tính int:

DataDefinition::create('số nguyên')

Tôi gặp lỗi kiểu nguyên thủy vì phần tử tệp được quản lý mong đợi một mảng. Bất kỳ đề xuất? Cảm ơn!

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