Le notifiche di script avanzate in OpenCart 2.2.x.x.

Oggi discuteremo di una delle funzionalità più interessanti delle notifiche di script OpenCart. Sebbene siano disponibili dal rilascio della versione OpenCart 2.x, sono stati migliorati nella recente versione di OpenCart 2.2.x.x. Nel corso di questo tutorial, discuteremo il concetto e lo dimostreremo creando un modulo funzionante.

introduzione

Come sviluppatore, dovrai spesso modificare il flusso del comportamento del core framework, se aggiungere una nuova funzionalità al framework o migliorare il flusso di lavoro esistente. In entrambi i casi, è necessario avere il controllo sul flusso di lavoro in modo da poter accedere alla funzionalità e ottenere il comportamento desiderato.

Proviamo a capirlo con un semplice esempio. Se gestisci un negozio online popolare, è probabile che i prodotti più popolari del tuo negozio saranno presto esauriti. In questo caso, sarebbe bello ricevere una notifica al riguardo e adottare le misure appropriate di conseguenza.

Quindi quello che potresti fare nell'esempio sopra riportato è cercare il metodo che viene chiamato quando l'ordine è piazzato. Successivamente, puoi collegarti al flusso di creazione degli ordini in modo da poter controllare quando viene effettuato l'ordine. Ciò consente di eseguire una parte di codice casuale nel contesto dell'evento chiamato. È qui che le notifiche degli eventi entrano in scena, consentendoci di eseguire codice arbitrario e modificare il risultato finale.

Cosa sono le notifiche di script?

Secondo la documentazione ufficiale di OpenCart:

In 2.2+ abbiamo aggiunto un nuovo sistema di eventi, questi sono hook che possono essere chiamati prima e dopo eventi come una chiamata al metodo controller, una chiamata metodo model o modelli caricati. Danno la possibilità di manipolare i parametri del metodo di input e restituito l'output.

È davvero potente, dato che potresti letteralmente collegarti a qualsiasi chiamata di metodo e cambiare l'output restituito da quel metodo. Tuttavia, dovresti fare attenzione durante l'implementazione degli hook, se ti stai assumendo la responsabilità di modificare l'output risultante della chiamata. Questo perché se l'implementazione restituisce alcun valore, interromperà qualsiasi altra azione evento che verrà impostata per essere chiamata.

Cosa serve per implementare le notifiche di script? Ecco i passaggi necessari:

Registra il tuo evento

Quando registri il tuo evento con OpenCart, stai dicendo a OpenCart che vuoi monitorare xyz azione, e se ciò accade si prega di eseguire l'azione foo nel file del controller della barra. Mentre lo fai, hai due opzioni tra cui scegliere, prima e dopo.

Se scegli l'opzione before, OpenCart eseguirà l'azione foo prima dell'azione che viene monitorata e, nel caso dell'opzione after, eseguirà foo dopo l'azione. Nel caso dell'opzione before, è importante notare che se il metodo foo restituisce qualcosa, OpenCart non eseguirà il codice del metodo originale che viene monitorato a tutti.

Più avanti in questo articolo, vedremo come registrare un evento durante l'implementazione del modulo personalizzato.

Implementare l'azione target

Successivamente, dovrai implementare il controller e il metodo di azione corrispondente che è stato associato a un evento nel primo passaggio. Questo è il posto in cui dovrebbe essere inserito il tuo codice personalizzato. OpenCart invia argomenti specifici del contesto al tuo metodo foo, in modo che tu possa usarlo se necessario.

Quindi questo è solo un assaggio di ciò che le notifiche di script sono in grado di.

Abbiamo ancora bisogno di OCMOD?

Se hai familiarità con vQmod o OCMOD, è probabile che ti rimboccerai le maniche contro la funzione di notifica degli eventi. Dopotutto, potresti ottenere tutto dalle delizie di cui sopra che avresti comunque ottenuto con le notifiche degli eventi.

Per coloro che non hanno familiarità con vQmod o OCMOD, elencati di seguito sono buoni articoli introduttivi che lo spiegano.

  • Il nuovo sistema di modifica in OpenCart 2
  • Modifica del nucleo di OpenCart mediante vQmod

Quindi, la domanda è, se potessi usare vQmod o OCMOD per modificare i file core, perché dovresti usare le notifiche di script? È a causa del fatto che potrebbero esserci più plugin OCMOD che tentano di modificare lo stesso codice e che potrebbero causare conflitti. Nel caso degli eventi, non vi è alcuna possibilità di conflitto poiché ogni evento viene eseguito in un ordine specifico.

Quindi la conclusione è che se è possibile utilizzare gli eventi, andare per quello. D'altra parte, se ritieni che non ci siano eventi disponibili per il tuo caso d'uso, è assolutamente bene andare con OCMOD.

Creare un modulo back-end

In questa sezione, costruiremo un modulo che dimostra come utilizzare le notifiche degli eventi in OpenCart. Presumo che tu sia a conoscenza del processo di sviluppo del modulo di base in OpenCart, poiché scorreremo attraverso le basi. Se non ne sei a conoscenza, ecco un bell'articolo che puoi consultare rapidamente.

Comprendiamo il caso d'uso prima di procedere e implementarlo. Supponiamo che tu abbia un negozio che recupera le informazioni del catalogo dal back-end API di terze parti. Hai impostato un cron che recupera regolarmente le informazioni e le inserisce nel database OpenCart, in modo che possa essere visualizzato nel front-end. Sebbene tu abbia impostato un cron che aggiorna le informazioni a intervalli regolari, devi assicurarti che le informazioni visualizzate nel front-end siano in tempo reale.

Nel front-end, OpenCart chiama il EsprProdotto funzione quando visualizza la pagina dei dettagli del prodotto. Quindi, questo è il candidato ideale per collegare e aggiornare il database se le informazioni dell'API sono cambiate.

Iniziamo quindi a creare i file back-end.

Vai avanti e crea il admin / controllore / modulo / demoevent.php file con il seguente contenuto.

load-> modello ( 'estensione / evento'); $ this-> model_extension_event-> addEvent ('event_product_info', 'catalogo / modello / catalogo / prodotto / getProduct / before', 'custom / product / info');  public function uninstall () $ this-> load-> model ('extension / event'); $ This-> model_extension_event-> deleteEvent ( 'event_product_info'); 

Come abbiamo discusso in precedenza, la prima cosa che vorresti fare è la registrazione dell'evento. È il hook di installazione che useremo per farlo, poiché verrà eseguito quando il modulo è installato.

Abbiamo usato il Aggiungi evento metodo del modello di evento sotto il estensione directory, e quel metodo ha tre argomenti.

Il primo argomento, event_product_info, è il nome dell'evento. Puoi chiamarlo qualsiasi cosa, ma assicurati che sia unico.

Il secondo argomento è molto importante, e indica il metodo con cui vorresti collegarti. Nel nostro caso, dobbiamo scegliere il EsprProdotto metodo del Prodotto Modello sotto il Catalogare directory. Quindi la gerarchia è modello / catalogo / prodotto / EsprProdotto. Oltre a ciò, dovrebbe essere preceduto da entrambi Catalogare o Admin, che sta per l'applicazione. Nel nostro caso, lo è Catalogare mentre ci stiamo agganciando al metodo front-end. Infine, verrà post-riparato prima o dopo, il che dice a OpenCart di eseguire il nostro codice di conseguenza.

Il terzo argomento punta al azione del controller che verrà attivato quando viene attivato l'evento. È impostato su custom / prodotto / info, quindi dovrai creare un Prodotto controller con il Informazioni metodo sotto il costume directory, come faremo in un momento.

Infine, il metodo di disinstallazione viene utilizzato per rimuovere l'evento durante la disinstallazione del modulo.

Quindi, creiamo un file di lingua per il nostro modulo personalizzato su admin / lingua / it-IT / modulo / demoevent.php con i seguenti contenuti.

Abbiamo finito con l'installazione del file back-end. Ora dovresti essere in grado di vedere il nostro modulo elencato sotto Estensioni> Moduli nel back-end di OpenCart. Vai avanti e installalo. Ora, andremo avanti e creeremo i file nel front-end.

Crea un file di modello Catalogo / modello / custom / Product.php con i seguenti contenuti È un tipico file di modello secondo la struttura OpenCart.

db-> query ("SELECT date_modified FROM". DB_PREFIX. "prodotto WHERE product_id = '". (int) $ product_id. "'"); return $ query-> row;  function updateProductInfo ($ product_id, $ data) include_once __DIR __. '... / ... / ... /admin/model/catalog/product.php'; $ modelCatalogProduct = new ModelCatalogProduct (); $ modelCatalogProduct-> editProduct ($ product_id, $ data); 

Implementa due metodi importanti. Il getProductLastModifiedInfo il metodo viene utilizzato per recuperare l'ultima data di modifica del prodotto e il file updateProductInfo il metodo viene utilizzato per aggiornare le informazioni sul prodotto nel database. Tra un momento, vedremo come verranno utilizzati questi metodi.

Infine, creiamo uno dei file più importanti di questo articolo, Catalogo / regolatore / custom / Product.php, con i seguenti contenuti È un file di controller che implementa il Informazioni metodo di azione che è impostato per essere chiamato quando il EsprProdotto metodo del Modello di prodotto è chiamato.

load-> modello ( 'custom / prodotto'); $ product_modified_date = $ this-> model_custom_product-> getProductLastModifiedInfo ($ product_id); if ($ product_modified_date ['date_modified']! = $ product_api_info ['date_modified']) // informazioni su api sono cambiate quindi prima aggiorniamo db // Nota: probabilmente vuoi formattare $ product_api_info come richiesto dal metodo editProduct $ this-> model_custom_product-> updateProductInfo ($ product_id, $ product_api_info); // return latest / real-time information information array ('product_id' => $ product_api_info ['product_id'], 'name' => $ product_api_info ['name'], 'description' => $ product_api_info ['description' ], 'meta_title' => $ product_api_info ['meta_title'], 'meta_description' => $ product_api_info ['meta_description'], 'meta_keyword' => $ product_api_info ['meta_keyword'], 'tag' => $ product_api_info [' tag '],' model '=> $ product_api_info [' model '],' sku '=> $ product_api_info [' sku '],' upc '=> $ product_api_info [' upc '],' ean '=> $ product_api_info ['ean'], 'jan' => $ product_api_info ['jan'], 'isbn' => $ product_api_info ['isbn'], 'mpn' => $ product_api_info ['mpn'], 'location' => $ product_api_info ['location'], 'quantity' => $ product_api_info ['quantity'], 'stock_status' => $ product_api_info ['stock_status'], 'image' => $ product_api_info ['image'], 'manufacturer_id' => $ product_api_info ['manufacturer_id'], 'manufacturer' => $ product_api_info ['manufacturer'], 'price' => ($ product_api_info ['discount']? $ product_api_in fo ['discount']: $ product_api_info ['price']), 'special' => $ product_api_info ['special'], 'reward' => $ product_api_info ['reward'], 'points' => $ product_api_info [ 'points'], 'tax_class_id' => $ product_api_info ['tax_class_id'], 'date_available' => $ product_api_info ['date_available'], 'weight' => $ product_api_info ['weight'], 'weight_class_id' => $ product_api_info ['weight_class_id'], 'length' => $ product_api_info ['length'], 'width' => $ product_api_info ['width'], 'height' => $ product_api_info ['height'], 'length_class_id' = > $ product_api_info ['length_class_id'], 'sottrarre' => $ product_api_info ['sottrarre'], 'rating' => round ($ product_api_info ['rating']), 'recensioni' => $ product_api_info ['recensioni'] ? $ product_api_info ['reviews']: 0, 'minimum' => $ product_api_info ['minimum'], 'sort_order' => $ product_api_info ['sort_order'], 'status' => $ product_api_info ['status'], ' date_added '=> $ product_api_info [' date_added '],' date_modified '=> $ product_api_info [' date_modified '],' viewed '=> $ product_api_info [' viewed ']); 

La cosa importante da notare qui è che OpenCart fornisce argomenti specifici del contesto al tuo metodo. Il primo $ route argomento ti dice il percorso associato all'evento che è stato attivato. Nel nostro caso, dovrebbe essere Catalogo / prodotto / EsprProdotto. Il secondo argomento è l'id del prodotto in quanto è un argomento richiesto dal reale EsprProdotto metodo.

La logica è qualcosa del genere: confronteremo la data modificata del prodotto nel database OpenCart con le informazioni restituite dal callback dell'API.

Quindi il primo passo è caricare le informazioni sul prodotto in tempo reale dall'API. Si prega di notare che il api_call_to_fetch_product_info metodo è solo un metodo fittizio che vorresti sostituire con la tua vera chiamata API.

Successivamente, usiamo il getProductLastModifiedInfo metodo, che è stato creato nella sezione precedente, per recuperare la data modificata del prodotto dal database OpenCart.

Infine, eseguiamo il confronto e, se la data differisce, aggiorneremo il database OpenCart con le informazioni più recenti sul prodotto utilizzando updateProductInfo metodo nella nostra classe Model.

Abbiamo anche restituito le informazioni sul prodotto in formato array allo stesso modo del reale EsprProdotto sarebbe tornato. È importante notare che, poiché abbiamo fornito il valore di ritorno nel nostro hook, non chiameremo altre chiamate di eventi, inclusa la chiamata all'originale EsprProdotto metodo pure.

Quindi, in questo modo potresti influenzare il flusso di esecuzione in OpenCart. È un modo davvero potente per modificare le funzionalità principali. Tuttavia, dovresti stare attento mentre ti avvicini a questa soluzione in quanto ti dà il controllo totale per modificare l'output risultante di qualsiasi metodo.

Conclusione

Oggi abbiamo discusso di una delle interessanti funzionalità di OpenCart chiamate notifiche di script. Abbiamo iniziato con un'introduzione all'argomento ed è stata la seconda metà dell'articolo a dimostrare come utilizzarli creando un modulo evento personalizzato.

Come sempre, se stai cercando altri strumenti, utility, estensioni e così via che puoi sfruttare nei tuoi progetti o per la tua istruzione, non dimenticare di vedere cosa abbiamo a disposizione sul mercato.

Domande e commenti sono sempre benvenuti!