Después de estudiar la arquitectura conceptual de Drupal Commerce vamos a comenzar una nueva fase: construir una tienda desde cero.
Hasta ahora hemos analizado:
Discovery
↓
Product Modeling
↓
Pricing
↓
Orders
↓
Checkout
↓
Payments
↓
Shipping
↓
FulfillmentAhora utilizaremos esos conceptos para tomar decisiones reales dentro de una instalación Drupal.
Para hacerlo utilizaremos un negocio de ejemplo suficientemente pequeño para comprenderlo con claridad, pero suficientemente variado para explorar diferentes capacidades de Commerce.
1. Nuestro negocio de ejemplo
Imaginemos una familia que comienza a vender productos desde casa mediante Internet.
Inicialmente quiere vender tres grandes tipos de cosas:
Artículos usados
Objetos que la familia ya posee y desea vender.
Por ejemplo:
Used Products
├── Laptop usado
├── Cámara fotográfica
├── Mesa
├── Bicicleta
└── LibrosNormalmente cada artículo:
- Es único
- Tiene una sola unidad disponible
- Tiene un precio específico
- Tiene fotografías propias
- Tiene una condición particular
Productos importados
La familia también compra algunos productos en el exterior para revenderlos localmente.
Por ejemplo:
Imported Products
├── Accesorios electrónicos
├── Cables
├── Gadgets
├── Artículos para el hogar
└── Pequeños dispositivosEstos productos pueden tener:
- Varias unidades en stock
- Reposición de inventario
- Costos de importación
- Precio de venta
- Diferentes variantes
Pasteles
También existe un pequeño negocio familiar de pastelería.
Por ejemplo:
Cake
Chocolate Cakeque puede ofrecerse en diferentes tamaños:
Small
Medium
Largey quizás diferentes sabores o coberturas:
Chocolate
Vanilla
StrawberryEsto nos permitirá trabajar con Product Attributes y Product Variations.
Servicios en el futuro
Más adelante la familia podría ofrecer servicios.
Por ejemplo:
Computer setup
Basic technical support
Cake decoration service
Home delivery service
Personalized event serviceNo implementaremos todavía estos servicios, pero tendremos en cuenta que el modelo pueda extenderse sin reconstruir toda la tienda.
2. Por qué este ejemplo es interesante
Nuestro pequeño negocio contiene varios problemas diferentes de Commerce.
Used Products
↓
Unique items
Imported Products
↓
Inventory / repeatable products
Cakes
↓
Product Variations
Future Services
↓
Non-physical commerceEsto nos permitirá aprender progresivamente diferentes patrones de modelado.
Además nos obliga a evitar una mala práctica común:
Crear una única estructura genérica para cualquier cosa que podamos vender.
Queremos compartir estructuras cuando tenga sentido, pero separarlas cuando existan diferencias reales de negocio.
3. Alcance de nuestra primera versión
No vamos a implementar toda la tienda desde el primer artículo.
Nuestra primera versión tendrá un alcance deliberadamente pequeño.
Construiremos:
Drupal
↓
Commerce
↓
Store
↓
Basic Product Architecture
↓
First ProductEn artículos posteriores añadiremos:
Attributes
Variations
Inventory
Checkout
Payments
Shipping
Promotions
Taxes
ServicesTrabajaremos de forma incremental.
4. Arquitectura inicial del negocio
Antes de instalar Commerce podemos hacer un primer diseño conceptual.
HOME SHOP
│
├── Used Products
│
├── Imported Products
│
├── Cakes
│
└── Services
└── FutureLa primera pregunta es:
¿Necesitamos cuatro Product Types?
No necesariamente.
Debemos analizar las diferencias estructurales.
5. Analizando los artículos usados
Un producto usado podría tener:
Title
Description
Category
Condition
Images
Price
AvailabilityPor ejemplo:
MacBook Air M1 usado
Condition:
Good
Price:
450 USD
Quantity:
1Normalmente tendrá una única Product Variation.
Product
MacBook Air M1 usado
↓
Variation
SKU:
USED-0001
Price:
450 USDNo necesitamos Attributes porque el usuario no selecciona entre múltiples versiones.
6. Analizando los productos importados
Algunos productos importados podrían tener exactamente la misma estructura.
Por ejemplo:
USB-C Hub
Description
Brand
Category
Images
Pricey:
Variation
SKU:
IMP-USBHUB-001
Price:
35 USDEn ese caso la diferencia entre:
Used Product
Imported Productpodría ser simplemente una clasificación.
Podríamos utilizar:
Product Type:
Physical Product
Taxonomy:
Product Origin
├── Used
├── Imported
└── LocalEsto sería más sencillo que crear Product Types diferentes sin necesidad.
7. Pero existen diferencias reales
Sin embargo, quizá queramos registrar información específica para los productos usados.
Por ejemplo:
Condition
Purchase year
Visible defectsMientras los productos importados podrían necesitar:
Brand
Supplier
Country of originAquí tenemos una decisión real de arquitectura.
Podemos:
Option A
One Product Type
+
optional fieldso:
Option B
Used Product
Imported ProductPara nuestro ejercicio elegiremos inicialmente mantenerlos separados.
Esto hará más visibles las diferencias entre Product Types y nos permitirá practicar su configuración.
8. Arquitectura inicial de Product Types
Comenzaremos con:
Product Types
├── Used Product
├── Imported Product
└── CakeDejaremos:
Servicepara una etapa posterior.
9. Variation Types
También debemos pensar en las unidades comprables.
Used Product
Product
Used Laptop
↓
1 Variation
SKU:
USED-0001Imported Product
Inicialmente:
Product
USB-C Hub
↓
1 Variation
SKU:
IMP-0001Pero posteriormente un producto importado puede tener:
Color
Size
Capacityy múltiples Variations.
Cake
Product
Chocolate Cake
↓
Variations
├── Small
├── Medium
└── LargePor tanto el pastel será nuestro primer ejemplo real de múltiples Variations.
10. Nuestra arquitectura inicial
Podemos representar el diseño así:
STORE
Home Shop
│
├── Product Type
│ Used Product
│ ↓
│ Used Variation
│
├── Product Type
│ Imported Product
│ ↓
│ Imported Variation
│
└── Product Type
Cake
↓
Cake VariationMás adelante podremos evaluar si realmente necesitamos mantener separados algunos de estos tipos.
Parte del aprendizaje consiste precisamente en revisar nuestras decisiones cuando conocemos mejor el dominio.
11. Stack de nuestra tienda
Partiremos de un proyecto Drupal moderno administrado mediante Composer.
Nuestra arquitectura será:
Drupal 11
↓
Drupal Commerce 3.x
↓
Custom configuration
↓
Custom theme / frontend laterDurante esta primera fase nos concentraremos en administración y arquitectura.
La apariencia visual puede esperar.
12. Crear un nuevo proyecto Drupal
Si comenzamos completamente desde cero podemos utilizar el proyecto recomendado de Drupal.
composer create-project drupal/recommended-project home-shop
cd home-shopDespués podemos preparar nuestro entorno local utilizando la herramienta que prefiramos.
Por ejemplo:
DDEVEn nuestra serie asumiremos que Drupal ya está correctamente instalado y funcionando antes de añadir Commerce.
13. Instalar Drupal Commerce
Commerce debe instalarse mediante Composer.
Para Commerce 3.x:
composer require 'drupal/commerce:^3.3'Composer instalará Commerce y sus dependencias PHP.
Después podemos comprobar los módulos disponibles:
drush pm:list --filter=commerceCommerce se distribuye como un conjunto de módulos relacionados.
14. Commerce no es un único módulo funcional
Drupal Commerce está dividido en diferentes componentes.
Encontraremos módulos relacionados con conceptos como:
Commerce
Store
Product
Order
Cart
Checkout
Payment
Price
Promotion
Tax
LogEsta división refleja la arquitectura que hemos estudiado durante toda la serie.
No se trata de un monolito.
15. Habilitar Commerce
Podemos habilitar el conjunto principal mediante Drush.
Por ejemplo:
drush en commerce -yDependiendo de nuestro proyecto también podemos habilitar explícitamente componentes concretos posteriormente.
Después:
drush crUna vez habilitado Commerce aparecerán nuevas secciones administrativas relacionadas con la tienda.
16. No instalaremos todavía Shipping
Nuestros primeros productos serán físicos.
Podríamos pensar que deberíamos instalar inmediatamente Commerce Shipping.
Pero no lo haremos todavía.
Primero queremos dominar:
Store
Products
Variations
Attributes
OrdersDespués añadiremos Shipping conscientemente.
Esto nos permite comprender qué funcionalidad pertenece a Commerce Core y cuál procede de módulos adicionales.
17. Tampoco instalaremos un Payment Gateway todavía
No comenzaremos instalando Stripe o PayPal.
Primero construiremos correctamente nuestra tienda.
Más adelante podremos instalar un Gateway de prueba.
Durante desarrollo también podemos trabajar con opciones de pago manual para comprender el flujo sin depender inicialmente de servicios externos.
18. Primera decisión: moneda
Nuestra tienda familiar necesita una moneda base.
Supongamos que opera inicialmente en Ecuador.
Utilizaremos:
USDEcuador utiliza el dólar estadounidense, por lo que para nuestro ejemplo no necesitamos conversión de moneda.
Esto simplifica mucho nuestra primera implementación.
19. Crear nuestra primera Store
Una instalación Commerce necesita al menos una Store para vender productos.
Conceptualmente crearemos:
Store Type
Online Storey:
Store
Home ShopPor ahora tendremos:
1 StoreNo necesitamos una Store para cada familia de productos.
20. Datos iniciales de la Store
Nuestra Store podría configurarse conceptualmente con:
Name:
Home Shop
Default Currency:
USD
Email:
store@example.com
Country:
EcuadorLa dirección exacta dependerá del negocio real.
En un proyecto de producción también debemos configurar correctamente la información comercial y fiscal correspondiente.
21. ¿Necesitamos varias Stores?
No.
No necesitamos:
Used Store
Imported Store
Cake Storeporque estas categorías pertenecen al mismo negocio.
Tenemos:
Home Shop
│
├── Used Products
├── Imported Products
└── CakesUna única Store es suficiente.
22. Crear categorías
Antes de crear productos podemos preparar una Taxonomy.
Por ejemplo:
Vocabulary:
Product CategoryCon términos:
Electronics
Home
Furniture
Photography
Books
Food
CakesMás adelante podremos construir una jerarquía más completa.
23. Crear una clasificación de origen
También puede ser útil registrar cómo obtenemos cada producto.
Podríamos crear:
Vocabulary:
Product OriginCon términos:
Used
Imported
Local ProductionEsto nos permitirá posteriormente revisar si todavía tiene sentido mantener separados:
Used Product
Imported Producto si podemos consolidarlos.
24. Crear una clasificación de condición
Los productos usados necesitan indicar su estado.
Podríamos utilizar una Taxonomy:
Product Condition
├── Like New
├── Very Good
├── Good
├── Fair
└── For PartsO un field con opciones predefinidas.
Para este ejercicio utilizaremos Taxonomy porque queremos permitir:
- Filtros
- Páginas por condición
- Administración centralizada de términos
25. Diseñar Used Product
Nuestro primer Product Type será:
Used ProductPodría tener:
Title
Description
Category
Condition
Images
Visible Defects
Original Purchase YearMientras la Variation contendrá:
SKU
PriceMás adelante añadiremos inventario.
26. Diseñar Imported Product
Nuestro segundo Product Type:
Imported ProductPodría contener:
Title
Description
Brand
Category
Images
Country of OriginLa Variation:
SKU
PriceMás adelante puede incorporar Attributes y stock.
27. Diseñar Cake
Nuestro tercer Product Type será:
CakeEl Product podría contener:
Title
Description
Images
Ingredients
Allergen Information
CategoryLas Variations representarán las opciones que realmente vendemos.
Small
Medium
LargeCada una puede tener:
SKU
Price
Size28. Size será nuestro primer Product Attribute
Crearemos conceptualmente:
Product Attribute
Cake SizeCon valores:
Small
Medium
LargeEntonces:
Product
Chocolate Cake
↓
Variations
├── Small
├── Medium
└── LargeEsto nos permitirá practicar la relación entre:
Product
Variation Type
Attribute
Variation29. ¿Y el sabor?
Aquí debemos detenernos antes de crear otro Attribute.
Supongamos que tenemos:
Chocolate Cake
Vanilla Cake
Carrot CakeDebemos preguntar:
¿Son sabores seleccionables del mismo producto o son productos diferentes?
Podríamos diseñar:
Product:
Birthday Cake
Attributes:
Flavor
├── Chocolate
├── Vanilla
└── Carrot
Size
├── Small
├── Medium
└── LargeEsto produciría hasta:
3 flavors
×
3 sizes
=
9 variationsPero quizás para el negocio tenga más sentido:
Product:
Chocolate Cake
Variations:
Small
Medium
Large
Product:
Vanilla Cake
Variations:
Small
Medium
LargePara nuestro ejercicio utilizaremos este segundo modelo.
El sabor definirá el Product y el tamaño definirá la Variation.
30. Por qué elegimos este modelo
Porque queremos que cada tipo de pastel tenga:
- Fotografías propias
- Descripción propia
- Ingredientes propios
- Información de alérgenos propia
Mientras el tamaño modifica principalmente:
- Precio
- SKU
- Cantidad aproximada de porciones
Por tanto:
Flavor / recipe
↓
Product
Size
↓
VariationEsta es precisamente la clase de razonamiento que debemos aprender a realizar.
31. Nuestra arquitectura inicial completa
STORE
Home Shop
│
├── USED PRODUCT
│ │
│ └── Used Variation
│
├── IMPORTED PRODUCT
│ │
│ └── Imported Variation
│
└── CAKE
│
└── Cake Variation
│
└── Attribute
SizeClasificaciones compartidas:
Taxonomies
Product Category
Product Origin
Product Condition32. Nuestro primer producto real
Para comprobar la instalación comenzaremos con un artículo usado.
Por ejemplo:
Product
Used Canon CameraDatos:
Title:
Canon EOS Camera usada
Category:
Photography
Condition:
Good
Description:
Cámara usada en buen estado.
Visible defects:
Small scratches on body.Variation:
SKU:
USED-CAMERA-001
Price:
250 USDTendremos:
Product
Canon EOS Camera usada
↓
Variation
USED-CAMERA-001
↓
250 USD33. Por qué incluso el producto usado necesita Variation
Este ejemplo refuerza uno de los conceptos fundamentales de Commerce.
Tenemos solamente una cámara.
No existen:
Colors
Sizes
CapacitiesPero seguimos necesitando:
Product
↓
Product Variationporque la Variation es la entidad comprable.
La cámara puede tener una única Variation.
34. Nuestro segundo producto será importado
Posteriormente añadiremos:
Product
USB-C Multiport Hubcon:
SKU:
IMP-HUB-001
Price:
35 USDEsto nos permitirá comparar los dos Product Types.
Quizás descubramos que su estructura es suficientemente similar como para consolidarlos.
Esa revisión forma parte del proceso de arquitectura.
35. Nuestro tercer producto será un pastel
Finalmente añadiremos:
Product
Chocolate Cakecon:
Variation #1
Size:
Small
SKU:
CAKE-CHO-S
Price:
15 USD
Variation #2
Size:
Medium
SKU:
CAKE-CHO-M
Price:
25 USD
Variation #3
Size:
Large
SKU:
CAKE-CHO-L
Price:
40 USDEste será nuestro primer producto con Attributes y múltiples Variations.
36. ¿Dónde colocaremos las fotografías?
En nuestros primeros ejemplos utilizaremos imágenes a nivel de Product.
Por ejemplo:
Used Camera
Images
├── front.jpg
├── back.jpg
└── scratch-detail.jpgy:
Chocolate Cake
Images
├── cake-main.jpg
└── cake-detail.jpgSi posteriormente diferentes Variations tienen imágenes diferentes, podremos mover o añadir imágenes a nivel de Variation.
37. ¿Dónde colocaremos el stock?
Todavía no.
Es importante no confundir:
Published
↓
Product visibilitycon:
Stock
↓
Inventory availabilityMás adelante estudiaremos explícitamente cómo manejar inventario.
Para un artículo usado queremos eventualmente:
Initial Stock
1y después de comprarlo:
Stock
0Pero no intentaremos implementar esto mediante un simple campo improvisado.
38. Tampoco modelaremos todavía el costo de importación como Price
Supongamos:
USB Hub
Purchase price:
15 USD
Import cost:
5 USD
Final internal cost:
20 USD
Sale price:
35 USDCommerce Price representa el precio comercial de venta.
Los costos internos pertenecen a otro problema.
Más adelante podemos decidir si necesitamos almacenar:
Purchase Cost
Import Cost
Marginpara reporting interno.
No debemos mezclar automáticamente:
Cost
≠
Selling Price39. Prepararnos para servicios sin implementarlos
Nuestro diseño también debe permitir una futura incorporación de servicios.
Por ejemplo:
Product Type
ServicePodría tener:
Title
Description
Duration
RequirementsY una Variation:
SKU
PriceUn servicio puede ser perfectamente una entidad comprable sin necesitar Shipping.
Esto confirma por qué no queremos acoplar toda nuestra arquitectura a productos físicos.
40. Configuración frente a contenido
Durante esta implementación debemos distinguir cuidadosamente dos tipos de información.
Configuration
Product Types
Variation Types
Fields
Taxonomies definitions
Attributes
Order Types
Checkout FlowsEsta configuración normalmente forma parte de nuestro sistema de configuración Drupal.
Content
Canon Camera
USB Hub
Chocolate Cake
Small Variation
Medium VariationEstos son datos comerciales.
La separación es importante para nuestro proceso de desarrollo y deployment.
41. Exportaremos la configuración
Una vez creada la arquitectura podremos exportarla utilizando:
drush cex -yDespués podremos revisar los cambios en:
config/synco en el directorio de configuración utilizado por nuestro proyecto.
Deberíamos poder identificar archivos relacionados con:
commerce_product_type
commerce_product_variation_type
commerce_product_attribute
field.storage
field.field
taxonomy.vocabularyEsto será especialmente útil para aprender cómo Commerce representa su configuración internamente.
42. No exportamos el catálogo como configuración
Cuando ejecutamos:
drush cexno esperamos encontrar:
Canon Camera
USB Hub
Chocolate Cakeporque estos productos son entidades de contenido.
Lo que exportamos es la arquitectura que permite crearlos.
Configuration
↓
¿Qué tipos de cosas podemos vender?
Content
↓
¿Qué cosas estamos vendiendo?43. Secuencia práctica de nuestra tienda
Nuestra implementación seguirá aproximadamente este orden:
1. Drupal
2. Commerce
3. Store
4. Taxonomies
5. Product Types
6. Variation Types
7. Product Attributes
8. Fields
9. Used Product
10. Imported Product
11. Cake
12. Cart
13. Checkout
14. Payment
15. Inventory
16. Shipping
17. Promotions
18. Taxes
19. ServicesNo todos los proyectos reales deben seguir exactamente este orden.
Pero para aprendizaje nos permitirá introducir los conceptos progresivamente.
44. Nuestra primera milestone
Al terminar esta primera fase deberíamos ser capaces de navegar administrativamente por una arquitectura similar a:
Commerce
├── Store
│ └── Home Shop
│
├── Products
│ ├── Used Product
│ ├── Imported Product
│ └── Cake
│
├── Product Variations
│ ├── Used Variation
│ ├── Imported Variation
│ └── Cake Variation
│
└── Product Attributes
└── Cake SizeY deberíamos poder crear:
Canon Camera usada
↓
250 USD
USB-C Hub
↓
35 USD
Chocolate Cake
↓
Small 15 USD
Medium 25 USD
Large 40 USD45. Qué no vamos a hacer todavía
Para mantener clara esta fase, todavía no configuraremos:
Real Payment Gateway
Shipping
Inventory
Taxes
Promotions
Coupons
ERP integrations
Invoices
ServicesTodos estos componentes tendrán su propio momento.
Primero queremos tener un catálogo correctamente modelado.
46. Nuestro principio de trabajo
A lo largo de la implementación utilizaremos la misma regla aplicada durante toda la serie:
Primero entendemos qué necesita el negocio. Después decidimos cómo representarlo en Drupal Commerce. Finalmente configuramos Drupal.
No utilizaremos la interfaz para descubrir nuestro modelo.
Utilizaremos la interfaz para implementar un modelo que podamos explicar.
47. Checklist de esta primera etapa
Antes de continuar deberíamos tener claro:
Store
- Una única Store
- Moneda USD
- Negocio inicialmente local
Product Types
- Used Product
- Imported Product
- Cake
Variation Types
- Used Variation
- Imported Variation
- Cake Variation
Attributes
- Cake Size
Taxonomies
- Product Category
- Product Origin
- Product Condition
Future
- Inventory
- Shipping
- Payment Gateway
- Services
48. Modelo mental inicial
Nuestra primera implementación puede resumirse así:
HOME SHOP
│
▼
STORE
│
├───────────────────────┐
│ │
▼ ▼
USED PRODUCTS IMPORTED PRODUCTS
│ │
▼ ▼
VARIATION VARIATION
│ │
▼ ▼
PRICE PRICE
CAKES
│
▼
PRODUCT
│
▼
CAKE VARIATIONS
│
┌─────┼─────┐
▼ ▼ ▼
Small Medium Large
│ │ │
▼ ▼ ▼
Price Price PricePosteriormente:
Products
↓
Cart
↓
Checkout
↓
Payment
↓
Shipping
↓
Order CompletionConclusión
Con este artículo comenzamos la transición desde arquitectura conceptual hacia implementación real.
Nuestro negocio de ejemplo nos permitirá trabajar con varios patrones importantes:
Used Product
= producto normalmente único
Imported Product
= producto repetible
con posible inventario
Cake
= producto con Variations
Service
= futura entidad comprable
sin ShippingLa primera lección práctica sigue siendo arquitectónica.
No debemos instalar módulos ni crear campos simplemente porque pueden parecernos útiles.
Primero definimos qué queremos representar.
Nuestra arquitectura inicial será:
1 Store
3 Product Types
3 Variation Types
1 Product Attribute
3 Taxonomiesy evolucionará solamente cuando aparezca una necesidad real.
En el siguiente artículo comenzaremos directamente dentro de Drupal: crearemos la Store, los Product Types y los Product Variation Types.
Además examinaremos las opciones que aparecen en cada formulario administrativo y explicaremos qué significa cada una, en lugar de limitarnos a indicar qué botones debemos pulsar.