Как исправить проблему с соответствующим продуктом в 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?

Я создал новый модуль для решения проблемы, связанной с продуктом, о которой я упоминал в этом вопросе, но я получил ошибку.

Author: Chintan Kaneriya, 2019-04-11

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;
    }
}
 2
Author: Marius, 2019-04-11 07:43:35