Compartir

Entendiendo Akeneo Connector para Magento

13 marzo, 2020

Importar tu catálogo de Akeneo a Magento

Vale, ya sé que Akeneo mola mucho. Tanto que me he hecho con él y tengo mi catálogo todo resultón en él. Ahora quiero que mi Magento lo tenga también. ¿Cómo lo voy a hacer? Ah, si resulta que Akeneo provee un módulo para hacer todo el trabajo: akeneo-connector, el anteriormente conocido como Pimgento:

https://marketplace.akeneo.com/extension/akeneo-connector-magento-2-community-edition

Hay otras muchas posibilidades, otros módulos que realizan la importación. Y siempre podemos hacer una importación con otros módulos genéricos, ya que no olvidemos que Akeneo puede realizar exportaciones a CSV. Pero con este módulo aprovecharemos la potencia y la comodidad de los webservices de Akeneo en un módulo provisto por el propio Akeneo.

⚠ Alerta de lenguaje técnico

Este artículo está dirigido a desarrolladores que se estén enfrentando a Akeneo_Connector / Pimgento y quieran entender cómo funciona.

¿Sobre qué estamos trabajando?

En este ejemplo tenemos:

  • Un Akeneo CE 3.2.7 con tres canales (website1, website2 y folletos) y dos idiomas (inglés de EEUU y español de España).
  • Un Magento CE 2.3.1 con un website (website1 con idioma inglés).
  • Akeneo-Connector v100.3.3
  • Php 7.2
  • MySQL 5.7.25

Pasos previos

Ya tengo en akeneo seleccionado el canal o canales que tengo para mi magento. Como tengo dos websites lo ideal es separar cada website en un canal.

He configurado mi magento con las credenciales de mi akeneo, y he añadido la configuración necesaria.

Ya puedo lanzar la importación. Puedo hacerlo desde el panel de administración o desde consola.

Pero aunque la interfaz que provee es muy intuitiva, tiene un problema. En importaciones largas no termina el proceso, ya que se va validando cada paso vía ajax, y si alguno demora más que el tiempo máximo de espera que tenga configurado el servidor (típicamente 30 segundos), no prosigue con todos los pasos.

¿Cómo funciona?

Akeneo-Connector recoge la información directamente desde Akeneo vía webapi. Akeneo dispone de una de las webapis más rápidas y mejor documentadas que he visto. https://api.akeneo.com/

La importación se divide en etapas o fases diferentes, que coinciden con los tipos de entidades que existen en Akeneo. Estas etapas se lanzan de manera independiente, y no son obligatorias, pero sí que hay que lanzarlas en el orden correcto.

Instala algunas tablas auxiliares, algunas son para log de acciones y otras son usadas para algunas fases, pero hay una tabla muy importante, “akeneo_connector_entities”. En ella guarda la relación entre todas las entidades de akeneo con las de magento, asociándolas por ids. Si alguna vez te da algún problema de duplicados una importación, revisa esta tabla que seguro que está ahí el origen.

Todas las fases tienen un funcionamiento similar: se conectan a akeneo para obtener sus entidades, las guardan en una tabla temporal (falsa temporal, ya que mientras exista será accesible desde cualquier sesión de MySQL), comprueba la relación con las entidades de magento en la tabla “akeneo_connector_entities” y la actualiza de ser necesario, y guarda las entidades de magento con estos datos relacionados.

Las distintas fases son las siguientes:

Categorías

Akeneo-connector importará todo el árbol de categorías. Incluída la categoría raíz, por lo tanto si no existe anteriormente, creará una nueva categoría padre de la que descenderán todas las demás.

Tip de configuración:
La configuración para la importación de categorías es bastante autoexplicativa. Sólo ten en cuenta que hay un selector de categorías, esto EXCLUYE las que selecciones, pese a lo que puede parecer en un primer vistazo.

Familias

Las familias de akeneo se convierten en Magento en attribute-set. Se importan también los grupos de atributos. Guarda en una tabla “akeneo_connector_family_attribute_relations” la relación de los atributos de akeneo con el attribute_set para ser usado en la fase de atributos.

Atributos

Se buscan los atributos existentes en akeneo y se relacionan con los de magento, bien por el propio código de atributo o por el mapping configurado, si éste existe. Los atributos que no se relacionen se crearán en Magento bajo una equivalencia de tipos básica, o bien la avanzada que se configure.

Consejos

  • Si hay algún problema de atributos, lo más probable es que haya algún dato incorrectamente relacionado. Revisa la tabla “akeneo_connector_entities” para que no haya atributos relacionados a inexistentes en Magento, o identificadores duplicados.
  • Si algún atributo nuevo se crea como tipo “static”, comprueba el punto anterior, algo ha ido mal. Yo lo que suelo hacer es borrar el atributo y su relación en “akeneo_connector_entities” y vuelvo a importar.

Opciones

Las opciones de atributos tipo select y multiselect se han de crear por separado en Magento, por lo que se importan de una manera muy similar al resto de entidades.
Hay una excepción: si importas atributos Metric como select (usados en las variantes), las opciones se rellenarán durante la importación de productos, ya que para akeneo los metric no tienen opciones.

Modelos de producto

Los “product models” de Akeneo son los equivalentes a productos configurables de Magento. Para magento es simplemente un tipo de productos con unos productos simples relacionados. Para Akeneo es una agrupación de productos con una definición de atributos comunes y otros atributos específicos de los productos simples.

Dado que conceptualmente son muy diferentes en las dos plataformas, este paso sigue un proceso significativamente distinto al resto de entidades. Se crea una tabla “akeneo_connector_product_model” que contendrá los atributos comunes y el “eje” de atributos sobre el que pivotará el configurable. 

No se realiza nada más que almacenar estos datos, ya que será en la importación de productos donde se crearán los productos configurables en Magento.

Tip Configuración
Si tienes productos configurables, es muy importante que configures el mapeo de atributos de productos configurables. Ten en cuenta que en akeneo un atributo sólo puede estar en el product model o en el variant, nunca en los dos. Así que es probable que tengas que dedicar tiempo y varias pruebas a la configuración:
Se elegirá qué atributos deben venir del product model, cuáles deben heredarse del primer producto hijo, cuáles tendrán un valor por defecto, e incluso establecer una instrucción SQL sobre las tablas temporales de akeneo-connector para obtener el valor.

Variantes de Familias

Se recogen los datos de Akeneo referentes a las variantes de familias, esto es, las distintas combinaciones de atributos que se dan en los product models, y se actualiza la tabla akeneo_connector_product_model con ellos.

Consejo

  • Si no hay product models en akeneo, esta importación dará un error de SQL ya que no existirán las columnas necesarias. Si estás automatizando la importación, asegúrate de capturar este falso error.

Productos

Aquí viene el meollo de la importación. Se divide en los siguientes pasos (definidos en el código como “jobs”):

  1. createTable: Crear tabla temporal para almacenar los datos que provengan de Akeneo.
  2. insertData: Obtener los datos de Akeneo y guardarlos en la tabla temporal
  3. addRequiredData: Añade en la tabla temporal datos necesarios que no vienen nativamente de akeneo. Por ejemplo, genera los url-key de los productos.
  4. createConfigurable: Utiliza los datos de los productos simples y los precargados en la tabla akeneo_connector_product_model para construir las filas de los productos configurables en la tabla temporal.
  5. matchEntities. Compara por sku las filas de la tabla temporal con los productos existentes y asigna los ids correspondientes
  6. updateAttributeSetId. Asigna el attribute set a los productos en la tabla temporal
  7. UpdateOption. Cambia el valor de los atributos tipo select y multiselect por el optionId correspondiente, creado en el paso de las opciones.
  8. createEntities. Crea y actualiza los productos de magento.
  9. setValues. Crea y actualiza los valores de los atributos para los productos importados.
  10. linkConfigurable. Enlaza los productos configurables con sus productos hijos.
  11. setCategories. Enlaza los productos a sus categorías.
  12. setWebsites. Enlaza los productos a sus websites. Bien según el canal configurado o según el atributo website si se ha configurado.
  13. initStock. Inicializa las tablas de stock para los productos nuevos importados.
  14. setRelated. Establece las relaciones entre productos. Aquí se crean las relaciones de productos agrupados, productos relacionados y productos de ventas cruzadas.
  15. setUrlRewrite. Actualiza los url-rewrite de magento para los productos importados, adecuándolo al url-key. Atención, si no se mapea el campo url-key, la extensión lo creará en base al sku.
  16. importMedia. Importa las imágenes. Usa el webservice de akeneo para descargar las imágenes y asignarlas a los productos de Magento.
  17. dropTable. Borra la tabla temporal creada.
  18. cleanCache. Limpia la caché de Magento.

Tips de configuración
Estúdiate bien la sección entera de configuración de productos, ya que es bastante extensa. Algunos apuntes:

  • Pon especial cuidado en configurar los atributos de media. Por un lado tienes que decirle a akeneo-connector qué columnas tiene que interpretar como imagen, y en otra configuración, cuál será la que se guardará como atributos de imagen (base, small, thumbnail).
  • Ten cuidado al configurar la “Default tax class” que establece cuál será la taxclass de los productos. Cambiará la que tengan todos los productos que vengan de akeneo a esta que esté configurada.
  • Ojo a los atributos tipo “Metric” de Akeneo. En él se permite que estos atributos sean pivotables para los Product Model, pero por defecto se importan a Magento como tipo “Text”, lo que les inhabilita para ser pivotables. Si van a ser pivotables añádelos a la sección de configuración “Metric Attributes” como usados como variant.
  • Los atributos de los productos configurables es de las secciones más delicadas de configurar, dedícales mucha atención y cariño.

Consejos

  • De los jobs que se realizan, el proceso más largo normalmente es el de regeneración de url-rewrite, especialmente si tienes muchas tiendas. Tenlo en cuenta si vas a automatizar el proceso, y si lo haces manualmente, no desesperes. Si estás haciendo importaciones de pruebas y no lo necesitas, desactiva la generación de url-rewrite en la configuración de Akeneo-connector.-
  • No configures la regeneración de urls si tienes url-rewrites antiguas. Genera errores por claves duplicadas. Normalmente lanzamos un proceso externo posterior a la importación para regenerar las url-rewrite.

Tiempos

Seguramente sea lo que más te preocupa si nunca has hecho esto antes.

Con un Akeneo con un catálogo de 17.000 productos, los tiempos más reseñables durante la importación de productos han sido:

  • Obtener los datos de Akeneo y guardarlos en la tabla temporal: 2 minutos y 30 segundos
  • Rellenar los datos requeridos: 8 segundos.
  • Guardar los datos de atributos: 15 segundos.
  • Asignar productos a categorías: 5 minutos.
  • Relaciones de productos: 1 minuto y 40 segundos.
  • URL-rewrite: con las url-rewrites vacías para los productos, 2 minutos. Con datos previos hasta 15 minutos y errores de duplicados.
  • Imágenes: Naturalmente depende de la cantidad de imágenes a importar. En este ejemplo no hemos importado imágenes.

El total de la importación de productos ha sido de 15 minutos.

El resto de tareas y fases se realizan en tiempos poco reseñables.

Consejos para personalizaciones

Aunque Akeneo-connector es muy completo y configurable, es inevitable que no se ajuste al 100% a tu proyecto y seguramente tengas que realizar alguna modificación. Aquí van algunos consejos:

  • Como siempre en magento 2, para modificar funcionalidad existente, intenta primero hacerlo mediante Observer. Si esto no es posible, mediante plugin after o before, y si tampoco es posible, te recomendaría usar un preference pese a que se aconseja mucho los plugins. Sin embargo un plugin around puede bloquear otros plugins, pero el preference no.
  • Para funcionalidades muy concretas y separadas, la forma más limpia de extender la importación es con un nuevo paso. Si quieres añadir alguna tarea adicional, tendrás que hacer un preference del job concreto, y definirle el orden de tareas completo. En este ejemplo se está añadiendo una tarea importFiles después de importMedia:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    <preference for="Akeneo\Connector\Job\Product"
              type="Interactiv4\AkeneoConnector\Job\Product"/>

    <type name="Interactiv4\AkeneoConnector\Job\Product">
       <arguments>
           <argument name="data" xsi:type="array">
               <item name="steps" xsi:type="array">
                   <item name="1" xsi:type="array">
                       <item name="method" xsi:type="string">createTable</item>
                       <item name="comment" xsi:type="string">Create temporary table</item>
                   </item>
                   <item name="2" xsi:type="array">
                       <item name="method" xsi:type="string">insertData</item>
                       <item name="comment" xsi:type="string">Fill temporary table</item>
                   </item>
                   <item name="3" xsi:type="array">
                       <item name="method" xsi:type="string">addRequiredData</item>
                       <item name="comment" xsi:type="string">Add required data</item>
                   </item>
                   <item name="4" xsi:type="array">
                       <item name="method" xsi:type="string">createConfigurable</item>
                       <item name="comment" xsi:type="string">Create configurables</item>
                   </item>
                   <item name="5" xsi:type="array">
                       <item name="method" xsi:type="string">matchEntities</item>
                       <item name="comment" xsi:type="string">Match code with Magento ID</item>
                   </item>
                   <item name="6" xsi:type="array">
                       <item name="method" xsi:type="string">updateAttributeSetId</item>
                       <item name="comment" xsi:type="string">Match family code with Magento ID</item>
                   </item>
                   <item name="7" xsi:type="array">
                       <item name="method" xsi:type="string">updateOption</item>
                       <item name="comment" xsi:type="string">Update column values for options</item>
                   </item>
                   <item name="8" xsi:type="array">
                       <item name="method" xsi:type="string">createEntities</item>
                       <item name="comment" xsi:type="string">Create or update product entities</item>
                   </item>
                   <item name="9" xsi:type="array">
                       <item name="method" xsi:type="string">setValues</item>
                       <item name="comment" xsi:type="string">Set values to attributes</item>
                   </item>
                   <item name="10" xsi:type="array">
                       <item name="method" xsi:type="string">linkConfigurable</item>
                       <item name="comment" xsi:type="string">Link configurable with children</item>
                   </item>
                   <item name="11" xsi:type="array">
                       <item name="method" xsi:type="string">setCategories</item>
                       <item name="comment" xsi:type="string">Set products to categories</item>
                   </item>
                   <item name="12" xsi:type="array">
                       <item name="method" xsi:type="string">setWebsites</item>
                       <item name="comment" xsi:type="string">Set products to websites</item>
                   </item>
                   <item name="13" xsi:type="array">
                       <item name="method" xsi:type="string">initStock</item>
                       <item name="comment" xsi:type="string">Init stock</item>
                   </item>
                   <item name="14" xsi:type="array">
                       <item name="method" xsi:type="string">setRelated</item>
                       <item name="comment" xsi:type="string">Update related, up-sell and cross-sell products</item>
                   </item>
                   <item name="15" xsi:type="array">
                       <item name="method" xsi:type="string">setUrlRewrite</item>
                       <item name="comment" xsi:type="string">Set Url Rewrite</item>
                   </item>
                   <item name="16" xsi:type="array">
                       <item name="method" xsi:type="string">importMedia</item>
                       <item name="comment" xsi:type="string">Import media files</item>
                   </item>
                   <item name="17" xsi:type="array">
                       <item name="method" xsi:type="string">importFiles</item>
                       <item name="comment" xsi:type="string">Import attribute files</item>
                   </item>
                   <item name="18" xsi:type="array">
                       <item name="method" xsi:type="string">dropTable</item>
                       <item name="comment" xsi:type="string">Drop temporary table</item>
                   </item>
                   <item name="19" xsi:type="array">
                       <item name="method" xsi:type="string">cleanCache</item>
                       <item name="comment" xsi:type="string">Clean cache</item>
                   </item>
               </item>
           </argument>
       </arguments>
    </type>

Conclusión

La base de trabajar con el Akeneo Conector ya la has leído varias veces en el artículo: dedícale atención a la configuración. Correctamente configurado la importación del catálogo desde Akeneo es rápida y eficaz. Y puedes suplir las carencias que tengas si te animas a personalizarlo con extensiones tuyas.

Otra lucha será que se explote el potencial que tiene Akeneo.

Categoría
Etiquetas
Autor

Compartir

Suscríbete a nuestra newsletter

También te puede interesar

Usamos cookies de terceros para mejorar nuestros servicios y obtener datos estadísticos de tus hábitos de navegación. Si continúas navegando consideramos que aceptas su uso. Puedes obtener más información en Política de privacidad y cookies