All posts by Morten Blinksbjerg Nielsen

Yderligere caching og performance

Ud over at vi har vores generelle caching der fungerer på sidebasis, og som bliver deaktiveret i det øjeblik en bruger logger ind, eller lægger noget i kurven, så har vi også en caching-funktion på blok-niveau som man selv skal implementere.

Den er brugbar hvis man fx har en masse smarty-kode til at rendere en menu, eller andre komplicerede ting – de ting kan nemlig sløve din shop en lille smule, da de måske skal lave en masse opslag. Afhængig af hvad du renderer selvfølgelig ..

<{get_cache name="my_cache" ttl=3600 assign="my_cached_data"}>

<{if $my_cached_data}>

  <{$my_cached_data}>

<{else}>

  <{cache name="my_cache"}>
    <!-- Her skal du skrive din egen kode -->
  <{/cache}>

<{/if}>

De to funktioner og blok-element du skal lægge mærke til er <{cache}> og <{get_cache}>.

<{cache}> bruges til at omkrandse den kode du vil gemme i din cache, og den skal have argumentet name=”…” for at angive navnet på cachen.

<{get_cache}> henter din cache ud, og den skal også have en name=”…” for at vide hvilken cache den skal hente. ttl=3600 er en Time To Live på din cache i sekunder, og hvis din cache er ældre end det du angiver kommer der intet resultat. Assign er valgfri, men anbefales. Den bruges til at assigne dit cachede data til en variable du senere kan checke på.

For at det virker optimalt skal du gøre som ovenstående, hvor du assigner din cache til en variable, og så checker om den er til stede. Er den til stede kan du vide dit cachede data. Ellers skal det renderes igen.

Update: Nørderne fra ClickStarter har leget med det og fundet en smart løsning på dynamisk indhold. Du kan se deres løsning her.

Boost performance på variantopslag

Jeg ser flere og flere shops der viser varianter og evt. checker på deres lagerstatus i fx kategorioversigter. Performancemæssigt er det ikke skidesmart at hive så meget data ud på én side, fordi det er potentielt ret mange databaseopslag.

Derfor har jeg forbedret vores cachingsystem og tilføjet funktionen getInStockVariants() der returnerer varianter der er på lager, og deres lagerantal.

Den er blevet implementeret på én shop indtil videre, og en meget stor og tung kategoriside med mange lagerstatusopslag gik fra ca. 6.5 sek. til 0.8 sek.

Eks.:

<{assign var="stock" value=$product->getInStockVariants()}>
<{section name="i" loop=$stock}>
  <{$stock[i].name}>
<{/section}>

Se wikien for flere eksempler.

Seneste opdateringer (2. april 2014)

Vi har i dag opdateret Shoporama med følgende features:

  • Mulighed for at tage onlinetiden med i landingssiderne, så en landingsside fx kan være produkter, hvor druen er malbec, district er Sydafrica, og hvor de blev lagt online indenfor 24 timerSkærmbillede 2014-04-02 kl. 16.53.36
  • Udvidet export/import i JSON format der udover produkter også tager profiler, kategorier og allervigtigst profilindstillingerne for produkterne med. Tidligere har vi kun haft en CSV import/export, og det format var ikke egnet til vores profilstruktur. Formatet vil løbende blive udvidet så det til sidst tager hele shoppen.
  • Synkronisering af delt lager. Vores delt lager fungerer på den måde at hver shop, har sit eget lager; men hvis produkterne har samme SKU-nummer, så vil en bevægelse på det ene lager også blive udført på de andre produkter fra de andre shops med samme SKU-nummer. Det er forholdsvist simpelt, men det kan også betyde at hvis man tilføjer sit delte lager efter den oprindelige varer blev lagt på lager, så vil den nye vare ikke have samme lagerbeholdning. Eller hvis man skifter rundt i SKU-numre, eller andre underlige ting.

Boost hastigheden med bedre komprimering af billeder

De fleste shops har utrolig mange billeder, så det betyder enormt meget hvor maget de billeder fylder. Vi har en feature der gør at I selv kan vælge om I enten vil levere billeder som PNG eller JPEG.

Umiddelbart bør I altid vælge JPEG, der er velegnede til fotografi-lignende billeder, hvor PNG er bedst til grafik-lignende billeder eller billeder der er gennemsigtige. JPEG er også den eneste hvor det er muligt at styre komprimeringen.

Under Indstillinger for jeres Shoporama shop finder I denne indstilling:

Skærmbillede 2014-03-29 kl. 20.00.29

Det er relevant at vide, at (hvis de er lavet ordentligt altså) jeres template har en funktion til at hente adressen ud på billedet, og det er den funktion der også sørger for at billedet bliver leveret i det rigtige format. Vi gemmer originalen (dog kun i 1000 x 1000 px), og så leverer vi den som shoppen er sat op.

Her er nogle eksempler:

PNG fylder 274.4 KB

JPEG 100 % fylder 133.8 KB

JPEG 80 % fylder 32.4 KB

JPEG 60 % fylder 21.1 KB

Som I kan se er der en del at spare. Så er det op til jer hvor meget komprimering I vil have.

Vis at produktet er nyt

Mange vil gerne vise et ikon, eller noget andet, hvis deres produkt er nyt. Vi har en feature der kan hjælpe med det, og det er metoden getOnlineHours() på produkterne. Den returnerer antal timer siden produktet blev sat online.

Måden den kan implementeres på er som følgende:

<{if $product->getOnlineHours() < 48}>
    Nyhed! (smart ikon fx)
<{/if}>

Ovenstående skriver en tekst – eller måske viser et ikon hvis det er under 48 timer siden produktet blev sat online.

Hvis man vil kunne stille nemt på timerne, så kan man med fordel tilføje et felt i sin theme_settings.ini og bruge det. Jeg tilføjer fx føldende til themes_settings.ini:

[products]
news_in_hours=int

Det gør at der kommer en lille boks under temaindstillinger hvor man kan ændre hvor gammelt noget må være for at det er en nyhed. Boksen ser sådan ud:

Skærmbillede 2014-03-23 kl. 19.57.56

For at checke på det felt kan du bruge følgende kode:

<{if $product->getOnlineHours() < $settings.products.news_in_hours|default:10}>
    Nyhed ...
<{/if}>

Bemærk at jeg bruger “|default:10″ for at angive at hvis feltet ikke er sat så skal default være 10 timer.

Enjoy!