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

Laravel9 Blade使用Str::of截取Summernote数据返回空值问题

问题原因
  • 字段写入异常:对应模型未将product_description加入$fillable白名单、表单验证规则拦截、XSS防护过滤了提交的富文本内容,导致数据库中该字段实际存储值为NULL或空字符串,调取自然无内容。
  • 截断逻辑不匹配富文本场景:你使用的Str::of($item->product_description)->limit(40)是针对纯文本设计的截断方法,Summernote存储的内容包含大量HTML标签,前40个字符很可能全是标签代码(比如<p class="content" style="font-size:14px">这类),标签本身不会在页面渲染显示,最终输出的可见内容为空;如果截断位置刚好落在HTML标签内部,还会造成标签未闭合,浏览器解析失败直接不显示后续内容。
  • 多字节字符截断异常:Str::limit默认按单字节计数,若描述内容以中文等多字节字符开头,截断时可能出现字符截断乱码,导致内容无法正常显示。
解决方案
  • 第一步:先确认数据库实际存储值
    调试阶段先输出字段原始值,确认内容是否真的写入数据库:
    // 临时调试代码,验证完成后删除
    dd($item->getRawOriginal('product_description'));
    
    如果输出为NULL,先修改对应模型,将字段加入白名单:
    // 对应商品模型文件
    protected $fillable = [
        // 其余已配置字段...
        'product_description',
    ];
    
    同时检查表单验证规则、XSS过滤配置,确保富文本内容可以正常提交入库。
  • 第二步:替换富文本场景的截断逻辑
    不要直接对带HTML标签的富文本用原生字符串截断,先处理标签再做安全截断。如果不需要保留富文本格式,直接剥离标签后截断即可,替换Blade代码为:
    {!! Str::limit(strip_tags($item->product_description), 40, '...') !!}
    
    如果需要保留基础文本格式,先自定义HTML安全截断方法,避免截断后标签未闭合:
    1. 新建app/helpers.php文件,写入以下函数:
    <?php
    if (!function_exists('rich_text_limit')) {
        function rich_text_limit($content, $length = 40, $suffix = '...')
        {
            // 配置允许保留的基础标签
            $allowTags = '<p><br><strong><b><em><i><u><span>';
            $content = trim(strip_tags($content, $allowTags));
            if (mb_strlen(trim(strip_tags($content))) <= $length) {
                return $content;
            }
            // 按多字节规则截断纯文本部分,避免乱码
            $plainText = trim(strip_tags($content));
            $truncatedText = mb_substr($plainText, 0, $length) . $suffix;
            return $truncatedText;
        }
    }
    
    1. 在composer.json的autoload配置中加载该辅助文件:
    "autoload": {
        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/"
        },
        "files": [
            "app/helpers.php"
        ]
    }
    
    1. 执行composer dump-autoload生效后,Blade中调用自定义方法即可:
    {!! rich_text_limit($item->product_description, 40) !!}
    
  • 第三步:校验Summernote提交逻辑
    确认Summernote初始化时配置了内容同步,避免提交时空值传到后端:
    $('#product-description').summernote({
        height: 300,
        // 其余配置...
        callbacks: {
            onBlur: function() {
                // 失焦时将编辑器内容同步到关联的textarea
                $(this).val($(this).summernote('code'));
            }
        }
    });
    
    表单提交前可通过控制台打印字段值,确认内容正常获取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 02:18:14