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.
Кто-нибудь из Акенео хочет пролить свет на это?