我有要求在进口时我需要能够更换产品'产品型号。我尝试通过更改我导入的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;
}
}
}
}
这很有效。现在,在导入父项时会正确保存。我只想知道是否:
我还注意到原始Akeneo代码中的以下TODO语句,该代码在尝试更改父级时抛出错误的代码:
// TODO:这将在PIM-6350中删除。
Akeneo的任何人都在关注这个问题吗?