Как исправить проблему с соответствующим продуктом в admin после перехода с magento 1 на magento 2.3
Я использую Magento 2.3.0
Я перенес продукты из Magento 1 в Magento 2. Я могу видеть связанные продукты на странице сведений о продукте в интерфейсе, и это правильно, а также я могу найти запись о связанных продуктах в базе данных, но когда я проверил связанные продукты в admin, я обнаружил, что в некоторых продуктах отсутствуют некоторые связанные продукты
Например. Когда я проверил один продукт на переднем конце. Я видел там три сопутствующих продукта, как так же, как и в базе данных, но я могу найти только 2 продукта в admin, в admin отсутствует один продукт.
Я проверил две таблицы в базе данных на наличие связанных продуктов: "catalog_product_link
" и "catalog_product_link_attribute_int
".
Я нашел некоторые значения в столбце "значение" в таблице "catalog_product_link_attribute_int
", которая представляет положение соответствующих продуктов в admin и в интерфейсе, но я нашел значение 0 в столбце "значение" этой таблицы для некоторых продуктов, и когда я проверил эти продукты, я обнаружил, что только те продукты, которые не имеют значения. у вас есть только 0 в столбце "значение" в таблице "catalog_product_link_attribute_int
". отсутствуют связанные продукты в admin.
Итак, как я могу решить эту проблему?
Проверьте также мой следующий вопрос:
Как переопределить файлы моделей продуктов в Magento 2?
Я создал новый модуль для решения проблемы, связанной с продуктом, о которой я упоминал в этом вопросе, но я получил ошибку.
1 answers
Почему это происходит
Это происходит, когда существуют несогласованные позиции для соответствующих продуктов. Это может произойти после миграции с magento 1. Так было и со мной.
Проблема вызвана методом Magento\Catalog\Model\ProductLink\CollectionProvider::getCollection()
.
Это тот, кто отвечает за извлечение продуктов.
Часть, которая ведет себя не так, как ожидалось, такова:
foreach ($output as $item) {
$itemPosition = $item['position'];
if (!isset($sorterItems[$itemPosition])) {
$sorterItems[$itemPosition] = $item;
} else {
$newPosition = $itemPosition + 1;
$sorterItems[$newPosition] = $item;
}
}
Давайте возьмем 2 случая.
Тот, который работает:
Допустим,
$output = [
['position' => 0],
['position' => 2],
['position' => 1],
];
(Я игнорируются другие значения для связанных элементов, поскольку они не важны).
После выполнения кода выше это приводит к
Array
(
[0] => Array
(
[position] => 0
)
[2] => Array
(
[position] => 2
)
[1] => Array
(
[position] => 1
)
)
, который позже сортируется функцией ksort
.
Итак, 3 элемента на входе, 3 на выходе. Пока все хорошо.
Но давайте возьмем этот случай:
$output = [
['position' => 0], // or null
['position' => 1],
['position' => 0], // or null
];
Тот же фрагмент кода возвращает:
Array
(
[0] => Array
(
[position] => 0
)
[1] => Array
(
[position] => 0
)
)
Итак, 3 пункта вошли, 2 вышли.
Решение
Я решаю эту проблему, переписывая метод, упомянутый выше, и гарантируя, что там нет никаких позиционных столкновений.
Чтобы переопределить его, добавьте это в файл di.xml
в одном из ваших пользовательских модулей
<preference for="Magento\Catalog\Model\ProductLink\CollectionProvider" type="[Vendor]\[Module]\Model\ProductLink\CollectionProvider" />
Затем создайте класс [Vendor]\[Module]\Model\ProductLink\CollectionProvider
в файле [Vendor]/[Module]/Model/ProductLink/CollectionProvider.php
Класс должен выглядеть так:
<?php
namespace [Vendor]\[Module]\Model\ProductLink;
use Magento\Framework\Exception\NoSuchEntityException;
class CollectionProvider extends \Magento\Catalog\Model\ProductLink\CollectionProvider
{
/**
* Get product collection by link type
*
* @param \Magento\Catalog\Model\Product $product
* @param string $type
* @return array
* @throws NoSuchEntityException
*/
public function getCollection(\Magento\Catalog\Model\Product $product, $type)
{
if (!isset($this->providers[$type])) {
throw new NoSuchEntityException(__('Collection provider is not registered'));
}
$products = $this->providers[$type]->getLinkedProducts($product);
$converter = $this->converterPool->getConverter($type);
$output = [];
$sorterItems = [];
foreach ($products as $item) {
$output[$item->getId()] = $converter->convert($item);
}
foreach ($output as $item) {
$itemPosition = (int)$item['position'];
while (isset($sorterItems[$itemPosition])) {
$itemPosition++;
}
$sorterItems[$itemPosition] = $item;
}
ksort($sorterItems);
return $sorterItems;
}
}