You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Drupal Twig中获取图片URL(含/不含Node场景)

Drupal中Twig获取图片URL的两种场景解决方案(不使用Node/使用Node)

一、不使用Node的场景(直接从表单值处理)

你当前的核心问题是:$form_state->getValue('image1')返回的是文件ID数组(格式类似[123]),而非直接可用的图片URL。必须先加载文件实体,再生成可访问的URL。

方法1:PHP端预处理后传递给Twig

修改表单值处理逻辑,提前生成URL再传入模板:

// 获取表单提交的文件ID数组
$image_fids = $form_state->getValue('image1');
$image_url = '';

if (!empty($image_fids)) {
    // 加载第一个文件(managed_file默认单文件模式)
    $file = \Drupal\file\Entity\File::load(reset($image_fids));
    if ($file) {
        // 生成绝对URL,如需相对URL改用generateString()
        $image_url = \Drupal::service('file_url_generator')->generateAbsoluteString($file->getFileUri());
    }
}

// 把处理好的URL传入模板数组
$form_array = [
    'img1_url' => $image_url,
];

Twig模板中直接使用:

{% if form_array.img1_url %}
  <img src="{{ form_array.img1_url }}" style="width:100%">
{% endif %}

方法2:Twig模板内直接处理(推荐优先用PHP预处理)

若需在Twig中直接处理,先确保文件ID已传入模板,再用Drupal内置Twig函数:

{% if form_array.img1 is not empty %}
  {% set file = file_load(form_array.img1|first) %}
  {% if file %}
    <img src="{{ file_url(file.uri) }}" style="width:100%">
  {% endif %}
{% endif %}

二、使用Node的场景(从节点字段获取)

节点的field_image1字段存储的是文件引用关系,可通过以下方式获取URL:

方法1:PHP端预处理节点数据

从节点对象中加载文件实体并生成URL,再传递给Twig:

// 假设已加载目标节点$node
$image_url = '';

if ($node->hasField('field_image1') && !$node->get('field_image1')->isEmpty()) {
    $file = $node->get('field_image1')->entity;
    if ($file) {
        $image_url = \Drupal::service('file_url_generator')->generateAbsoluteString($file->getFileUri());
    }
}

// 将URL或节点对象传入模板构建数组
$build = [
    '#theme' => 'theme_project',
    '#image_url' => $image_url,
    '#node' => $node, // 也可直接传节点对象给Twig
];

方法2:Twig直接从节点字段获取(更简洁)

若已将节点对象传入Twig,可直接通过字段关系获取URL:

{% if node.field_image1 is not empty %}
  {# 生成相对URL #}
  <img src="{{ node.field_image1.entity.uri.value|file_url }}" style="width:100%">
  {# 生成绝对URL #}
  <img src="{{ node.field_image1.entity.uri.value|file_url(true) }}" style="width:100%">
{% endif %}

推荐使用Drupal内置的图片格式化输出(自动处理懒加载、响应式等特性):

{% if node.field_image1 is not empty %}
  {{ node.field_image1|view }}
{% endif %}

如需自定义样式,可指定视图模式:

{{ node.field_image1|view('large') }}

你之前代码失败的原因

  1. 直接输出form_array.img1得到的是文件ID数组,浏览器无法解析为有效URL;
  2. 尝试$form_state->getValue('field_image1')是错误逻辑:field_image1是节点字段名,表单提交的字段名是image1,且节点字段值需从节点对象中获取,而非直接从form_state读取。

内容的提问来源于stack exchange,提问作者newb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 04:08:17