Ejemplo 6 - Importación en Sales Layer
Introducción y estructura de datos
A través de nuestra API y SDK es posible importar datos directamente a SalesLayer usando SalesLayer_Conn(). De esta manera, es factible programar importaciones automáticas desde, por ejemplo, un ERP a la plataforma.
En el ejemplo 6 utilizaremos el SDK para importar información en una cuenta de pruebas dónde actualizaremos información ya existente y crearemos ítems nuevos.
Es importante tener en cuenta que antes de proceder a la lectura de este documento, es recomendable leer la documentación de nuestra API.
Para este ejemplo utilizaremos un conector importación. Podréis encontrarlo en la tienda de canales:

El primer paso será definir una clave privada para el conector y elegir los idiomas a conectar:

Como el parámetro de Sobreescribir siempre al importar sirve para sincronizar archivos CSV a través de Fuentes Enlazadas, no lo tendremos en cuenta en este ejemplo:

Después de haber definido los parámetros iniciales procederemos con la configuración de las tablas a importar. En este punto tendremos que definir los campos que queremos actualizar o crear en el caso de tener ítems nuevos.
Atento: en todas las tablas es obligatorio subir el campo de referencia ya que es un campo obligatorio para añadir nuevos ítems y el campo que reconoce los ítems ya existentes a actualizar.
A modo de ejemplo, en la tabla de categorías añadiremos los siguientes campos:

Los siguientes en la de productos:

Y por último, en las variantes configuramos los siguientes campos:

Hay varias cosas a tener en cuenta al configurar las tablas:
Por un lado, el checkbox que indica si queremos solo actualizar ítems existentes dándole a Sí.

Y por otro, si queremos no solo actualizar, sino también crear nuevos ítems, marcando la opción en No. Al hacer esta acción, aparecerá un segundo checkbox para seleccionar el estado de los ítems nuevos:

Hay que tener en cuenta que, al seleccionar que no queremos actualizar solo los existentes, los nuevos ítems se crearán en estado borrador.
A continuación habrá que decidir el nombre de la columna a importar, correspondiente a la columna de la izquierda:

Este nombre tiene que ser exactamente igual al nombre de la columna que vamos a subir por el SDK, incluyendo espacios, guiones, mayúsculas, etc.
La columna de la derecha corresponderá al campo a relacionar existente en Sales Layer:

Atento: para subir información a través del SDK es obligatorio que el campo relacionado esté previamente creado en Sales Layer.
Una vez generadas y configuradas las tablas procederemos a guardar y finalizar el conector. Hay que tener en cuenta que, como en este caso vamos a utilizar nuestra API, no pondremos información en la pestaña de Fuentes Enlazadas porque sirve exclusivamente para subir ficheros CSV.
Código
Vamos a revisar ahora cómo sería el
<?php
define('LOC_BASE', dirname(__FILE__) . '/');
require(LOC_BASE.'SalesLayer-Conn.php');
require(LOC_BASE.'lib/nice_r-master/Nicer.php');
?>
<!DOCTYPE html>
<html dir="ltr" lang="en-US">
<head>
<link rel="stylesheet" type="text/css" href="lib/nice_r-master/nice_r.css?version=<?php echo filemtime(LOC_BASE.'lib/nice_r-master/nice_r.css'); ?>"/>
<script type="text/javascript" src="lib/nice_r-master/nice_r.js?version=<?php echo filemtime(LOC_BASE.'lib/nice_r-master/nice_r.js'); ?>"></script>
</head>
<body>
<?php
//SL import connector
$connector_id = "CN17533H3908C4486";
$secret_key = "cd6a8653823248296079e595e772f9b2";
//Create object with the credentials of the connector
$SLConn = new SalesLayer_Conn ($connector_id, $secret_key);
//API Version
$SLConn->set_API_version('1.18');
//Import Data
$input_data = [
"categories" => [
[
"Section Reference" => "CHAQ01",
"Section name" => "Jackets 2022"
],
[
"Section Reference" => "CAMI03",
"Section Description" => "Summer T-shirts, Collection of 2022! The best choice..."
],
[
"Section Reference" => "SH01",
"Section name" => "Shoes",
"Section Description" => "Summer Shoes Collection. Choose the best that suits you!",
"Parent Section Reference" => "VERA01"
],
],
"products" => [
[
"Product Reference" => "42PM020100483",
"Product Description:en" => "Brown mohair coat with detachable funnel neck, raglan sleeves and concealed clip button fastening."
],
[
"Product Reference" => "AAPA10L63534",
"Product Name:en" => "Phone Cover",
"Product Name:es" => "Funda Móvil",
"Section Reference" => "ACCE02",
"Product Description:en" => "Phone cover that will protect your phone even with the strongest falls. The phone cover you need!",
"Product Description:es" => "Funda para tu movil que protegerá incluso con las caídas más fuertes. ¡La funda de que necesitas!",
"Product Color" => "Black"
],
],
"variants" => [
[
"Product Reference" => "42PM020100483",
"Variant Reference" => "FR1342",
"Variant Size" => "L",
"Variant Price" => "24.99"
],
[
"Variant Reference" => "F234944",
"Variant Price" => "49.99"
],
]
];
// set_info function
$response = $SLConn->set_info($input_data);
//error verification
if ($SLConn->has_response_error())
echo "<h4>Error:</h4>\n\n Code: ".$SLConn->get_response_error().
"<br>\nMessage: ". $SLConn->get_response_error_message();
else {
echo "<h4>Response OK</h4>\n".
"<p>".
"API version: <b>".$SLConn->get_response_api_version()."</b><br />\n".
"Connector ID: <b>". $SLConn->get_identification_code()."</b><br />\n".
"Time: <b>". $SLConn->get_response_time() ."</b> (GMT 0)<br/>\n".
"</p>";
//tracking functions
do {
$status = $SLConn->get_input_tracking_status();
echo "Status: ". $status.
', percent: '. $SLConn->get_input_tracking_percent().
'%, message: '.$SLConn->get_input_tracking_message()." <br>\n";
flush(); ob_flush(); sleep(1);
} while (!in_array($status, ['error', 'end']));
//Resume of Total Information
echo "<br />\n".
"Total information: ". print_r($SLConn->get_data_returned(), 1);
}
?>
</body>
</html>
Empezaremos definiendo las credenciales del conector de importación siguiendo con la creación del objeto $SLConn, responsable de la conexión con Sales Layer.
Después definimos la versión de la API. En este ejemplo, usaremos la versión 1.18 porque en esta versión están disponibles las funciones de tracking de la importación, ayudando a saber el porcentaje de ítems importados. Igualmente, la versión 1.17 sigue disponible para uso.
Una vez realizado esto, será el momento de configurar la información que queremos subir, tanto para crear información nueva como para actualizar la ya existente. La estructura de
$input_data = [
"table" => [
[
"reference" => "",
"campo1" => "",
"campo2" => "",
…
],
…
],
…
];
Siguiendo el ejemplo de la estructura anterior tendremos el siguiente código para la tabla de categorías:
"categories" => [
[
"Section Reference" => "CHAQ01",
"Section name" => "Jackets 2022"
],
[
"Section Reference" => "CAMI03",
"Section Description" => "Summer T-shirts, Collection of 2022! The best choice..."
],
[
"Section Reference" => "SH01",
"Section name" => "Shoes",
"Section Description" => "Summer Shoes Collection. Choose the best that suits you!",
"Parent Section Reference" => "VERA01"
],
]
En los dos primeros registros de la tabla estaremos modificando las categorías de referencia CHAQ01 y CAMI03, y en el tercer registro estaremos creando un nuevo registro definiendo todos los campos configurados en el conector. Sobre esto, es importante destacar que no es obligatorio a la hora de crear un nuevo ítem subir todos los campos de la categoría.
Como podemos ver en este ejemplo, es posible subir en una misma tabla registros para actualizar y nuevos registros para crear.
Atento: el nombre de las tablas en la estructura de input_data tiene que ser igual al nombre definido en el conector en el parámetro del Alias de tabla:

Como ejemplo, en la tabla de productos tenemos:
"products" => [
[
"Product Reference" => "42PM020100483",
"Product Description:en" => "Brown mohair coat with detachable funnel neck, raglan sleeves and concealed clip button fastening."
],
[
"Product Reference" => "AAPA10L63534",
"Product Name:en" => "Phone Cover",
"Product Name:es" => "Funda Móvil",
"Section Reference" => "ACCE02",
"Product Description:en" => "Phone cover that will protect your phone even with the strongest falls. The phone cover you need!",
"Product Description:es" => "Funda para tu movil que protegerá incluso con las caídas más fuertes. ¡La funda de que necesitas!",
"Product Color" => "Black"
],
]
En el primer registro estamos actualizando la descripción del producto en inglés, y en el segundo registro creando un nuevo producto.
Atento: para subir información de campos multi-idioma hay que definir los idiomas a conectar en la página de Parámetros.

Más tarde, solo habrá que añadir los campos multidioma en la tabla:

Y en la estructura de input_data enviar estos campos con los respectivos códigos ISO, Product Name:en, Product Name:es, Product Description:en, Product Description:es.
En la importación, Sales Layer hará el reconocimiento de los valores de los idiomas automáticamente con los respectivos campos.
Al respeto de las variantes tenemos lo siguiente:
"variants" => [
[
"Product Reference" => "42PM020100483",
"Variant Reference" => "FR1342",
"Variant Size" => "L",
"Variant Price" => "24.99"
],
[
"Variant Reference" => "F234944",
"Variant Price" => "49.99"
],
],
Donde en el primer registro veremos la creación de una variante y, en el segundo, la actualización del campo precio en otra.
Si seguimos con la verificación del código, podemos ver la llamada a la función
Después de verificar que la API no ha devuelto errores a través de la función
- versión de la API a través de la función
get_response_api_version( ) - ID del conector a través de la función
get_identification_code() - fecha en UNIX de la hora exacta de la llamada a la API con la función
get_response_time()
Y siguiendo en el código vemos las siguientes funciones de rastreo:
get_input_tracking_status() , muestra el estado de la importación.get_input_tracking_percent() , muestra el porcentaje de la importación.get_input_tracking_message() , muestra un pequeño mensaje de rastreo.
Finalmente, tenemos la impresión del total de la información subida a Sales Layer.
Ejecución y resultados
Al ejecutar el

Allí podremos verificar en

A continuación veremos el total de información importada en las diferentes tablas:

Y si buscamos ahora la información en Sales Layer veremos lo siguiente en categorías:

En la tabla de productos tendremos estos datos:

Y finalmente, esta información en la tabla de variantes:

Además de actualizar o crear información, es posible eliminar información ya existente. Para ello, basta con agregar el campo

Y enviar en el campo el valor X en la referencia del ítem a eliminar.
$input_data = [
"products" => [
[
"Product Reference" => "AAPA10I902516",
"product_status" => "X"
]
]
];
Al ejecutar el código añadiendo la estructura de

Y en Sales Layer buscando por esa misma referencia veremos que ya no existe:

Además, en lugar de usar la estructura
$input_data= [
"variants" => [
"URL" => "",
"user" => "",
"password" => "",
"port" => ""
]
];
Completando la URL, user, password y port con la información correspondiente.