修复 Magento 询盘组件在产品列表页不弹窗显示

更新日期: 2025-01-04 阅读次数: 153 字数: 529 分类: magento

在外贸站 Magento 主题中,使用了 bluethinkinc/magento2-module-product-enquiry 这个询盘组件。 在产品详情页是可以正常点击按钮进行询盘的。

但是在产品列表页,部分产品可以正常询盘。但是某些产品,点击了询盘组件之后,无法弹出询盘窗口。

问题出在哪里

看了一下页面的代码,发现这个询盘组件,会在产品框里增加一个询盘按钮,id 为产品的 sku。

问题就出在这里,因为 sku 中可能包含特殊的字符,例如空格,句号之类,导致生成了一个非法的 html 元素 id。

于是 js 的点击响应事件就无法触发了。

所以,需要修改一下插件的代码,来修复这个 bug.

修改哪个源码文件呢

cd vendor/bluethinkinc/magento2-module-product-enquiry/view/frontend
grep sku -r .

./templates/productenquiry-list.phtml:    id='sku<?= /* @noEscape */ $sku; ?>'>

php 代码测试

使用产品的 sku 作为 html 页面中 div 元素的 id,需要如何格式化才能使 id 的值符合变量命名规范,使用 php 实现. 先本地新建一个 PHP 文件测试一下:

<?php
function formatSkuForId($sku) {
    // 移除特殊字符,只保留字母、数字、下划线和破折号
    $formattedSku = preg_replace('/[^a-zA-Z0-9_-]/', '', $sku);
    // 将多个下划线或破折号替换为单个下划线
    $formattedSku = preg_replace('/_+|-+/', '_', $formattedSku);
    // 确保不以数字开头
    if (preg_match('/^[0-9]/', $formattedSku)) {
        $formattedSku = '_'. $formattedSku;
    }
    return $formattedSku;
}

// 示例使用
$sku = "ABC-123#456@XYZ";
$formattedId = formatSkuForId($sku);
echo '<div id="'. $formattedId. '">Product Information</div>';
?>

输出为

> php sku_id.php
<div id="ABC_123456XYZ">Product Information</div>

修改插件代码中的逻辑

在获取 sku 之后,加入下面的逻辑:

$formattedSku = preg_replace('/[^a-zA-Z0-9_-]/', '', $sku);
$formattedSku = preg_replace('/_+|-+/', '_', $formattedSku);
$sku = $formattedSku;

修改完插件 PHP 代码后

跟 composer 安装完插件一样,需要执行:

php bin/magento setup:upgrade
php bin/magento setup:di:compile
php bin/magento setup:static-content:deploy -f
php bin/magento cache:flush

只执行 static content deploy 是不行的。上面两个命令不能省掉。

微信关注我哦 👍

大象工具微信公众号

我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式