Tilpassede kontrollører i OpenCart 2

I dag går vi gjennom begrepet controllers i OpenCart 2.x. Med utgivelsen av OpenCart 2.x-versjonen har de innført rammeendringer som krever en oppgradering hvis du har laget noen egendefinerte moduler i den tidligere versjonen - OpenCart 1.x. Vi går gjennom et praktisk eksempel på hva vi kaller Gjestebok i denne opplæringen.

Før vi går videre i denne artikkelen, kan du vurdere dette som en oppfølging av det jeg skrev tidligere. I den artikkelen forklarte jeg hvordan du lager en tilpasset side i OpenCart 1.x, og hvis du allerede har fulgt denne artikkelen, kan du raskt hoppe over de fleste av seksjonene i dag! 

Selvfølgelig er det OpenCart 2.x som vil bli diskutert i dag, så sørg for at du følger koden nøye.

Hvis du vil se mer teori om OpenCart-rammemønsteret og kontrollerne, kan du gå gjennom et par av de første delene av denne artikkelen. Når det er sagt, er det ingenting som hindrer deg fra å følge denne artikkelen med en gang, da jeg ikke vil hoppe over noen grunner.

Hvorfor en tilpasset kontroller?

Noe som du kanskje spør i utgangspunktet-hvorfor en tilpasset kontroller? La oss raskt forstå hva kontrolleren handler om i OpenCart før vi kommer inn i dette.

I sammenheng med OpenCart, the kontrolleren er en uunnværlig del av rammen som direkte omhandler rutingsprosessen og gjør brukergrensesnittet. I prosessen handler det om andre viktige komponenter som språk, modell og visning for å bygge det endelige utfallet.

Når du åpner en side i OpenCart, ser OpenCart-rammen etter den tilsvarende kontrolleren og delegerer videre behandling til den. Å være modulær av natur, gir OpenCart-rammen flere kontroller som omhandler logisk grupperte funksjoner.

For eksempel, konto gruppen inneholder kontrollører som omhandler innlogging, registrering, profil og lignende brukstilfeller. På samme måte, Sjekk ut Gruppe av kontrollører håndterer bestillingsprosessen.

I et nøtteskall, når du vil opprette en funksjon som ikke er i kjernen i OpenCart, og hvis den tar en ny nettadresse - en rute i OpenCarts terminologi - bør du gå til en tilpasset kontroller. Det gir deg full kontroll over sideopprettingsprosessen - hvilke elementer du vil vise på din egendefinerte side.

Lag en tilpasset kontroller

I dag implementerer vi en grunnleggende gjestebokfunksjonalitet som demonstrerer konseptet med tilpassede kontroller. I løpet av dette vil vi bygge et grensesnitt i frontenden som gjør det mulig for gjester å sende inn tilbakemelding ved å skrive inn navn og melding.

Før du fortsetter, må du sørge for at du har en fungerende installasjon av OpenCart 2.3.x. Og det er ganske mye å begynne å jobbe med i vår gjestebok-funksjon.

For de som ikke er kjent med OpenCart-strukturen, er stedet å se etter front-end controllers katalog / kontrolleren. Det er katalogen som styrer alle kontrollerne etter gruppe, basert på funksjonene de gir.

I vårt tilfelle lager vi en egen gruppe som heter gjestebok. Gå videre og opprett en katalog katalog / styreenhet / gjeste. I den katalogen, opprett en entry.php fil med følgende innhold. Det er en kontrollerfil som håndterer programlogikken og innleveringslogikken i vår gjestebokfunksjonalitet.

last> språk ( 'gjeste / gjeste'); $ Dette-> dokument-> setTitle ($ dette-> Språk> får ( 'HEADING_TITLE')); hvis (($ this-> request-> server ['REQUEST_METHOD'] == 'POST') && $ this-> validere ()) $ this-> load-> modell ('gjestebok / gjestebok'); $ data ['subject'] = sprintf ('Ny gjestebokoppføring sendt av% s', $ this-> request-> post ['guest_name']); $ data ['message'] = $ this-> request-> post ['guest_message']; $ Dette-> model_guestbook_guestbook-> processGuestbookEntry ($ data); $ this-> session-> data ['success'] = $ this-> language-> get ('text_success'); $ this-> response-> omdirigere ($ this-> url-> link ('gjestebok / oppføring', 'true'); data ['success'] = "; hvis (isset ($ this-> session-> data ['suksess'])) $ data ['suksess'] = $ this-> session-> data ['suksess']; ikke-fikserte ($ dette-> økt-> data [ 'suksess']);  $ data ['breadcrumbs'] = array (); $ data ['breadcrumbs'] [] = array ('text' => $ this-> språk-> få ('text_home'), 'href' => $ this-> url-> lenke )); $ data ['breadcrumbs'] [] = array ('text' => $ this-> language-> få ('heading_title'), 'href' => $ this-> url-> lenke , $ true ['heading_title'] = $ this-> language-> get ('heading_title'); $ data ['entry_guest_name'] = $ this-> language-> get ('entry_guest_name') $ data ['entry_guest_message'] = $ this-> language-> få ('entry_guest_message'); $ data ['entry_submit'] = $ this-> language-> få ('entry_submit'); this-> error ['guest_name'])) $ data ['error_guest_name'] = $ this-> feil ['guest_name']; else $ data ['error_guest_name'] = ";  hvis (isset ($ this-> error ['guest_message'])) $ data ['error_guest_message'] = $ this-> feil ['guest_message'];  andre $ data ['error_guest_message'] = "; $ data ['action'] = $ this-> url-> link ('gjestebok / oppføring', 'true'); hvis (isset ($ this-> request-> post ['guest_name'])) $ data ['guest_name'] = $ this-> request-> post ['guest_name'];  andre $ data ['guest_name'] = "; hvis (isset ($ this-> request-> post ['guest_message'])) $ data ['guest_message'] = $ this-> request-> post ['guest_message']; else $ data ['guest_message'] = ";  $ data ['column_left'] = $ this-> load-> kontroller ('common / column_left'); $ data ['column_right'] = $ this-> load-> kontroller ('common / column_right'); $ data ['content_top'] = $ this-> load-> kontroller ('common / content_top'); $ data ['content_bottom'] = $ this-> load-> kontroller ('common / content_bottom'); $ data ['footer'] = $ this-> load-> kontroller ('common / footer'); $ data ['header'] = $ this-> load-> kontroller ('common / header'); $ this-> response-> setOutput ($ this-> load-> view ('gjestebok / oppføring', $ data));  beskyttet funksjon validere () hvis (utf8_strlen (trim ($ this-> request-> post ['guest_name']))) < 1)  $this->feil ['guest_name'] = $ this-> language-> get ('error_guest_name');  hvis (utf8_strlen (trim ($ this-> request-> post ['guest_message']))) < 1)  $this->feil ['guest_message'] = $ this-> language-> get ('error_guest_message');  return! $ this-> feil;  

I henhold til OpenCart navngivningskonvensjoner begynner klassenavnet med Controller søkeord etterfulgt av katalognavnet, Gjestebok i vårt tilfelle, der klassen filen ligger. Videre navnet på klassefilen, Inngang i vårt tilfelle er vedlagt på slutten.

Hver kontrollerklasse gir en de facto index metode som håndterer det meste av kontrollerenes logikk. Deretter går vi gjennom koden i index metode, og vi vil også lage andre filer etter behov.

Mesteparten av tiden starter vi ved å inkludere språkfilen for den aktuelle gruppen. Slik administrerer OpenCart statiske språketiketter i hele applikasjonen. Selvfølgelig gjør implementeringen av flerspråklige nettsteder en bris.

$ Dette-> last> språk ( 'gjestebok / gjestebok');

Før du går videre, la oss lage den tilsvarende språkfilen slik at vår kontroller kan finne den. Lage en Katalog / language / nb-no / gjestebok / guestbook.php fil med følgende innhold.

Som du kan se, tilordner vi bare etiketter med sine verdier i språkarrangementet.

Tilbake til kontrolleren vår, er det neste å sette opp HTML-tittel-taggen for vår side.

$ Dette-> dokument-> setTitle ($ dette-> Språk> får ( 'HEADING_TITLE'));

Brukere med skarpe øyne har lagt merke til at vi har brukt HEADING_TITLE språkvariabel definert i språkfilen opprettet for et øyeblikk siden.

For å forstå det neste koden må vi lage en modellfil. Så for et øyeblikk vil jeg avlede deg for å lage modellfilen på Katalog / modell / gjestebok / guestbook.php med følgende innhold.

protokoll = $ this-> config-> get ('config_mail_protocol'); $ mail-> parameter = $ this-> config-> get ('config_mail_parameter'); $ mail-> smtp_hostname = $ this-> config-> get ('config_mail_smtp_hostname'); $ mail-> smtp_username = $ this-> config-> get ('config_mail_smtp_username'); $ mail-> smtp_password = html_entity_decode ($ this-> config-> get ('config_mail_smtp_password'), ENT_QUOTES, 'UTF-8'); $ mail-> smtp_port = $ this-> config-> get ('config_mail_smtp_port'); $ mail-> smtp_timeout = $ this-> config-> get ('config_mail_smtp_timeout'); $ Post-> Setto ($ dette-> config-> får ( 'config_email')); $ Post-> setFrom ($ dette-> config-> får ( 'config_email')); $ mail-> setSender (html_entity_decode ($ this-> config-> get ('config_name'), ENT_QUOTES, 'UTF-8')); $ Post-> setSubject ($ data [ 'emne']); $ Post-> setText ($ data [ 'beskjed']); $ Post-> send ();  

I OpenCart er modellen ansvarlig for å håndtere forretningslogikken i applikasjonen. Skulle du ønske å implementere noen logikk som involverer en database, er dette stedet det skal gå inn.

Navngivningskonvensjonen i modellklassen ligner den som tilhører kontrollerklassen. For å holde ting enkelt, har vi implementert en metode processGuestbookEntry som underretter administrasjonen av butikken via e-post når en bruker sender inn en gjestebokoppføring. Ganske enkelt, hei?

La oss komme tilbake til vår kontroller og undersøke det neste koden i køen.

hvis (($ this-> request-> server ['REQUEST_METHOD'] == 'POST') && $ this-> validere ()) $ this-> load-> modell ('gjestebok / gjestebok'); $ data ['subject'] = sprintf ('Ny gjestebokoppføring sendt av% s', $ this-> request-> post ['guest_name']); $ data ['message'] = $ this-> request-> post ['guest_message']; $ Dette-> model_guestbook_guestbook-> processGuestbookEntry ($ data); $ this-> session-> data ['success'] = $ this-> language-> get ('text_success'); $ this-> response-> omdirigere ($ this-> url-> link ('gjestebok / oppføring', 'true');

Det sjekker for en gyldig POST forespørsel og gjør grunnleggende validering av bruker-innsendte data ved å ringe validere metode.

Koden $ Dette-> last> modell ( 'gjestebok / gjestebok') brukes til å laste inn modellen som vi definerte for et øyeblikk siden. Umiddelbart etter det forbereder vi $ data array basert på brukerinngangen og ring til processGuestbookEntry metode, som informerer butikkadministratoren om gjestebokoppføringen. Endelig omdirigerer vi brukeren tilbake til gjestebokens innlastingsside.

Når du går videre i kontrolleren, oppretter følgende utdrag suksessmeldingen som vil bli vist ved innsending av skjemaet.

$ data ['success'] = "; hvis (isset ($ this-> session-> data ['suksess'])) $ data ['suksess'] = $ this-> session-> data ['suksess' ]; unset ($ this-> session-> data ['suksess']);;

Etter det er det en utdrag som brukes til å bygge breadcrumb-koblinger til siden.

$ data ['breadcrumbs'] = array (); $ data ['breadcrumbs'] [] = array ('text' => $ this-> språk-> få ('text_home'), 'href' => $ this-> url-> lenke )); $ data ['breadcrumbs'] [] = array ('text' => $ this-> language-> få ('heading_title'), 'href' => $ this-> url-> lenke , "sant));

Neste kutt er en viktig, og det er noe du vil bruke mesteparten av tiden til å sende informasjon fra kontrolleringsmetoden til visningsmalen.

$ data ['heading_title'] = $ this-> language-> get ('heading_title'); $ data ['entry_guest_name'] = $ this-> language-> get ('entry_guest_name'); $ data ['entry_guest_message'] = $ this-> language-> get ('entry_guest_message'); $ data ['entry_submit'] = $ this-> language-> get ('entry_submit');

I likhet med å tilordne variabler, initierer OpenCart vanlige elementer i sidens overskrift, bunntekst og lignende som vist i følgende utdrag.

$ data ['column_left'] = $ this-> load-> kontroller ('common / column_left'); $ data ['column_right'] = $ this-> load-> kontroller ('common / column_right'); $ data ['content_top'] = $ this-> load-> kontroller ('common / content_top'); $ data ['content_bottom'] = $ this-> load-> kontroller ('common / content_bottom'); $ data ['footer'] = $ this-> load-> kontroller ('common / footer'); $ data ['header'] = $ this-> load-> kontroller ('common / header');

Til slutt kalles det visningsmalen for å gjengjøre den faktiske siden!

$ this-> response-> setOutput ($ this-> load-> view ('gjestebok / oppføring', $ data));

Selvfølgelig har vi ikke bygget en visningsmal ennå. Det er den perfekte tiden til å gjøre det! Gå videre og opprett en Katalog / view / tema / default / mal / gjestebok / entry.tpl fil med følgende innhold.

 
  • ">

Dette er vår hovedvisningsmalfil som er ansvarlig for visning av innholdet på vår gjestebokside. I denne filen har vi nettopp brukt variablene som ble satt opp i kontrolleren index metode.

Det er viktig å merke seg at lydhørhet er noe som kommer innebygd med de nyeste versjonene av OpenCart støttet av Bootstrap-rammen. Annet enn det, er det ganske vanlig HTML-ting som er ganske enkle å forstå.

Så, det er det så langt som filoppsettet angår.

Vi har alt på plass nå, men hvordan ville du få tilgang til det fra fronten?

I fronten kan du få tilgang til gjesteboksiden ved å legge til variabelen for ruteforespørsel, slik at nettadressen skal være noe som http: //your-opencart-store-url/index.php? Route = gjestebok / oppføring.

La oss forstå hvordan OpenCart karter hvilken som helst nettadresse til den spesifikke kontrolleringsfilen. Formatet på rutevariabelen er Katalogen / filename / metode.

  • De Katalog komponentkart til katalogen under katalog / kontrolleren.
  • De filnavn kart til navnet på kontrollerfilen under katalog / styreenhet / katalog.
  • Endelig vil det se etter kontrolleren metoden som heter Metode hvis det er angitt i ruten, ellers vil det kalle standard index metode.

Slik ser det endelige utfallet ut.

Selvfølgelig kan du gå videre og teste det ved å sende inn skjemaet, og du bør motta et e-postvarsel til e-postadressen som er registrert som en butikkadministrator.

Konklusjon

I alle rammer er det alltid spennende å gå videre og implementere egen tilpasset funksjonalitet. Det var akkurat gjenstand for dagens veiledning, hvor vi utvidet OpenCart og utviklet tilpassede kontrollører ved å bygge en ganske enkel, men likevel nyttig funksjonalitet i gjesteboken.

I prosessen innså vi at det ikke handler bare om kontrollerne - det var få andre viktige elementer som var uunngåelige. Så endte vi med å introdusere dem også: Modell, Språk og Vis.

På slutten var det hyggelig å se arbeidsmessig bruk av hva jeg lovet i begynnelsen av artikkelen. Så, det er det for i dag, og ikke nøl med å forlate dine spørsmål og kommentarer. Også, jeg vil gjerne høre fra deg hvis det er et bestemt emne som du vil at jeg skal komme med i min neste artikkel!

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.

Hvis du har hatt denne artikkelen, har jeg noen flere bare hvis du vil gå gjennom dem!