I dag skal vi diskutere en av de kuleste funksjonene i OpenCart-script notifikasjoner. Selv om de har vært tilgjengelige siden utgivelsen av OpenCart 2.x-versjonen, har de blitt forbedret i den siste utgivelsen av OpenCart 2.2.x.x. Gjennom hele opplæringen drøfter vi konseptet og demonstrerer det ved å skape en arbeidsmodul.
Som utvikler må du ofte endre strømmen av kjernenes rammeadferd, enten det er å legge til en ny funksjon i rammen eller for å forbedre den eksisterende arbeidsflyten. I begge tilfeller må du ha kontroll over arbeidsflyten, slik at du kan hekte inn i funksjonaliteten og oppnå ønsket oppførsel.
La oss prøve å forstå det med et enkelt eksempel. Hvis du kjører en populær nettbutikk, er det sjansen for at de mest populære produktene i butikken din vil bli utsolgt snart. I dette tilfellet ville det være fint å få varsel om det og ta den rette tiltak tilsvarende.
Så hva du kan gjøre i det nevnte eksemplet er å se etter metoden som kalles når bestillingen er plassert. Deretter kan du hekte inn ordrenes etableringsflyt, slik at du kan kontrollere når bestillingen er plassert. Det gjør at du kan utføre et tilfeldig stykke kode i sammenheng med den kalte hendelsen. Det er der hendelsesvarsler kommer inn i bildet, slik at vi kan kjøre vilkårlig kode og endre det resulterende resultatet.
I henhold til den offisielle OpenCart-dokumentasjonen:
I 2.2+ har vi lagt til et nytt hendelsessystem, disse er kroker som kan ringes før og etter hendelser som en kontrollermetode samt modellanrop eller maler som lastes inn. De gir muligheten til å manipulere parametrene for inngangsmetode og returnerte utdata.
Det er veldig kraftig, som du kunne bokstavelig talt koble til noen metode samtale og endre utgangen returnert av den metoden. Du bør imidlertid være forsiktig når du gjennomfører kroker, hvis du tar ansvaret for å endre den resulterende utgangen av samtalen. Det er fordi hvis implementeringen din returnerer noen verdi, stopper den eventuelle andre hendelseshandlinger som er satt til å bli kalt.
Hva tar det for å implementere skriptvarsler? Her er de nødvendige trinnene:
Når du registrerer hendelsen med OpenCart, forteller du OpenCart som du vil overvåke xyz
handling, og hvis det skjer, må du utføre foo-handlingen i bar-kontrollerfilen. Mens du gjør det, har du to alternativer å velge mellom før og etter.
Hvis du velger alternativet før, vil OpenCart kjøre foo-handlingen før handlingen som blir overvåket, og i tilfelle av alternativet etterpå vil den utføre foo etter handlingen. Når det gjelder alternativet før, er det viktig å merke seg at hvis foo-metoden returnerer noe, vil OpenCart ikke utføre den opprinnelige metodekoden som overvåkes i det hele tatt.
Senere i denne artikkelen ser vi hvordan du registrerer en hendelse under tilpasset modulimplementering.
Deretter må du implementere kontrolleren og den tilsvarende handlingsmetoden som har vært knyttet til en hendelse i første trinn. Det er stedet der din egendefinerte kode skal gå inn. OpenCart sender kontekstavespesifikke argumenter til din foo-metode, slik at du kan bruke den hvis nødvendig.
Så det er bare et glimt av hva skriptvarsler er i stand til.
Hvis du er kjent med enten VQmod eller OCMOD, er det sjansen for at du skal rulle opp ermene dine mot hendelsesvarslerfunksjonen. Tross alt kan du oppnå alt ved de nevnte godbiter som du ville ha oppnådd med hendelsesvarsler.
For de som ikke er kjent med enten VQmod eller OCMOD, er listene nedenfor gode introduksjonsartikler som forklarer det.
Så spørsmålet er, om du kan bruke enten vQmod eller OCMOD til å endre kjernefilene, hvorfor vil du bruke skriptvarsler? Det er på grunn av at det kan være flere OCMOD-plugins som prøver å endre samme kode, og det kan føre til konflikt. Ved hendelser er det ingen sjanse for konflikt da hver hendelse utføres i en bestemt rekkefølge.
Så konklusjonen er at hvis det er mulig å bruke hendelser, gå for det. På den annen side, hvis du føler at det ikke er noe arrangement tilgjengelig for din brukskasse, er det helt fint å gå med OCMOD.
I denne delen skal vi bygge en modul som demonstrerer hvordan du bruker hendelsesvarsler i OpenCart. Jeg antar at du er klar over den grunnleggende modulutviklingsprosessen i OpenCart, da vi vil glide gjennom det grunnleggende. Hvis du ikke er klar over det, er det en fin artikkel som du kan gå gjennom raskt.
La oss forstå brukssaken før vi går videre og implementer den. Anta at du har en butikk som henter kataloginformasjonen fra tredjeparts API-back-end. Du har satt opp en cron som jevnlig henter informasjonen og legger den inn i OpenCart-databasen, slik at den kan vises i fronten. Selv om du har satt opp en cron som oppdaterer informasjonen med jevne mellomrom, vil du forsikre deg om at informasjonen som vises i fronten, må være i sanntid.
I forkant kalles OpenCart getProduct
funksjon når det vises produktdetaljer siden. Så det er den ideelle kandidaten for å koble til og oppdatere databasen hvis API-informasjonen er endret.
Så la oss begynne å lage back-end-filer først.
Gå videre og opprett admin / styreenhet / modul / demoevent.php
fil med følgende innhold.
last> modell ( 'forlengelse / event'); $ this-> model_extension_event-> addEvent ('event_product_info', 'katalog / modell / katalog / produkt / getProduct / before', 'custom / product / info'); offentlig funksjon avinstallere () $ this-> load-> modell ('utvidelse / hendelse'); $ Dette-> model_extension_event-> deleteEvent ( 'event_product_info');
Som vi diskuterte tidligere, er det første du ønsker å gjøre, registreringen av arrangementet. Det er installasjonshaken som vi skal bruke for å gjøre det, da det blir utført når modulen er installert.
Vi har brukt addEvent
metode for arrangementsmodellen under forlengelse katalog, og denne metoden har tre argumenter.
Det første argumentet, event_product_info, er navnet på arrangementet. Du kan nevne noe, men sørg for at det er unikt.
Det andre argumentet er veldig viktig, og det peker på den metoden du vil ha på. I vårt tilfelle må vi velge getProduct
metode av Produkt Modell under Katalog katalogen. Så hierarkiet er modell / katalog / produkt / getProduct
. I tillegg til det, bør det prefikset av heller katalog eller admin, som står for søknaden. I vårt tilfelle er det katalog som vi henger inn i front-end-metoden. Endelig vil det bli post-fixed av enten før eller etter, som forteller OpenCart å kjøre vår kode tilsvarende.
Det tredje argumentet peker på handling av kontrolleren din som vil bli utløst når hendelsen blir sparket. Det er satt til tilpassede / produkt / info
, så du må lage en Produkt kontrolleren med info
metode under tilpasset katalog, som vi gjør i et øyeblikk.
Endelig brukes avinstalleringsmetoden til å fjerne hendelsen under avinstallasjonen av modulen.
Deretter la vi lage en språkfil for vår egendefinerte modul på admin / language / nb-no / modul / demoevent.php
med følgende innhold.
Vi er ferdige med back-end filoppsett. Nå bør du se vår modul oppført under Utvidelser> Moduler i back-end av OpenCart. Gå videre og installer den. Nå går vi videre og lager filene i fronten.
Lag en modellfil
Katalog / modell / custom / product.php
med følgende innhold. Det er en typisk modellfil i henhold til OpenCart-strukturen.db-> spørring ("SELECT date_modified FROM". DB_PREFIX. "produkt WHERE product_id = '". (int) $ product_id. "'"); returner $ spørring-> rad; funksjonoppdateringProduktInfo ($ product_id, $ data) include_once __DIR __. '... / ... / ... /admin/model/catalog/product.php'; $ modelCatalogProduct = new ModelCatalogProduct (); $ modelCatalogProduct-> editProdukt ($ product_id, $ data);Det implementerer to viktige metoder. De
getProductLastModifiedInfo
Metoden brukes til å hente siste endrede dato for produktet, ogupdateProductInfo
Metoden brukes til å oppdatere produktinformasjonen i databasen. I et øyeblikk ser vi hvordan disse metodene blir brukt.La oss endelig lage en av de viktigste filene i denne artikkelen,
katalog / styreenhet / tilpassede / product.php
, med følgende innhold. Det er en kontrollerfil som implementererinfo
handlingsmetode som er satt til å bli kalt nårgetProduct
metode av Produktmodell er kalt.last> modell ( 'tilpassede / produkt'); $ product_modified_date = $ this-> model_custom_product-> getProductLastModifiedInfo ($ product_id); hvis ($ product_modified_date ['date_modified']! = $ product_api_info ['date_modified']) // api info har endret seg så først la oss oppdatere db // Merk: du vil sannsynligvis formatere $ product_api_info i henhold til formatet som kreves av editProduct method $ this-> model_custom_product-> updateProductInfo ($ product_id, $ product_api_info); // return siste / sanntid produktinformasjon returneringsgruppe ('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 [' modell '],' 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 ['produsent'], 'pris' => ($ product_api_info ['rabatt']? $ product_api_in fo ['discount']: $ product_api_info ['price']), 'special' => $ product_api_info ['special'], 'belønning' => $ product_api_info ['belønning'], 'poeng' => $ product_api_info [ 'poeng'], 'tax_class_id' => $ product_api_info ['tax_class_id'], 'date_available' => $ product_api_info ['date_available'], 'weight' => $ product_api_info ['vekt'], 'weight_class_id' => $ product_api_info ['weight_class_id'], 'length' => $ product_api_info ['lengde'], 'bredde' => $ product_api_info ['width'], 'height' => $ product_api_info ['height'], 'length_class_id' = ' > $ product_api_info ['length_class_id'], 'subtract' => $ product_api_info ['trekker'], 'rating' => runde ($ product_api_info ['rating']), 'reviews' => $ product_api_info ['anmeldelser'] ? $ 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 ']);Det viktige å merke seg her er at OpenCart gir kontekstspesifikke argumenter til metoden din. Den første
$ rute
argumentet forteller deg ruten knyttet til hendelsen som har blitt utløst. I vårt tilfelle bør det værekatalog / produkt / getProduct
. Det andre argumentet er produkt-ID fordi det er et nødvendig argument av den faktiskegetProduct
metode.Logikken er noe slikt: Vi sammenligner den endrede datoen for produktet i OpenCart-databasen med informasjonen som returneres av API-tilbakeringingen.
Så det første trinnet er å laste inn produktinformasjonen i sanntid fra API. Vær oppmerksom på at api_call_to_fetch_product_info Metoden er bare en dummy-metode som du vil erstatte med din faktiske API-samtale.
Deretter bruker vi
getProductLastModifiedInfo
metode, som ble opprettet i den tidligere delen, for å hente den endrede datoen for produktet fra OpenCart-databasen.Endelig gjør vi sammenligningen, og hvis datoen er forskjellig, oppdaterer den OpenCart-databasen med den nyeste produktinformasjonen ved hjelp av
updateProductInfo
metode i vår modellklasse.Vi har også returnert produktinformasjonen i arrayformat på samme måte som den faktiske
getProduct
ville ha returnert. Det er viktig å merke seg at ettersom vi har oppgitt returverdi i vår krok, vil det ikke ringe noen ytterligere hendelsesanrop, inkludert anropet til originalengetProduct
metode også.På denne måten kan du påvirke utførelsesflyten i OpenCart. Det er en veldig kraftig måte å endre kjernefunksjonaliteten på. Du bør imidlertid være forsiktig når du nærmer deg denne løsningen, da det gir deg total kontroll for å endre den resulterende produksjonen av en hvilken som helst metode.
Konklusjon
I dag har vi diskutert en av de spennende funksjonene i OpenCart-kalt skriptvarsler. Vi startet med en introduksjon til emnet, og det var den siste halvdelen av artikkelen som viste hvordan man bruker dem ved å bygge en tilpasset hendelse modul.
Som alltid, hvis du leter etter ekstra OpenCart-verktøy, verktøy, utvidelser og så videre som du kan utnytte i dine egne prosjekter eller for din egen utdanning, ikke glem å se hva vi har tilgjengelig på markedet.
Spørsmål og kommentarer er alltid velkomne!