ADD A PRODUCT ID TO THE ROUTE
On va generer un unique id bidon
save() {
this.id = Math.random().toString();
...
}
// in the html :
<a href="/products/<%= product.id %>" class="btn">Détails</a>
EXTRACT THE ID FROM THE URL
Définir la route :
router.get('/products/:productId', shopController)
// dans le controller on recupere l'id de cette facon :
exports.getProduct = (req, res, next) => {
const prodId = req.params.productId;
Product.findByID(prodId, (product) => {
console.log(product)
});
}
Définir la méthode findByID dans notre model
static findByID(index, cb) {
getProductsFromFile(products => {
const product = products.find(p => p.id === index)
cb(product);
})
}
PASSING DATA WITH POST REQUEST
Dans notre product-detail :
<form action="/cart" method="post">
<button class="btn" type="submit">Add to Cart</button>
// je met en hidden pour ne pas le voir mais avoir quand même le champ dans notre POST
<input type="hidden" name="productId" value="<%= product.id %>">
</form>
On utilise notre route /cart avec POST maintenant donc on doit creer la route :
router.post('/cart', shopController.postCart)
// puis on s'occupe du controller :
exports.postCart = (req, res, next) => {
// ici productId car c'est le name="" donné dans la view avec hidden input
const productId = req.body.productId;
console.log(productId)
};
Exemple de Model pour un Shopping Cart :
const fs = require("fs");
const path = require("path");
const p = path.join(
path.dirname(process.mainModule.filename),
'data',
'cart.json'
)
module.exports = class Cart {
static addProduct(id, productPrice) {
// fetch previous cart
fs.readFile(p, (err, fileContent) => {
let cart = { products: [], totalPrice: 0 }
if (!err) {
cart = JSON.parse(fileContent);
}
// analyse => find existing product
const existingProductIndex = cart.products.findIndex(prod => prod.id === id)
const existingProduct = cart.products[existingProductIndex]
let updatedProduct;
// add nex product / increase qty
if (existingProduct) {
updatedProduct = {...existingProduct};
updatedProduct.qty = updatedProduct.qty + 1;
cart.products = [...cart.products];
cart.products[existingProductIndex] = updatedProduct;
} else {
updatedProduct = {id: id, qty: 1};
cart.products = [...cart.products, updatedProduct];
}
cart.totalPrice = cart.totalPrice + +productPrice;
fs.writeFile(p, JSON.stringify(cart), err => {
console.log(err)
})
})
}
}
QUERY PARAMS
Nous allons utiliser les query param pour editer nos produits :
// controller :
exports.getEditProduct = (req, res, next) => {
// pour accéder aux query params :
// edit ici fait reference au lien :
// <http://localhost:3000/admin/edit-product/123245?edit=true>
const editMode = req.query.edit;
if (!editMode) {
return res.redirect("/");
}
// get product Id
const prodId = req.params.productId;
// find the product
Product.findById(prodId, product => {
if (!product) {
return res.redirect("/")
}
res.render('admin/edit-product', {
pageTitle: 'Edit Product',
path: '/admin/edit-product',
editing: editMode,
product: product
});
})
};
// route :
router.get('/edit-product/:productId', adminController.getEditProduct);