Nếu bạn có một trang web có nội dung được điền bằng trường loại tệp/hình ảnh và muốn chuyển đổi nó sang sử dụng loại trường Phương tiện, bạn cần tạo một trường loại phương tiện mới và điền lại tất cả nội dung hình ảnh. Điều này không thực tế đối với một trang web có nhiều nội dung, vì vậy chúng tôi đã nghĩ ra một phương pháp sử dụng tập lệnh cập nhật để tự động điền trường phương tiện mới từ loại trường tệp/hình ảnh cũ
Sự chuẩn bị
Nếu bạn chưa có, bước đầu tiên là tạo thực thể Phương tiện của bạn. Sau đó, tạo trường tham chiếu phương tiện mới trên loại nội dung hiện tại của bạn
Chuyển thành
Bây giờ hãy đặt đoạn mã sau [được sửa đổi cho các giá trị loại nội dung và trường của bạn] vào một mô-đun tùy chỉnh và chạy tập lệnh cập nhật của Drupal [/update. php hoặc "drush updb"]
Đôi khi, có thể hữu ích khi truy cập URI thô hoặc URL tệp của hình ảnh được tải lên bằng trường tham chiếu Phương tiện trong Drupal 8
Bạn có thể yêu cầu URL cho tệp hình ảnh thay vì muốn Drupal hiển thị hình ảnh và đánh dấu HTML xung quanh với nó
Để thực hiện điều này trong mẫu nút bằng Twig, chỉ cần sử dụng cú pháp sau, thay thế tên trường bằng tên máy của trường Phương tiện tùy chỉnh của bạn
use Drupal\media\Entity\Media;
use Drupal\file\Entity\File;
$media = Media::load[$mid];
$fid = $media->field_media_image->target_id;
$file = File::load[$fid];
$url = $file->url[];
$image_url = $media->field_media_image->entity->getFileUri[];
file_create_url[$image_url];
Có bất kỳ ví dụ mã còn lại?
Ví dụ về mã mới trong danh mục Khác
drupal
Sử dụng Phương tiện trong Drupal [phiên bản 8, 9 và 10] là một lựa chọn tốt hơn nhiều so với việc sử dụng các trường hình ảnh kiểu cũ. Bạn có thể thêm tất cả các loại trường vào Phương tiện để làm phong phú hình ảnh, video và các loại phương tiện khác với thông tin bổ sung và bạn cũng có thể sử dụng lại Phương tiện. Tất cả điều đó không thể dễ dàng thực hiện nếu bạn đang sử dụng các trường hình ảnh thông thường
Cũng giống như các loại Nội dung, bạn có thể có nhiều loại Phương tiện khác nhau. Theo mặc định khi bạn bật mô-đun Phương tiện, bạn sẽ nhận được các loại sau
Hình ảnh
Nếu bạn phân tích loại Phương tiện hình ảnh, bạn sẽ thấy rằng theo mặc định chỉ có một trường. Trường đó là field_media_image thuộc loại Hình ảnh. Hãy thêm một số trường bổ sung để làm phong phú hình ảnh của chúng tôi và cung cấp nhiều thông tin hữu ích hơn cho người dùng của chúng tôi. Trong ảnh chụp màn hình sau, bạn có thể thấy rằng tôi đã thêm các trường Tác giả, Ngày và Vị trí.
Hình ảnh
Trước khi chúng ta tiếp tục với việc tạo các thực thể Phương tiện theo chương trình, bạn cũng có thể xem bài viết của tôi về cách chuyển đổi các trường hình ảnh hiện có thành hình ảnh phương tiện. Khá dễ dàng để viết một móc cập nhật sẽ tự động thực hiện chuyển đổi
Để lập trình lưu một thực thể phương tiện thuộc loại hình ảnh, bạn có thể làm điều gì đó như thế này
use Drupal\media\Entity\Media;
$image_id = 1;
$image_media = Media::create[[
'name' => 'My media name',
'bundle' => 'image',
'uid' => 1,
'langcode' => 'en',
'status' => 0,
'field_media_image' => [
'target_id' => $image_id,
'alt' => t['My media alt attribute'],
'title' => t['My media title attribute'],
],
'field_author' => 'Goran Nikolovski',
'field_date' => '2025-12-31T23:59:59',
'field_location' => 'Subotica',
]];
$image_media->save[];
Ví dụ trên giả định rằng bạn có ID tệp hình ảnh. Đây có thể là trường hợp khi bạn đang chuyển đổi các trường hình ảnh thành phương tiện. Nhưng bạn cũng có thể tạo và lưu tệp hình ảnh trong Drupal theo lập trình
use Drupal\media\Entity\Media;
use Drupal\Core\File\FileSystemInterface;
$image_data = file_get_contents['//gorannikolovski.com/themes/custom/gn2021/images/goran-nikolovski-signature.png'];
$file_repository = \Drupal::service['file.repository'];
$image = $file_repository->writeData[$image_data, "public://goran-nikolovski-signature.png", FileSystemInterface::EXISTS_REPLACE];
$image_media = Media::create[[
'name' => 'My media name',
'bundle' => 'image',
'uid' => 1,
'langcode' => 'en',
'status' => 0,
'field_media_image' => [
'target_id' => $image->id[],
'alt' => t['My media alt attribute'],
'title' => t['My media title attribute'],
],
'field_author' => 'Goran Nikolovski',
'field_date' => '2025-12-31T23:59:59',
'field_location' => 'Subotica',
]];
$image_media->save[];
Như bạn có thể thấy, việc tạo một thực thể phương tiện rất giống với việc tạo các thực thể khác trong Drupal. Nếu bạn nhìn kỹ hơn, bạn sẽ thấy rằng chúng tôi không có tiêu đề và loại fields like nodes have, but instead, we have name and bundle fields.
Như thường lệ, bạn không cần phải mã hóa cứng uid và langcode values. You can set the current user ID and the current language code:
$current_user_id = \Drupal::currentUser[]->id[];
$language_code = \Drupal::languageManager[]->getCurrentLanguage[]->getId[];
Làm cách nào để tạo một thực thể video YouTube theo chương trình?
Để làm điều này, bạn phải sử dụng loại phương tiện Video từ xa .
use Drupal\media\Entity\Media;
$video_media = Media::create[[
'bundle' => 'remote_video',
'uid' => 1,
'name' => 'DrupalCon Prague 2022 Driesnote',
'field_media_oembed_video' => [
'value' => '//www.youtube.com/watch?v=Hmit4ET-l3Q',
],
]];
$video_media->save[];
Cuối cùng, bạn có thể đính kèm thực thể phương tiện đã tạo vào một số thực thể khác. Trong ví dụ sau, chúng tôi đang đính kèm nó vào loại nội dung trang Cơ bản
use \Drupal\node\Entity\Node;
$node = Node::create[[
'type' => 'page',
'title' => 'My media parent node',
'field_youtube' => [
'target_id' => $video_media->id[],
],
]];
$node->save[];
Mô-đun phương tiện đã được thêm vào lõi Drupal trong phiên bản 8. 4 [5 năm trước] vì vậy đã đến lúc tất cả chúng ta bắt đầu sử dụng nó