Sylius - 如何以编程方式将频道分配给产品?

问题描述:

我正尝试将一个频道分配给以编程方式创建的产品,因此它们将显示在商店中。不幸的是,这个用例没有文档。Sylius - 如何以编程方式将频道分配给产品?

这是我如何创建我的产品:

$productFactory = $this->container->get('sylius.factory.product'); 
$productManager = $this->container->get('sylius.manager.product'); 
$productRepository = $this->get('sylius.repository.product'); 
$productVariantFactory = $this->get('sylius.factory.product_variant'); 
$productVariantRepository = $this->get('sylius.repository.product_variant'); 
$channelPricingFactory = $this->get('sylius.factory.channel_pricing'); 
$channelPricingRepository = $this->get('sylius.repository.channel_pricing'); 

//CREATE PRODUCT 

$product = $factory->createNew(); 
$product->setName('TEST 2 - '.$title); 
$product->setCode($this->generateRandomString()); 
$product->setSlug($this->generateRandomString()); 
$productRepository->add($product); 

//CREATE VARIANT & ATTACH IT TO PRODUCT 

$variant = $productVariantFactory->createNew(); 
$variant->setName('TEST 2 - '.$title); 
$variant->setCode($this->generateRandomString()); 
$variant->setProduct($product); 
$productVariantRepository->add($variant); 

//CREATE PRICE & ATTACH IT TO VARIANT 

$channelPricing = $channelPricingFactory->createNew(); 
$channelPricing->setPrice(999); 
$channelPricing->setOriginalPrice(999); 
$channelPricing->setChannelCode('US_WEB'); 
$channelPricing->setProductVariant($variant); 
$channelPricingRepository->add($channelPricing); 

不幸的是,该产品未链接到一个频道:

enter image description here

的回答你的问题:

你有一个产品变体,但产品变体实现了可扩展TranslatableInterface的ProductVariantInterface。所以我们需要一个翻译才能让它出现和工作。要添加翻译:

$productVariant->setCurrentLocale('fr_FR'); 
$productVariantTranslation = $productVariant->getTranslation(); 

$productVariantTranslation = $productVariant->getTranslation($locale); 

后,您可以添加一个名字或不:

$productVariantTranslation->setName('What a product variant!'); 

后:

$product->addVariant($productVariant); 
$this->entityManager->persist($product); 

你将有你的产品变种在线。

的另一件事是:

$channelPricingRepository = $this->get('sylius.repository.channel_pricing'); 
$channelPricingRepository->add($entity); 

它会在每个呼叫直接数据刷新到数据库。在这个例子中,你将冲刷3次而不是只有一次。在许多“增加”的更大进程中,这可能是缺乏性能。你可以简单地;

$this->entityManager->persist($entity); //Many times 
$this->entityManager->flush(); 

这是我如何成功地创造自己的产品(将其连接然后我的实体):

function createProduct($livre,$options){ 

    $title = $livre['title']; 
    $prix = $livre['prix']; 

    // SYLIUS REPOSITORIES LOAD 

    $productFactory = $options['sylius_factory_product']; 
    $productRepository = $options['sylius_repository_product']; 
    $productVariantFactory = $options['sylius_factory_product_variant']; 
    $productVariantRepository = $options['sylius_repository_product_variant']; 
    $channelPricingFactory = $options['sylius_factory_channel_pricing']; 
    $channelPricingRepository = $options['sylius_repository_channel_pricing']; 

    //CREATE PRODUCT 

    $product = $productFactory->createNew(); 
    $product->setName($title); 
    $product->setCode($title.'_'.$this->generateRandomString()); 
    $product->setSlug($title.'_'.$this->generateRandomString()); 
    $productRepository->add($product); 


    //CREATE VARIANT & ATTACH IT TO PRODUCT 

    $variant = $productVariantFactory->createNew(); 
    $variant->setName($title. 'Variant'); 
    $variant->setCode($title.'_'.$this->generateRandomString()); 
    $variant->setProduct($product); 
    $productVariantRepository->add($variant); 


    //CREATE PRICE & ATTACH IT TO VARIANT 

    $channelPricing = $channelPricingFactory->createNew(); 
    $channelPricing->setPrice($prix*100); 
    $channelPricing->setOriginalPrice($prix*100); 
    $channelPricing->setChannelCode('CH'); 
    $channelPricing->setProductVariant($variant); 
    $channelPricingRepository->add($channelPricing); 

    $productId = $product->getId(); 

    return $productId; 
} 

我说这样的渠道的产品:

$channelCode = 'US_WEB' 
$channelRepository = $this->get('sylius.repository.channel'); 
$channel = $channelRepository->findOneBy(array('code' => $channelCode)); 
$product->addChannel($channel);