Ayer me plantearon el siguiente escenario: «necesito agregar N cantidad de valores al atributo color ya que el tipo de tienda que estoy haciendo tiene una variedad demencial de opciones y si cargo a mano cada option del atributo me va a tomar X tiempo».
Entiéndase que N eran varios miles y X era demasiado. Luego podríamos discutir si el valor de N tiene sentido o no.
Finalmente di con una solución que se transformó en módulo.
De esta manera, no sólo se pudo evitar el desperdicio de X tiempo para esto, sino que ahora tenemos una opción adicional para la creación de atributos, pudiendo versionar la creación y los cambios con un archivo CSV. La parte de no programar es parcialmente cierta, ya que se podría necesitar duplicar el DataPatch que llama al archivo CSV.
El escenario era el mencionado al comienzo, pero a los fines de mi experimento me dispuse a importar más valores para el atributo Color y crear dos nuevos atributos personalizados (uno de ellos, también con opciones).
Por defecto, entonces, tenemos nuestro atributo Color, que puede o no contener valores. En mi instancia de juguete (un Magento 2.4.2 con SampleData) tenía estos.
Y en cuanto a los atributos creados, contaba con 66.
Luego de habilitar mi módulo y ejecutar el comando setup:upgrade, el resultado fue el siguiente.
Si, custom_attribute_with_options y another_attribute son los dos atributos adicionales que yo creé. Así se ve mi archivo CSV (una parte del mismo).
Puede verse en la columna A el label del atributo y en la columna F el attribute code. La columna D, cuando corresponde, crea los options.
Si reviso la tabla de los options de los atributos, debería de ver algo así.
Hasta aquí todo parece correcto en términos de datos. Vayamos al backend ahora.
Tengo dos atributos nuevos (y los veo en la segunda y última fila). Todo va sobre ruedas.
Voy a revisar las opciones del atributo Color.
Mis opciones fueron agregadas correctamente. Lo del Swatch se puede lograr también, pero lleva otra lógica (quizás sea material para otro post).
Ahora revisemos mi atributo custom con opciones.
Y finalmente, mi atributo con valor booleano.
Es decir que hasta aquí, pude editar un atributo existente y crear dos nuevos atributos. Veamos qué pasa al momento de editar el producto.
Mis nuevas opciones están disponibles. Lo mismo con el atributo booleano.
No logro dar con el tercer atributo, y eso no es por error, sino por los attribute sets. Estoy en un producto que no tiene el attribute set definido para el producto. Para que esté disponible debería ser alguno de estos:
Una vez que doy con un producto que pertenezca a ese set…
Ahora si, todos los atributos fueron creados sin error.
Veamos entonces la parte del código, que es la que puede ser útil en algún escenario (al final volveré sobre este punto).
Para empezar, el módulo está disponible en Github y Packagist. La idea de lo que está ahí es que sirva como ejemplo para cuando se necesiten crear más atributos o actualizar muchos valores de opciones.
Hay 3 archivos que son los que nos importarán realmente para hacer nuestras actualizaciones.
El archivo CSV dentro de fixtures contiene la información del atributo. Pueden ver el ejemplo aquí. Si necesitamos agregar options a un atributo dado, agregaremos en la cuarta columna, cada uno de los valores (que deben estar separados por un salto de línea). Si el atributo ya existe, se agregarán los valores. Sino, el atributo se creará según lo que hayamos definido.
El otro archivo importante es, sin dudas, el DataPatch InstallSampleAttributesData.php. Este archivo hace dos cosas:
- Utiliza el Executor del SampleData (que está dentro del Framework, no es necesario instalar SampleData).
- Invoca un segundo archivo (InstallerSampleAttributes) que es el que llamará a nuestro CSV.
Es por eso que en nuestro DataPatch importamos el archivo que queremos que se ejecute.
Veamos ahora qué hace InstallerSampleAttributes.php.
Si, va a leer el archivo que le indiquemos y lo va a procesar (haciendo uso de un Model). Y con eso estaríamos listos.
¿Cómo hago para crear mis propios atributos o para usar el módulo más de una vez?. Aquí funciona como un DataPatch normal. Crearíamos un segundo (o tercer o N) patch dentro de Setup/Patch/Data/, el cual llamará a otro archivo idéntico a Setup/InstallerSampleAttributes.php (con otro nombre, claro), y dentro de ese archivo llamaremos a otro (u otros) archivos CSV.
Y aquí termina el tema.
Antes hablaba sobre cuándo tiene sentido o no usar esta metodología. No debería hacer falta repetir que dependerá de cada uno/equipo/proyecto/deadline; pero para el caso en el que es necesario curar muchos datos, y cuando quizás tengamos a alguien que se encargue correctamente de ello pero que no tenga o los conocimientos o los permisos técnicos para armar un DataPatch y pushearlo, podríamos usar este módulo.
Una última aclaración. Si instalan el módulo y ejecutan setup:upgrade, van a modificar y crear atributos. Recuerden revisar los valores del archivo CSV y hacer los cambios que consideren necesarios.
Con respecto a la persona que me hizo la pregunta, finalmente resolvió en unos segundos la carga de los 4000 options y quien iba a hacer la carga manual se dedicó a disfrutar de una noche más de su streaming favorito.
Intenté recomendarle cierto Podcast pero no tuve suerte.