Nedan hittar du information om hur du utvecklar ett Shoporama-tema.
I allmänhet är ett Shoporama-tema en serie HTML-filer som finns i en mapp på vår ftp-server. Mallspråket i de enskilda filerna är Smarty, som nämns nedan.
Varje mall ger tillgång till ett antal objekt och metoder. Du kan läsa mer om dem i vår Mall-API.
Kontakta oss på support@shoporama.dk om du har några frågor.
Motorn i vårt mallsystem är baserad på Smarty.
Vi har version 2.6 installerad av bakåtkompatibilitetsskäl, men vi underhåller den inte längre och vi rekommenderar att alla använder version 4.x. Versionen ställs in under inställningar för butiken.
Observera att denna dokumentation endast tar hänsyn till version 4.x.
Skillnaden mellan standard Smarty och vår är att vi använder <{
och }>
som avgränsare. Dvs. syntaxen är:
<h1>Velkommen til <{$webshop->getName()|escape}></h1>
Hvis du er i tvivl om hvad en variabel er,
eller hvad en funktion returerer, kan du køre den igennem var_dump
. Hvis du har fat i et
objekt vil du altid kunne se hvilke metoder der findes i vores Mall-API.
Du använder var_dump
på följande sätt:
<{$order|var_dump}>
I vissa fall är det relevant att se till att om du använder en variabel som ett objekt, så är den också ett objekt. Annars kommer mallen inte att fungera. Vi ställer in några globala variabler som $product
och$webshop
och andra. För dessa variabler är det inte nödvändigt. De kan kontrolleras på något av följande sätt:
<{* Typisk tilstrækkelig *}> <{if $profile}> <{$profile->getName()}> <{/if}> <{* Lidt grundigere *}> <{if is_object($profile)}> <{$profile->getName()}> <{/if}> <{* Meget grundig *}> <{if is_a($profile, "SafeProfile")}> <{$profile->getName()}> <{/if}>
Om du vill se vilka variabler som finns tillgängliga på den sida du utvecklar kan du sätta Smarty i felsökningsläge och se variablerna i ett nytt fönster. Klistra in följande kod i din mall:
<{debug}>
Läs mer om Smarty4 här: Smarty 4 Dokumentation.
Väg | Funktionalitet |
---|---|
/{navn} |
Huvudmapp för ditt tema |
/{navn}/components |
Mapp med komponenter för Page Builder |
/{navn}/components/sections.json |
Lista över vilka avsnitt som kan infogas på vilka sidor |
/{navn}/components/tags.json |
Taggar att använda i temat |
/{navn}/components/sections |
Mapp för de enskilda sektionsfilerna |
/{navn}/extensions |
Tillägg till Shoporamas inbyggda datatyper. |
/{navn}/templates |
Mapp för mallar |
/{navn}/templates/mails |
Mapp för e-postmallar |
Namngivningen av filer i /{name}/templates
är i allmänhet fri. Det finns dock några få undantag:
Väg | Funktionalitet | |||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
/{navn}/templates/global.html |
Den överordnade sidan som innehåller strukturen för hela butiken. Själva innehållet infogas där denna mall visar <{$contents}>, som är en speciell variabel som kommer från index.html nedan. En mycket enkelglobal.html skulle kunna se ut så här:
<!DOCTYPE html> <html> <head> <title><{$webshop->getName()|escape}></title> </head> <body> <nav> <!-- Din navigation --> </nav> <div> <{$contents}> </div> </body> </html> |
|||||||||||||||||||||||||||||||||||||||
/{navn}/templates/index.html |
Den här mallen används för att visa innehållet i det du ser nu. D.v.s. en produkt, en landningssida eller korgen etc. Ett förslag på hur det kan se ut är följande:
<{if $inc}> <{include file=$inc}> <{elseif $category}> <{include file="category.html"}> <{elseif $landing_page}> <{include file="landing_page.html"}> <{elseif $product}> <{include file="product.html"}> <{elseif $page}> <{include file="page.html"}> <{elseif $blog_post}> <{include file="blog_post.html"}> <{/if}> |
|||||||||||||||||||||||||||||||||||||||
/{navn}/templates/printed_invoice.html |
Används från admin om du vill skriva ut en följesedel. Innehållet i ordern kommer alltid att finnas i variabeln $order. |
|||||||||||||||||||||||||||||||||||||||
/{navn}/templates/mails |
Mapp för e-postmallar. Måste innehålla följande filer:
Allmän information om strukturen för e-postmallarI princip är alla e-postmallar indelade i två delar. En del för ämnet och den andra delen för innehållet. Mallen delas upp genom att kontrollera om variabeln <{if $subject}> Emnet på mailen <{else}> Indholdet af mailen <{/if}> Med undantag för de två e-postmeddelandena |
Du kan placera dina bilder, stylesheets etc. var du vill, men vi rekommenderar att du använder en struktur som/{namn}/images
och /{namn}/css.
När du refererar till filerna använder du
variabeln$theme_url
som innehåller temats URL.
Observera att den kan ändras, så du kan inte alltid skriva in URL:en manuellt i ditt tema. Men variabeln kommer alltid att fungera. Om du vill länka till bilden/{namn}/images/img.gif
skriver du därför<img src="<{$theme_url}>/images/img.gif">.
Shoporama innehåller några olika datatyper. Till exempel produkter och kategorier. Dessa datatyper innehåller vissa fördefinierade fält som titel, beskrivning och pris. Det är möjligt att utöka de vanligaste datatyperna med egna fält. Extensions måste placeras i temat i filen /{name}/extensions/{datatype}.json,
där de möjliga datatyperna är product
, landing_page
, category
, static_page
och blog_post
.
Json-filen måste innehålla en array av
grupper, där varje grupp innehåller ett antal fält. Formatet är enligt följande:
Fält | Innehåll | Typ | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
name |
Namn på gruppen av fält | string |
||||||||||||||||
description |
Längre beskrivning | string |
||||||||||||||||
fields |
Array av fält | array |
||||||||||||||||
|
Nedan visas ett exempel på json i filen extensions/product.json:
[ { "name": "Billeder", "description": "Her kan du tilføje billeder", "fields": [ { "title": "Et enkelt billede", "id": "my-image", "type": "image" }, { "title": "En serie af billeder", "id": "my-images", "type": "images" } ] }, { "name": "Indstillinger", "description": "Herunder kan du indstille diverse", "fields": [ { "title": "my-setting", "description": "Vælg flere ..", "id": "tags", "type": "multi", "options": { "foo": "Foo", "bar": "Bar", "baz": "Baz" } } ] } ]
Tillhandahåller följande gränssnitt:
För datatyper som stöder tillägg måste värdena hämtas via metoden getExtensionValue('ID')
, där ID
är ID från json-filen. Beroende på fältets datatyp kan innehållet returneras som en text, en array eller ett objekt:
Materiale: <{$product->getExtensionValue('materiale')}>
Eller..:
<{if $img = $product->getExtensionValue('img')}> <{$img->getSrc(50, 50, 'fit')}> <{/if}>
Eller om du vill slingra dig genom bilder:
<{foreach $product->getExtensionValue('my-images') as $image}> <img src="<{$image->getSrc(50, 50, 'box')}>"> <{/foreach}>
Variabel | Innehåll | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
$webshop |
Generellt objekt som innehåller webbshoppen, men som också innehåller vissa funktioner för att extrahera olika data från webbshoppen. Läs mer om objektet Webshop. Exempel på hur $webshop används för att ta fram en lista med kategorier:<{foreach $webshop->getCategories() as $category}> <{$category->getName()|escape}> <{/foreach}> |
||||||||||||||||||||
$product |
Produktobjektet om du tittar på en produktsida | ||||||||||||||||||||
$category |
Category-objektet om en kategori visas | ||||||||||||||||||||
$landing_page |
Landningssida-objekt om du befinner dig på en landningssida | ||||||||||||||||||||
$page |
Objektet för den statiska sidan om du befinner dig i något av dessa | ||||||||||||||||||||
$blog_post |
Blogginläggsobjektet om du ser ett blogginlägg | ||||||||||||||||||||
$inc |
Namnet på den speciella - inte dynamiska - sida som körs. Värdena för detta kan vara return.html ,
order-return.html ,
return_received.html ,
also.html ,
search.html ,
basket.html ,
address.html ,
shipping.html ,
approve.html ,
payment.html ,
thanks.html ,
order.html ,
product_review.html ,
subscription.html ,
blog.html ,
user-sign-up.html ,
user-sign-in.html ,
user-sign-out.html ,
user-edit.html ,
user-reset-password.html ,
user-profile.html ,
user-orders.html ,
user-points.html ,
user-subscriptions.html ,
user-change-card.html ,
404.html ,
410.html .
När vi validerar innehållet kan du använda koden nedan för att styra visningen i en include-fil: <{if $inc}> <{include file=$inc}> <{/if}> |
||||||||||||||||||||
$shipping |
Den valda leveransmetoden | ||||||||||||||||||||
$pager_array |
Pager om den aktuella sidan innehåller sidrullning. Innehållet i matrisen är elementenmax, current , total , url och first_url . |
||||||||||||||||||||
$pager |
Personsökarobjekt. | ||||||||||||||||||||
$current_url |
Den absoluta URL:en för den aktuella sidan. | ||||||||||||||||||||
$top_url |
Relativ URL till den aktuella sidan. | ||||||||||||||||||||
$get |
En array med alla GET-variabler. | ||||||||||||||||||||
$post |
En array med alla POST-variabler. | ||||||||||||||||||||
$cookie |
En array med alla COOKIE-variabler. | ||||||||||||||||||||
$user_id |
ID för den butiksägare som är inloggad i admin. Denna variabel sätts om du följer en länk till butiken från admin. | ||||||||||||||||||||
$customer |
Kundobjekt om kunden är inloggad i butiken. | ||||||||||||||||||||
$remote_addr |
IP-adressen för den kund som tittar på sidan. | ||||||||||||||||||||
$admin_url |
URL till Shoporama-administratören | ||||||||||||||||||||
$selected_payment_gateway |
ID för den valda betalningsgatewayen. | ||||||||||||||||||||
$join_mailinglist |
En indikator om kunden har kryssat i att de vill prenumerera på nyhetsbrevet. | ||||||||||||||||||||
$basket_url |
URL till korgen och dess innehåll. | ||||||||||||||||||||
$products_matches |
ID:n för produkter som har matchat en rabatt eller kampanj | ||||||||||||||||||||
$campaign_ids |
ID:n på kampanjer om produkterna i korgen matchar en kampanj. | ||||||||||||||||||||
$campaigns |
Om det finns en aktiv kampanj. | ||||||||||||||||||||
$campaign_discount |
Rabatten från de aktiva kampanjerna. | ||||||||||||||||||||
$campaign_matches |
En matris med produkter som matchar en kampanj. Om det inte finns några produkter är variabeln null. | ||||||||||||||||||||
$unpaid_order |
Om kunden har en obetald order. | ||||||||||||||||||||
$unpaid_recurring_order |
Obetald prenumeration. | ||||||||||||||||||||
$basket |
Innehållet i korgen som en array, där de enskilda elementen är produkterna i korgen, med värdena:
Exempel på hur ovanstående används: <{foreach $basket as $row}> <{if $image = $row.product->getImage()}> <img src="<{$image->getSrc(50, 50, 'box')|escape}>"> <{/if}> <{$row.amount}> x <{$row.product->getName()|escape}> i alt <{$row.product->getRealPrice($row.amount, $row.attributes)|number_format:2:",":"."}> <{$webshop->getCurrency()}> <{/foreach}> Kontrollera Template API för att se vilka metoder som är tillgängliga för de olika objekten. |
||||||||||||||||||||
$subscriptions |
Prenumerationer på korgar. Fungerar på samma sätt som $basket |
||||||||||||||||||||
$price |
Delsumman av korgens innehåll. Det vill säga utan frakt. | ||||||||||||||||||||
$shipping_price |
Fraktpriset för korgen. | ||||||||||||||||||||
$total_price |
Totalt pris för korgens innehåll. | ||||||||||||||||||||
$vat |
Moms på innehållet i korgen. | ||||||||||||||||||||
$basket_weight |
Korgens totala vikt (för t.ex. frakt). | ||||||||||||||||||||
$total_amount |
Totalt antal produkter i korgen. | ||||||||||||||||||||
$voucher |
Rabattkoden om det finns en sådan. | ||||||||||||||||||||
$voucher_discount |
Rabatten från rabattkoden. | ||||||||||||||||||||
$shipping_country |
Det valda leveranslandet. | ||||||||||||||||||||
$nofollow |
Anger om nofollow är inställt på sidan. | ||||||||||||||||||||
$meta_title |
Sidans titel. | ||||||||||||||||||||
$meta_description |
Beskrivning av sidan. | ||||||||||||||||||||
$canonical |
URL till sidans canonical. | ||||||||||||||||||||
$session_order |
Array med faktureringsadressen. Innehåller fältenname , company_name , vat_number , address , address2 , zipcode ,city , email , phone , ean_number , comments |
||||||||||||||||||||
$session_del |
Array med leveransadressen. Innehåller fälten:name , company_name , address ,address2 , zipcode , city |
||||||||||||||||||||
$session_extra |
Array med extra fält på ordern. Om ett fält postas medextra[test]=123 , kommer $session_extra.test att vara123 och lagras på ordern. |
||||||||||||||||||||
$use_points |
Antal poäng som kunden har angett att de vill spendera på ordern. | ||||||||||||||||||||
$point_discount |
Hur många DKK (eller annan valuta) de använda poängen (från $use_points ) motsvarar. |
||||||||||||||||||||
$earns |
Hur många poäng kunden tjänar genom att slutföra ordern. |
Nedan visas de Shoporama-specifika funktioner som kan användas i mallar:
Funktionalitet | Beskrivning | ||||||||
---|---|---|---|---|---|---|---|---|---|
t |
Det är möjligt att bygga in språkstöd i sina mallar. Inte klassiskt språkstöd, där man kan välja texten på flera språk, utan språkstöd där det är möjligt att ändra texten i admin. Det fungerar genom att texten packas in i ett <{t}>Din kurv<{/t}> Observera att om du ändrar texten i dina mallfiler så kommer den nya texten att visas i admin som en ny text. Det finns inga ID:n eller namn utöver innehållet, vilket gör texten unik. Du kan ställa in <{t section="basket" hint="Bruger i overskriften"}>Din kurv<{/t}> Om du har variabelt innehåll som du vill skicka med utan att värdet finns i admin, kan du använda syntaxen nedan: <{t amount=$total_amount price=$total_price|number_format:2:",":"." hint="Til kurven"}> Du har {amount} ting til {price} kroner i kurven. <{/t}> Om det passar bättre in i din struktur kan du också använda <{$title = "Min titel her"}> <{$title|t}> Ovanstående kommer att visa följande i admin:
|
||||||||
cache |
Om en mall innehåller många tunga anrop som inte behöver uppdateras live - t.ex. varianter på produkter, menyer eller kategoriöversikter - innehåller Shoporama en cachefunktion som kan göra butiken mycket snabbare. De funktioner som används är <{get_cache name="my_cache" ttl=3600 assign="c"}> <{if $c}> Fra cache: <{$c}> <{else}> Live: <{cache name="my_cache"}> <{$smarty.now}> <{/cache}> <{/if}>
|
||||||||
get_cache |
Funktion som returnerar det cachade innehållet från
|
Det går att lägga till några allmänna inställningar i teman genom att lägga till entheme_settings.json
i roten till temat och provocera fram något i stil med följande:
Strukturen är som följer:
Namn | Innehåll | Typ av data | |||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
info |
Namnet på temat | string |
|||||||||||||||||||||||||||||||||||||||
features |
Array av funktioner som temat innehåller. Används endast för visning i admin. Endast användbart om temat är allmänt och flera användare kan välja det. Till exempel ["Funktion A", "Funktion B", "Funktion C"]. |
array |
|||||||||||||||||||||||||||||||||||||||
demo |
URL till eventuell demosida | string |
|||||||||||||||||||||||||||||||||||||||
settings |
Array av fält som kan redigeras: |
array |
|||||||||||||||||||||||||||||||||||||||
Exempel på filinnehåll{ "info": "Mit tema", "settings": [ { "path": "design", "name": "Design", "description": "Indstillinger for dit design", "fields": [ { "path": "logo", "name": "Toplogo", "description": "Upload dit logo her", "type": "image" }, { "path": "background_color", "name": "Baggrundsfarve", "description": "Baggrundsfarven på shoppen", "type": "color" }, { "path": "size", "name": "Bredde", "description": "Bredden på siden", "type": "list", "values": [ { "name": "Afgrænset", "value": "boxed" }, { "name": "Fuld bredde", "value": "fullwidth" } ] } ] }, { "path": "contact", "name": "Kontaktoplysninger", "description": "Dine kontaktoplysninger der vises i temaet", "fields": [ { "path": "mail", "name": "E-mail-adresse", "description": "Indtast din e-mail-adresse her", "type": "string" } ] }, ] } |
Page Builder är ett verktyg för att bygga innehåll via sektioner från JSON-filer. Dessa sektioner kan placeras på olika sidor i webbshoppen. Vilka sidor de kan placeras på definieras i filen/{name}/components/sections.json.
Innehållet i varje sektion definieras i en egen fil ,
som placeras i /{name}/components/sections/{section}.json.
Om du har gjort ovanstående kommer länken Design längst upp i admin automatiskt att leda tillPage Builder:
Byggnadsavsnitten är uppbyggda enligt följande:
Tråd | Innehåll | |||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
/{navn}/components/sections.json |
Innehåller en lista över sidtyper och en matris över vilka avsnitt som är tillåtna. Förutom sidtyper kan du också använda anpassade taggar. { "Sidetype": ["sektionA", "sektionB"] } Följande sidtyper finns tillgängliga:
Ett exempel på en { "landing_page": ["slider", "photos", "quiz"], "product": ["slider"], "#footer": ["about"] } |
|||||||||||||||||||||||||||||||||||||||||||||||||||
/{navn}/components/tags.json |
Taggar används för platser som du hittar på själv, och som du kan dra ut som du vill. Du kan till exempel behöva en #footer som du drar ut och visar längst ner i butiken, eller en #xmas setup som du bara använder i december . Formatet för tags.json är:
{ "tag1": "Beskrivelse ...", "tag2": "Beskrivelse ...", "tag3": "Beskrivelse ..." } De enskilda taggarna visas automatiskt i admin när användaren skapar en ny installation: För att extrahera innehållet i taggar i temat används funktionengetBlocks() på följande sätt: <{if $blocks = $webshop->getBlocks("#foo")}> <{foreach $blocks as $block=>$elements}> [...] <{/foreach}> <{/if}> |
|||||||||||||||||||||||||||||||||||||||||||||||||||
/{navn}/components/sections |
I denna katalog placeras varje avsnitt i sin egen json-fil. Varje fil är uppkallad efter sektionens namn. Om avsnittet heter slider ska innehållet finnas i/{name}/components/sections/slider.json. Filernas struktur är som följer
|
Det finns olika strategier för att extrahera data. I grund och botten kommer det att finnas en$page_blocks
på de sidor som matchar en inställning. Detta kan loopas igenom, eller så kan innehållet extraheras via $webshop->getBlocks('#foo')
. Eller så kan innehållet nås via sektionsnamnet.
Som utgångspunkt rekommenderar vi att du placerar vyn för de enskilda avsnitten i separata filer ,
till exempel /{namn}/templates/sections/{section}.html.
Då är det enkelt att loopa genom $page_blocks
och inkludera rätt vy på följande sätt:
<{if $page_blocks}> <{foreach $page_blocks as $section}> <{$type = $section._type}> <{if $webshop->templateExists("sections/$type.html")}> <{include file="sections/$type.html"}> <{/if}> <{/foreach}> <{/if}>
Observera att typen av rad finns i variabeln _type.
Vi kallar avsnittet nedan för images
- innehållet finns därför i/{name}/components/sections/images.json.
{ "title": "Overskrift og billeder", "fields": [ { "id": "headline", "type": "text", "title": "Overskrift" }, { "id": "images", "type": "images", "title": "Billeder" } ] }
Detta ger följande gränssnitt i admin:
För att extrahera innehållet med ovanstående metod kan/{name}/templates/sections/images.html
innehålla följande:
<h1><{$section.headline|escape}></h1> <{foreach $section.images as $image}> <img src="<{$image->getSrc(150, 150, 'box')}>"> <{/foreach}>
När det gäller datatyp är det viktigt att vara medveten om vad de enskilda fälten innehåller. De kan vara antingensträngar
, matriser
eller objekt
. Med andra ord bör du göra något liknande:
[...] <{foreach $section as $name=>$val}> <{if is_array($val)}> Repeater eller bildserie <{elseif is_object($val)}> En bild <{else}> Text, siffror eller liknande <{/if}> <{/foreach}> [...]
Om du använder typerna product
, category
eller landing_page
returneras det valda ID :
t i temat, och du måste själv extrahera objektet med metoderna $webshop->getProductById(id)
,$webshop->getCategory(
id
)
eller $webshop->getLandingPage(
id
).
Exempel på detta:
[...] <{if $product = $webshop->getProductById($section.product_id)}> <{$product->getName()|escape}> <{/if}> [...]
Observera att det alltid är möjligt att använda var_dump
för att undersöka vad variabeln innehåller och loopa igenom den på rätt sätt.
Baserat på den tidigare nämnda strukturen diskuteras de enskilda vyerna nedan. För att förstå de enskilda objekten och vilka metoder som finns tillgängliga rekommenderar vi att du tar en titt på vår Mall-API.
Ladda ner vårt Alaska-tema för att se exempel på de olika vyerna.
Produktvyn kan ligga i product .html
, men det är inte obligatoriskt .
Det är alltid index.html
som hanterar de enskilda vyerna .
Vi rekommenderar dock att du använder denna struktur. För att veta att en produktvy körs, kontrollera om $product
är närvarande.
Produkter läggs till i korgen genom att göra ett POST-anrop
till valfri sida - vanligtvis bara den sida du redan visar, med argumenten product_id
, attributes[{attribute_id}]={attribute_value_id}
ochamount.
Attributet bör endast läggas till om produkterna har varianter.
Ett enkelt exempel på hur man lägger till produkter i korgen kan vara:
<form action="" method="post"> <input type="hidden" name="product_id" value="<{$product->getProductId()}>"/> <input type="number" name="amount" value="1" min="1"/> <input type="submit" value="Læg i kurv"> </form>
Med varianter:
<form action="" method="post"> <input type="hidden" name="product_id" value="<{$product->getProductId()}>"/> <{foreach $product->getProfile()->getAttributeList() as $attribute}> <{if $attribute->getIsVariant() && $attribute->getDataType() == "valuelist"}> <select name="attributes[<{$attribute->getAttributeId()}>]"> <{foreach $attribute->getValues() as $value}> <option value="<{$value->getAttributeValueId()}>"> <{$attribute->getName()|escape}>: <{$value->getVal()|escape}> </option> <{/foreach}> </select> <{/if}> <{/foreach}> <input type="number" name="amount" value="1" min="1"/> <input type="submit" value="Læg i kurv"> </form>
Naturligtvis kan ovanstående göras mer komplicerat om du vill visa lagerstatus, buntar etc.
Landningssidor innehåller en $landningpage
och $products
som är en matris med produkter som ska visas på sidan.
Om sidan kräver en personsökare, infoga den på följande sätt:
<{if $pager}> <{$pager->render()}> <{/if}>
Kategorier innehåller en $category
och $products
som är en array av produkter som ska visas på sidan.
Om sidan kräver en personsökare, infoga den på följande sätt:
<{if $pager}> <{$pager->render()}> <{/if}>
Statiska sidor kommer att innehålla en $page.
Bloggen kan delas in i två sidor: blog.html
och blog_post.html
, där den första kan visa en lista över blogginlägg via
<{$blog_posts = $webshop->getBlogPosts()}>
Den faktiska visningen av de enskilda blogginläggen görs genom att titta på variabeln $blog_post.
Om listan med blogginlägg kommer från en kategori finns det också en $category
för den kategorin .
I product_review.html
har du tillgång till $order,
som är din beställning. Du kan bara granska produkter som du har köpt. Från ordern kan du hämta produkterna via $order->getOrderProducts()
. För att spara produktrecensionerna måste du göra ett POST-anrop
till samma sida med följande innehåll:
<{if $order}> <{if $get.voted}> Tak! <{else}> <form action="" method="post"> <{foreach $order->getOrderProducts() as $product}> <{$product->getName()|escape}> Stjerner: <input type="number" min="1" max="5" name="rating[<{$product->getProductId()}>]"> Anmeldelse <textarea name="description[<{$product->getProductId()}>]"></textarea> <{/foreach}> <input type="submit" value="Skriv anmeldelse"/> </form> <{/if}> <{/if}>
$get.voted
är sant när kunden har granskat.
För att länka till granskningssidan från din beställning använder du $order->getReviewUrl().
Sökningen fungerar genom att göra ett GET-anrop
till /search
där argumentet?search=
måste vara din sökterm.
Ett exempel:
<form action="/search"> <input type="text" name="search" value="<{$get.search|escape}>"/> <input type="submit" value="Søg"/> </form>
Produkter, kategorier, blogginlägg och landningssidor söks. För att visa resultatet måste du titta på de fyra variablerna$products
, $categories
, $blog_posts
, $pages
och $landing_pages
.
Huruvida statiska sidor ska sökas måste aktiveras i admin.
Om dina kunder kan logga in i din butik kan du låta dem skapa önskelistor. De kan skapa hur många önskelistor som helst, och en önskelista har ett namn, en beskrivning och ett sortiment av produkter. Själva önskelistan har en publik adress så att dina kunder kan skicka en länk.
Önskelistan använder sig av följande mallar:
Mall | URL | Beskrivning | Relevanta variabler |
---|---|---|---|
wishlist.html |
/wishlist |
Den offentliga önskelistan. | $wishlist som innehåller önskelistan. Se metoder här. |
user-wishlists.html |
/user-wishlists |
Användarens sida med önskelistor. Kräver inloggning. | $customer->getWishlists() för att extrahera önskelistor. |
user-wishlist.html |
/user-wishlist |
Den sida som används för att redigera önskelistan och produkterna | $wishlist som innehåller önskelistan. Se metoder här. |
För att skapa en önskelista
måste en POST skickas från user-wishlists.html
med namnfältet
och en valfri beskrivning
. Till exempel
<form action="" method="post"> Navn <input type="text" name="name"> Beskrivelse <textarea name="description"></textarea> <input type="submit" value="Opret"> </form>
Observera att du kan använda metoderna $wishlist->getRemoteUrl()
och $wishlist->getEditUrl()
för att skapa länkar för att visa och redigera önskelistorna.
I filen user-wishlist.html
där önskelistan redigeras måste namn och beskrivning skickas somnamn
, beskrivning
och status
, som kan vara antingen aktiv
eller stängd
. Själva produkterna, deras antal och eventuella kommentarer måste skickas som en array i följande format:
wishlist_product[{id}][name] = 'navn' wishlist_product[{id}][comments] = 'kommentar' wishlist_product[{id}][remove] = '1' // kun hvis produktet skal fjernes
Exempel på kod:
<{foreach $wishlist->getWishlistProducts() as $wp}> <{* Fordi der er forskel på produkter og ønskelisteprodukter }*> <{$product = $wp->getProduct()}> <input type="checkbox" name="wishlist_product[<{$wp->getWishlistProductId()}>][remove]" value="1"> <a href="<{$product->getUrl()|escape}>"><{$product->getName()|escape}></a> <{if $variant = $wp->getVariantValue()}> <{$wp->getVariantName()|escape}>: <{$variant|escape}> <{/if}> <input type="number" name="wishlist_product[<{$wp->getWishlistProductId()}>][amount]" value="<{$wp->getAmount()}>"> <textarea name="wishlist_product[<{$wp->getWishlistProductId()}>][comments]"><{$wp->getComments()|escape}></textarea> <{/foreach}>
Om en variabel redigering
skickas kommer sidan att återgå till samma redigeringssida igen. Annars kommer du att omdirigeras till översikten över önskelistan. För att ta bort önskelistan måste en variabel med namnetremove
skickas. Till exempel: remove.
<input type="submit" name="remove" value="Slet" onclick="return confirm('Er du sikker?');">
För att lägga till produkter i en önskelista från butiken kan ett POST-anrop göras från valfri sida med fältenwishlist_id
, product_id
och ett valfritt attribute_value_id
om produkten har en variant. Exempel:
<{if $product && $customer}> <{if $wishlists = $customer->getWishlists()}> <form action="" method="post"> <input type="hidden" name="product_id" value="<{$product->getProductId()}>"/> <label>Vælg ønskeliste:</label> <select name="wishlist_id"> <{foreach $wishlists as $wishlist}> <option value="<{$wishlist->getWishlistId()}>"> <{$wishlist->getName()|escape}> </option> <{/foreach}> </select> <{if $variant = $product->getVariant()}> <label>Vælg variant:</label> <select name="attribute_value_id"> <{foreach $variant->getValues() as $value}> <option value="<{$value->getAttributeValueId()}>"> <{$variant->getName()|escape}>: <{$value->getVal()|escape}> </option> <{/foreach}> </select> <{/if}> <input type="submit" value="Tilføj til ønskeliste"> </form> <{/if}> <{/if}>
Returcentret gör det möjligt för dina kunder att själva skapa returer. Det måste aktiveras ibutiksinställningarna. När en kund har skapat en retur måste den godkännas i admin och en kreditnota kommer att skapas.
Returcentralen använder sig av följande mallar:
Mall | URL | Beskrivning | Relevanta variabler |
---|---|---|---|
return.html |
/return |
Den sida där returen skapas | $order innehåller den order som kunden vill returnera. Se metoder här. |
order-return.html |
/order-return |
Den sida där returen visas i efterhand | $order_return med avkastningen. Se metoder här. |
return_received.html |
E-postmeddelande som skickas till kunden när de skapar en retur | $order_return med avkastningen. Se metoder här. |
Det finns två sätt för din kund att komma till retursidan. Det ena är att ange ordernumret och e-postadressen på beställningen. Det andra är genom att följa en direktlänk. Direktlänken extraheras från beställningen med hjälp av$order->getReturnUrl().
Till exempel
<{if $webshop->useReturnCenter() && !$order->getIsCreditNote()}> <a href="<{$order->getReturnUrl()|escape}>">Retuner varer</a> <{/if}>
Som framgår av exemplet är det en god idé att kontrollera att ordern inte är en kreditnota och att handlaren har aktiverat returcentret. Exemplet kan användas var som helst där det finns en $order.
Till exempel i kundens egen orderöversikt eller i e-postmeddelanden.
Om du inte använder login eller på annat sätt vill att kunden ska kunna söka efter sin order måste du implementera en sökning med ordernummer och e-postadress i return.html
. Det är fälten webshop_order_id
och email
som ska POSTas till /return.
Om ordern hittas kommer kunden att skickas till returen, om inte kommer$get.not_found
att ställas in och du kan visa ett felmeddelande i temat.
Ett minimalt formulär kan se ut så här:
<{if $get.not_found}> <p>Der blev ikke fundet nogen ordre.</p> <{/if}> <h1>Returcenter</h1> <form method="post" action=""> <input type="number" name="webshop_order_id" placeholder="Ordrenummer"> <input type="email" name="email" placeholder="E-mail-adresse"> <input type="submit" value="Søg"> </form>
I filen return.html
måste en lista med orderrader extraheras och kunden kan välja vilka produkter som ska returneras och varför. Till skillnad från vanliga ordervyer måste returen innehålla en rad per orderrad.
<form action="" method="post"> <{$line = 0}> <!-- Looper ordrelinjerne igennem --> <{foreach $order->getOrderProducts() as $product}> <!-- getReturned() returnerer antallet der tidligere er returneret --> <{$returned = $product->getReturned()}> <!-- Løkke for hver antal --> <{section name="i" loop=$product->getAmount()}> <{$line = $line+1}> <!-- Viser ikke flere end det er muligt at returnere --> <{if $line - $returned > 0}> <{$product->getName()|escape}> <{if $attributes = $product->getAttributes()}> <{foreach $attributes as $attribute}> <{$attribute.name}>: <{$attribute.val}> <{/foreach}> <{/if}> <!-- Check hvilken pris der skal vises --> <{if $webshop->getUseCalculatedUnitPrice()}> <{$webshop->getCurrency()}> <{$product->getCalculatedUnitPrice()|number_format:2:",":"."}> <{else}> <{$webshop->getCurrency()}> <{$product->getUnitPrice()|number_format:2:",":"."}> <{/if}> <!-- Checkbox og en grund --> <input type="checkbox" name="return[<{$line}>]" value="<{$product->getOrderProductId()}>">Vælg <input type="text" name="reason[<{$line}>]" placeholder="Evt. årsag til returnering"/> <{/if}> <{/section}> <{/foreach}> </form>
Det är möjligt att i admin ange en fast fraktmetod och ett fast pris. Om detta görs extraheras leveransmetoden via$webshop->getReturnShipping($country_id)
och om priset är fast extraheras det via$webshop->getReturnShippingPrice($country_id).
Exempel på:
<{if $return_shipping = $webshop->getReturnShipping($order->getDelCountryId())}> Varer skal returneres via <{$return_shipping->getName()|escape}>. <{if $price = $webshop->getReturnShippingPrice($order->getDelCountryId())}> Prisen er <{$price|number_format:2:",":"."}> <{else}> Prisen er <{$return_shipping->getCost()|number_format:2:",":"."}> <{/if}> <{else}> <!-- Vis en liste over shoppens almindelige leveringsmetoder her --> <{/if}>
Den valda leveransmetoden, om den är valfri, måste skickas som shipping_id
.
När returen är skapad kommer den att visas i order-return.html
, som innehåller en $order_return
med relevanta metoder.
also.html
är vår sida för merförsäljning. I grund och botten har du tillgång till $product,
och därifrån kan du ge förslag till kunden. Det kan till exempel vara relevant att använda $product->getRelatedProducts()
,$product->getAlsoBought()
eller $webshop->getPopularProducts()
.
Används endast för att visa 404-sidor.
Används endast för att visa 410 sidor.
En captcha infogas automatiskt när du försöker anmäla dig till nyhetsbrevet eller skriva kommentarer. Detta för att undvika spam. Det går att designa sidan själv i captcha.html
, och den måste minst innehålla:
<form action="" method="post"> <{$form}> <{if $error}>Fejl i koden<{/if}> <img src="<{$imgstr}>"> Skriv indholdet at ovenstående felt: <input type="text" name="c"> <input type="submit" value="OK"> </form>
Det är möjligt att låta dina kunder logga in i butiken. Om de är inloggade kommer det att finnas en$customer
som innehåller information om användaren. Alla sidor som redigerar, loggar in etc. måste skickas via POST till själva sidan.
Filens namn | Beskrivning | Relevanta variabler/parametrar i formuläret |
---|---|---|
/user-edit.html |
Används för att redigera kunddata. Det är möjligt att lägga till fält på kunden. Se mer under denna tabell. | company , vat_number , name , email , phone , address , zipcode , city , country_id , shipping_name , shipping_address , shipping_zipcode , shipping_city , shipping_country_id , pass1 , pass2 . |
/user-orders.html |
Kundens tidigare beställningar | $my_orders |
/user-points.html |
Kundens synvinkel | $my_points |
/user-profile.html |
Visning av kunddata | $customer |
/user-reset-password.html |
Används för återställning av lösenord | email , password |
/user-sign-in.html |
Inloggningssida. Använd redir om kunden behöver omdirigeras till en URL efter inloggning. |
email , password , redir |
/user-sign-up.html |
Ett formulär som kunden använder för att registrera sig. | name , email , phone , address , zipcode , city , company , vat_number , og country_id |
I admin är det möjligt att definiera anpassade fält för dina användare. Dessa fält redigeras på följande sätt:
<{foreach $webshop->getCustomerFields() as $field}> <{if $field->getType() == "list"}> <{$field->getName()|escape}> <select name="field[<{$field->getCustomerFieldId()}>]"> <{foreach $field->getValues() as $value}> <option <{if $field->getVal() == $value}>selected="selected"<{/if}> value="<{$value|escape}>"> <{$value|escape}> </option> <{/foreach}> </select> <{elseif $field->getType() == "string"}> <{$field->getName()|escape}> <input type="text" name="field[<{$field->getCustomerFieldId()}>]" value="<{$field->getVal()|escape}>"> <{/if}> <{/foreach}>
Lojalitetsprogrammet gör det möjligt för dina kunder att tjäna och spendera poäng när de slutför beställningar. Konfigurationen hanteras under Kunder > Lojalitetsprogram.
Du kan använda metoderna nedan för att kontrollera om butiken har aktiverat lojalitetsprogrammet och om kunden är inloggad och har tjänat poäng som de kan använda:
<{if $webshop->hasLoyaltyProgram() && $customer && $customer->getActivePoints()}> [Visning af point m.m.] <{/if}>
För att visa hur många poäng kunden har tjänat in och hur många poäng kunden kan spendera på den aktuella ordern kan du använda följande kodexempel:
Du har optjent <{$customer->getActivePoints()|number_format:0:",":"."}> point. <{if $points = $customer->getPointsAvailable()}> Du kan bruge <{$points|number_format:0:",":"."}> point på denne ordre. <{else}> Du har ingen optjente point du kan bruge på denne ordre. <{/if}>
Det fält som du POSTar till korgen och som anger hur många poäng kunden ska använda ska heta use_points
och kan se ut så här:
<input type="number" name="use_points" value="<{$use_points}>" min="0" max="<{$customer->getPointsAvailable()}>"/>
Du kan använda $earns
för att se hur mycket kunden tjänar på ordern:
Du optjener <{$earns|number_format:0:",":"."}> point på denne ordre.
Du kan använda exemplet nedan för att beskriva ditt lojalitetsprogram:
Du optjener <{$webshop->getLoyaltyProgramBasePoints()|number_format:0:",":"."}> point hver gang du køber for 1 <{$webshop->getCurrency()}>. Når du betaler med point svarer <{$webshop->getLoyaltyProgramBaseCost()|number_format:0:",":"."}> point til 1 <{$webshop->getCurrency()}>.
Om du vill skapa en sida med en poängöversikt kan du använda user-points.html
, där du kan loopa genom $my_points
och presentera innehållet. Ta en titt på SafePoint-klassen för att se vilka metoder som finns tillgängliga.
Tips: Du kan utforma din orderöversikt med hjälp av följande CSS-klasser: points_used
, points_earned
och has_profile
.
Checkout-flödet är helt enkelt en serie html-sidor, var och en innehåller ett formulär som POSTAR
vissa data till sig själv, och om nästa
fält är inställt kommer Shoporama att vidarebefordra till nästa sida i flödet. Vanligtvis ställer du in knappen "Nästa" till name="
nästa "
. Du kan alltid länka till tidigare sidor i flödet. När kunden har angett sina uppgifter lagras dessa i två arrayer, $session_order
och $session_del
. Till exempel$session_order.name.
Filens namn | Beskrivning | Relevanta variabler/parametrar i formuläret |
---|---|---|
basket.html |
Visar innehållet i korgen. Enkelt exempel på hur $basket används:<{foreach $basket as $line}> <{$line.amount}> x <{$line.product->getName()}> <{foreach $line.attributes as $a}> <{$a.name|escape}>: <{$a.value|escape}> <{/foreach}> <{/foreach}> För att ändra numret, [...] <input name="amount[<{$line.id}>]" value="<{$line.amount}>" /> [...] För att lägga till en rabattkod måste en Leveranslandet kan ändras genom att |
$basket , $voucher , $voucher_discount , $campaign_ids ,
$campaign_discount , $price , $shipping_price , $total_price ,
$vat |
address.html |
Den sida där leveransinformationen anges. Om Om |
order_country_id , order_name , order_company_name , vat_number ,
ean_number , order_address , order_zipcode , order_city ,
email , phone , comments , del_name , del_company_name ,
del_address , del_zipcode , del_city , del_country_id ,
mailinglist , create_profile |
shipping.html |
Används för att välja leveransmetod. De enskilda leveransmetoderna kan extraheras via För att spara leveransmetoden måste en [...] <{if $shipping->getModule()}> <select name="shop"> <{foreach $shipping->getDeliveryShops() as $shop}> <option value="<{$shop.number}>"> <{$shop.name|escape}> <{$shop.street|escape}> <{$shop.zip|escape}> <{$shop.city|escape}> </option> <{/foreach}> </select> <{/if}> [...] |
shipping_id , shop |
approve.html |
Sidan för godkännande. Används för att visa ordern. Om butiken innehåller flera betalningsgateways kan dessa väljas på den här sidan. De hämtas via |
$basket , $shipping , payment_gateway_id |
thanks.html |
Tack-sida. Används för att visa den order som har slutförts. | $order |
Shoporama har två inbyggda ajax-anrop. Den ena kan extrahera produkter på olika sätt (filtrering) och den andra är en allmän och enkel sökning som söker efter produkter, kategorier och målsidor.
Filtreringen sker i filen /ajax som
ligger i roten till alla butiker
Argument | Beskrivning | Exempel på ett exempel |
---|---|---|
atags |
En lista med taggar på attributvärden, attributvärden är inställningar på attributen på produkternas profiler. värdena på atags måste separeras med kommatecken, men tillåter grupperingar separerade med pipe som ett logisktOR. |
ajax?atags=female,black|white |
product_ids |
Lista över product_ids separerade efter pipe. | ajax?product_ids=1|2|3|4 |
price_range |
Returnerar produkter som faller inom ett prisintervall. Beloppen måste vara åtskilda med pip. | ajax?price_range=100|200 |
categories |
En pipseparerad lista med kategorier som produkterna ska finnas i. Om argumentet exclude=1 anges returneras en lista med produkter som inte har kategorierna. |
ajax?categories=5|9|2 ajax?categories=5|9|2&exclude=1 |
sort |
Sorteringsordning. Värdena popular , weight , name ,price , created kan ställas in. Om sorteringsordningen ska vara stigande eller fallande anges genom att sort_order sätts till antingen asc (stigande) eller desc (fallande) . |
ajax?sort=price&sort_order=desc |
attribute_values |
En lista med ID:n för de attributvärden som produkterna ska ha. Listan är separerad med pipe. Om argumentetexclude=1 anges returneras en lista med produkter som inte matchar. |
ajax?attribute_values=9|8|12 |
suppliers |
Rörseparerad lista med leverantörs-ID:n. | ajax?suppliers=8|2 |
landing_pages |
Girl-separerad lista med ID:n för målsidor där produkter ska visas. | ajax?landing_pages=5|24 |
extension.{id} |
Om temat använder utökade fält kan produkter extraheras baserat på dem. Absoluta sökningar görs, så de fält som är mest meningsfulla att använda är bool , multi ,number och list. Pipe-separerade värden kan användas om produkterna bara behöver matcha ett av värdena. |
ajax?extension.foo=1&extension.tags=foo|bar |
attribute_tags_in_stock |
Lista över taggar med attributvärden som måste finnas i lager. Listan kan vara pipe-separerad. | ajax?attribute_tags_in_stock=foo|bar |
attribute_tags |
Lista över taggar som måste ställas in på produkterna. Listan kan vara pipe-separerad. | ajax?attribute_tags=foo|bar |
attribute_tag |
Samma sak som attribute_tags men bara med en enda tagg. |
ajax?attribute_tag=foo |
force_categories |
En pipseparerad lista med kategori-ID:n som alla måste anges för produkterna. | ajax?force_categories=5|9|2 |
limit |
Max. antal produkter som ska returneras. | ajax?limit=10 |
offset |
Startposition i förhållande till var i listan med produkter du vill hämta från. | ajax?offset=100&limit=10 |
meta |
Pipe-separerad lista över extra fält som du vill se på produkterna i resultatet. Om du angermeta=_all returneras alla. |
ajax?meta=foo|bar ajax?meta=_all |
only_in_stock_variants |
Ställs in på 1 eller 0 beroende på om varje produkt i resultatet endast ska innehålla varianter som finns i lager. Standardvärdet är 0. |
ajax?only_in_stock_variants=1 |
include_meta |
Ställ in till 1 eller 0 beroende på om du vill ha ett extra metafält i resultatet som innehåller beskrivningar av produkterna i resultatet. Detta är information om vilka attribut, kategorier och varumärken som finns. Standardvärdet är 0. |
ajax?include_meta=1 |
include_pagination |
Sätts till 1 eller 0 beroende på om du vill ha ett extra pagineringsfält i resultatet som innehåller pagineringsinformation . Fälten i matrisen är offset , limit , count , total . Standardinställningen är 0. |
ajax?include_pagination=1 |
pretty |
Sätts till 1 eller 0 beroende på om json-svaret ska formateras snyggt eller inte. |
ajax?pretty=1 |
Svaret från /ajax
är en array i formatet nedan:
[ { "product_id": 139735, "own_id": "skunumme", "name": "Produktnavn", "supplier_id": 0, "supplier_name": "", "category_ids": [ 3661, 2113, 2106, 1973 ], "category_names": [ "Bob", "Forside", "Ged", "Giraf" ], "description": "<p>...</p>", "list_description": "", "profile_name": "Default m. variant", "allow_negative_stock": 1, "brand_name": "TESTBRAND", "sale_price": 0, "real_price": 80, "price": 80, "price_dk": "80,00", "approx_shipping": 0, "delivery_time": "", "delivery_time_not_in_stock": "", "url": "https://example.com/produkt", "stock": 0, "attr_stock": null, "variant_stock": [ { "attribute_id": 2740, "attribute_value_id": 16287, "name": "S", "weight": 10, "cnt": 4 }, { "attribute_id": 2740, "attribute_value_id": 16289, "name": "L", "weight": 30, "cnt": 9 } ], "stock_string_da": "Nej", "avg_rating": null, "thumbnail": "https://example.com/cache/1/9/6/9/bob-fit-200x200x90.png", "meta_values": [ null ], "online_since": 1651685711, "has_campaigns": true, "campaign_info": [ { "name": "Bob", "price_model": "cheapest_free", "min_product_count": 4, "price": 0, "percent": 0, "created": "2023-02-01 14:55:47", "expires": null } ] } ]
Av hastighetsskäl cachar vi svaret från ajax-filen, men i testmiljön kan du lägga till rebuild=1
som ett argument för att sidan ska byggas om. Vi rekommenderar att du inte gör detta i produktionsmiljön eftersom det kan sakta ner sidan avsevärt.
Sidan /ajax_search
innehåller en allmän sökning efter produkter, kategorier och målsidor. Den kan till exempel användas för en autokomplettering i ditt sökfält. Den tar emot följande argument:
Argument | Beskrivning | Exempel på ett exempel |
---|---|---|
term |
Nyckelord. | ajax_search?term=ostemad |
limit |
Max. antal resultat. | ajax_search?term=ostemad&limit=25 |
include |
En kommaseparerad lista över de datatyper som du vill söka efter. Värdena kan varaprodukter , kategorier , blog_posts , sidor och landing_pages . |
ajax_search?term=ostemad&include=products,categories |
pretty |
Sätts till 1 eller 0 beroende på om json-svaret ska formateras snyggt eller inte. |
ajax_search?term=ostemad&pretty=1 |
Resultatet är en matris i formatet nedan:
[ { "name": "Produkt et", "supplier": "", "description": "<p>...</p>", "price": 80, "sale_price": null, "normal_price": 80, "currency": "DKK", "price_dk": "80,00", "url": "https://example.com/produkt-et", "stock": 0, "stock_string_da": "Nej", "review_avg": 0, "thumbnail": "https://example.com/cache/1/9/8/4/box-100x100x90.png", "type": "product" }, { "name": "Produkt to", "supplier": "", "description": "<p>...</p>", "price": 80, "sale_price": null, "normal_price": 80, "currency": "DKK", "price_dk": "80,00", "url": "https://example.com/produkt-to", "stock": 0, "stock_string_da": "Nej", "review_avg": 0, "thumbnail": "https://example.com/cache/1/9/6/9/bob-box-100x100x90.png", "type": "product" } ]