Este artigo mostra a maneira completa, técnica e funcional de importar as categorias Categorias, Atributos e Produtos no comércio eletrônico Magento 2 CE, usando a interface API REST e o código C# .NET.
No final , você encontrará algumas dicas do Magento Backup and Recovery.
Você encontrará instruções passo-a-passo com códigos de exemplos para:
- Carregar as categorias;
- Carregar Atributos Personalizados do Produto;
- Carregar Produtos Configuráveis;
- Carregar produtos simples;
- Associar opções de produtos configuráveis a produtos configuráveis e a produtos simples;
- Criar configurações de produto;
- Vincular produtos simples ao produto configurável;
Os exemplos neste guia foram testados para as seguintes versões:
- Magento CE 2.2.6
- Mysql 5.7.21
- Php 7.1.14
Para mais informações sobre os pré-requisitos de instalação do Magento 2 CE, você pode encontrar a documentação oficial aqui: devdocs.magento.com/guides/v2.0/install-gde/prereq/prereq-overview.html
O Magento 2 apresenta três principais interfaces implementáveis para o envio e gerenciamento de dados:
Interface REST API
Interface API SOAP
Gerenciador de objetos + interface de modelo de objeto
Ao usar esses métodos, você pode facilmente adicionar listas de produtos de uma fonte de dados genérica ao comércio eletrônico magento e pode manter a sincronização dos mesmos.
PHP – ObjectManager:
É possível desenvolver código PHP personalizado, para Plugins, Módulos ou scripts genéricos, e integrá-lo no Magento. O serviço ObjectManager permite implementar a Interface do Modelo de Objeto no seu código e instanciar seus objetos no bootstrapping do aplicativo. Isso é feito explorando as peculiaridades do Dependecy Injection.
Você pode optar por não usar dependecy injection e bootstraping do Magento simplesmente criando objetos ‘Newable/non-injectable’, modificando o Bootstrap, instanciando o Object Manager e invocando recursos (classes Framework) sempre que forem necessários. Com as modalidades descritas acima, usando o Object Model, os dados do Magento podem ser carregados e manipulados.
APIs SOAP:
Os pontos terminais Magento são protegidos e acessíveis apenas com autenticação. Para gerar um proxy, é necessário obter o WSDL (por exemplo: http://<site url>/magento2/soap/default?Wsdl=1&services=storeStoreRepositoryV1) do serviço solicitado, usando um software que permita solicitações SOAP com autenticação (ex: Postman). Depois de salvar o WSDL com utilitários dedicados, é possível gerar classes de proxy do lado do cliente C# e VB .NET (no Visual Studio, a ferramenta mais comum é o Svcutil.exe).
APIs REST:
Cada instalação do Magento possui um conjunto completo de pontos terminais REST para interagir com dados e estruturas do CMS.
A maneira mais conveniente de aproveitar a API REST do Magento é usar chamadas HTTP. Em detalhes, você deve gerar um modelo de dados local e instanciar um cliente REST.
Um exemplo de código escrito em C#:
JsonDeserializer jsonDeSerializer = new JsonDeserializer();
RestClient client = new RestClient("http://<your site url>/magento2/");
bool contentTypeHeaderWithUnderscore = false;
string barerToken = "vztdr8zbicw4poozqfg5eo0vh3t29ikt";
client.AddDefaultHeader(contentTypeHeaderWithUnderscore ? "Content_Type" : "Content-Type", "application/json");
client.ClearHandlers(); client.AddHandler("application/json", _jsonDeSerializer);
var request = new RestRequest("rest/V1/products/000167", RestSharp.Method.GET);
request.RequestFormat = DataFormat.Json;
request.AddHeader("Authorization", "Bearer " + barerToken);
request.AddHeader("Accept", "application/json");
O RestClient é um pacote Restsharp que pode ser obitdo do repositório do NuGet Package.
Existe um ponto terminal para gerenciar cada entidade do Magento 2 CE. Para cada entidade existe uma interface para criar um “modelo de dados” através para construir uma requisição no formato JSON.
Você pode encontrar a lista completa dos serviços disponíveis aqui: devdocs.magento.com/guides/v2.0/rest/list.html
Para transformar um modelo de dados em uma cadeia Json (serialização), você pode usar a Biblioteca .NET Newtonsoft.Json, conforme mostrado no código a seguir:
Product pd = new product();
pd.name = “Jacket”;
pd.sku = “GIUB01” …….
string json = JsonConvert.SerializeObject(pd, Formatting.Indented);
request.AddParameter("application/json", json, ParameterType.RequestBody);
response = Client.Execute(request);
Seqüência de etapas a serem seguidas para um carregamento de dados padrão e completo no Magento são:
- Criação de Categorias;
- Criação de AttributeSet;
- Criação de Atributos Personalizados de Produto, Atribuição de AttributeSet, atribuição de AttributeGroup;
- Atribuição de opção ao atributo de produto personalizado individual;
- Criando Produtos Configuráveis;
- Atribuição contextual a AttributeSet;
- Criação de produtos de tipo simples;
- Atribuição contextual à opção personalizada AttributeSet + Product Attributes;
- Opção de Atribuição de Atributo ao Produto Configurável para uso nas combinações de produtos;
- Opção de atribuição de atributos a produtos simples para uso nas associações de produtos;
- Associação de Produtos Simples ao Produto Configurável relativo (ligação de produtos);
Ponto 1:
A instalação do Magento cria uma categoria raiz, não visível no back-end ou no front-end, chamada “Root Catalog”.
Não deve ser excluído. Sob a categoria raiz você tem que inserir todas as outras categorias de acordo com a hierarquia desejada. Abaixo está um JSON simples para enviar ao ponto final para inserir uma categoria: “/rest/V1/categories”:
{"category":{"id":0,"parent_id":2,"name":"Clothing","is_active":true,"position":0,"level":0,"children":null,"created_at":null,"updated_at":null,"path":null,"available_sort_by":null,"include_in_menu":true,"custom_attributes":[{"attribute_code":"url_key","value":"clothing"}]}}
Ponto 2:
No Magento, os Atributos do Produto são organizados e relacionados a um AttributeSet. É possível criar vários Atributos de Produto Personalizados e atribuí-los a AttributeSet. Um Atributo do Produto pode pertencer apenas a um conjunto de atributos. Aqui está um JSON simples para o ponto final “/rest/V1/products/attribute-sets” para criar um Conjunto de Atributos:
{"skeletonId":4,"attributeSet":{"attribute_set_id":null,"attribute_set_name":"Etos_Magento_Attr","sort_order":2,"entity_type_id":0,"extension_attributes":null},"entityTypeCode":"catalog_product"}
Parameter named “Skeletonid” indicates the creation of the attribute set on the default attribute set that in Magento always has id = 4.
Ponto 3:
O Magento vem com alguns Atributos padrão, mas é possível adicionar Atributos Personalizados do Produto para qualificar os produtos. Temos que fazer isso se as combinações de produtos que serão criadas para os produtos forem baseadas em atributos não presentes no Magento. Abaixo está um JSON simples para enviar para o ponto final “/rest/V1/products/attributes” para criar um Atributo de Produto Customizado:
{"attribute":{"is_wysiwyg_enabled":false,"is_html_allowed_on_front":true,"used_for_sort_by":false,"is_filterable":false,"is_filterable_in_search":false,"is_used_in_grid":true,"is_visible_in_grid":true,"is_filterable_in_grid":false,"position":0,"apply_to":["simple","configurable","virtual"],"is_searchable":null,"is_visible_in_advanced_search":null,"is_comparable":"true","is_used_for_promo_rules":null,"is_visible_on_front":"true","used_in_product_listing":"true","is_visible":true,"scope":"Store View","attribute_id":0,"attribute_code":"a1","frontend_input":"select","entity_type_id":null,"is_required":false,"options":null,"is_user_defined":true,"default_frontend_label":"A1","frontend_labels":[{"storeId":0,"label":"A1"}],"backend_type":null,"source_model":null,"is_unique":null,"validation_rules":null}}
Para usar o recurso Opções de Atributos em produtos, o Atributo deve ter os seguintes recursos:
O “escopo” deve ser definido como “global”;
O atributo deve estar “visível”;
O atributo deve ser do tipo “definido pelo usuário”;
O atributo deve usar várias opções (como os atributos “dropdown” e “multiselect”)
O exemplo json para atribuir o Atributo do Produto Customizado ao Conjunto de Atributos e ao grupo de Atributos é mostrado abaixo. O nó de extremidade é: ponto terminal é “/rest/V1/products/attribute-sets/attributes”:
{"attributeSetId":16,"attributeGroupId":101,"attributeCode":"a1","sortOrder":0}
Ponto 4:
Para cada Atributo criado, temos que atribuir as listas de valores de opções relativas usando o ponto de terminal “/rest/V1/products/atributos/<código de atributo>/options” com um json como o seguinte:
{"option":{"label":"2XS","value":"T2XS_TA","storeLabels":{"storeId":1,"label":"2XS"}},"sortOrder":1}
Ponto 5:
O Magento 2 CE permite criar pelo menos 6 tipos de produtos: Simple, Configurable, Grouped, Virtual, Bundle and Downlodable. Normalmente o Magento 2 shop deve ter Procutos Configurados (Principal) com vários Produtos Simples (Derivado) associados em um número igual a todas as combinações possíveis para os Attributes Options Values associados.
O produto configurável será a única entidade visível no catálogo de produtos da loja. Assim, os Produtos Simples serão exibidos somente nas páginas de detalhes toda vez que os clientes escolherem as opções disponíveis.
Para criar um produto do tipo Configurável, você tem que usar o ponto terminal “/rest/V1/products” com o método ‘POST’. Abaixo um exemplo de json para a inserção completa de um produto configurável com preço, estoque (estoque), imagens, descrições, atributos:
{"sku":"000043","product":{"id":null,"sku":"000043","name":"Apepazza Women Sold Shoes Yle01/texture-box Derby Mascherina Con Perline","attribute_set_id":16,"price":139,"status":1,"visibility":4,"type_id":"configurable","created_at":null,"updated_at":null,"extension_attributes":{"stockItem":{"itemId":null,"productId":0,"stockId":1,"qty":0,"isInStock":true,"isQtyDecimal":true,"showDefaultNotificationMessage":false, "useConfigMinQty":true,"minQty":1,"useConfigMinSaleQty":1,"minSaleQty":1,"useConfigMaxSaleQty":false,"maxSaleQty":0,"useConfigBackorders":true, "backorders":0,"useConfigNotifyStockQty":true,"notifyStockQty":1,"useConfigQtyIncrements":true,"qtyIncrements":1,"useConfigEnableQtyInc":true,"enableQtyIncrements":true,"useConfigManageStock":true,"manageStock":true, "lowStockDate":null,"isDecimalDivided":true,"stockStatusChangedAuto":0,"extensionAttributes":null},"category_links":[{"position":0,"category_id":"3","extension_attributes":null},{"position":0,"category_id":"14","extension_attributes":null},{"position":0,"category_id":"60","extension_attributes":null},{"position":0,"category_id":"84","extension_attributes":null}]},"product_links":null,"options":null,"media_gallery_entries":[{"id":null,"mediaType":"image","label":"Foto-0-APEPAZZACALZATURESALDIDONNAYLE01TEXTUREBOXDERBYMASCHERINACONPERLINE-000043","position":0,"disabled":false,"types":["image","small_image","thumbnail"],"file":null,"content":{"Base64EncodedData":"/9j/4RJQRXhpZgAATU0AKgAAAAgAEgEAAAMAAAABEKAAAA .... <stringa.dati-base64>","Type":"image/jpeg","Name":"DSE_3460jpg"},"extensionAttributes":null}],"tier_prices":null,"custom_attributes":[{"attribute_code":"url_key","value":"apepazza-calzature-saldi-donna-yle01-texture-box-derby-mascherina-con-perline"},{"attribute_code":"description","value":"YLE01/TEXTURE-BOX<br>\t\t<p><span style=\"background-color:#FFFFFF;font-family:Calibri;font-size:11pt;\">Scarpa bassa in pelle spazzolata con inserti elasticizzati su linguetta.<\/span><\/p>\r\n\t\t<p><span style=\"background-color:#FFFFFF;font-family:Calibri;font-size:11pt;\"> Ricamo di perline frontale .<\/span><\/p>\r\n\t\t<p><span style=\"background-color:#FFFFFF;font-family:Calibri;font-size:11pt;\"> Suola in gomma light e tacco 30 .<\/span><\/p>\r\n\r\n"},{"attribute_code":"barcode","value":""},{"attribute_code":"tipoprodotto","value":"CALZATURE"},{"attribute_code":"reparto","value":"SALDI DONNA"},{"attribute_code":"brand","value":"APEPAZZA"}]}}
Ponto 6:
A próxima etapa consiste em criar um produto Simples ou Derivado, que é a variante única (combinação) do produto configurável.
{"sku":"000257.010-41","product":{"id":null,"sku":"000257.010-41","name":"Atlantic Stars Calzature Saldi Uomo Antares Bpb-63n Camoscio/nylon F.do Sport","attribute_set_id":16,"price":185,"status":1,"visibility":1,"type_id":"simple","created_at":null,"updated_at":null,"extension_attributes":{"stockItem":{"itemId":null,"productId":0,"stockId":1,"qty":1,"isInStock":true,"isQtyDecimal":true,"showDefaultNotificationMessage":false, "useConfigMinQty":true,"minQty":1,"useConfigMinSaleQty":1,"minSaleQty":1,"useConfigMaxSaleQty":false,"maxSaleQty":0,"useConfigBackorders":true, "backorders":0,"useConfigNotifyStockQty":true,"notifyStockQty":1,"useConfigQtyIncrements":true,"qtyIncrements":1,"useConfigEnableQtyInc":true,"enableQtyIncrements":true,"useConfigManageStock":true, "manageStock":true,"lowStockDate":null,"isDecimalDivided":true,"stockStatusChangedAuto":0,"extensionAttributes":null},"category_links":[{"position":0,"category_id":"3","extension_attributes":null},{"position":0,"category_id":"25","extension_attributes":null},{"position":0,"category_id":"79","extension_attributes":null},{"position":0,"category_id":"85","extension_attributes":null}]},"product_links":null,"options":null,"media_gallery_entries":[{"id":null,"mediaType":"image","label":"Foto-0-ATLANTICSTARSCALZATURESALDIUOMOANTARESBPB63NCAMOSCIONYLONFDOSPORT-000257.010-41","position":0,"disabled":false,"types":["image","small_image","thumbnail"],"file":null,"content":{"Base64EncodedData":"/9j/4RDKRXhpZgAATU0AKgAAAAgAEgEAAA ... ","Type":"image/jpeg","Name":"DSE_4063jpg"},"extensionAttributes":null},{"id":null,"mediaType":"image","label":"Foto-1-ATLANTICSTARSCALZATURESALDIUOMOANTARESBPB63NCAMOSCIONYLONFDOSPORT-000257.010-41","position":1,"disabled":false,"types":null,"file":null,"content":{"Base64EncodedData":"/9j/4RIRRXhpZgAATU0AKgAAAAgAEgEAAA ... ","Type":"image/jpeg","Name":"DSE_4064jpg"},"extensionAttributes":null},{"id":null,"mediaType":"image","label":"Foto-2-ATLANTICSTARSCALZATURESALDIUOMOANTARESBPB63NCAMOSCIONYLONFDOSPORT-000257.010-41","position":2,"disabled":false,"types":null,"file":null,"content":{"Base64EncodedData":"/9j/4RFxRXhpZgAATU0AKgAAAAgAEgEAAA ...","Type":"image/jpeg","Name":"DSE_4065jpg"},"extensionAttributes":null}],"tier_prices":null,"custom_attributes":[{"attribute_code":"calzuomo3848senza12","value":"147"},{"attribute_code":"colore","value":"326"},{"attribute_code":"url_key","value":"atlantic-stars-calzature-saldi-uomo-antares-bpb-63n-camoscio-nylon-f-do-sport"},{"attribute_code":"barcode","value":"20094581"},{"attribute_code":"tipoprodotto","value":"CALZATURE"},{"attribute_code":"reparto","value":"SALDI UOMO"},{"attribute_code":"brand","value":"ATLANTIC STARS"}]}}
Para o Produto Simples, a visibilidade é definida como ‘1’ (= não visível individualmente), pois somente o Produto Configurável deve estar visível no Catálogo e nas Pesquisas, enquanto o produto simples será mostrado nos detalhes da página, escolhendo a combinação relativa.
Ponto 7:
Agora temos que atribuir ao produto configurável os atributos e as opções relativas a serem usadas para as combinações. Atribuir essas opções ao produto configurável corresponde ao valor de ‘Opções de produtos configuráveis’ É possível pelo ponto de extremidade “/rest/V1/configurable-products/{sku}/options” e o seguinte JSON, derivado de um GET método (“rest/V1/products/:sku”) para um único produto:
{"configurable_product_options":[{"id":51642,"attribute_id":"197","label":"Colore","position":0,"values":[{"value_index":322}],"product_id":6728},{"id":51643,"attribute_id":"210","label":"Ta","position":0,"values":[{"value_index":8},{"value_index":5},{"value_index":9},{"value_index":6},{"value_index":7}],"product_id":6728}]}
Se essas opções não forem atribuídas, quando tentarmos vincular um Produto Simples ao Configurável, o sistema Magento aumentará a exceção “Configurable”
Opção para atributo Color
{"option":{"attributeId":"174","label":"COLORE","position":0,"isUseDefault":true,"values":[{"valueIndex":346,"extensionAttributes":{}}],"extensionAttributes":{},"productId":0}}
Opções para o atributo “CALZ. WOMAN 34-42 WITH ½ “:
{"option":{"attributeId":"160","label":"CALZ. DONNA 34-42 CON ½","position":0,"isUseDefault":true,"values":[{"valueIndex":32,"extensionAttributes":{}},{"valueIndex":33,"extensionAttributes":{}},{"valueIndex":34,"extensionAttributes":{}},{"valueIndex":35,"extensionAttributes":{}},{"valueIndex":36,"extensionAttributes":{}},{"valueIndex":37,"extensionAttributes":{}}],"extensionAttributes":{},"productId":0}}
Todas as opções são atribuídas ao configurável. Todas as opções devem ser incluídas em um único json, caso contrário, o erro “Algo deu errado ao salvar a opção” será gerado, o que corresponde à violação da restrição da chave primária.
Ponto 8:
Também temos que atribuir as Opções de Atributos Configuráveis ao produto Simples, se for uma Combinação de um Produto Configurável, usando “/rest/V1/configurable-products/{sku}/options “. Para o Produto Simples, temos que atribuir apenas um valor de opção para cada Atributo:
Opção para atributo Color:
{"option":{"attributeId":"174","label":"COLORE","position":0,"isUseDefault":true,"values":[{"valueIndex":326,"extensionAttributes":{}}],"extensionAttributes":{},"productId":0}}
Opções para o atributo Size:
{"option":{"attributeId":"163","label":"CALZ.UOMO 38-48 SENZA 1/2","position":0,"isUseDefault":true,"values":[{"valueIndex":150,"extensionAttributes":{}}],"extensionAttributes":{},"productId":0}}
Ponto 9:
O último passo é associar o produto simples ao configurável. Através do endpoint “/rest/V1/configurable-products/{sku}/child” e o seguinte exemplo json:
{ "childSku": "000042.032-36" }
Backup e Segurança do Magento 2 e-commerce
Antes de fazer um upload completo de produtos ou outros dados, é importante fazer um backup completo do banco de dados Magento MySQL e dos arquivos Magento localizados no espaço FTP.
Primeiro de tudo é necessário configurar o MySQL para permitir conexões remotas (isto deve ser permitido pelo seu provedor de hospedagem), então você tem que localizar o arquivo de configuração do MySQL onde você tem que indicar o endereço IP do qual você precisa se conectar :
bind-address = 192.168.0.97
Então acesse o servidor MySQL através das credenciais de administrador, executando o seguinte script:
GRANT ALL ON <mysql db name>.* TO <utente accesso remoto>@<indirizzo ip computer remoto> IDENTIFIED BY '<password utente remoto>';
Por exemplo:
GRANT ALL ON magento2.* TO root@192.168.0.200 IDENTIFIED BY 'mypswd';
Para executar os procedimentos de backup do Magento e-commerce, usaremos o Iperius Backup.
Na imagem abaixo você pode ver a configuração simples para baixar automaticamente o site via FTP e realizar um backup do MySQL (dump).
Para mais informações, acesse o tutorial mais adequado: Backup do MySQL com Iperius
É essencial realizar um backup completo de todos os arquivos de instalação do Magento 2 CE. Para isso, é preciso configurar uma nova operação de backup no Iperius, onde os itens de origem são os arquivos do Magento localizados no espaço da web, acessíveis via FTP:
Para mais informações, acesse o tutorial mais adequado: Copie um site inteiro com o Iperius
Clique aqui para conhecer e instalar a versão mais recente do Iperius Backup
Software para gestão de lojas e e-commerce
Importar listas de produtos para um comércio eletrônico é uma operação de grande importância se você tiver um software de gerenciamento de loja que gerencie muitos dados. De fato, uma das melhores maneiras de uma loja expandir sua oferta e seus clientes é vender produtos através de um e-commerce Magento. Lojas e empresas geralmente encontram dificuldades em integrar seu software de gerenciamento a uma estratégia eficaz de comércio eletrônico. Para simplificar esse processo, existem soluções completas que permitem importar automaticamente listas de produtos para um e-commerce Magento, como o software de gerenciamento para lojas Etos : www.etosweb.com/negozio-online
PLEASE NOTE: if you need technical support or have any sales or technical question, don't use comments. Instead open a TICKET here: https://www.iperiusbackup.com/contact.aspx
**********************************************************************************
PLEASE NOTE: if you need technical support or have any sales or technical question, don't use comments. Instead open a TICKET here: https://www.iperiusbackup.com/contact.aspx
*****************************************