虽然我想找到实现这一目标的最佳方法,但我目前迫切希望找到任何方法来实现这一目标。我试图在我的主题文件中的预处理视图函数中获取图像文件名或 URI 值,但始终遇到障碍。我设法得到的最接近的是
$node->field_photo->entity;
,当我转储它时,我可以看到我想要获取的“文件名”或“uri”值,请参见下面的屏幕截图。
这是我迄今为止尝试过的:
#1)我尝试使用
$node->field_photo->entity->getFileUri();
#2)我尝试了以下方法:
$referenceItem = $node->get('field_photo')->referencedEntities();
$referenceItem[0]->values['filename']
问题:返回 null
#3)我尝试了以下方法:
$referencedEntity = $node
->get('field_photo')
->first()
->get('entity')
->getTarget()
->getValue();
问题:返回错误:在 null 上调用成员函数 get() 来获取“->get('entity')”
#4) 我尝试从“target_id”获取图像,但两个类都没有找到:
use Drupal\media\Entity\Media;
use Drupal\media_entity\Entity\Media;
问题:两个类都没有找到
#5)我尝试了以下方法:
// $id = some node ID
// $field = field name for entity reference field
$node = Node::load($id);
/** @var \Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem $referenceItem */
$referenceItem = $node->get($field)->first();
/** @var \Drupal\Core\Entity\Plugin\DataType\EntityReference $entityReference */
$entityReference = $referenceItem->get('entity');
/** @var \Drupal\Core\Entity\Plugin\DataType\EntityAdapter $entityAdapter */
$entityAdapter = $entityReference->getTarget();
/** @var \Drupal\Core\Entity\EntityInterface $referencedEntity */
$referencedEntity = $entityAdapter->getValue();
问题:错误:在 null 上调用成员函数 get() 来获取“->get('entity')”
#6)我还尝试了以下方法:
$node->field_photo->entity->field_media_image->entity->getFileUri();
问题:在 null 上调用成员函数 getFileUri() 返回错误
在 Drupal 上获取媒体图像 URI 的一种肮脏而快速的方法:
$media = current($node->get('field_media')->referencedEntities());
$uri = $media->field_media_image->entity->getFileUri();
这取决于您的图像媒体类型的字段名称。
请查看此页面:
/admin/structure/media/manage/image/fields
以获取字段名称。
假设字段名称为
field_media_image
,获取媒体图像文件 URI 的简洁且推荐的方法是:
public function getFileUriFromNode(Node $node) : string {
// File URI to return (empty string by default).
$uri = '';
// Node field media.
$field_media = $node->get('field_media');
// Check field not empty.
if ($field_media->isEmpty() === TRUE) {
return $uri;
}
// Media.
$media = current($field_media->referencedEntities());
// File.
$file = $media->field_media_image->entity;
// Check file exists.
if (empty($file) === TRUE) {
return $uri;
}
// File URI.
$uri = $file->getFileUri();
return $uri;
}
这涉及编写更多行代码,但确保您的代码永远不会生成致命错误(错误 500),让我们面对现实,这是一个很好的做法。
更进一步,如果您需要应用图像样式(例如调整大小或其他),然后获取应用了图像样式的图像 URI :
public function getImageStyleUri(Node $node) : string {
// Image style URI to return (empty string by default).
$style_uri = '';
// Same code that above to get media URI first.
$media_uri = $this->getFileUriFromNode($node);
// Check media URI.
if (empty($media_uri) === TRUE) {
return $style_uri;
}
// Load Drupal entity type manager.
$entityTypeManager = Drupal::entityTypeManager();
// Load image style by name.
$style = $entityTypeManager->getStorage('image_style')->load('100x50');
// Check that image style exists.
if (empty($style) === TRUE) {
return $style_uri;
}
else {
$style_uri = $style->buildUrl($uri);
}
return $style_uri;
}
请注意,从 PHP 8.0 版本开始,您可以使用 null 安全运算符:https://php.watch/versions/8.0/null-safe-operator
当对不是带有符号
?->
而不是 ->
的对象调用方法时,这个新运算符可以避免致命错误。
像这样:
// Generate a fatal error if one of these is null : media, field_media_image, entity.
$uri = $media->field_media_image->entity->getFileUri();
// Never generate fatal error. Will set $uri with NULL.
$uri = $media?->field_media_image?->entity?->getFileUri();
// The line above does the same that :
if ($media) {
if ($media->hasField('field_media_image')) {
if (!$media->get('field_media_image')->isEmpty()) {
if (method_exists($media->field_media_image->entity, 'getFileUri') {
return $media->field_media_image->entity->getFileUri();
}
}
}
}
非常实用,因为它节省了时间,提高了代码可读性并增加了代码执行的可靠性。