Magento 2.3.5 выдает проблемы с сохранением категорий
У меня есть некоторые проблемы с сохранением категорий в Magento 2.3.5, когда я нажимаю безопасно после изменения информации SEO (Meta Title, Meta description и Meta Keyowrds), выдает эту ошибку.
Аргумент 1, передаваемый в Magento\Catalog\Model\Category\FileInfo::removeStorePath(), должен быть строкового типа, заданного массива, вызываемого в /home/adminpsol2016/public_html/vendor/magento/module-catalog/Model/Category/FileInfo.php в строке 167
здесь вы можете увидеть скриншот проблемы.
2 ответа
Это вызвало у меня головную боль, но, наконец, мне удалось разобраться в этом; мой случай выглядит следующим образом:
Репродукция:
- добавить настраиваемый атрибут категории с
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 текущего запроса формы к сеансу (также блок делает то же самое). Позже эти данные восстанавливаются в https://github.com/magento/magento2/blob/2.4-develop/app/code/Magento/Catalog/Controller/Adminhtml/Category/Edit.php#L95 и сразу после формы информация для
image
атрибут удален / очищен. Это, конечно, не обрабатывает какой-либо настраиваемый атрибут типа Image, который мы могли бы определить для нашей сущности категории.
Решение:
Я добавил
after*
плагин (в
adminhtml
только область) на
\Magento\Framework\Session\SessionManager::__call
, где я явно проверяю, что вызываемый метод
getCategoryData
: если это так, я извлекаю все атрибуты изображения пользовательской категории и удаляю их из возвращаемого массива, например
Category/Edit
делает.
Таким образом, любое дальнейшее сообщение об исключении правильно отображается в бэк-офисе (при условии, что оно расширяет
LocalizedException
)
Просто чтобы расширить ответ Франческо Сальви, который действительно помог мне с той же проблемой, вот как мы реализовали это решение:
и т.д./adminhtml/di.xml
<?xml version="1.0" ?>
<config>
<type name="Magento\Framework\Session\SessionManager">
<plugin name="pluginNameGoesHere" type="Vendor\Namespace\Plugin\StripCustomImage" />
</type>
</config>
плагин/StripCustomImage.php
<?php
namespace Vendor\Namespace\Plugin;
class StripCustomImage
{
public function after__call($method, $response, ...$args)
{
if ($args[0] === 'getCategoryData') {
if (isset($response['widget_image']['delete'])) {
$response['widget_image'] = null;
} else {
unset($response['widget_image']);
}
}
return $response;
}
}
Где «widget_image» — это имя атрибута для изображения пользовательской категории, которое мы создали в другом модуле, который причинял нам боль.