In questo articolo proseguiamo il nostro discorso mostrando come creare un nuovo prodotto in WooCommerce utilizzando le REST API e NodeJS. Per creare il form d'inserimento abbiamo bisogno dell'elenco delle categorie presenti nello store. Aggiungiamo quindi un metodo alla nostra classe API:
static categories() {
return WooCommerce.get('/products/categories');
}
A questo punto definiamo il metodo da associare alla nostra route:
product: (req, res) => {
req.API.categories().then(data => {
res.render('product', {
title: 'New product | WooCommerce Node',
categories: data.product_categories
});
}).catch(err => {
res.redirect('/dashboard');
});
}
Nel form definiamo la select box in questo modo:
<div class="form-group">
<select name="category" class="form-control">
<option value="">Category</option>
<% categories.forEach(function(category) { %>
<option value="<%= category.id %>"><%= category.name %></option>
<% }); %>
</select>
</div>
Attiviamo la nostra route in app.js
:
app.get('/dashboard/products/new', routes.product);
Ora dobbiamo creare un metodo nella nostra classe per effettuare una richiesta POST alle API REST:
static product(data) {
return WooCommerce.post('products', data);
}
L'argomento passato è un oggetto letterale contenente il nome del prodotto, il prezzo, la descrizione, la descrizione breve e la categoria scelta. In questo caso il metodo restituisce una Promise essendo stata omessa la funzione di callback.
Ora definiamo la route che gestirà l'invio del form di inserimento:
createProduct: (req, res) => {
let form = req.body;
let data = {
name: form.name,
type: 'simple',
regular_price: form.regular_price,
description: form.description,
short_description: form.short_description,
categories: [
{
id: parseInt(form.category, 10)
}
]
};
req.API.product(data).then(success => {
res.redirect('/dashboard/products');
}).catch(err => {
res.json(err);
});
}
Abbiamo omesso la validazione del form per brevità, ma i criteri sono:
name
: non può essere vuoto.regular_price
: stringa decimale nel formato nn.nn.ID categoria
: numero intero.
Potete aiutarvi nella validazione installando il modulo validator
:
npm install validator --save
Attenzione: questo modulo opera unicamente sulle stringhe e restituisce un errore se l'argomento passato ad uno dei suoi metodi non è una stringa. Esempio d'uso nel nostro caso:
const validator = require('validator');
//...
createProduct: (req, res) => {
let form = req.body;
let errors = [];
if(validator.isEmpty(form.name)) {
errors.push('Il nome è richiesto');
}
if(!validator.isDecimal(form.regular_price)) {
errors.push('Formato prezzo non valido');
}
if(!validator.isInt(form.category)) {
errors.push('Categoria non valida');
}
if(errors.length > 0 ) {
res.json(errors);
} else {
let data = {
name: form.name,
type: 'simple',
regular_price: form.regular_price,
description: form.description,
short_description: form.short_description,
categories: [
{
id: parseInt(form.category, 10)
}
]
};
req.API.product(data).then(success => {
res.redirect('/dashboard/products');
}).catch(err => {
res.json(err);
});
}
}
Consultate la pagina ufficiale del modulo per un elenco completo dei metodi di validazione disponibili.
Non ci resta a questo punto che attivare la nostra route:
app.post('/dashboard/products/new', routes.createProduct);
Abbiamo visto come creare un prodotto semplice utilizzando le REST API di WooCommerce e NodeJS. Nei prossimi articoli vedremo come gestire meglio i prodotti.