D8: Commerce: битые товары или поля товаров

Главные вкладки

Аватар пользователя OldWarrior OldWarrior 21 марта 2022 в 19:53

Заказчик удалил несколько позиций товаров и после этого представление /admin/commerce/products стало выдавать белый экран с unknown error , а в журнале ошибку вида:

TypeError: Argument 1 passed to Drupal\views\Plugin\views\field\EntityOperations::getEntityTranslation() must implement interface Drupal\Core\Entity\EntityInterface, null given

То есть, поля операций с сущностями (в том числе массовых) на штатной странице представления товаров вызывало ошибку метода getEntityTranslation(). Я так и не понял, что послужило исходной причиной. Заказчик тоже не смог найти причин, как-то объясняющих происшеднее. Но ему срочно нужно было запустить это представление

Поиск привёл к схожей проблеме, но там в итоге решают патчами ядра. Другое найденное схожее решение сводится к удалению "потерянных" рядов из БД. Последнее натолкнуло на мысль исследовать поведение представления без EntityOperations (т.е. виджета массовых операций, на которое ссылается вышеприведённая запись журнала). Я отключил виджет.

Получилось то, что на скриншоте.

Как видите, в рядах затесалась пустая позиция без каких-либо опознавательных характеристик (ID или артикул). Причём сложилось ощущение, что сама сущность уже убита, остались её поля. Покопался и понял, что есть поле артикула, но оно пустое. Поставил дополнительный фильтр типа "SKU != NULL". Вопрос временно решён. Представление работает.

Остаются резонные вопросы:

1. С чем мог (хотя бы теоретически) быть связан инцидент.
2. Как лучше/оптимальнее окончательно вычистить всё побитое.

Лучший ответ

Аватар пользователя madt madt 21 января 2023 в 18:07

Получаем список потерянных product_id:

SELECT          commerce_product_field_data.product_id
FROM            commerce_product_field_data
LEFT OUTER JOIN commerce_product ON commerce_product_field_data.product_id = commerce_product.product_id
WHERE           commerce_product.product_id IS NULL

Ищем и удаляем строки с этими product_id в таблице commerce_product_field_data.

Комментарии

Аватар пользователя ivnish ivnish 7 ноября 2022 в 17:52
1

Сегодня столкнулись с такой же проблемой на одном из проектов. Гугл привел в этот пост)

Ручное удаление лишней записи решило проблему

Аватар пользователя OldWarrior OldWarrior 8 ноября 2022 в 18:10

Как сделали сверку product vs product_field_data ? В смысле - как нашли лишнюю запись? Или она была последней в вашем случае?

Аватар пользователя madt madt 21 января 2023 в 18:07

Получаем список потерянных product_id:

SELECT          commerce_product_field_data.product_id
FROM            commerce_product_field_data
LEFT OUTER JOIN commerce_product ON commerce_product_field_data.product_id = commerce_product.product_id
WHERE           commerce_product.product_id IS NULL

Ищем и удаляем строки с этими product_id в таблице commerce_product_field_data.