Akeneo 2.1.4: Как изменить родителя продукта (модель используемого продукта)

У меня есть требование, когда при импорте я должен иметь возможность перейти на модель продукта. Я пытался сделать это, изменив parent в CSV-файл, который я импортирую, но это покажет следующее сообщение:

ПРЕДУПРЕЖДЕНИЕ parent: Свойство "parent" не может быть изменено, указан "new_parent_code".

Как правильно сделать эту работу? Я попытался "взломать" базу данных, вручную назначив другого родителя продукту, отредактировав его непосредственно в pim_catalog_product-table, и это, казалось, работало, но при редактировании продукта неожиданные результаты.

Может кто-нибудь указать мне правильное направление, как я могу изменить родителя продукта при импорте?

Обновить:

Теперь я пришел к следующему решению:

В своем собственном комплекте я добавил Resources/config/updaters.yml (используя расширение DependencyInjecten) со следующим:

parameters:
    # Rewrite parent field setter so we can allow the importer to update the parent:
    pim_catalog.updater.setter.parent_field.class:            Vendor\Bundle\InstallerBundle\Updater\Setter\ParentFieldSetter

И мой обычай ParentFieldSetter.php:

namespace Vendor\Bundle\InstallerBundle\Updater\Setter;

use Akeneo\Component\StorageUtils\Exception\ImmutablePropertyException;
use Akeneo\Component\StorageUtils\Repository\IdentifiableObjectRepositoryInterface;

/**
 * Class ParentFieldSetter
 */
class ParentFieldSetter extends \Pim\Component\Catalog\Updater\Setter\ParentFieldSetter
{
    /**
     * @var IdentifiableObjectRepositoryInterface
     */
    private $productModelRepository;

    /**
     * ParentFieldSetter constructor.
     * @param IdentifiableObjectRepositoryInterface $productModelRepository
     * @param array $supportedFields
     */
    public function __construct(
        IdentifiableObjectRepositoryInterface $productModelRepository,
        array $supportedFields
    ) {
        $this->productModelRepository = $productModelRepository;
        parent::__construct($productModelRepository, $supportedFields);
    }

    /**
     * @param \Pim\Component\Catalog\Model\ProductInterface|\Pim\Component\Catalog\Model\ProductModelInterface $product
     * @param string $field
     * @param mixed $data
     * @param array $options
     */
    public function setFieldData($product, $field, $data, array $options = []): void
    {
        try {
            parent::setFieldData($product, $field, $data, $options);
        } catch (ImmutablePropertyException $exception) {
            if ($exception->getPropertyName() === 'parent') {
                // Allow us to change the product parent:
                if ($parent = $this->productModelRepository->findOneByIdentifier($data)) {
                    $familyVariant = $parent->getFamilyVariant();
                    $product->setParent($parent);
                    $product->setFamilyVariant($familyVariant);
                    if (null === $product->getFamily()) {
                        $product->setFamily($familyVariant->getFamily());
                    }
                }
            } else {
                throw $exception;
            }
        }
    }
}

Это работает. Теперь при импорте родительский файл сохраняется правильно. Мне только интересно, если:

  • а). Эта реализация верна.
  • б). Я не вызываю некоторые другие серьезные проблемы, меняя родителя.

Я также отметил следующую инструкцию TODO в исходном коде Akeneo над кодом, который выдает ошибку при попытке изменить родителя:

// TODO: это нужно удалить в PIM-6350.

Кто-нибудь из Акенео хочет пролить свет на это?

0 ответов

Другие вопросы по тегам