THELIA Forum

Welcome to the THELIA support and discusssion forum

Offline

#1 PRODUCT_CLONE Event

(02-12-2019 09:56:43)


Bonjour à tous !

J'ai créé un module qui fonctionne, mais il me reste une chose à faire et je n'y arrive pas.
Dans mon module j'ai créé une table qui me permet de rajouter un champ "référence fournisseur" pour chaque produit, dans cette table se trouve l'id du produit et l'id de la référence produit. Avec un event listener j'ai ajouter mon form et tout fonctionne très bien.
Je souhaite maintenant que lorsque je clone un produit, le produit cloné est lui aussi une référence si le produit de base en avait une.

Pour l'instant j'ai seulement déclaré mon service et créé mon eventListener mais je galère un peu pour le remplir...

<service id="add.ref" class="MonStock\EventListeners\CloneRefProductEventListener">
            <argument type="service" id="request"/>
            <tag name="kernel.event_subscriber"/>
</service>
<?php

namespace MonStock\EventListeners;

use MonStock\MonStock;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Thelia\Action\BaseAction;
use Thelia\Core\Event\Product\ProductCloneEvent;
use Thelia\Core\Event\TheliaEvents;
use Thelia\Core\Security\AccessManager;
use Thelia\Core\Security\Resource\AdminResources;
use Thelia\Model\ConfigQuery;
use Thelia\Model\ProductQuery;
use Doctrine\ORM\EntityManagerInterface;
use MonStock\Model\ProductFournisseurRefQuery;
use MonStock\Model\FournisseurRefQuery;

/**
 * Payline payment module
 *
 * @author Franck Allimant <franck@cqfdev.fr>
 */
class CloneRefProductEventListener extends BaseAction implements EventSubscriberInterface
{

    public static function getSubscribedEvents()
    {
        return array(
            TheliaEvents::PRODUCT_CLONE => array("addRef", 128)
        );
    }

    public function addref(ProductCloneEvent $event)
    {


        
    }

}

Si quelqu'un a une piste pour moi je suis preneur ! Merci !

Offline

#2 Re: PRODUCT_CLONE Event

(02-12-2019 15:04:59)


J'ai un peu avancé, j'arrive à récupérer l'id du produit créé suite au clonage ainsi que l'id de la référence. (à savoir que dans ma table il n'y a que l'id du produit et l'id de la ref).

Il ne me reste plus qu'a réussir à enregistrer ça dans la BDD

public function addref(ProductCloneEvent $event)
    {
        $cloneProduct = $event->getClonedProduct();
        $idNewProduct = $cloneProduct->getId();
        
        $originalProduct = $event->getOriginalProduct()->getId();
        $fournisseurProduct = ProductFournisseurRefQuery::create()->findPk($originalProduct);
        if($fournisseurProduct != null){
            $idRef = $fournisseurProduct->getFournisseurRefId();
            
        }
    }

Offline

#3 Re: PRODUCT_CLONE Event

(02-12-2019 17:32:44)


Il te faut créer une instance de ton modèle (correspondant  à la table qui stocke l'id produit et l'id de la référence fournisseur) ensuite affecter les attributs requis et persister le le modèle en base.

Quelque chose qui ressemblerait à ça :

if($fournisseurProduct != null) {
	$idRef = $fournisseurProduct->getFournisseurRefId();
	$fpRef = new ProductFournisseurRef();
	$fpRef->setProductId($product->getId());
	$fpRef->setRefId($vehicle_id);
	$fpRef->save();
}

en ayant pris soin d'importer le namespace du modèle.

Offline

#4 Re: PRODUCT_CLONE Event

(02-12-2019 19:07:01)


Heu... Ça devrait plutôt ressembler à ça : on clone le ProductFournisseurRef s'il existe, en lui attribuant l'ID du nouveau produit

    ...
    if (null !== $fournisseurProduct = ProductFournisseurRefQuery::create()->findPk($originalProduct)) {
	$idRef = $fournisseurProduct->getFournisseurRefId();

	(new ProductFournisseurRef())
            ->setProductId($idNewProduct)
            ->setRefId($idRef)
            ->save();
    }

CQFDev | Sites, boutiques, modules, développement et intégration pour Thelia 1 et 2

Offline

#5 Re: PRODUCT_CLONE Event

(03-12-2019 00:00:05)


En effet, j'ai fait un copier/coller un peu rapide (c.f. $vehicule_id qui n'a rien à faire là :-0).

Offline

#6 Re: PRODUCT_CLONE Event

(03-12-2019 09:30:05)


Merci à vous deux, ça fonctionne nickel !