In questa pagina riassumo la soluzione di problemi o lo svoglimento di alcuni compiti che riguardino il popolare pacchetto opensource per e-commerce.
Sommario
Come configurare Opencart in modalità multi-store
Opencart ha l’utilissima (nel mio caso) caratteristica che consente di costruire più di un negozio elettronico con la medesima installazione.
Dal punto di vista del database, esiste l’entità store ogni riga della quale definisce un negozio separato, ognuno con logo, aspetto e catalogo distinti. La differenziazione degli articoli viene poi fatta agganciando le categorie agli store tramite la tabella category_to_store. L’interfaccia di amministrazione consente di gestire separatamente i cataloghi per le diverse aziende.
Le istruzioni per costruire un multi negozio elettronico sono relativamente poche e nemmeno troppo complicate, ma il tralasciare uno stupido slash (“/”) può costare ore di lavoro.
Operazioni da interfaccia di amministrazione
Nella interfaccia di amministrazione di Opencart seguire il menu Sistema > Impostazioni (o System > Settings).
E’ definito sempre un negozio di default, che ha 0 come store_id. Possiamo definirne altri (non c’è limitazione) premendo il pulsante Inserisci, e in ognuno di questi dobbiamo inserire queste informazioni basilari:
- * URL negozio: in questa casella di testo scriviamo l’URL del singolo negozio; meglio se in un dominio a parte o in un dominio almeno di secondo livello. Ad esempio potremmo scrivere http://hifi.esempio.com/ oppure se proprio è qualcosa di completamente separato (ad esempio due clienti distinti) http://www.hifi.com/; per un secondo negozio sceglieremo http://computers.esempio.com/ oppure http://www.computers.com/. Questo campo è obbligatorio (vedi l’asterisco rosso), e vediamo più avanti come va gestito anche il dominio.
Attenzione: lo slash finale (/) è assolutamente obbligatorio (l’avverbio è inutile, ma serve a rendere l’idea del tempo che si può perdere…) pena la redirezione al negozio predefinito! - Nome negozio: qui consiglio di scrivere un nome possibilmente breve per il negozio: nella tendina “Vai al negozio” dell’interfaccia amministratore si vedrà l’elenco degli store creati e, se il descrittore è troppo lungo, la lista si vedrà male.
- Il resto dei campi compiliamolo a discrezione.
Operazioni su Apache
Ora è necessario agire sull’httpd server che viene invocato quando andiamo a visitare i negozi. Per ora sto allestendo un setup sperimentale in una sola macchina per cui mi arrangio modificando solo alcuni file (quelli di apache e il file hosts), in un ambiente di produzione occorre mettere mano anche ai DNS, se serve.
Io uso Apache 2.2 e per definire due diversi host modifico la configurazione dei VirtualHosts:
- /etc/apache2/apache2.conf delega le configurazione personalizzate ai file sites-enabled/*, per cui creo un nuovo file /etc/apache2/sites-available/opencart che contiene la definizione dei virtual hosts:
<VirtualHost *:80> DocumentRoot /var/www/opencart/ ServerName negozio1.opencart.com </VirtualHost> <VirtualHost *:80> DocumentRoot /var/www/opencart/ ServerName negozio2.opencart.com </VirtualHost>
Come si vede, sto puntando alla stessa istanza di opencart, la selezione dei cataloghi è a carico di Opencart in base all’URL digitato dall’utente.
- devo anche creare un link simbolico nella directory sistes-enabled per abilitare il virtual host
$ cd /etc/apache2/conf.d/sites-enabled $ ln -s ../sites-available/opencart .
Alla fine riavvio Apache
$ sudo apachectl graceful
Come ultima modifica, devo dire al sistema operativo di invocare localhost quando cerco opencart.com:
127.0.0.1 negozio1.opencart.com negozio2.opencart.com
Ora devo splittare i cataloghi nel database: quando ho importato i dati dal gestionale aziendale ho avuto cura di distinguere le categorie e i prodotti in base ad una informazione company_id che ho introdotto nel database di Opencart per non perdere il legame. Ora basta che valorizzi in modo coerente category_to_store per utilizzare questa informazione per il multi store (in realtà non era necessario modificare la base dati per questo motivo, ma ho comunque dovuto aggiungere della complessità a OpenCart a partire da un gestionale che aveva parecchie complicazioni in più).
Come OpenCart passa i parametri
Ho integrato nelle schermate di Storico Ordini di admin e dell’utente autenticato la colonna che visualizza o store in cui è stato effettuato l’acquisto.
L’amministratore potrà elencare tutti gli ordini inoltrati in tutti i negozi, con la possibilità di ordinarli per id del negozio e filtrarli selezionando il nome del negozio da una combo box.
L’utente autenticato (il customer) potrà visualizzare tutti gli acquisti fatti in tutti i negozi contenuti in OpenCart.
La prima di queste due modifiche mi ha comportato qualche rompicapo. Praticamente anche se selezionavo il negozio prima di lanciare lanciare il filtro, il filtro non veniva applicato e vedevo sempre tutti gli ordini, come se il filtro non fosse stato applicato. Il perché di questo comportamento era oltretutto complicato dal fatto che il form HTML spediva i dati in post e il controller raccoglieva in GET.
A livello di VIEW ho aggiunto una combo box che prendeva i dati delle option dal CONTROLLER (il quale se le faceva dare dal MODEL, nel quale ho aggiunto un caricamento del model_store e ho lanciato la query che leggeva tutte le righe di store); poi, alla pressione del tasto submit, raccoglievo dalla request il valore di store_id da passare al model perché eseguisse la query. Solo che store_id non arrivava mai. Avevo correttamente inizializzato tutte le variabili che impostavano lo store_id affinchché dal controller passassero al model, ma niente. Come se non ci fosse il campo.
Il problema stava nel fatto che il tasto submit non era un vero tasto di submit ma un button, e l’evento onSubmit invocava una funzione javascript filter() (vedi il file admin/view/template/sale/order_list.php) che prendeva i dati che stavano partendo via POST, costruiva una query string che conteneva i dati, e chiamava la pagina di arrivo via GET: ho quindi aggiunto queste righe al Javascript alla fine del file:
var filter_store_id = $('select[name='filter_store_id']').attr('value'); if (filter_store_id != '*') { url += '&filter_store_id=' + encodeURIComponent(filter_store_id); }
Dopo questa modifica ha funzionato tutto.
Commenti recenti