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

通过Twig覆盖JS插件选项时响应式设置类型转换问题

解决Twig模板中JS配置空对象被转为数组导致插件异常的问题

问题场景

通过Twig模板覆盖JS插件配置时,startTabIndex和startModel参数能正常生效,但清空responsive下的子配置项(设为空对象)后,配置合并出现类型转换:原本的空对象被转为数组,导致插件的getSettings函数无法正常工作。给responsive子配置设置具体值时则运行正常。

原JS插件配置:

static options = {
    configurator: {
        startTabIndex: 0,
        startModel: null,
        responsive: {
            xs: {
                startTabIndex: 1,
                startModel: 1
            },
            sm: {
                startTabIndex: 1,
                startModel: 1
            },
            md: {
                startTabIndex: 1,
                startModel: 1
            },
            lg: {},
            xl: {},
            xxl: {},
        },
    }
}

无效的Twig覆盖代码:

{% set configuratorOptions = {
    configurator: {
        startTabIndex: 1,
        startModel: 10,
        responsive: {
            xs: {},
            sm: {},
            md: {},
            lg: {},
            xl: {},
            xxl: {},
        },
    }
} %}

data-product-configurator-options="{{ configuratorOptions|json_encode }}"

合并后的异常配置:

{
    "configurator": {
        "startTabIndex": 1,
        "startModel": 10,
        "responsive": {
            "0": [],
            "576": [],
            "768": [],
            "992": [],
            "1200": [],
            "undefined": []
        }
    }
}

原因分析

Twig中使用{}定义的空配置项在PHP中会被解析为空数组,而PHP的json_encode函数默认会将空数组序列化为JSON数组([]),而非JSON对象({})。JS插件的配置合并逻辑期望responsive的子项是对象类型,当接收到数组时,会错误地将断点名称(如xs/sm)映射为对应的像素值索引,导致类型转换异常。

解决方案

在Twig的json_encode过滤器中添加JSON_FORCE_OBJECT参数,强制将所有数组序列化为JSON对象,即使是空数组也会转为{}:

{% set configuratorOptions = {
    configurator: {
        startTabIndex: 1,
        startModel: 10,
        responsive: {
            xs: {},
            sm: {},
            md: {},
            lg: {},
            xl: {},
            xxl: {},
        },
    }
} %}

data-product-configurator-options="{{ configuratorOptions|json_encode(constant('JSON_FORCE_OBJECT')) }}"

验证效果

添加参数后,responsive下的空配置项会被正确序列化为JSON对象:

{
    "configurator": {
        "startTabIndex": 1,
        "startModel": 10,
        "responsive": {
            "xs": {},
            "sm": {},
            "md": {},
            "lg": {},
            "xl": {},
            "xxl": {}
        }
    }
}

此时JS插件的合并逻辑能正确识别对象类型,getSettings函数可正常工作。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 22:57:35