Smarty er en PHP-basert templerende motor / rammeverk. Det gir deg mulighet til å skille virksomhetslogikken ytterligere fra visualiseringen, ved å fjerne så mye PHP-kode som mulig fra dine synspunkter. Noen utviklere og rammer foretrekker ikke å bruke en templerende motor, andre foretrekker dem å bruke vanlig PHP i dine synspunkter. Begge synspunkter kan argumenteres, og til slutt er det mest et spørsmål om smak. Uansett, det er aldri en dårlig ide å prøve den ut før du bestemmer deg for ikke å bruke den, og det handler det om denne opplæringen: Prøv Smarty Templating Framework.
På slutten av denne opplæringen har du en grunnleggende ide om hvordan Smarty fungerer. Du kan laste inn malfiler, passere variabler til dem, bruk et "layout" der de andre visningene dine er satt inn, og skriv dine egne modifikatorer. Dette vil alle bli oppnådd ved hjelp av en ekstra wrapper klasse, som du enkelt kan integrere i dine eksisterende prosjekter.
Prosjektet for denne opplæringen vil ha et veldig enkelt oppsett, siden vi ikke utvikler en ekte applikasjon. Bare opprett en prosjektmappe (min heter "smarty_example") med en index.php-fil i den, og en katalog som heter "lib" inne i den. Lag også en fil med navnet smtemplate.php i "lib" -mappen. Deretter lager du en "visninger" -mappe inne i "smarty_example". Denne mappen inneholder våre smarty malfiler.
Før du kan bruke noe, må du installere det. Heldigvis er det å installere Smarty ekstremt lett og krever nesten ingen konfigurasjon. Først av alt, last ned Smarty og hent ut arkivet. Du kan sjekke ut alt inni arkivet, men vi trenger bare "libs" -mappen for vår søknad. Gi nytt navn til "smarty" og lim det inn i "lib" -mappen i applikasjonen vår. Smarty bruker noen ekstra mapper, så opprett mappene "templates_c", "cache" og "configs" i vår "lib / smarty" -mappe. Hvis du ikke bruker Windows, må du gi 775 tillatelser på disse mappene til webserveren din. Katalogtreet ditt skal nå se slik ut:
Hver programmerer har sin egen ide om den ideelle API. For å justere Smartys API litt, og la oss legge til noen ekstra funksjonalitet, oppretter vi en wrapper-klasse som kalles SMTemplate, som vil ta vare på smarty-detaljene for oss. Denne tilnærmingen har en annen fordel: Hvis du i et øyeblikk bør velge å bruke en annen malmotor, kan du lage en wrapper for den motoren mens du beholder SMTemplate-grensesnittet, og dermed uten å bryte koden som bruker vår SMTemplate-klasse.
Før du kodes for SMTemplate-klassens funksjonalitet, trenger vi et sted for å lagre noen konfigurasjonsdetaljer. Du kan gjøre dette på flere måter, det vil si ved å definere config-alternativer som klassekonstanter, ved å definere dem som konstanter i smtemplate.php-filen, eller ved å holde dem i en separat config-fil. Jeg foretrekker det siste alternativet, så jeg lager en smtemplate_config.php-fil. Smarty trenger konfigurasjon for malen, kompilert mal, cache og config kataloger. Senere kan vi også legge til SMTemplate-spesifikke alternativer til vår config-fil, men for nå vil dette gjøre:
/ ** * @file * Konfigurasjonsfil for SMTemplate-klassen * / $ smtemplate_config = array ('template_dir' => 'visninger /', 'compile_dir' => 'lib / smarty / templates_c /', 'cache_dir' => ' lib / smarty / cache / ',' configs_dir '=>' lib / smarty / configs / ',);
Klassen SMTemplate vil laste denne konfigurasjonsfilen, og overføre alternativene til Smarty. Før vi kan passere alternativene, trenger vi et objekt av klasse Smarty. Vår SMTemplate-klasse kan utvide Smarty-klassen, men jeg foretrekker å bruke en privat instansvariabel for å inneholde Smarty-objektet. Så langt har vi følgende for vår SMTemplate-klasse:
/ ** * @file * Wrapper for Smarty Template Engine * / require_once ('smarty / Smarty.class.php'); require_once ( 'smtemplate_config.php'); klasse SMTemplate private $ _smarty; funksjon __construct () $ this -> _ smarty = ny Smarty (); global $ smtemplate_config; $ dette -> _ smarty-> template_dir = $ smtemplate_config ['template_dir']; $ dette -> _ smarty-> compile_dir = $ smtemplate_config ['compile_dir']; $ dette -> _ smarty-> cache_dir = $ smtemplate_config ['cache_dir']; $ dette -> _ smarty-> configs_dir = $ smtemplate_config ['configs_dir'];
Som du kan se, er vår klasse fortsatt ganske patetisk, da den ikke kan gjengi noe. Vi løser dette problemet ved å legge til en gjengivelsesfunksjon, som laster inn en mal og viser den.
funksjon gjengivelse ($ template) $ this -> _ smarty-> display ($ template. 'ttl');
For å gjøre noe, må vi opprette en malfil, og deretter ring gjengivelsesfunksjonen fra vår index.php-fil. Malen filen vil være ganske grunnleggende, inneholder en enkel HTML-side. Gi det navnet "home.tpl", og legg det i vår "visninger" -katalog.
Hjem Hei Verden!
Nå er alt som er igjen å lage et SMTemplate-objekt og gjøre "hjemme". Åpne index.php, legg til følgende kodelinjer, og naviger i nettleseren din.
require_once ( 'lib / smtemplate.php'); $ tpl = nytt SMTemplate (); $ Tpl-> render ( 'hjem');
Hvis vi ikke kunne gjengi noe dynamisk, ville Smarty være ganske ubrukelig. Heldigvis kan vi tilordne variabler til vår smarte klasse, og vise dem i vår mal. Vi kan også bruke noen Smarty-funksjoner (vel, modifikatorer faktisk) for å formatere dem på riktig måte.
Selv om Smarty støtter tildelingen av variabler, gjør ikke vår SMTemplate (ennå). Vi gir oppdrags-kodeIgniter-stilen, der du sender en matrise til gjengivelsesfunksjonen. Du kan tilpasse SMTemplate til å støtte andre metoder også; for eksempel tilordne dem til objektet og deretter bruke __set til å lagre dem i en matrise er også en ren måte. For denne opplæringen skjønt, vil passere en matrise gjøre. Før du tilordner variablene, redigerer vi vår mal til noe litt mer dynamisk. Hilsen til verden er vanlig for programmerere, men ikke veldig nyttig, så la oss bruke en variabel for å avgjøre hvem vi hello-ing. For det andre legger vi til dagens dato for meldingen. Variabler kan vises ved å pakke dem i krøllede parenteser.
Hei, $ mottaker! Det er $ date i dag!
Hvis du oppdaterer siden, ser du at variablene ikke er fylt ut, siden vi ikke angav dem. Innstillingsvariabler kan gjøres ved hjelp av smarty-> tilordne, så la oss tilordne dem. Gjenopprettingsfunksjonen vil nå ta en valgfri dataramming som et annet argument.
funksjon gjengivelse ($ template, $ data = array ()) foreach ($ data som $ key => $ verdi) $ dette -> _ smarty-> tilordne ($ nøkkel, $ verdi); $ this -> _ smarty-> display ($ template. '.tpl');
Det vil fortsatt ikke fungere, fordi vi ikke passerer i en matrise når vi ringer vår gjengivelsesfunksjon. Vi kan enkelt gjøre dette ved å endre noen linjer i vår index.php-fil.
$ data = array ('receiver' => 'JR', 'date' => tid (),); $ tpl = nytt SMTemplate (); $ tpl-> render ('home', $ data);
Hvis du oppdaterer nå, vil siden si noe som "Hei, JR! Det er 1282810169 i dag!". Selvfølgelig er denne datoen ikke egentlig det vi hadde i tankene. Det må formateres, noe som bringer oss til neste del.
Smarty er ikke bare en malmotor som søker og erstatter variabler. Det er også et kraftig rammeverk som gjør at du kan spare tid ved å bruke ting som modifikatorer, funksjoner og blokker. Hvis vi ønsker å formatere vår dato, kan vi for eksempel bruke date_format modifikatoren. For å bruke en modifikator til en variabel, bare sett et rørkarakter og modifikasjonsnavnet bak det, etterfulgt av valgfrie argumenter som er adskilt av kolonner. Date_format modifier tar et strengargument, som representerer formatet datoen vil ta, og en valgfri standarddato, som vi ikke trenger. Følgende kode vil vise datoen som "dag (i desimaler) Måned".
Hei, $ mottaker! Det er $ date | date_format: "% d% B" i dag!
Dette burde nå gi noe av skjemaet "Hei, JR! Det er 26. august i dag!" Nå, kanskje vi vil sørge for at mottakeren vår er opptatt. Vi kan oppnå det ved å bruke den øvre modifikatoren.
Hei, $ mottaker | øvre! Det er $ date | date_format: "% d% B" i dag!
Nå, hvis jeg endrer index.php for å passere 'jr' i stedet for 'JR', vil malen fortsatt vise 'JR'. Enkelt, ikke sant? Deretter vil vi inkludere våre maler i et standard "layout".
Før vi endrer vår SMTemplate-klasse for å aktivere oppsett, lager vi først en oppsett. Opprett en ny katalog med navnet "layouts" i vår "smarty_example" -mappe og flytt home.tpl der. Gi nytt navn til 'page.tpl'. Vi fjerner vårt tidligere hello world-innhold, og legger to horisontale linjer. Vårt innhold vil bli plassert mellom disse linjene.
Hjem
Selvfølgelig vil dette ikke kutte det, siden Smarty ikke vet hvor du skal sette inn innholdet vårt. Det er mer enn én måte å få innhold fra en annen mal inne i vårt oppsett, og jeg bruker Smarty's hentefunksjon. Denne funksjonen returnerer vår mal som tekst, i stedet for å vise den. Dette betyr at vi kan hente malen, og tilordne den til en variabel for bruk i vår mal! Denne variabelenes navn er din å velge. Jeg prefixer mine spesielle variabler med __, for å skille dem fra de andre variablene jeg bruker. Jeg skal ringe til dette innholdet, siden vi tilordner sidens innhold til det.
$ __ innhold
Dette avslutter vårt layout, så la oss lage noen maler som skal brukes som innhold. Jeg lager en hello-mal, som vil inneholde en standard hello world-linje og en "lipsum" -mal, som inneholder noen Lorem Ipsum-tekst. Ikke glem å gi disse malene en .tpl-utvidelse.
Hei Verden!
Kjæresten er dum og sitter, og er en avgjørende forfatter. Aenean aliquet dignissim diam på vulputate. Aenean nek ligula ac dolor fringilla pharetra. Kras i augue ac tellus dictum pellentesque. Heltall element tempus lectus, ikke rutrum som viverra a. Du kan ikke snakke med deg selv, du må ikke ha det. Maecenas sed nibh felis. Donec dictum porta ante på faucibus. Morbi masse tellus, pulvinar id porta id, imperdiet vel nibh. Donec lectus nulla, porttitor et tempor id, kursus leu. Nulla egen nunc eu lorem posuere hendrerit ut acna. Aenean soda lobortis egestas. Integer faucibus hendrerit tempor.
Å tilpasse vår SMTemplate-klassen til å bruke et oppsett er også svært enkelt. Vi oppretter først et konfigurasjonsalternativ for layoutkatalogen, som vi gjorde for våre synspunkter.
/ ** * @file * Konfigurasjonsfil for SMTemplate-klassen * / $ smtemplate_config = array ('layouts_dir' => 'layouts /', 'template_dir' => 'visninger /', 'compile_dir' => 'lib / smarty / templates_c / ',' cache_dir '=>' lib / smarty / cache / ',' configs_dir '=>' lib / smarty / configs / ',);
Deretter endrer vi gjengivelsesfunksjonen. Vi leverer oppsettet som en valgfri tredje parameter, og la den være standard på «side». Deretter henter vi den forespurte malken, tilordner den til innholdsvariabelen $ __, og viser vår layout.
funksjon gjengivelse ($ template, $ data = array (), $ layout = 'side') foreach ($ data som $ key => $ verdi) $ dette -> _ smarty-> tilordne ($ nøkkel, $ verdi); $ content = $ this -> _ smarty-> hent ($ template. '.tpl'); $ dette -> _ smarty-> tilordne ('__ innhold', $ innhold); $ dette -> _ smarty-> displayet ($ layout. '.tpl');
Det er et par ting å vurdere, angående denne koden. Først av alt, har vi ikke fortalt Smarty hvor vi finner våre layout ennå. Vi kan gjøre det ved å legge til en mal dir, men denne tilnærmingen betyr at vi ikke kan gi våre oppsett samme navn som våre maler - Smarty ville ikke vite hvilken du skulle velge. Vi kunne løse dette ved å gi våre layouter en annen utvidelse, eller ved å sette og tilbakestille vår malkatalog inne i vår gjengivelsesfunksjon, eller ved å bruke mer avanserte Smarty-funksjoner. For nå vil vi bare avgjøre begrensningen om at oppsett og visninger ikke kan ha samme navn. Vi kan legge til katalogen våre layouter ved hjelp av addTemplateDir () -funksjonen.
funksjon __construct () $ this -> _ smarty = ny Smarty (); global $ smtemplate_config; $ dette -> _ smarty-> template_dir = $ smtemplate_config ['template_dir']; $ Dette -> _ smarty-> addTemplateDir ($ smtemplate_config [ 'layouts_dir']); // <- new line $this->_smarty-> compile_dir = $ smtemplate_config ['compile_dir']; $ dette -> _ smarty-> cache_dir = $ smtemplate_config ['cache_dir']; $ dette -> _ smarty-> configs_dir = $ smtemplate_config ['configs_dir'];
La oss sjekke det ved å endre vår index.php-fil igjen.
require_once ( 'lib / smtemplate.php'); $ tpl = nytt SMTemplate (); $ Tpl-> render ( 'Hei');
Det fungerer!
Og hvis vi forandrer det for å gjengi 'lipsum', fungerer det også:
Som den siste delen av denne opplæringen vil jeg introdusere en av Smartys mer avanserte funksjoner, som gjør det mer enn en enkel templerende motor. Smarty inneholder en rekke standardfunksjoner og modifikatorer, men det er også svært enkelt å lage din egen. La oss se på modifikatoren vi brukte til å formatere vår dato:
$ date | date_format: "% d% B"
Hvis du vil ha en tilpasset modifikator, er alt du trenger å gjøre å skrive en PHP-funksjon.
Dette vil faktisk resultere i en samtale til funksjonen smarty_modifier_date_format (), med $ date og vår format streng som argumenter. Denne funksjonen returnerer en streng, og denne strengen vil bli vist. Så hvis du vil ha en egendefinert modifier, er alt du trenger å gjøre, å skrive en PHP-funksjon. Som et eksempel, skriver vi en modifikator som heter "weirdcase", som vil oppsummere alle konsonanter og små bokstaver alle vokaler, dvs. 'Lorem Ipsum' blir 'LoReM IPSuM'. For å gjøre dette, opprett en fil som heter 'modifier.weirdcase.php' i mappen 'lib / smarty / plugins'. Modifikatoren tar bare ett argument, strengen som må endres.
/ ** * Smarty weirdcase modifier plugin * * Type: modifier * Navn: weirdcase * Formål: Vend konsonanter til store og vokaler i små bokstaver * @param string * @return string * / function smarty_modifier_weirdcase ($ string)
Vi kan få vårt resultat ved å definere en rekke vokaler, snu vår streng inn i en matrise og deretter krysse den, og kontrollere om hvert tegn er i vokaleregisteret vårt. Hvis det er, lagrer vi det, ellers oppdager vi det. De modifiserte tegnene legges deretter til en resultatvariabel.
funksjon smarty_modifier_weirdcase ($ string) $ str_array = str_split ($ string); $ result = "; $ vokaler = array ('a', 'e', 'I', 'o', 'u'); foreach ($ str_array som $ char) if (in_array ($ vokaler, $ char) ) $ resultat. = strtolower ($ char); annet $ resultat. = strtoupper ($ char); returnere $ result;
Dette burde gjøre kunsten, så la oss sjekke det ut. Rediger 'lipsum.tpl' -malen og legg til en h1 som inneholder vår merkelige 'Lorem Ipsum' til den.
'Lorem Ipsum' | weirdcase
Kjæresten er dum og sitter, og er en avgjørende forfatter. Aenean aliquet dignissim diam på vulputate. Aenean nek ligula ac dolor fringilla pharetra. Kras i augue ac tellus dictum pellentesque. Heltall element tempus lectus, ikke rutrum som viverra a. Du kan ikke snakke med deg selv, du må ikke ha det. Maecenas sed nibh felis. Donec dictum porta ante på faucibus. Morbi masse tellus, pulvinar id porta id, imperdiet vel nibh. Donec lectus nulla, porttitor et tempor id, kursus leu. Nulla egen nunc eu lorem posuere hendrerit ut acna. Aenean soda lobortis egestas. Integer faucibus hendrerit tempor.
Selv om det er mye mer til Smarty enn jeg kunne passe i denne opplæringen, forhåpentligvis bør dette gi deg grunnleggende kunnskap om hvordan du skal jobbe med den. Du vet egentlig allerede alt du trenge å vite. Du bør også kunne bestemme om du liker ideen om å bruke dette templerende rammeverket eller ikke nå. De mer avanserte emnene, som filtre og blokker, er nyttige, men du vil fortsatt gjøre det bra uten dem. Du finner dokumentasjon på de mer avanserte funksjonene på Smartys nettsted. Takk for at du leste!