从节点上的field_image获取图像URL


42

所以我有这个节点:

object(Drupal\node\Entity\Node)[1862]
  protected 'values' => 
    array (size=17)
      'vid' => 
        array (size=1)
          'x-default' => string '7' (length=1)
      'langcode' => 
        array (size=1)
          'x-default' => 
            array (size=1)
              0 => 
                array (size=1)
                  'value' => string 'en' (length=2)
      ... (more fields)
      'field_image' => 
        array (size=1)
          'x-default' => 
            array (size=1)
              0 => 
                array (size=5)
                  'target_id' => string '1' (length=1)
                  'alt' => string '' (length=0)
                  'title' => string '' (length=0)
                  'width' => string '150' (length=3)
                  'height' => string '120' (length=3)

现在,field_image具有一个x-default数组和一些基本图像数据。如何显示图像,或在Twig模板中创建指向图像的链接?


没有时间检查,但可能很简单url(node.field_image.0.entity.uri)相关问题
克莱夫

@Clive我尝试了这个,并给了我这个错误:Recoverable fatal error: Object of class Drupal\Core\Field\FieldItemList could not be converted to string 所以我尝试了这个: url(node.field_image.0.entity.uri.value)但是然后它告诉了我:Twig_Error_Runtime: An exception has been thrown during the rendering of a template ("Route "public://image.png" does not exist.")
Rias

错误...我想这需要在预处理钩子中完成,除非有Twig帮助函数将FieldItemLists转换为字符串表示形式(我找不到)
Clive

哦,我知道了,url()想要一条路线。怎么url_from_path(node.field_image.0.entity.uri.value)
克莱夫(Clive)

url_from_path()似乎产生这样的:http://mywebsite.local/public%3A//image.png所以它似乎是URL编码和附加的精确值的url
里亚斯

Answers:


49

这是此答案的8.0.x之后的更新版本。这是基于@joelpittet的评论。

{{ file_url(node.field_image.entity.fileuri) }}

2
请注意,您将获得“未样式化”原始图像的URL,而不是特定于图像样式的URL(例如,缩略图)。除了弗拉基米尔(VladimirM)的答案,无法在树枝中获取正确样式的图像URL。至少目前如此...
菲利普·迈克尔

2
...形象风格,现以嫩枝调整- drupal.org/project/twig_tweak
4k4

1
File类具有一个url()方法,因此您可以直接调用entity.url()而不是传递entity.fileurifile_url()
Kiee

36

我不了解Twig,但是您$node->field_image->entity->getFileUri()在PHP中获得了带有文件URI的文件,您需要file_create_url()对此进行调用:

file_create_url($node->field_image->entity->getFileUri())

我不知道这在树枝上是否可行。如果不可能,则始终可以在预处理中对其进行计算并添加为新变量。


2
我们正在尝试将file_create_url()纳入核心,但缺乏兴趣使问题变得陈旧。 drupal.org/node/2168231尽管应该进入{{file_url(node.field_image.entity.fileuri)}}
joelpittet 2014年

26

如果有人需要样式图像:

$styled_image_url = ImageStyle::load('large')->buildUrl($node->field_image->entity->getFileUri());

4
这是一个很好的答案。请注意,在您的.theme.module文件中,您需要将其添加到顶部:use Drupal\image\Entity\ImageStyle;
mikeDOTexe

2
我遇到了https的问题,因为Safari使用IP代替,因此Safari不会显示图像。您可能需要添加$relative = file_url_transform_relative($styled_image_url);以确保它是相对的。这里的API
mikeDOTexe

9

以上所有树枝解决方案都不适合我(也许那些适用于旧版8.x,但不适用于8.5版)

{{ file_url(node.field_image['#items'].entity.uri.value) }}

注意:应该适用于Drupal 8.5+


我认为不好的是过一会儿这些东西就被弃用了。升级Drupal应该可以使它们继续工作!谢谢,这在Drupal 8.6中对我有效。
Stef Van Looveren

7

所以我在Clive的帮助下找到了答案。

使用以下方法在Twig中获取图像URI: node.field_image.0.entity.uri.value

获取图像的完整URL可以使用 file_create_url(node.field_image.0.entity.uri.value)

目前尚无法在Twig中执行此操作,但他们正在努力-> 参见此处


6

在D8中最终为我工作的是:

$imageUrl = $node->get('field_image')->entity->uri->value;

使用kint($node->get('field_image')->entity)和查看数组非常有帮助

在此处输入图片说明

然后在我的树枝文件中使用:

<img class="top-article-image" src="{{ file_url(imageUrl) }}" />

如果没有图像插入并且我们设置了默认值该怎么办。
2017年


2

我一直在使用辅助功能

  /**
   * Get the Image URI.
   *
   * @param \Drupal\Core\Entity\Entity $entity
   * @param $fieldName
   * @param bool $imageStyle
   * @return mixed
   */
  public function getImageUri(\Drupal\Core\Entity\Entity $entity, $fieldName, $imageStyle = FALSE) {
    $imageField = $entity->get($fieldName)->getValue();
    if (!empty($imageField[0]['target_id'])) {
      $file = File::load($imageField[0]['target_id']);
      if ($imageStyle) {
        return ImageStyle::load($imageStyle)->buildUrl($file->getFileUri());
      }

      // Original URI.
      return file_create_url($file->getFileUri());
    }
  }

1

如果要获取树枝模板中任何图像字段的图像URL及其相关的图像样式,可以采用以下方法:

首先安装Twig Tweak模块

然后将图像URI设置为变量。使用URI,您可以使用细枝调整模式来获取具有所需图像样式的路径。见下文:

{% set image_uri = content.field_feature_row_image['#items'].entity.uri.value %}

<img src="{{ image_uri|image_style('image1200x1103') }}"/>

Twig Tweak v2.4 +提供了file_url用于从实体提取文件URL的过滤器。

<img src="{{ node.field_image|file_url|image_style('image1200x1103') }}"/>

0

我遇到了同样的问题,因此我创建了一个get_image_path()Twig函数,并将其与其他一些有用的东西添加到我的样板启动器模块中:

https://github.com/brynj-digital/starter

该函数接受图像字段和图像样式的机器名称,然后返回该图像路径。

它工作在很多环境中的-你可以传递node.field_namecontent.field_namerow._entity.field_name(在视野模板的情况下)。


0

天哪,实际上我花了很长时间才弄清楚为什么我的最终URL无法正常工作。所有404版本。如果它尚不存在,则需要先创建它

因此,例如,当您稍后添加图像样式时,原始图像上传后,便没有样式图像文件(图像派生)。首先需要创建它。

根据需要更换field_MYIMAGEMYSTYLE

$original_image = $node->field_MYIMAGE->entity->getFileUri();
$style = \Drupal::entityTypeManager()->getStorage('image_style')->load('MYSTYLE');

$destination = $style->buildUri($original_image);
if (!file_exists($destination)) {
  $style->createDerivative($original_image, $destination);
}

$url = $style->buildUrl($original_image);

我希望这会自动发生。


0

有点相关,这是我用来(通过所有先前的答案使我到达那里)从树枝中的媒体实体的图像字段获取图像文件URL的内容:

{% set media_img_url = file_url(content.field_media_image.0['#item'].entity.uri.value) %}

现在我可以在树枝模板中使用此变量

{{ media_img_url }}

0

要获取图像属性(例如URI,alt,title等),请使用以下模板明智的语法

在节点树枝模板中

{{node.field_name.entity.fileuri}}

现场树枝模板

{{content.field_name.entity.fileuri}}

在其他领域的树枝模板

{{element['#object'].field_name.entity.fileuri}}

注意:还要检查twig_tweaks模块备忘单,以获取与twig相关问题有关的详细信息。


0

您可以url()将File类上的方法用作快捷方式,以便:

{{ file_url(node.field_image.entity.fileuri) }}

可以缩短为:

{{ node.field_image.entity.url }}

这适用于预处理功能,但Twig_Sandbox_SecurityError在树枝模板中调用时会触发。

如果收到,Twig_Sandbox_SecurityError您可以告诉Twig允许url在该Stackoverflow帖子中提及的settings.php文件中允许

请参阅有关File :: Url()的文档https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/function/File%3A%3Aurl/8.6.x


-4

您可以通过两种方式做到这一点!

1)file_create_url(---------)//里面写节点的路径

2)file_url(-------)//里面写节点的路径

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.