Creación de productos simples y configurables de Magento mediante programación

Básicamente, los productos son la piedra angular de cualquier catálogo y tienda de comercio electrónico. Y Magento tiene excelentes funciones para crearlos desde el backend, pero hay casos en los que necesitamos cuando en Magento necesitamos crear un producto mediante programación o manualmente. Por ejemplo, puede necesitarlo si importa productos en un determinado formato de texto, o si necesita crear muchos productos para probar el rendimiento de una tienda, o si está sugiriendo una interfaz de creación de productos alternativa. Así que lea este artículo si desea agregar el producto Magento 2 mediante programación u obtener opciones de productos configurables seleccionadas en Magento 2.

Cómo crear productos simples de Magento programáticamente (manualmente)

Para crear un producto en la base de datos de una tienda, podemos:

  1. Hacer uso de la API (lea más sobre esto aquí )
  2. Realizar una solicitud de base de datos sin procesar
  3. Cree un objeto de tipo Mage_Catalog_Model_Product, inicialícelo y llame al método de guardado.

Hablaremos sobre la API en uno de nuestros próximos artículos más adelante, es excelente para los casos en que se lleva a cabo la integración de varios sistemas, pero no es aconsejable usarla dentro del alcance de un sistema.

Una consulta como INSERT INTO product_tablename… parece ser la forma más fácil de crear un producto Magento a primera vista, pero solo si no está familiarizado con
la arquitectura de almacenamiento
EAV (valor de atributo de entidad) de Magento.

Le contaremos más sobre EAV en los próximos artículos, y ahora solo quiero señalar que necesitaremos actualizar más de 15 tablas simultáneamente para crear un producto simple. Aquí están los principales (haga clic para ampliar):

Para la versión completa del sistema de base de datos Magento, haga clic para abrir el PDF . La tabla está un poco desactualizada, pero servirá para nuestro propósito aquí: necesitamos comprender el proceso de creación de un producto simple.

Podemos ver que los valores se almacenan en varias tablas dependiendo de su tipo. Además, los atributos desplegables, como el color y el fabricante, tienen una tabla adicional de opciones. El precio y las imágenes también se almacenan por separado.

Algunas buenas noticias: hay una clase Mage_Catalog_Model_Product que se ocupa de la integridad y el almacenamiento correcto de datos, y le mostraré cómo usarla.

Lo primero es lo primero, vamos a establecer algunos atributos obligatorios:

div.embedPastebin { text-align:left; padding: 0; color: #000; margin: 0; font-family: monospace; background: #F7F7F7; border: 1px solid ddd; border-radius:3px; } div.embedPastebin { } div.embedPastebin div.embedFooter { background: #F7F7F7; color: #333; font-size: 100%; padding: 6px 12px; border-bottom: 1px solid #ddd; text-transform:uppercase; } div.embedPastebin div.embedFooter a, div.embedPastebin div.embedFooter a:visited { color: #336699; text-decoration:none; } div.embedPastebin div.embedFooter a:hover { color: red; } .noLines ol { list-style-type: none; padding-left: 0.5em; } .embedPastebin{background-color:#F8F8F8;border:1px solid #ddd;font-size:12px;overflow:auto;margin: 0 0 0 0;padding:0 0 0 0;line-height:21px} .embedPastebin div { line-height:21px; font-family:Consolas, Menlo, Monaco, Lucida Console,’Bitstream Vera Sans Mono’,’Courier’,monospace; } ol { margin:0; padding: 0 0 0 55px} ol li { border:0; margin:0;padding:0; } li.ln-xtra .de1, li.ln-xtra .de2 {background:#F8F8CE;} .embedPastebin ol li.li1 { margin: 0; } .embedPastebin ol li.li2 { margin: 0; }

Datos alojados con ♥ por Pastebin.comDescargar RawVer original
  1. [ php ] Mago :: aplicación ( ) -> setCurrentStore ( Mage_Core_Model_App :: ADMIN_STORE_ID ) ; //
  2. $producto = Mage :: getModel ( ‘catalogo/producto’ ) ;
  3. $ rand = rand ( 1 , 9999 ) ;
  4. $producto
  5. -> setTypeId ( $tipo )
  6. -> setAttributeSetId ( 4 ) // conjunto de atributos por defecto
  7. -> setSku ( ‘example_sku’ . $rand ) // generar un SKU aleatorio
  8. -> setWebsiteIDs ( matriz ( 1 ) )
  9. ;
  10. [ / php ]

Ahora, es hora de hacer visible el producto en el catálogo:

div.embedPastebin { text-align:left; padding: 0; color: #000; margin: 0; font-family: monospace; background: #F7F7F7; border: 1px solid ddd; border-radius:3px; } div.embedPastebin { } div.embedPastebin div.embedFooter { background: #F7F7F7; color: #333; font-size: 100%; padding: 6px 12px; border-bottom: 1px solid #ddd; text-transform:uppercase; } div.embedPastebin div.embedFooter a, div.embedPastebin div.embedFooter a:visited { color: #336699; text-decoration:none; } div.embedPastebin div.embedFooter a:hover { color: red; } .noLines ol { list-style-type: none; padding-left: 0.5em; } .embedPastebin{background-color:#F8F8F8;border:1px solid #ddd;font-size:12px;overflow:auto;margin: 0 0 0 0;padding:0 0 0 0;line-height:21px} .embedPastebin div { line-height:21px; font-family:Consolas, Menlo, Monaco, Lucida Console,’Bitstream Vera Sans Mono’,’Courier’,monospace; } ol { margin:0; padding: 0 0 0 55px} ol li { border:0; margin:0;padding:0; } li.ln-xtra .de1, li.ln-xtra .de2 {background:#F8F8CE;} .embedPastebin ol li.li1 { margin: 0; } .embedPastebin ol li.li2 { margin: 0; }

Datos alojados con ♥ por Pastebin.comDescargar RawVer original
  1. [ php ]
  2. $producto
  3. -> setCategoryIds ( matriz ( 2 , 3 ) )
  4. -> setStatus ( Mage_Catalog_Model_Product_Status :: STATUS_ENABLED )
  5. -> setVisibility ( Mage_Catalog_Model_Product_Visibility :: VISIBILITY_BOTH ) // visible en catálogo y búsqueda
  6. ;
  7. [ / php ]

Configuración de existencias:

div.embedPastebin { text-align:left; padding: 0; color: #000; margin: 0; font-family: monospace; background: #F7F7F7; border: 1px solid ddd; border-radius:3px; } div.embedPastebin { } div.embedPastebin div.embedFooter { background: #F7F7F7; color: #333; font-size: 100%; padding: 6px 12px; border-bottom: 1px solid #ddd; text-transform:uppercase; } div.embedPastebin div.embedFooter a, div.embedPastebin div.embedFooter a:visited { color: #336699; text-decoration:none; } div.embedPastebin div.embedFooter a:hover { color: red; } .noLines ol { list-style-type: none; padding-left: 0.5em; } .embedPastebin{background-color:#F8F8F8;border:1px solid #ddd;font-size:12px;overflow:auto;margin: 0 0 0 0;padding:0 0 0 0;line-height:21px} .embedPastebin div { line-height:21px; font-family:Consolas, Menlo, Monaco, Lucida Console,’Bitstream Vera Sans Mono’,’Courier’,monospace; } ol { margin:0; padding: 0 0 0 55px} ol li { border:0; margin:0;padding:0; } li.ln-xtra .de1, li.ln-xtra .de2 {background:#F8F8CE;} .embedPastebin ol li.li1 { margin: 0; } .embedPastebin ol li.li2 { margin: 0; }

Datos alojados con ♥ por Pastebin.comDescargar RawVer original
  1. [ php ] $producto -> setStockData ( matriz (
  2. ‘use_config_manage_stock’ => 0 , // ¿usar configuración global?
  3. ‘manage_stock’ => 1 , // ¿deberíamos administrar el stock o no?
  4. ‘es_en_stock’ => 1 ,
  5. ‘cantidad’ => 5 ,
  6. ) ) ;
  7. [ / php ]

Especificación de atributos obligatorios, como nombre y precio:

div.embedPastebin { text-align:left; padding: 0; color: #000; margin: 0; font-family: monospace; background: #F7F7F7; border: 1px solid ddd; border-radius:3px; } div.embedPastebin { } div.embedPastebin div.embedFooter { background: #F7F7F7; color: #333; font-size: 100%; padding: 6px 12px; border-bottom: 1px solid #ddd; text-transform:uppercase; } div.embedPastebin div.embedFooter a, div.embedPastebin div.embedFooter a:visited { color: #336699; text-decoration:none; } div.embedPastebin div.embedFooter a:hover { color: red; } .noLines ol { list-style-type: none; padding-left: 0.5em; } .embedPastebin{background-color:#F8F8F8;border:1px solid #ddd;font-size:12px;overflow:auto;margin: 0 0 0 0;padding:0 0 0 0;line-height:21px} .embedPastebin div { line-height:21px; font-family:Consolas, Menlo, Monaco, Lucida Console,’Bitstream Vera Sans Mono’,’Courier’,monospace; } ol { margin:0; padding: 0 0 0 55px} ol li { border:0; margin:0;padding:0; } li.ln-xtra .de1, li.ln-xtra .de2 {background:#F8F8CE;} .embedPastebin ol li.li1 { margin: 0; } .embedPastebin ol li.li2 { margin: 0; }

Datos alojados con ♥ por Pastebin.comDescargar RawVer original
  1. [ php ] $producto
  2. -> setName ( ‘Test Product #’ . $rand ) // agregar atributo de cadena
  3. -> setShortDescription ( ‘Descripción’ ) // agregar atributo de texto
  4.  
  5. // establecer precios
  6. -> establecerPrecio ( 24.50 )
  7. -> establecerPrecioEspecial ( 19.99 )
  8. -> setTaxClassId ( 2 ) // Bienes imponibles por defecto
  9. -> establecerPeso ( 87 )
  10. ;
  11. [ / php ]

Especificando atributos de tipo desplegable, como color, tamaño , marca:

div.embedPastebin { text-align:left; padding: 0; color: #000; margin: 0; font-family: monospace; background: #F7F7F7; border: 1px solid ddd; border-radius:3px; } div.embedPastebin { } div.embedPastebin div.embedFooter { background: #F7F7F7; color: #333; font-size: 100%; padding: 6px 12px; border-bottom: 1px solid #ddd; text-transform:uppercase; } div.embedPastebin div.embedFooter a, div.embedPastebin div.embedFooter a:visited { color: #336699; text-decoration:none; } div.embedPastebin div.embedFooter a:hover { color: red; } .noLines ol { list-style-type: none; padding-left: 0.5em; } .embedPastebin{background-color:#F8F8F8;border:1px solid #ddd;font-size:12px;overflow:auto;margin: 0 0 0 0;padding:0 0 0 0;line-height:21px} .embedPastebin div { line-height:21px; font-family:Consolas, Menlo, Monaco, Lucida Console,’Bitstream Vera Sans Mono’,’Courier’,monospace; } ol { margin:0; padding: 0 0 0 55px} ol li { border:0; margin:0;padding:0; } li.ln-xtra .de1, li.ln-xtra .de2 {background:#F8F8CE;} .embedPastebin ol li.li1 { margin: 0; } .embedPastebin ol li.li2 { margin: 0; }

Datos alojados con ♥ por Pastebin.comDescargar RawVer original
  1. [ php ]
  2. $optionId = $this -> _getOptionIDByCode ( ‘color’ , ‘Black’ ) ;
  3. $producto -> setColor ( $optionId ) ;
  4. $optionId = $this -> _getOptionIDByCode ( ‘tamaño’ , ‘M’ ) ;
  5. $producto -> setSize ( $optionId ) ;
  6. [ / php ]

Toda la magia sucede en $producto->guardar();

Además, podemos agregar algunas imágenes a nuestro producto simple Magento recién creado.
Coloque los archivos en la carpeta /media/example/amasty/:

div.embedPastebin { text-align:left; padding: 0; color: #000; margin: 0; font-family: monospace; background: #F7F7F7; border: 1px solid ddd; border-radius:3px; } div.embedPastebin { } div.embedPastebin div.embedFooter { background: #F7F7F7; color: #333; font-size: 100%; padding: 6px 12px; border-bottom: 1px solid #ddd; text-transform:uppercase; } div.embedPastebin div.embedFooter a, div.embedPastebin div.embedFooter a:visited { color: #336699; text-decoration:none; } div.embedPastebin div.embedFooter a:hover { color: red; } .noLines ol { list-style-type: none; padding-left: 0.5em; } .embedPastebin{background-color:#F8F8F8;border:1px solid #ddd;font-size:12px;overflow:auto;margin: 0 0 0 0;padding:0 0 0 0;line-height:21px} .embedPastebin div { line-height:21px; font-family:Consolas, Menlo, Monaco, Lucida Console,’Bitstream Vera Sans Mono’,’Courier’,monospace; } ol { margin:0; padding: 0 0 0 55px} ol li { border:0; margin:0;padding:0; } li.ln-xtra .de1, li.ln-xtra .de2 {background:#F8F8CE;} .embedPastebin ol li.li1 { margin: 0; } .embedPastebin ol li.li2 { margin: 0; }

Datos alojados con ♥ por Pastebin.comDescargar RawVer original
  1. [ php ] $imágenes = matriz (
  2. ‘miniatura’ => ‘imagen.jpg’ ,
  3. ‘pequeña_imagen’ => ‘imagen.jpg’ ,
  4. ‘imagen’ => ‘imagen.jpg’ ,
  5. ) ;
  6.  
  7. $dir = Mago :: getBaseDir ( ‘medios’ ) . DS . ‘ejemplo/amasty/’ ;
  8.  
  9. foreach ( $imágenes como $imageType => $imageFileName ) {
  10. $ruta = $dir . $nombreArchivoImagen ;
  11. if ( archivo_existe ( $ruta ) ) {
  12. prueba {
  13. $producto -> addImageToMediaGallery ( $ruta , $imageType , false ) ;
  14. } captura ( Excepción $e ) {
  15. echo $e -> obtenerMensaje ( ) ;
  16. }
  17. } más {
  18. echo «No se puede encontrar la imagen por ruta: ` {$ruta} `<br/>» ;
  19. }
  20. }
  21. [ / php ]

¡Hecho! Tenemos un producto simple creado. Si aún no puede verlo en la interfaz, vuelva a indexar y borre su caché. Siempre te decimos que hagas esto porque es más un paso importante que una simple recomendación.

¿Podemos mejorar este código? Por supuesto que podemos; Nunca te olvides de la optimización del rendimiento. Si creamos varios productos en un ciclo, debemos decirle al núcleo de Magento que las tablas de índice no necesitan actualizarse después de la creación de cada producto; es mejor hacerlo al final de toda la tarea.

[php] $producto->setIsMassupdate(verdadero)->setExcludeUrlRewrite(verdadero);[/php]

Entonces, aprendimos cómo crear productos simples de Magento manualmente. Pero, como sabemos, Magento tiene tipos de productos complejos, como:

  • Configurable
  • agrupados
  • Paquete de unos.

Cómo crear productos configurables de Magento 2 mediante programación (manualmente)

Ahora, daremos un paso adelante para crear un producto configurable. Diga, haremos solo una opción de configuración: color. De cualquier manera, necesitamos al menos dos productos: un producto configurable principal y un producto simple secundario.

div.embedPastebin { text-align:left; padding: 0; color: #000; margin: 0; font-family: monospace; background: #F7F7F7; border: 1px solid ddd; border-radius:3px; } div.embedPastebin { } div.embedPastebin div.embedFooter { background: #F7F7F7; color: #333; font-size: 100%; padding: 6px 12px; border-bottom: 1px solid #ddd; text-transform:uppercase; } div.embedPastebin div.embedFooter a, div.embedPastebin div.embedFooter a:visited { color: #336699; text-decoration:none; } div.embedPastebin div.embedFooter a:hover { color: red; } .noLines ol { list-style-type: none; padding-left: 0.5em; } .embedPastebin{background-color:#F8F8F8;border:1px solid #ddd;font-size:12px;overflow:auto;margin: 0 0 0 0;padding:0 0 0 0;line-height:21px} .embedPastebin div { line-height:21px; font-family:Consolas, Menlo, Monaco, Lucida Console,’Bitstream Vera Sans Mono’,’Courier’,monospace; } ol { margin:0; padding: 0 0 0 55px} ol li { border:0; margin:0;padding:0; } li.ln-xtra .de1, li.ln-xtra .de2 {background:#F8F8CE;} .embedPastebin ol li.li1 { margin: 0; } .embedPastebin ol li.li2 { margin: 0; }

Datos alojados con ♥ por Pastebin.comDescargar RawVer original
  1. [ php ] $simpleProduct = $this -> _createProduct ( Mage_Catalog_Model_Product_Type :: TYPE_SIMPLE ) ; // crea un producto simple
  2. $confProduct = $this -> _createProduct ( Mage_Catalog_Model_Product_Type :: TYPE_CONFIGURABLE , false ) ; // crea un producto conf pero no lo guardas[/php]

A continuación, asocie el producto simple (hijo) con el producto configurable (principal). Hay varias opciones para hacerlo, pero no todas funcionan bien con las versiones recientes de Magento CE 1.9+. Te mostraremos la más fácil. Solo sigue estos 4 pasos:

1. Seleccione los atributos configurables:

div.embedPastebin { text-align:left; padding: 0; color: #000; margin: 0; font-family: monospace; background: #F7F7F7; border: 1px solid ddd; border-radius:3px; } div.embedPastebin { } div.embedPastebin div.embedFooter { background: #F7F7F7; color: #333; font-size: 100%; padding: 6px 12px; border-bottom: 1px solid #ddd; text-transform:uppercase; } div.embedPastebin div.embedFooter a, div.embedPastebin div.embedFooter a:visited { color: #336699; text-decoration:none; } div.embedPastebin div.embedFooter a:hover { color: red; } .noLines ol { list-style-type: none; padding-left: 0.5em; } .embedPastebin{background-color:#F8F8F8;border:1px solid #ddd;font-size:12px;overflow:auto;margin: 0 0 0 0;padding:0 0 0 0;line-height:21px} .embedPastebin div { line-height:21px; font-family:Consolas, Menlo, Monaco, Lucida Console,’Bitstream Vera Sans Mono’,’Courier’,monospace; } ol { margin:0; padding: 0 0 0 55px} ol li { border:0; margin:0;padding:0; } li.ln-xtra .de1, li.ln-xtra .de2 {background:#F8F8CE;} .embedPastebin ol li.li1 { margin: 0; } .embedPastebin ol li.li2 { margin: 0; }

Datos alojados con ♥ por Pastebin.comDescargar RawVer original
  1. [ php ]
  2. $colorAttributeId = Mage :: getModel ( ‘eav/entity_attribute’ ) -> getIdByCode ( ‘catalog_product’ , ‘color’ ) ;
  3. $confProduct -> getTypeInstance ( ) -> setUsedProductAttributeIds ( array ( $colorAttributeId ) ) ;
  4. [ / php ]

2. Prepare información para cada uno de los productos simples:

div.embedPastebin { text-align:left; padding: 0; color: #000; margin: 0; font-family: monospace; background: #F7F7F7; border: 1px solid ddd; border-radius:3px; } div.embedPastebin { } div.embedPastebin div.embedFooter { background: #F7F7F7; color: #333; font-size: 100%; padding: 6px 12px; border-bottom: 1px solid #ddd; text-transform:uppercase; } div.embedPastebin div.embedFooter a, div.embedPastebin div.embedFooter a:visited { color: #336699; text-decoration:none; } div.embedPastebin div.embedFooter a:hover { color: red; } .noLines ol { list-style-type: none; padding-left: 0.5em; } .embedPastebin{background-color:#F8F8F8;border:1px solid #ddd;font-size:12px;overflow:auto;margin: 0 0 0 0;padding:0 0 0 0;line-height:21px} .embedPastebin div { line-height:21px; font-family:Consolas, Menlo, Monaco, Lucida Console,’Bitstream Vera Sans Mono’,’Courier’,monospace; } ol { margin:0; padding: 0 0 0 55px} ol li { border:0; margin:0;padding:0; } li.ln-xtra .de1, li.ln-xtra .de2 {background:#F8F8CE;} .embedPastebin ol li.li1 { margin: 0; } .embedPastebin ol li.li2 { margin: 0; }

Datos alojados con ♥ por Pastebin.comDescargar RawVer original
  1. [ php ]
  2. $datosProductosConfigurables = matriz ( ) ;
  3. $configurableAttributesData = $confProduct -> getTypeInstance ( ) -> getConfigurableAttributesAsArray ( ) ;
  4.  
  5. $simpleProductsData = matriz (
  6. ‘etiqueta’ => $Productosimple -> getAttributeText ( ‘color’ ) ,
  7. ‘attribute_id’ => $colorAttributeId ,
  8. ‘value_index’ => ( int ) $productosimple -> getColor ( ) ,
  9. ‘es_porcentaje’ => 0 ,
  10. ‘precio_valor’ => $Productosimple -> obtenerPrecio ( ) ,
  11. ) ;
  12.  
  13. $configurableProductsData [ $simpleProduct -> getId ( ) ] = $simpleProductsData ;
  14. $configurableAttributesData [ 0 ] [ ‘valores’ ] [ ] = $simpleProductsData ;
  15. [ / php ]

3. Configure los datos en 2 formatos obligatorios:

div.embedPastebin { text-align:left; padding: 0; color: #000; margin: 0; font-family: monospace; background: #F7F7F7; border: 1px solid ddd; border-radius:3px; } div.embedPastebin { } div.embedPastebin div.embedFooter { background: #F7F7F7; color: #333; font-size: 100%; padding: 6px 12px; border-bottom: 1px solid #ddd; text-transform:uppercase; } div.embedPastebin div.embedFooter a, div.embedPastebin div.embedFooter a:visited { color: #336699; text-decoration:none; } div.embedPastebin div.embedFooter a:hover { color: red; } .noLines ol { list-style-type: none; padding-left: 0.5em; } .embedPastebin{background-color:#F8F8F8;border:1px solid #ddd;font-size:12px;overflow:auto;margin: 0 0 0 0;padding:0 0 0 0;line-height:21px} .embedPastebin div { line-height:21px; font-family:Consolas, Menlo, Monaco, Lucida Console,’Bitstream Vera Sans Mono’,’Courier’,monospace; } ol { margin:0; padding: 0 0 0 55px} ol li { border:0; margin:0;padding:0; } li.ln-xtra .de1, li.ln-xtra .de2 {background:#F8F8CE;} .embedPastebin ol li.li1 { margin: 0; } .embedPastebin ol li.li2 { margin: 0; }

Datos alojados con ♥ por Pastebin.comDescargar RawVer original
  1. [ php ]
  2. $confProduct -> setConfigurableProductsData ( $configurableProductsData ) ;
  3. $confProduct -> setConfigurableAttributesData ( $configurableAttributesData ) ;
  4. [ / php ]

4. Guarde el producto con una bandera especial:

div.embedPastebin { text-align:left; padding: 0; color: #000; margin: 0; font-family: monospace; background: #F7F7F7; border: 1px solid ddd; border-radius:3px; } div.embedPastebin { } div.embedPastebin div.embedFooter { background: #F7F7F7; color: #333; font-size: 100%; padding: 6px 12px; border-bottom: 1px solid #ddd; text-transform:uppercase; } div.embedPastebin div.embedFooter a, div.embedPastebin div.embedFooter a:visited { color: #336699; text-decoration:none; } div.embedPastebin div.embedFooter a:hover { color: red; } .noLines ol { list-style-type: none; padding-left: 0.5em; } .embedPastebin{background-color:#F8F8F8;border:1px solid #ddd;font-size:12px;overflow:auto;margin: 0 0 0 0;padding:0 0 0 0;line-height:21px} .embedPastebin div { line-height:21px; font-family:Consolas, Menlo, Monaco, Lucida Console,’Bitstream Vera Sans Mono’,’Courier’,monospace; } ol { margin:0; padding: 0 0 0 55px} ol li { border:0; margin:0;padding:0; } li.ln-xtra .de1, li.ln-xtra .de2 {background:#F8F8CE;} .embedPastebin ol li.li1 { margin: 0; } .embedPastebin ol li.li2 { margin: 0; }

Datos alojados con ♥ por Pastebin.comDescargar RawVer original
  1. [ php ]
  2. $confProduct -> setCanSaveConfigurableAttributes ( verdadero ) ;
  3. $confProducto -> guardar ( ) ;
  4. [ / php ]

NB Necesitamos tener el mismo atributo establecido en el producto configurable y su producto asociado en ambos.

Voila, creamos un producto Magento configurable manualmente.
Pero hoy tengo algo más en el bolsillo.