'Magento 2 Custom Product Type, assosiated/linked Products cant copied by save & duplicate

I have the problem that, when i save & duplicate my custom product type the linked products not be copied and die "old" link_ids in catalog_product_link got new ids for the "old" product.

In my module for the custom product type i added a copyconstructor

class OrderableLink implements \Magento\Catalog\Model\Product\CopyConstructorInterface
{

    protected $_logger;

    protected ProductLinkInterfaceFactory $productLinkFactory;

    public function __construct(
        \Magento\Backend\Block\Template\Context $context,
        \Psr\Log\LoggerInterface $logger,
        ProductLinkInterfaceFactory $productLinkFactory,
        array $data = []
    )
    {
        $this->_logger = $logger;
        $this->productLinkFactory = $productLinkFactory;
    }

    /**
     * Retrieve collection week_product link
     *
     * @param Product $product
     * @return Collection
     */
    protected function _getOrderableLinkCollection(Product $product)
    {
        /** @var Link $links */
        $links = $product->getLinkInstance();
        $links->setLinkTypeId(OrderableLinkProduct::LINK_TYPE_ORDERABLELINK);

        $collection = $links->getLinkCollection();
        $collection->setProduct($product);
        $collection->addLinkTypeIdFilter();
        $collection->addProductIdFilter();
        $collection->joinAttributes();


        return $collection;
    }

    /**
     * Build product links
     *
     * @param Product $product
     * @param Product $duplicate
     * @return void
     */
    public function build(Product $product, Product $duplicate)
    {
        if ($product->getTypeId() !== WeekBundleProductType::TYPE_ID) {
            //do nothing if not week_product
            return;
        }

        $data = [];
        $attributes = [];
        $link = $product->getLinkInstance();
        $link->setLinkTypeId(OrderableLinkProduct::LINK_TYPE_ORDERABLELINK);
        foreach ($link->getAttributes() as $attribute) {
            if (isset($attribute[ 'code' ])) {
                $attributes[] = $attribute[ 'code' ];
            }
        }


        /** @var \Magento\Catalog\Model\Product\Link $link */
        foreach ($this->_getOrderableLinkCollection($product)
                 as $link) {
            $data[ $link->getLinkedProductId() ] = $link->toArray($attributes);
        }
        
        $duplicate->setOrderablelinkLinkData($data);

    }
}

like in magento 2 group-product

in my di.xml is the following

<type name="Magento\Catalog\Model\Product\LinkTypeProvider">
        <arguments>
            <argument name="linkTypes" xsi:type="array">
                <item name="orderablelink" xsi:type="const">Gigatec\WeekProduct\Model\Product\OrderableLink::LINK_TYPE_ORDERABLELINK</item>
            </argument>
        </arguments>
    </type>
    <type name="Magento\Catalog\Model\ProductLink\CollectionProvider">
        <arguments>
            <argument name="providers" xsi:type="array">
                <item name="orderablelink" xsi:type="object">Gigatec\WeekProduct\Model\ProductLink\CollectionProvider\OrderableLinkProducts</item>
            </argument>
        </arguments>
    </type>
    <!-- Plugin to add update argument in collectionProvider -->
    <type name="Gigatec\WeekProduct\Model\ProductLink\CollectionProvider\OrderableLinkProducts">
        <plugin name="change_orderable_link_before" type="Gigatec\WeekProduct\Plugin\UpdateToOrderableLinkModel"/>
    </type>
    <type name="Magento\Catalog\Model\Product\Initialization\Helper\ProductLinks">
        <plugin name="WeekProduct" type="Gigatec\WeekProduct\Model\Product\Initialization\Helper\ProductLinks\Plugin\Orderable" />
    </type>

My Links has the id 7 and code orderablelink.

hope someone of you has a possible solution for my problem



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source