Заказчик удалил несколько позиций товаров и после этого представление /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. Как лучше/оптимальнее окончательно вычистить всё побитое.
Комментарии
Спрошу иначе: у кого-нибудь были подобные прецеденты в Commerce?
Сегодня столкнулись с такой же проблемой на одном из проектов. Гугл привел в этот пост)
Ручное удаление лишней записи решило проблему
Как сделали сверку product vs product_field_data ? В смысле - как нашли лишнюю запись? Или она была последней в вашем случае?
Она была на последней странице в PPHMyAdmin и её сразу было видно. Но не самая последняя
Т.е. по id сущности (parent) не пришлось сверять обе таблицы?
Неа
Снова эта проблема. но на этот раз лишнюю запись на глаз не видно. Расскажи как ты её вычислял?
Получаем список потерянных 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
.