Skip to content

MelisCommerce

Framework e-commerce completo per MelisPlatform — catalogo, clienti, carrello/checkout/ordini, coupon, spedizioni e SEO — con un back-office React. Pacchetto melisplatform/melis-commerce.

Scopo

MelisCommerce aggiunge un livello commerce completo a un sito Melis: un catalogo (prodotti, varianti, attributi, categorie, prezzi, giacenze), un modello cliente B2B (account + contatti), la pipeline carrello/checkout/ordine, coupon, valute, spedizioni, resi, documenti e SEO. Include una suite di gestione back-office e uno shop front-office costruito con plugin di templating trascinabili. Il livello dati utilizza 59 tabelle melis_ecom_*, 26 servizi, 10 entità ricche e 33 listener; l'accesso ai dati usa Eloquent (illuminate/database incluso), incapsulato da servizi event-driven in stile Melis.

In Melis v6 la logica di business è invariata; il livello di visualizzazione è un back-office React (/melis-react). MelisCommerce include un unico bundle multi-brick che espone 13 strumenti React nativi, ciascuno supportato da endpoint JSON sotto /melis/react-api/…. Ogni strumento mantiene un toggle New / Old per strumento, così puoi tornare alla classica schermata legacy in un iframe.

Attivazione

Aggiungi a config/melis.module.load.php:

php
return [
    'MelisCommerce',
];

Richiede melisplatform/melis-core. Le tabelle del database vengono predisposte automaticamente da MelisDbDeploy (delta sotto install/dbdeploy/); il modulo è proposto dall'installer di Melis come componente opzionale. Gli strumenti React compaiono nel back-office solo quando MelisCommerce è attivo (discovery tramite GET /melis/react-api/react-modules).

Il back-office React — un bundle, tredici strumenti

Il bundle (public/ui-react/brick.js + brick.manifest.json) dichiara 13 strumenti che si auto-registrano in brick.tsx. Tutti sono full-React nativi; ciascuno renderizza un ViewModeToggle condiviso + LegacyFrame, così Old monta lo strumento classico in un iframe (/melis/react-tool-page?key=<melisKey>). I sette strumenti "entità" impostano subTabs: true (l'apertura di un record aggiunge una sotto-scheda); tutti e 13 sono persistent.

La sezione MelisCommerce nella sidebar React — i 13 strumenti commerce

Brick idRottaEtichettamelisKey
commerce-accounts/melis-commerce/clients-listAccountmeliscommerce_clients_list_page
commerce-contacts/melis-commerce/contact-listContattimeliscommerce_contact_list_page
commerce-catalog/melis-commerce/categoriesCataloghimeliscommerce_categories_page
commerce-products/melis-commerce/product-listProdottimeliscommerce_product_list_container
commerce-orders/melis-commerce/order-listOrdinimeliscommerce_order_list_page
commerce-coupons/melis-commerce/coupon-listCouponmeliscommerce_coupon_list_page
commerce-attributes/melis-commerce/attribute-listAttributimeliscommerce_attribute_list_page
commerce-countries/melis-commerce/country-listPaesimeliscommerce_country_list_container
commerce-languages/melis-commerce/language-listLingue commercemeliscommerce_language_list_container
commerce-currencies/melis-commerce/currency-listsValutemeliscommerce_currency_conf
commerce-order-status/melis-commerce/order-status-listsStato ordinemeliscommerce_order_status_tool_page
commerce-clients-groups/melis-commerce/clients-group-listGruppi clientimeliscommerce_clients_group_tool_container
commerce-settings/melis-commerce/settingsImpostazioni commercemeliscommerce_settings_page

Regola pratica: costruisci il catalogo (attributi → cataloghi → prodotti/varianti), gestisci i clienti (account + contatti), poi esegui la pipeline ordini (ordini + wizard di checkout + coupon), il tutto supportato dalle liste di riferimento commerce.

Modello a oggetti

ConcettoCos'è
ProdottoUn contenitore di varianti — non è di per sé un'unità vendibile.
VarianteL'unità vendibile: ha il proprio SKU, giacenza e prezzo. Un prodotto senza opzioni reali ha comunque una variante principale.
AttributoUna proprietà filtrabile/definente la variante (es. Colore, Taglia) con valori tipizzati e traducibili. I prodotti dichiarano quali attributi usano; ogni variante sceglie un valore per attributo.
PrezzoRisolto per una coppia (countryId, groupId) con IVA; ripiega in modo graduale (vedi Risoluzione dei prezzi).
AccountUn'organizzazione B2B (melis_ecom_client); ha un record azienda, un gruppo e indirizzi.
Contatto / PersonaUn individuo (melis_ecom_client_person) che effettua il login; può appartenere a più account.
Carrello (Basket)Anonimo (identificato da clientKey) o persistente (legato a un account); si fondono al login.
OrdineCreato allo stato -1 (temporaneo) durante il checkout; passa a 1 (Nuovo ordine) dopo il pagamento.

Account e contatti

Account (/melis-commerce/clients-list) gestisce i clienti B2B: la lista offre ricerca, filtri per stato/gruppo, un gestore delle colonne, esportazione e importazione CSV. L'apertura di un account è una sotto-scheda con le schede Properties, Company, Contacts (collega/scollega, imposta predefinito), Addresses, Orders (storico) e Files.

La lista Account — filtri, gestore delle colonne e importazione CSV

Editor account — scheda Properties (stato, strategia del nome, gruppo, paese, tag)

Editor account — scheda Contacts (collega / scollega / predefinito)

Contatti (/melis-commerce/contact-list) gestisce le persone individuali. L'editor ha le schede Information, Address e Association (collega/scollega un contatto agli account, imposta il predefinito). I contatti sono supportati da MelisComContactService; gli account da MelisComClientService.

Editor contatto — scheda Association (collega / scollega account)

Cataloghi, prodotti e varianti

Cataloghi (/melis-commerce/categories) è un albero di categorie riordinabile tramite trascinamento; una categoria ha le schede Properties, SEO e Products (riordinabile).

L'albero delle categorie del catalogo (React)

Prodotti (/melis-commerce/product-list) elenca i prodotti con filtri, duplicazione ed esportazione. L'editor prodotto ha le schede Properties, Text (per lingua), Variants, SEO e Prices. La scheda Variants è la più ricca: ogni variante ha le proprie Properties, SEO, Prices, Stocks e Associations, oltre ai media.

La lista Prodotti (React)

Editor prodotto — scheda Variants (prezzi, giacenze, SEO, associazioni per variante)

Editor prodotto — scheda Prices

Attributi (/melis-commerce/attribute-list) gestisce le caratteristiche tipizzate dei prodotti: schede dell'editor Properties (riferimento, tipo, stato, visibile, ricercabile), Labels (per lingua) e Values (valori con traduzioni tipizzate).

Editor attributo — scheda Values (valori con traduzioni tipizzate)

Ordini e il wizard di checkout

Ordini (/melis-commerce/order-list) ha filtri per stato ed esportazione. Le schede dell'editor per ordine sono Properties, Basket (sola lettura), Addresses, Payment (sola lettura), Shipping, Messages e Returns — più Invoices quando MelisCommerceOrderInvoice è attivo.

La lista Ordini (React)

Editor ordine — scheda Properties

New Order apre un wizard di checkout guidato in 7 passaggi (contact → account → products → addresses → summary → payment → confirmation), supportato da una sessione di checkout lato server (endpoint sotto /orders/checkout/*) che riprende da dove avevi interrotto.

Il wizard di checkout New Order — passaggi contact / account / products

Il wizard di checkout — passaggio addresses / summary

Coupon

Coupon (/melis-commerce/coupon-list) gestisce i codici sconto (% o importo). Schede dell'editor: Properties, Assign account (clienti), Assign product e Orders (storico di utilizzo). Supportato da MelisComCouponService; lo sconto integrato è a sua volta un listener su meliscommerce_service_get_item_price_end.

Editor coupon — scheda Assign account

Strumenti di riferimento commerce

Piccoli strumenti in "stile impostazioni" — liste su singola pagina con modali di aggiunta/modifica o un unico form:

StrumentoRottaGestisce
Countries/melis-commerce/country-listLista dei paesi commerce (aggiungi/modifica)
Commerce languages/melis-commerce/language-listLingue commerce (lista + modale)
Currencies/melis-commerce/currency-listsValute (lista + modale, imposta predefinita)
Order status/melis-commerce/order-status-listsStati; l'editor ha Properties (colore) + Labels
Client's groups/melis-commerce/clients-group-listGruppi clienti (lista + modale)
Commerce settings/melis-commerce/settingsPagina di configurazione unica — schede Properties + Accounts

La lista Order status (React)

Impostazioni commerce — scheda Properties (soglia di allerta giacenze, strategia del nome account)

Le impostazioni commerce contengono la soglia globale di allerta giacenze e la strategia del nome account (sa_type).

Servizi principali

Tutti i servizi estendono MelisComGeneralService e sono registrati in config/module.config.php. Ogni metodo pubblico è incapsulato in eventi meliscommerce_service_*_start / *_end (vedi Eventi e listener). I controller React validano solo l'input e formattano il JSON — il lavoro vero resta in questi servizi.

Alias del servizioRuolo
MelisComProductServicegetProductById, getProductListMelisProduct
MelisComVariantServicegetVariantById, getVariantListByProductId, getVariantBySKU, getMainVariantByProductIdMelisVariant
MelisComCategoryServicegetCategoryById, getCategoryListById(Recursive)MelisCategory
MelisComAttributeServicegetAttributeById, getAttributesMelisAttribute
MelisComPriceServicegetItemPrice($itemId, $countryId, $groupId, $type) — prezzo con gerarchia di fallback
MelisComProductSearchServiceRicerca prodotti front-office
MelisComSeoServiceSEO commerce (URL / meta per prodotti e categorie)
MelisComClientServicegetClientById, getClientList, getClientByIdAndClientPersonMelisClient
MelisComContactServiceGestione contatti (persone)
MelisComClientGroupsServiceGruppi clienti (usati per il pricing specifico per gruppo)
MelisComAuthenticationServiceLogin front-office: login, getClientId, getPersonId, getClientGroup, setClientId, logout, hasIdentity
MelisComBasketServicegetBasket, getPersistentBasket, getAnonymousBasket, addVariantToBasket, transferAnonymousBasketToPersistentBasketMelisBasket
MelisComOrderServicegetOrderById, getOrderListMelisOrder
MelisComOrderCheckoutServiceCheckout in due fasi: checkoutStep1_prePayment, checkoutStep2_postPayment
MelisComPostPaymentServiceRegistrazione delle transazioni post-pagamento
MelisComOrderProductReturnServiceResi prodotti / RMA
MelisComCouponServicegetCouponById, getCouponListMelisCoupon
MelisComCurrencyServiceValute
MelisComShipmentCostServiceCalcolo del costo di spedizione
MelisComStockEmailAlertServiceAvvisi email per giacenze basse (VARIANTSLOWSTOCK)
MelisComDocumentServicegetDocumentById, getDocumentsByRelationMelisDocument
MelisComDuplicationServiceDuplica prodotti / varianti
MelisComLinksServiceCostruttore di link commerce front-office
MelisComCacheServiceCache commerce (commerce_big_services)
MelisComHeadHelper per l'head SEO (updateTitleAndDescription)
MelisComGeneralServiceClasse base; helper: getTableColumns, getEcomLang, getFrontPluginLangId

Risoluzione di prezzi e giacenze

MelisComPriceService::getItemPrice($itemId, $countryId, $groupId, $type) percorre una catena di fallback:

  1. paese specifico + gruppo specifico
  2. paese specifico + gruppo generale
  3. paese generale (price_country_id = 0) + gruppo specifico
  4. paese generale + gruppo generale
  5. (per una variante) ripiega sul prezzo del prodotto

La giacenza è per variante per paese (melis_ecom_variant_stock). Quando un ordine porta la giacenza sotto la soglia, l'email VARIANTSLOWSTOCK viene inviata ai destinatari configurati.

Pipeline di checkout

Due fasi in MelisComOrderCheckoutService (il wizard React esegue la stessa logica lato server):

Fase 1 — checkoutStep1_prePayment($clientId) valida carrello e indirizzi, calcola tutti i costi e la spedizione, genera il riferimento dell'ordine, poi chiama MelisComOrderService::saveOrder(). L'ordine viene salvato con ord_status = -1 (temporaneo). Emette meliscommerce_service_checkout_step1_prepayment_start/_end e …_save_success (che trasporta il nuovo orderId).

Fase 2 — checkoutStep2_postPayment() viene chiamata dopo il ritorno dal gateway. MelisComPostPaymentService::processPostPayment() registra la transazione in melis_ecom_order_payment e sposta l'ordine dallo stato -1 a uno stato reale. Emette meliscommerce_service_checkout_step2_postpayment_start/_end.

Stati dell'ordine: -1 temporaneo · 1 Nuovo ordine · 2 In attesa · 3 Spedito · 4 Consegnato · 5 Annullato · 6 Errore di pagamento.

Eventi e listener

Ogni metodo di servizio emette eventi meliscommerce_service_*_start e *_end. Gli argomenti nominati (costruiti da makeArrayFromParameters tramite reflection) e la chiave results viaggiano con l'evento.

  • Listener _start: modifica gli input prima che il lavoro venga eseguito.
  • Listener _end: modifica $params['results'] prima che il chiamante lo veda.

Questo è il principale meccanismo di estensione — nessuna sottoclasse necessaria. I 33 listener inclusi si dividono in quattro famiglie:

FamigliaEsempi
Salvataggio / validazione…SaveProductListener, …SaveOrderListener, …SaveClientListener, …ValidateVariantListener
Pulizia a cascata (paese/lingua rimossi)…ProductPriceCountryDeletedListener, …CategoryCountryLink…, …SEOLanguageDeletedListener
Checkout / pricing / giacenze…CheckoutCouponListener, …CouponProductPriceListener, …ShipmentCostListener, …PostPaymentListener, …VariantCheckLowStockListener
Routing SEO front-office…SEOReformatToRoutePageUrlListener, …SEODispatchRouterCommerceUrlListener, …SEOMetaPageListener

API React e capability

Tutte le rotte sono rotte figlie di melis-react-api (unite da config/react-api.php): 13 controller invocabili in src/Controller/ReactApi/, 184 rotte sotto /melis/react-api/…. Il contratto di risposta è ovunque { success, data, error? }; ogni azione chiama prima denyUnlessAccess() (auth + MelisCoreRights::canAccess(<melisKey>), 401/403). Ogni strumento entità espone all'incirca GET /<tool> (lista keyset), /<tool>/stats, /<tool>/options, POST /<tool>/save, DELETE /<tool>/delete/:id, GET /<tool>/:id, oltre a sotto-risorse specifiche dello strumento (es. Orders aggiunge il wizard completo /orders/checkout/*).

⚠ Le lingue commerce sono nel namespace /commerce-languages (non /languages) perché lo strumento Languages del core possiede già /languages sotto il genitore condiviso melis-react-api.

config/react.capabilities.php dichiara una voce melisReactToolCapabilities per strumento, indicizzata sotto la sua melisKey. Sono suggerimenti UI dichiarativi con default-allow — pilotano l'albero di checkbox in Users → Rights e permettono a React di mascherare schede/pulsanti tramite useCaps(...) — ma non esiste ancora un denyUnlessCan() lato server; solo denyUnlessAccess() sulla melisKey dello strumento protegge l'API. Tratta le capability come suggerimenti UI, non come sicurezza.

Front office

I plugin di templating sono registrati sotto config/plugins/{products,categories,clients,orders}/ e come controller_plugins in module.config.php. Trascinali in una zona drag-drop di una pagina CMS.

AreaPlugin
CatalogoProductShowPlugin, ProductListPlugin, ProductSearchPlugin, CategoryTreePlugin, CategoryProductListPlugin, RelatedProductsPlugin, AttributesShowPlugin, ProductAttributePlugin, ProductPriceRangePlugin
Carrello e checkoutAddToCartPlugin, CartPlugin, CheckoutPlugin, CheckoutCartPlugin, CheckoutAddressesPlugin, CheckoutCouponPlugin, CheckoutSummaryPlugin, CheckoutConfirmSummaryPlugin, CheckoutConfirmPlugin
AccountLoginPlugin, RegisterPlugin, AccountPlugin, ProfilePlugin, BillingAddressPlugin, DeliveryAddressPlugin, LostPasswordGetEmailPlugin, LostPasswordResetPlugin
Ordini (cliente)OrderPlugin, OrderHistoryPlugin, OrderMessagesPlugin, OrderShippingDetailsPlugin, OrderReturnProductPlugin, OrderAddressPlugin

Tabelle del database

59 tabelle con il prefisso melis_ecom_*, raggruppate per sottosistema:

GruppoTabelle principali
Prodotti e variantimelis_ecom_product, melis_ecom_product_text + _text_type, melis_ecom_product_attribute, melis_ecom_product_category, melis_ecom_variant, melis_ecom_variant_attribute_value, melis_ecom_variant_stock, melis_ecom_assoc_variant + _type
Attributimelis_ecom_attribute + _trans, melis_ecom_attribute_type, melis_ecom_attribute_value + _value_trans
Categorie e geomelis_ecom_category + _trans, melis_ecom_country_category, melis_ecom_country, melis_ecom_lang
Prezzi e valutamelis_ecom_price, melis_ecom_currency
Clienti (B2B)melis_ecom_client, melis_ecom_client_person + _person_emails, melis_ecom_client_company, melis_ecom_client_account_rel, melis_ecom_client_person_rel, melis_ecom_client_address + _address_type, melis_ecom_client_groups, melis_ecom_civility, melis_ecom_settings_account
Carrelli e ordinimelis_ecom_basket_anonymous, melis_ecom_basket_persistent, melis_ecom_order, melis_ecom_order_basket, melis_ecom_order_address, melis_ecom_order_payment + _type, melis_ecom_order_shipping, melis_ecom_order_message, melis_ecom_order_status + _trans, melis_ecom_order_product_return + _details
Couponmelis_ecom_coupon + _coupon_client / _coupon_order / _coupon_product
Documenti e SEOmelis_ecom_document + _doc_type + _doc_relations, melis_ecom_seo, melis_ecom_stock_email_alert

Esempi

Leggere un prodotto, la sua variante principale e un prezzo risolto

php
$prdSrv   = $sm->get('MelisComProductService');
$varSrv   = $sm->get('MelisComVariantService');
$priceSrv = $sm->get('MelisComPriceService');

$product = $prdSrv->getProductById($prdId, $langId, $countryId);  // → MelisProduct
$variant = $varSrv->getMainVariantByProductId($prdId, $langId, $countryId);  // → MelisVariant
$price   = $priceSrv->getItemPrice($variant->getId(), $countryId, $groupId, 'variant');
// $price['price'] (net), $price['price_currency'], $price['price_details']

Aggiungere al carrello ed eseguire il checkout in due fasi

php
$basketSrv   = $sm->get('MelisComBasketService');
$checkoutSrv = $sm->get('MelisComOrderCheckoutService');

$basketSrv->addVariantToBasket($variantId, 1, $clientId);
$basketSrv->transferAnonymousBasketToPersistentBasket($clientKey, $clientId);

$step1 = $checkoutSrv->checkoutStep1_prePayment($clientId);  // order at status -1
// $step1['orderId'] — hand to payment gateway
$step2 = $checkoutSrv->checkoutStep2_postPayment();          // records payment, moves off -1

Agganciare lo shop senza creare sottoclassi

php
// _start → mutate inputs; _end → mutate $params['results'].
$this->attachEventListener(
    $events, '*', 'meliscommerce_service_get_item_price_end',
    function ($e) {
        $params = $e->getParams();
        $price  = $params['results'];
        // modify $price, then:
        $params['results'] = $price;
        return $params;
    }
);

File principali

AmbitoPercorso
Configurazione del modulo (servizi, controller, plugin)vendor/melisplatform/melis-commerce/config/module.config.php
Rotte / capability API Reactvendor/melisplatform/melis-commerce/config/react-api.php, config/react.capabilities.php
Brick React (sorgente / build)vendor/melisplatform/melis-commerce/ui-react/src/, public/ui-react/{brick.js, brick.manifest.json}
Controller API React (13)vendor/melisplatform/melis-commerce/src/Controller/ReactApi/
Configurazione plugin front-officevendor/melisplatform/melis-commerce/config/plugins/
Servizi / Entità (10) / Table gateway (59)vendor/melisplatform/melis-commerce/src/Service/, src/Entity/, src/Model/Tables/
Listener (33)vendor/melisplatform/melis-commerce/src/Listener/
Delta DBvendor/melisplatform/melis-commerce/install/dbdeploy/

Vedi anche: Riferimento moduli · melis-react-api · melis-commerce-order-invoice · melis-core · melis-cms.