Cree programáticamente un producto simple en magento 2

Respuestas:

29

Aquí, encontré las soluciones para crear un producto mediante programación a través de un archivo php personalizado, es decir test.php.

<?php
use Magento\Framework\App\Bootstrap;
include('app/bootstrap.php');
$bootstrap = Bootstrap::create(BP, $_SERVER);

$objectManager = $bootstrap->getObjectManager();

$state = $objectManager->get('Magento\Framework\App\State');
$state->setAreaCode('frontend');


$_product = $objectManager->create('Magento\Catalog\Model\Product');
$_product->setName('Test Product');
$_product->setTypeId('simple');
$_product->setAttributeSetId(4);
$_product->setSku('test-SKU');
$_product->setWebsiteIds(array(1));
$_product->setVisibility(4);
$_product->setPrice(array(1));
$_product->setImage('/testimg/test.jpg');
$_product->setSmallImage('/testimg/test.jpg');
$_product->setThumbnail('/testimg/test.jpg');
$_product->setStockData(array(
        'use_config_manage_stock' => 0, //'Use config settings' checkbox
        'manage_stock' => 1, //manage stock
        'min_sale_qty' => 1, //Minimum Qty Allowed in Shopping Cart
        'max_sale_qty' => 2, //Maximum Qty Allowed in Shopping Cart
        'is_in_stock' => 1, //Stock Availability
        'qty' => 100 //qty
        )
    );

$_product->save();
?>
Zed Blackbeard
fuente
11
Por favor, no use (ni promueva el uso de) scripts independientes y el administrador de objetos para hacer las cosas. Es una forma muy pobre.
Ryan Hoerr
@RyanHoerr Me doy cuenta de que tu comentario tiene varios meses, pero ¿qué sugerirías en su lugar?
Lewis el
2
Mi recomendación sería un módulo personalizado y un comando CLI. Lo expongo con enlaces de documentación aquí: magento.stackexchange.com/a/102901/1905 - Es decir, en lugar de un script independiente, use un módulo; en lugar de $ objectManager, use la inyección de dependencia para obtener los objetos necesarios.
Ryan Hoerr
1
@RyanHoerr Gracias por el enlace, sin embargo, no estoy seguro de cómo usarlo en el contexto de la creación de un producto. También gracias Ankit, pero su enlace es muy similar a lo que ya está aquí (es decir, usando el ObjectManager).
Lewis
3
@RyanHoerr lo siento por responder a un hilo tan antiguo. Los módulos y los comandos de la CLI no siempre son una opción. Si deseo acceder a Magento desde mi propio software (que vive en el mismo servidor) y el uso de API es demasiado lento, la única opción que veo es usar el administrador de objetos.
mniess
23

En primer lugar, en su constructor querrá incluir tres clases para la inyección de dependencias: Magento\Catalog\Api\Data\ProductInterfaceFactory, Magento\Catalog\Api\ProductRepositoryInterfacey Magento\CatalogInventory\Api\StockRegistryInterface. El primero se genera, así que no te preocupes demasiado si aparece como no existente en tu IDE.

public function __construct(\Magento\Catalog\Api\Data\ProductInterfaceFactory $productFactory, \Magento\Catalog\Api\ProductRepositoryInterface $productRepository, \Magento\CatalogInventory\Api\StockRegistryInterface $stockRegistry)
{
    $this->productFactory = $productFactory;
    $this->productRepository = $productRepository;
    $this->stockRegistry = $stockRegistry;
}

A partir de ahí, donde desee crear el producto, deberá usar Factory para crearlo y configurar los datos, y el repositorio para guardarlo:

/** @var \Magento\Catalog\Api\Data\ProductInterface $product */
$product = $this->productFactory->create();
$product->setSku('SAMPLE-ITEM');
$product->setName('Sample Item');
$product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE);
$product->setVisibility(4);
$product->setPrice(1);
$product->setAttributeSetId(4); // Default attribute set for products
$product->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED);
// If desired, you can set a tax class like so:
$product->setCustomAttribute('tax_class_id', $taxClassId);

$product = $this->productRepository->save($product); // This is important - the version provided and the version returned will be different objects

Es probable que desee agregar algo de stock, lo que puede hacer así:

$stockItem = $this->stockRegistry->getStockItemBySku($product->getSku());
$stockItem->setIsInStock($isInStock);
$stockItem->setQty($stockQty);
$this->stockRegistry->updateStockItemBySku($product->getSku(), $stockItem);

Si está ejecutando esto en una secuencia de comandos (incluidas las secuencias de comandos de configuración / actualización), entonces también necesitará emular el área, ya que este tipo de cosas requiere sesiones por alguna extraña razón.

Para hacer eso, ingrese a \Magento\Framework\App\Statetravés del constructor y luego utilice este código:

$this->state->emulateAreaCode(
    'adminhtml', 
    function () { 
        /* all code here */ 
    }
);
Navarro
fuente
6
use \Magento\Framework\App\Bootstrap;
include('app/bootstrap.php');

// add bootstrap
$bootstraps = Bootstrap::create(BP, $_SERVER);
$object_Manager = $bootstraps->getObjectManager();

$app_state = $object_Manager->get('\Magento\Framework\App\State');
$app_state->setAreaCode('frontend');

// get date 
$today_date = date("m/d/Y");
$added_date = date('m/d/Y',strtotime("+17 day"));

$set_product = $object_Manager->create('\Magento\Catalog\Model\Product');

try{
    $set_product->setWebsiteIds(array(1));
    $set_product->setAttributeSetId(4);
    $set_product->setTypeId('simple');
    $set_product->setCreatedAt(strtotime('now')); 
    // time of product creation
    $set_product->setName('Test Sample Products'); 
    // add Name of Product
    $set_product->setSku('add-sku-1');
    // add sku hear
    $set_product->setWeight(1.0000);
    // add weight of product
    $set_product->setStatus(1);
    $category_id= array(4,5);
    // add your catagory id
    $set_product->setCategoryIds($category_id); 
    // Product Category
    $set_product->setTaxClassId(0); 
    // type of tax class 
    // (0 - none, 1 - default, 2 - taxable, 4 - shipping)
    $set_product->setVisibility(4); 
    // catalog and search visibility
    $set_product->setManufacturer(28); 
    // manufacturer id
    $set_product->setColor(24);
    //print_r($_product);die;
    $set_product->setNewsFromDate($today_date); 
    // product set as new from
    $set_product->setNewsToDate($added_date); 
    // add image path hear
    $set_product->setImage('/testimg/test.jpg');
    // add small image path hear
    $set_product->setSmallImage('/testimg/test.jpg');
    // add Thumbnail image path hear
    $set_product->setThumbnail('/testimg/test.jpg');
    // product set as new to
    $set_product->setCountryOfManufacture('AF'); 
    // country of manufacture (2-letter country code)
    $set_product->setPrice(100.99) ;
    // price in form 100.99
    $set_product->setCost(88.33); 
    // price in form 88.33
    $set_product->setSpecialPrice(99.85); 
    // special price in form 99.85
    $set_product->setSpecialFromDate('06/1/2016'); 
    // special price from (MM-DD-YYYY)
    $set_product->setSpecialToDate('06/30/2018'); 
    // special price to (MM-DD-YYYY)
    $set_product->setMsrpEnabled(1); 
    // enable MAP
    $set_product->setMsrpDisplayActualPriceType(1); 
    // display actual price 
    // (1 - on gesture, 2 - in cart, 3 - before order confirmation, 4 - use config)
    $set_product->setMsrp(99.99); 
    // Manufacturer's Suggested Retail Price
    $set_product->setMetaTitle('test meta title 2');
    $set_product->setMetaKeyword('test meta keyword 2');
    $set_product->setMetaDescription('test meta description 2');
    $set_product->setDescription('This is a long description');
    $set_product->setShortDescription('This is a short description');
    $set_product->setStockData(
        array(
        'use_config_manage_stock' => 0, 
        // checkbox for 'Use config settings' 
        'manage_stock' => 1, // manage stock
        'min_sale_qty' => 1, // Shopping Cart Minimum Qty Allowed 
        'max_sale_qty' => 2, // Shopping Cart Maximum Qty Allowed
        'is_in_stock' => 1, // Stock Availability of product
        'qty' => 100 // qty of product
        )
    );

    $set_product->save();
    // get id of product
    $get_product_id = $set_product->getId();
    echo "Upload simple product id :: ".$get_product_id."\n";
}
catch(Exception $exception)
{
    // errro in exception/code
    Mage::log($exception->getMessage());
}

referencia de código :: http://www.onlinecode.org/create-a-simple-product-programmatic-in-magento-2/

Dhaval Dave
fuente
setCategoryIds no funciona con más de un ID de categoría solo guarda una categoría.
Magento2 Devloper
@ Magento2 Devloper: también tengo referencia para este blog :: onlinecode.org/…
Dhaval Dave
Ok, lo he arreglado.
Magento2 Devloper
@ Magento2 Devloper: ¿puedes decirme cuál es el problema para que ayude en mi función?
Dhaval Dave
0
use Magento\Framework\App\Filesystem\DirectoryList; 
use Magento\Framework\App\Action\Context;
use Magento\Framework\Controller\ResultFactory;
class Addsimpleproduct extends \Magento\Framework\App\Action\Action
{
protected $_resultPageFactory;
protected $_fileUploaderFactory;
public function __construct(Context $context, \Magento\Framework\View\Result\PageFactory $resultPageFactory)
{
    //  $t$this->_fileUploaderFactory = $fileUploaderFactory;
    // $this->filesystem = $filesystem;
    $this->_resultPageFactory = $resultPageFactory;
    parent::__construct($context);
}


public function execute()
{
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    $islogin = $objectManager->create('Magento\Customer\Model\Session');    // check is login
    if(!$islogin->isLoggedIn()) 
    {
        $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
        $url='customer/account/login';
        $resultRedirect->setPath($url);
        $this->messageManager->addSuccess(__('Session Expired...!')); 
        return $resultRedirect;
        exit;
    }

    $_id=$this->getRequest()->getParam('_id');

    $category =     $this->getRequest()->getParam('categorylist');
    $pname      = $this->getRequest()->getParam('pname');
    $pdescription      = $this->getRequest()->getParam('pdescription');
    $pshortdescription      = $this->getRequest()->getParam('pshortdescription');
    $sku      = $this->getRequest()->getParam('sku');
    $price      = $this->getRequest()->getParam('price');
    $spprice      = $this->getRequest()->getParam('spprice');
    $spfrom      = $this->getRequest()->getParam('spfrom');
    $spto      = $this->getRequest()->getParam('spto');
    $stock      = $this->getRequest()->getParam('stock');
    $stockavailiable      = $this->getRequest()->getParam('stockavailiable');
    $visiblibilty      = $this->getRequest()->getParam('visiblibilty');
    $tax      = $this->getRequest()->getParam('taxclass');
    $weight_radio= $this->getRequest()->getParam('weight_radio');

    if($weight_radio==1)
    {
        $weight   = $this->getRequest()->getParam('weight');
    }

    $metatitle      = $this->getRequest()->getParam('metatitle');
    $metakey      = $this->getRequest()->getParam('metakey');
    $metadesc      = $this->getRequest()->getParam('metadesc');
    $maxqty      = $this->getRequest()->getParam('maxqty');
    $download    = $this->getRequest()->getParam('download');
    $virtual=$this->getRequest()->getParam('producttype');
    $title1 = "";
    $title2 = "";
    $separately1 = 0;
            $is_down = "simple";   
    $data =  $objectManager->get('\Magento\Catalog\Model\Product');
    if($_id!="")
    {
        $data ->load($_id);
    }
    $data
        ->setWebsiteIds(array(1))
        ->setStoreId(1) //you can set data in store scope               
        ->setAttributeSetId(4) //ID of a attribute set named 'default'
        ->setTypeId($is_down) //product type
        ->setCreatedAt(strtotime('now')) //product creation time
        ->setSku($sku); //SKU
        if($weight_radio==1)
        {
            $data->setWeight($weight);        
        }
        $data->setName($pname) //product name
        ->setStatus(2) //product status (1 - enabled, 2 - disabled)
        ->setTaxClassId($tax) //tax class (0 - none, 1 - default, 2 - taxable, 4 - shipping)              
        ->setVisibility($visiblibilty)
        ->setPrice($price) //price in form 11.22
        ->setSpecialPrice($spprice) //special price in form 11.22
        ->setSpecialFromDate($spfrom) //special price from (MM-DD-YYYY)
        ->setSpecialToDate($spto) //special price to (MM-DD-YYYY)
        ->setMetaTitle($metatitle)
        ->setMetaKeyword($metakey)
        ->setMetaDescription($metadesc)
        ->setDescription( $pdescription)
        ->setShortDescription($pshortdescription)
        ->setCategoryIds($category)
        ->setStockData(array(
                        'manage_stock' => 1,
                        'max_sale_qty' => $maxqty, //Maximum Qty Allowed in Shopping Cart
                        'is_in_stock' => $stockavailiable,
                        'qty' => $stock
                    )
                );

        // $data->setQuantityAndStockStatus(['qty' => $stock, 'is_in_stock' => $stockavailiable]);

        if($download=='yes')
        {
            $data->setData('links_title',$title1);
            $data->setData('samples_title',$title2);
            $data->setData('links_purchased_separately',$separately1);
        }


        $customerSession = $objectManager->create('Magento\Customer\Model\Session');
        $sid=$customerSession->getCustomer()->getId();

        $cname=$customerSession->getCustomer()->getName();

        $data->setSellerid($sid);
        $data->setApprovalstatus("Pending");

        //for image upload
         // $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
        $fileSystem = $objectManager->create('\Magento\Framework\Filesystem');
       //$mediaPath=$fileSystem->getDirectoryRead(\Magento\Framework\App\Filesystem\DirectoryList::MEDIA)->getAbsolutePath('tmp/catalog/product');
       $filename= $this->getRequest()->getParam('path');
       $files=explode(',',$filename);

       if($filename!='')
       {

           foreach($files as $file)
           {

                $filepath='/catalog/product' .trim($file);
                try{

                     $data->addImageToMediaGallery($filepath, array('image','thumbnail','small','swatch'), false, false);
                }catch(Exception $e)
                {

                }

           }
       }

            $data->save() //$data->save()
Nikhil waghela
fuente
Muestra error La imagen no existe.
Anees