Magento 2.3.5保存类别时出现问题

问题描述

我在保存magento 2.3.5中的类别时遇到一些问题,当我在更改SEO信息(元标题,元描述和元关键字)后单击安全时,出现此错误

传递给Magento \ Catalog \ Model \ Category \ FileInfo :: removeStorePath()的参数1必须为字符串类型,给定数组,在/ home / adminpsol2016 / public_html / vendor / magento / module-catalog / Model /中调用167行上的Category / FileInfo.PHP

在这里您可以看到问题的屏幕截图。

Magento 2.3.5 Categories issues

解决方法

这让我很头疼,但最终还是搞清楚了;我的情况如下:

重现:

  • 使用 backend_model := Magento\Catalog\Model\Category\Attribute\Backend\Image 添加自定义类别属性
  • 无论出于何种原因,类别表单保存操作都失败了(例如,类别模型保存功能上有一个插件会引发异常)

原因:

如果您查看 https://github.com/magento/magento2/blob/2.4-develop/app/code/Magento/Catalog/Controller/Adminhtml/Category/Save.php#L240,您会发现这具有将当前表单请求的整个 POST 数据存储到会话的效果(LocalizedException 块也执行相同的操作)。 稍后,这些数据会在 https://github.com/magento/magento2/blob/2.4-develop/app/code/Magento/Catalog/Controller/Adminhtml/Category/Edit.php#L95 中恢复,并且紧接着 image 属性的表单信息被剥离/清除。 这当然不会处理我们可能为类别实体定义的任何图像类型的自定义属性。

解决方案:

我在 after* 上添加了一个 adminhtml 插件(仅在 \Magento\Framework\Session\SessionManager::__call 区域),我在其中明确检查调用的方法是否为 getCategoryData:如果是这种情况,我获取所有自定义类别图像属性,并像 Category/Edit 一样从返回的数组中删除它们。

这样,任何进一步的异常消息都会在后台正确显示(授予它扩展 LocalizedException