Akeneo 2.1.4:如何更改产品' parent(二手产品型号)

时间:2018-02-16 09:43:14

标签: import product pim akeneo

我有要求在进口时我需要能够更换产品'产品型号。我尝试通过更改我导入的CSV文件中的parent来执行此操作,但这会显示以下消息:

  

警告   父母:财产"父母"无法修改," new_parent_code"给出。

使这项工作的正确方法是什么?我试过去黑客攻击'通过直接在pim_catalog_product - 表中编辑父级来手动为产品分配不同的父级数据库,这似乎有效,但在编辑产品时会出现意外结果。

有人能指出我在正确的方向上如何在导入时更改产品父级吗?

更新

我现在想出了以下解决方案:

在我自己的包中,我添加了Resources/config/updaters.yml(使用DependencyInjecten Extension)以及以下内容:

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;
            }
        }
    }
}

这很有效。现在,在导入父项时会正确保存。我只想知道是否:

  • a)中。这个实现是正确的。
  • B)。我通过更改父母来解决其他一些重大问题。

我还注意到原始Akeneo代码中的以下TODO语句,该代码在尝试更改父级时抛出错误的代码:

  

// TODO:这将在PIM-6350中删除。

Akeneo的任何人都在关注这个问题吗?

0 个答案:

没有答案