Drupal 8 获取图像文件名或URI

问题描述 投票:0回答:1

虽然我想找到实现这一目标的最佳方法,但我目前迫切希望找到任何方法来实现这一目标。我试图在我的主题文件中的预处理视图函数中获取图像文件名或 URI 值,但始终遇到障碍。我设法得到的最接近的是

$node->field_photo->entity;
,当我转储它时,我可以看到我想要获取的“文件名”或“uri”值,请参见下面的屏幕截图。

这是我迄今为止尝试过的:

#1)我尝试使用

$node->field_photo->entity->getFileUri();

问题:返回错误:在 null 上调用成员函数 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-8
1个回答
0
投票

简短回答

在 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),让我们面对现实,这是一个很好的做法。

获取 Drupal Node 媒体图像样式 URI。

更进一步,如果您需要应用图像样式(例如调整大小或其他),然后获取应用了图像样式的图像 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 中的致命错误

请注意,从 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();
      }
    }
  }
}

非常实用,因为它节省了时间,提高了代码可读性并增加了代码执行的可靠性。

© www.soinside.com 2019 - 2024. All rights reserved.