Shoporama-Vorlagen

Nachfolgend finden Sie Informationen über die Entwicklung eines Shoporama-Themas.

Auf einen Blick

Im Allgemeinen besteht ein Shoporama-Thema aus einer Reihe von HTML-Dateien, die sich in einem Ordner auf unserem FTP-Server befinden. Die Vorlagensprache in den einzelnen Dateien ist Smarty, die unten erwähnt wird.

Jede Vorlage ermöglicht den Zugriff auf eine Reihe von Objekten und Methoden. Sie können mehr über sie in unserem Vorlagen-API.

Wenden Sie sich an support@shoporama.dk, wenn Sie Fragen haben.

Smarty

Die Engine unseres Template-Systems basiert auf Smarty.

Wir haben aus Gründen der Abwärtskompatibilität die Version 2.6 installiert, aber wir pflegen sie nicht mehr und empfehlen, dass jeder die Version 4.x verwendet. Die Version wird unter Einstellungen für den Shop eingestellt.

Bitte beachten Sie, dass diese Dokumentation nur die Version 4.x berücksichtigt.

Der Unterschied zwischen Standard-Smarty und unserem System besteht darin, dass wir <{ und }> als Begrenzungszeichen verwenden. D.h. die Syntax ist:

<h1>Velkommen til <{$webshop->getName()|escape}></h1>

Tipps und Tricks

Prüfen Sie den Inhalt

Wenn Sie sich nicht sicher sind, was eine Variable ist oder was eine Funktion zurückgibt, können Sie sie durch var_dump laufen lassen. Wenn Sie ein Objekt haben, können Sie immer sehen, welche Methoden in unserer Vorlagen-API verfügbar sind.

Sie verwenden var_dump auf die folgende Weise:

<{$order|var_dump}>
Objekte prüfen

In einigen Fällen ist es wichtig sicherzustellen, dass eine Variable, die Sie als Objekt verwenden, auch ein Objekt ist. Andernfalls wird die Vorlage nicht funktionieren. Wir setzen einige globale Variablen wie $product,$webshop und andere. Für diese Variablen ist es nicht notwendig. Sie können auf eine der folgenden Arten überprüft werden:

<{* 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}>
Debuggen

Wenn Sie sehen wollen, welche Variablen auf der Seite, die Sie entwickeln, verfügbar sind, können Sie Smarty in den Debug-Modus versetzen und die Variablen in einem neuen Fenster sehen. Fügen Sie den folgenden Code in Ihre Vorlage ein:

<{debug}>

Lesen Sie hier mehr über Smarty4: Smarty 4 Dokumentation.

Struktur der Datei

Sie erhalten ftp-Zugang zu Ihrem Shop und legen Ihr Thema im Stammverzeichnis ab. Der Name des Ordners ist der Name des Themas.

Pfad Funktionsweise
/{navn} Hauptordner für Ihr Thema
/{navn}/components Ordner mit Komponenten für Page Builder
/{navn}/components/sections.json Liste der Abschnitte, die auf welchen Seiten eingefügt werden können
/{navn}/components/tags.json Tags zur Verwendung im Thema
/{navn}/components/sections Ordner für die Dateien der einzelnen Abschnitte
/{navn}/extensions Erweiterungen zu Shoporamas eingebauten Datentypen.
/{navn}/templates Ordner für Vorlagen
/{navn}/templates/mails Ordner für Mailvorlagen

Die Benennung von Dateien in /{name}/templates ist im Allgemeinen frei. Es gibt jedoch ein paar Ausnahmen:

Pfad Funktionsweise
/{navn}/templates/global.html Die übergeordnete Seite, die die Struktur des gesamten Shops enthält. Der Inhalt selbst wird dort eingefügt, wo diese Vorlage <{$contents}> anzeigt , das ist eine spezielle Variable, die aus der index.html unten stammt. Eine sehr einfacheglobal.html könnte wie folgt aussehen:
<!DOCTYPE html>
<html>
<head>
	<title><{$webshop->getName()|escape}></title>
</head>

<body>

	<nav>
		<!-- Din navigation -->
	</nav>

	<div>
		<{$contents}>
	</div>

</body>

</html>
/{navn}/templates/index.html Diese Vorlage wird verwendet, um den Inhalt von "Was-du-jetzt- siehst" anzuzeigen. D.h. ein Produkt, eine Landing Page oder der Warenkorb usw. Ein Vorschlag, wie es aussehen könnte, ist folgender:
<{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 Wird von der Verwaltung verwendet, wenn Sie einen Lieferschein drucken möchten. Der Inhalt der Bestellung wird immer in der Variablen $order stehen.
/{navn}/templates/mails Ordner für E-Mail-Vorlagen. Muss die folgenden Dateien enthalten:
Name der Datei Inhalt Relevante Variablen
after_purchase.html Wenn Sie Ihren Kunden einige Zeit nach dem Kauf eine E-Mail schicken möchten. $products, $order
basket_mail.html E-Mails, die automatisch verschickt werden können, wenn der Kunde seine E-Mail-Adresse eingegeben, aber nicht ausgecheckt hat. $basket_url, $basket
in_stock_mail.html E-Mail, die verschickt werden kann, wenn ein Artikel wieder auf Lager ist und der Kunde sich angemeldet hat. $product
invoice_dropshipping.html E-Mail an Dropshipping-Lieferant. $products, $order
invoice.html Die Rechnung für die Bestellung. $order
order_credit.html E-Mail, wenn die Bestellung gutgeschrieben wird. $order
order_sent.html E-Mail, wenn die Bestellung versandt wird. $order
payment_mail.html Wenn der Kunde eine Bestellung abgeschlossen, aber die Zahlung nicht getätigt hat. $payment_url, $order
product_review_mail.html E-Mail, die an den Kunden gesendet werden kann, wenn Sie Bewertungen wünschen. $order
user-reset-password-mail.html E-Mail mit Link zum Zurücksetzen des Passworts. Um die URL zu erhalten, verwenden Sie $customer->getTokenUrl(). $customer
user-welcome-mail.html Willkommens-E-Mail, wenn der Kunde ein Konto im Shop anlegt. $customer
return_received.html E-Mail, die der Kunde erhält, wenn er eine Rücksendung über das Rücksendezentrum anlegt. $order_return

Allgemeine Informationen über den Aufbau von Mailvorlagen

Im Grunde genommen sind alle E-Mail-Vorlagen in zwei Teile unterteilt. Ein Teil für den Betreff und der andere Teil für den Inhalt. Die Aufteilung der Vorlage erfolgt durch die Überprüfung, ob die Variable $subject gesetzt ist. Ist dies der Fall, sollte die Vorlage den Betreff zurückgeben. Andernfalls sollte sie den Inhalt zurückgeben. Beispiel:

<{if $subject}>

	Emnet på mailen

<{else}>

	Indholdet af mailen

<{/if}>

Mit Ausnahme der beiden E-Mails invoice.html undinvoice_dropshipping.html, bei denen der Betreff über denAdministrator und nicht über die Vorlage gesteuert wird.

Bilder, Stylesheets, etc. im Thema

Sie können Ihre Bilder, Stylesheets usw. platzieren, wo immer Sie wollen, aber wir empfehlen, eine Struktur wie/{name}/images und /{name}/css zu verwenden. Wenn Sie auf die Dateien verweisen, verwenden Sie die Variable$theme_url, die die URL des Themes enthält. Beachten Sie, dass sie sich ändern kann, so dass Sie die URL nicht immer manuell in Ihr Thema eingeben können. Aber die Variable wird immer funktionieren. Wenn Sie also auf das Bild/{name}/images/img.gif verlinken wollen, geben Sie<img src="<{$theme_url}>/images/img.gif"> ein.

Erweiterungen

Shoporama enthält einige verschiedene Datentypen. Zum Beispiel, Produkte und Kategorien. Diese Datentypen enthalten einige vordefinierte Felder wie Titel, Beschreibung und Preis. Es ist möglich, die gängigsten Datentypen mit eigenen Feldern zu erweitern. Die Erweiterungen müssen im Theme in der Datei /{name}/extensions/{datatype}.json abgelegt werden, wobei die möglichen Datentypen product, landing_page, category, static_page und blog_post sind.

Die Json-Datei muss ein Array von Gruppen enthalten, wobei jede Gruppe eine Reihe von Feldern enthält. Das Format ist wie folgt:

Feld Inhalt Typ
name Name der Gruppe von Feldern string
description Längere Beschreibung string
fields Array von Feldern array
Feld Inhalt
title Der Titel des Feldes
description Längere Beschreibung, falls zutreffend
id ID zum Extrahieren des Wertes mit
type Einer der folgenden Typen: multi, list, text, richtext, longtext, number, bool, image, images, color
options Werte, deren Typ entweder Liste oder Multi ist. Das Format ist
"options": {
	"foo": "Foo",
	"bar": "Bar",
	"baz": "Baz"
}
placeholder Möglicher Platzhalter
default Standardwert

Nachstehend finden Sie ein Beispiel für die json-Datei 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"
				}
			}
		]
	}
]

Bietet die folgende Schnittstelle:

Bei Datentypen, die Erweiterungen unterstützen, müssen die Werte über die Methode getExtensionValue('ID') abgerufen werden, wobei ID die ID aus der json-Datei ist. Je nach Datentyp des Feldes kann der Inhalt als Text, Array oder Objekt zurückgegeben werden:

Materiale: <{$product->getExtensionValue('materiale')}>

Oder:

<{if $img = $product->getExtensionValue('img')}>
	<{$img->getSrc(50, 50, 'fit')}>
<{/if}>

Oder wenn Sie Bilder in einer Schleife durchlaufen wollen:

<{foreach $product->getExtensionValue('my-images') as $image}>
	<img src="<{$image->getSrc(50, 50, 'box')}>">
<{/foreach}>

Globale Variablen

Variabel Inhalt
$webshop Allgemeines Objekt, das den Webshop enthält, aber auch einige Funktionen zum Extrahieren verschiedener Daten aus dem Webshop enthält. Lesen Sie mehr über das Webshop-Objekt. Beispiel, wie $webshop verwendet wird, um eine Liste von Kategorien zu erhalten:
<{foreach $webshop->getCategories() as $category}>
	<{$category->getName()|escape}>
<{/foreach}>
$product Das Produktobjekt, wenn Sie eine Produktseite anzeigen
$category Das Category-Objekt, wenn eine Kategorie angezeigt wird
$landing_page Landing Page-Objekt, wenn Sie sich auf einer Landing Page befinden
$page Das Objekt für die statische Seite, wenn Sie sich in einem der folgenden Bereiche befinden
$blog_post Das Blogpost-Objekt, wenn Sie einen Blogpost sehen
$inc Der Name der speziellen - nicht dynamischen - Seite, die gerade ausgeführt wird. Die Werte hierfür können sein 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.

Da wir den Inhalt validieren, können Sie den folgenden Code verwenden, um die Anzeige in einer Include-Datei zu steuern:

<{if $inc}>
	<{include file=$inc}>
<{/if}>
$shipping Die gewählte Versandart
$pager_array Pager, wenn die aktuelle Seite einen Seitenbildlauf enthält. Der Inhalt des Arrays besteht aus den Elementenmax, current, total, url und first_url.
$pager Pager-Objekt.
$current_url Die absolute URL der aktuellen Seite.
$top_url Relative URL zur aktuellen Seite.
$get Ein Array mit allen GET-Variablen.
$post Ein Array mit allen POST-Variablen.
$cookie Ein Array mit allen COOKIE-Variablen.
$user_id Die ID des Shop-Besitzers, der in der Verwaltung angemeldet ist. Diese Variable wird gesetzt, wenn Sie einem Link zum Shop vom Admin folgen.
$customer Kundenobjekt, wenn der Kunde im Shop eingeloggt ist.
$remote_addr Die IP-Adresse des Kunden, der die Seite betrachtet.
$admin_url URL zur Shoporama-Verwaltung
$selected_payment_gateway Die ID des ausgewählten Zahlungs-Gateways.
$join_mailinglist Eine Anzeige, ob der Kunde angekreuzt hat, dass er den Newsletter abonnieren möchte.
$basket_url URL zum Korb und seinem Inhalt.
$products_matches IDs von Produkten, für die ein Rabatt oder eine Werbeaktion gewährt wurde
$campaign_ids IDs zu Kampagnen, wenn die Produkte im Warenkorb einer Kampagne entsprechen.
$campaigns Wenn es eine aktive Kampagne gibt.
$campaign_discount Der Rabatt aus den aktiven Kampagnen.
$campaign_matches Ein Array von Produkten, die zu einer Kampagne passen. Wenn es keine Produkte gibt, ist die Variable null.
$unpaid_order Wenn der Kunde eine unbezahlte Bestellung hat.
$unpaid_recurring_order Unbezahltes Abonnement.
$basket Der Inhalt des Warenkorbs als Array, wobei die einzelnen Elemente die Produkte im Warenkorb sind, mit den Werten:
Variabel Inhalt
.id Eindeutige ID in der Zeile
.product_id die ID des Produkts
.in_stock true/false, wenn das Produkt auf Lager ist
.product Das Produkt
.attributes Produktattribute
.own_id die Sku-Nummer
.amount die Nummer im Korb
.comment Möglicher Kommentar
.bundle Array des Produkts, wenn das Produkt ein Bündel ist

Beispiel für die Verwendung der obigen Angaben:

<{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}>

Überprüfen Sie die Vorlagen-API, um zu sehen, welche Methoden für die verschiedenen Objekte verfügbar sind.

$subscriptions Warenkorb-Abonnements. Funktioniert auf die gleiche Weise wie $basket
$price Die Zwischensumme des Warenkorbinhalts. Das heißt, ohne Versand.
$shipping_price Der Versandpreis des Warenkorbs.
$total_price Gesamtpreis des Warenkorbinhalts.
$vat Mehrwertsteuer auf den Inhalt des Warenkorbs.
$basket_weight Das Gesamtgewicht des Korbes (z. B. für Fracht).
$total_amount Gesamtzahl der Produkte im Warenkorb.
$voucher Den Rabattcode, wenn es einen gibt.
$voucher_discount Der Rabatt aus dem Rabattcode.
$shipping_country Das ausgewählte Lieferland.
$nofollow Zeigt an, ob nofollow auf der Seite gesetzt ist.
$meta_title Der Titel der Seite.
$meta_description Beschreibung der Seite.
$canonical URL zum kanonischen Wert der Seite.
$session_order Array mit der Rechnungsadresse. Enthält die Feldername, company_name, vat_number, address, address2, zipcode,city, email, phone, ean_number, comments
$session_del Array mit der Lieferadresse. Enthält die Felder:name, company_name, address,address2, zipcode, city
$session_extra Array der zusätzlichen Felder in der Bestellung. Wenn ein Feld mitextra[test]=123 gepostet wird, ist $session_extra.test gleich 123 und wird in der Bestellung gespeichert.
$use_points Anzahl der Punkte, die der Kunde für die Bestellung ausgeben möchte.
$point_discount Wie viele DKK (oder andere Währung) die verwendeten Punkte (aus $use_points) entsprechen.
$earns Wie viele Punkte der Kunde durch den Abschluss der Bestellung erhält.

Merkmale der Vorlage

Nachfolgend finden Sie die Shoporama-spezifischen Funktionen, die in Vorlagen verwendet werden können:

Funktionsweise Beschreibung
t

Es ist möglich, Sprachunterstützung in Ihre Vorlagen zu integrieren. Keine klassische Sprachunterstützung, bei der Sie den Text in mehreren Sprachen auswählen können, sondern eine Sprachunterstützung, bei der es möglich ist, den Text im Adminbereich zu ändern. Das funktioniert, indem der Text in einen <{t}>-Block eingeschlossen wird. Nachdem die Vorlage im Browser gerendert wurde, kann der Text dann in der Verwaltung bearbeitet werden. Beispiel:

<{t}>Din kurv<{/t}>

Wenn Sie den Text in Ihren Vorlagendateien ändern, wird der neue Text in der Verwaltung als neuer Text angezeigt. Es gibt keine anderen IDs oder Namen als den Inhalt, was den Text einzigartig macht.

Sie können das Attribut Abschnitt auf den Block setzen, um Ihre Texte in überschaubare Teile zu unterteilen. Außerdem können Sie das Attribut "Hinweis" verwenden, wenn Sie bei der Bearbeitung des Textes einen Hinweis in der Verwaltung geben möchten:

<{t section="basket" hint="Bruger i overskriften"}>Din kurv<{/t}>

Wenn Sie einen variablen Inhalt haben, den Sie senden möchten, ohne dass der Wert in admin steht, können Sie die folgende Syntax verwenden:

<{t amount=$total_amount price=$total_price|number_format:2:",":"." hint="Til kurven"}>
    Du har {amount} ting til {price} kroner i kurven.
<{/t}>

Wenn es besser in Ihre Struktur passt, können Sie t auch als Modifikator für Ihre Variablen/Funktionen verwenden:

<{$title = "Min titel her"}>
<{$title|t}>

In der Verwaltung wird dann folgendes angezeigt:

Argumentieren Sie Beschreibung
section Abschnitt zu unterteilen in admin
hint Hinweis, der in der Verwaltung als Hilfetext verwendet wird
cache

Wenn ein Template viele umfangreiche Aufrufe enthält, die nicht live aktualisiert werden müssen - wie Produktvarianten, Menüs oder Kategorieübersichten - enthält Shoporama eine Caching-Funktion, die den Shop deutlich schneller machen kann. Die verwendeten Funktionen sind cache bzw. get_cache, die zunächst den zu cachenden Teil markieren und später die gecachten Daten abrufen. Beispiel:

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

<{if $c}>

	Fra cache: <{$c}>

<{else}>

	Live:

	<{cache name="my_cache"}>
		<{$smarty.now}>
	<{/cache}>

<{/if}>

Die Funktion cache umhüllt den Inhalt und weist ihm den in name angegebenen Namen zu. Wenn der Inhalt extrahiert werden soll, wird get_cache verwendet, das die Argumente name, wie zuvor verwendet, und ttl, das in Sekunden angibt, wie alt der Inhalt sein darf, entgegennimmt. Wenn das Argument weggelassen wird, ist die Vorgabe eine Stunde.

Argumentieren Sie Beschreibung
name Dient zur Angabe des Namens des zwischengespeicherten Elements. Es ist möglich, dynamische Namen von Variablen zu verwenden.
get_cache

Funktion, die den zwischengespeicherten Inhalt von der Cache-Funktion zurückgibt.

Argumentieren Sie Beschreibung
name Der Name des zwischengespeicherten Elements, wie er im Cache verwendet wird.
ttl Lebendige Zeit. Anzahl der Sekunden, für die der Cache gültig sein muss.
assign Der Name des variablen Hubs, dem der Inhalt zugewiesen werden soll.

Theme-Einstellungen

Es ist möglich, einige allgemeine Einstellungen zu Themes hinzuzufügen, indem man einetheme_settings.json im Stammverzeichnis des Themes hinzufügt und etwas wie das Folgende ausführt:

Die Struktur ist wie folgt:

Name Inhalt Datentyp
info Der Name des Themas string
features Eine Reihe von Funktionen, die das Thema enthält. Wird nur für die Anzeige in der Verwaltung verwendet. Nur nützlich, wenn das Thema allgemein ist und mehrere Benutzer es auswählen können. Zum Beispiel ["Merkmal A", "Merkmal B", "Merkmal C"] array
demo URL zur möglichen Demo-Seite string
settings

Array von Feldern, die bearbeitet werden können:

array
Name Inhalt Datentyp
.path ID der Felder, die bei der Abfrage des Wertes als erstes Element in die Variable aufgenommen werden. Ist path auf design gesetzt, befinden sich die Werte in$settings.design.{field name} string
.name In der Verwaltung angezeigter Name string
.description In der Verwaltung angezeigte Beschreibung string
.fields

Die einzelnen Felder, die vom Benutzer bearbeitet werden können

array
Name Inhalt Datentyp
.path Die ID, unter der der Wert abgerufen werden soll. Wenn path auf colour gesetzt ist und das übergeordnete Feld design war, kann das Feld über $settings.design.colour abgerufen werden . string
.name In der Verwaltung angezeigter Name string
.description In der Verwaltung angezeigte Beschreibung string
.default Standardwert. Wenn das Feld leer ist, wird dieser Wert verwendet. string
.type Der Typ des Feldes. Die gültigen Typen sind:Bild,Farbe,String,Bool,Wysiwyg undListe. string
.values Werte, wenn Typ auf Liste eingestellt ist. Formater er følgende:
[
	{
		"name": "cheese",
		"value": "Ost"
	},
	{
		"name": "ham",
		"value": "Skinke"
	}
]
array

Beispiel für den Inhalt einer Datei

{
	"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

Page Builder ist ein Werkzeug zum Erstellen von Inhalten über Abschnitte aus JSON-Dateien. Diese Abschnitte können auf verschiedenen Seiten des Webshops platziert werden. Auf welchen Seiten sie platziert werden können, wird in der Datei/{name}/components/sections.json definiert. Der Inhalt jeder Sektion wird in einer eigenen Datei definiert, die sich in /{name}/components/sections/{section}.json befindet.

Wenn Sie dies getan haben, führt der Link " Design" oben in der Verwaltung automatisch zumPage Builder:

Die Struktur der Gebäudeabschnitte ist wie folgt:

Draht Inhalt
/{navn}/components/sections.json

Enthält eine Liste von Seitentypen und ein Array mit den zulässigen Abschnitten. Zusätzlich zu den Seitentypen können Sie auch benutzerdefinierte Tags verwenden.

{
	"Sidetype": ["sektionA", "sektionB"]
}

Die folgenden Seitentypen sind verfügbar:

Typ der Seite Beschreibung
product Produkt-Seiten
category Kategorie-Seiten
landing_page Landing Pages
static_page Statische Seiten
blog_post Blog-Beiträge
basket Kurven
address Adresse Seite
shipping Die Frageseite
approve Seite Autorisierung
thanks Die Dankeseite, die der Kunde normalerweise nach Abschluss der Bestellung sieht
search Seite durchsuchen
also Die Upsell-Seite, die verwendet werden kann, wenn Sie eine Upsell-Seite anzeigen, nachdem der Kunde Produkte in den Warenkorb gelegt hat
order Die Bestellseite, die den Inhalt der Bestellung über einen Link anzeigt
#tags Optionale Tags, die Sie selbst erstellen

Ein Beispiel für eine sections.json, in der der Benutzer die AbschnitteSlider, Fotos und Quiz zu Landing Pages hinzufügen kann, aber nur Slider zu Produktseiten, und auf #footer kann ein About-Abschnitt hinzugefügt werden, würde wie folgt aussehen:

{
	"landing_page": ["slider", "photos", "quiz"],
	"product":      ["slider"],
	"#footer":      ["about"]
}
/{navn}/components/tags.json Tags werden für Orte verwendet, die Sie selbst erfinden und die Sie nach Belieben herausziehen können, z. B. einen #footer, den Sie herausziehen und unten im Shop anzeigen, oder ein #xmas-Setup, das Sie nur im Dezember verwenden. Das Format für tags.json ist:
{
	"tag1": "Beskrivelse ...",
	"tag2": "Beskrivelse ...",
	"tag3": "Beskrivelse ..."
}

Die einzelnen Tags erscheinen automatisch in der Verwaltung, wenn der Benutzer eine neue Einrichtung erstellt:

Um den Inhalt der Tags im Thema zu extrahieren, wird die FunktiongetBlocks() wie folgt verwendet:

<{if $blocks = $webshop->getBlocks("#foo")}>
	<{foreach $blocks as $block=>$elements}>
		[...]
	<{/foreach}>
<{/if}>
/{navn}/components/sections In diesem Verzeichnis wird jeder Abschnitt in einer eigenen json-Datei abgelegt. Jede Datei ist nach dem Namen des Abschnitts benannt. Wenn der Abschnitt slider heißt, sollte sich der Inhalt in/{name}/components/sections/slider.json befinden. Die Struktur der Dateien ist wie folgt
Feld Beschreibung Typ
title Der in admin angezeigte Name string
description In der Verwaltung angezeigte Beschreibung string
fields

Eine Reihe von Feldern

array
Feld Beschreibung Typ
.id Die ID des Feldes. Wird verwendet, wenn der Inhalt im Thema durchgeschleift wird string
.type Inhaltstyp. Gültige Typen sind:list,text,integer,image,images,bool,richtext,longtext,repeater,product,category, andlanding_page string
.options Wird nur für Felder vom Typ Liste verwendet und enthält eine Reihe von Optionen wie
[...]
"options": {
	"hat": "Hat",
	"glasses": "Briller",
	"beard": "Skæg"
},
[...]
string
.title Der Titel des Feldes string
.description Beschreibung des Feldes string
.max Felder, die maximal hinzugefügt werden können int
.required ob das Feld erforderlich ist bool
.placeholder Platzhalter für admin string
.default Möglicher Standardwert für das Feld string
.fields Wird nur verwendet, wenn es sich um einen Repeater handelt, der die gleichen Felder wie Abschnitte enthalten kann. Ein vereinfachtes Beispiel für einen Schieberegler-Repeater könnte sein:
[...]
"type": "repeater",
"fields": [
	{
		"id": "headline",
		"type": "text",
		"title": "Overskrift"
	},
	{
		"id": "img",
		"type": "image",
		"title": "Billedet"
	}
]
[...]
string
.field_title Wird nur verwendet, wenn der Typ Repeater ist und den Namen der einzelnen Elemente im Repeater enthält string

Ansichten

Es gibt verschiedene Strategien für die Extraktion von Daten. Grundsätzlich gibt es eine$page_blocks auf den Seiten, die einem Setup entsprechen. Dieser kann in einer Schleife durchlaufen werden, oder der Inhalt kann über $webshop->getBlocks('#foo') extrahiert werden. Oder der Inhalt kann über den Abschnittsnamen abgerufen werden.

Als Ausgangspunkt empfehlen wir, die Ansicht der einzelnen Abschnitte in separaten Dateien abzulegen, z. B. /{name}/templates/sections/{section}.html. Dann ist es einfach, eine Schleife durch $page_blockszu ziehen und die richtige Ansicht wie folgt einzubinden:

<{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}>

Beachten Sie, dass der Typ der Zeile in der Variablen _type steht.

Wir nennen den Abschnitt unten images - der Inhalt befindet sich also in/{name}/components/sections/images.json.

{
	"title": "Overskrift og billeder",
	"fields": [
		{
			"id": "headline",
			"type": "text",
			"title": "Overskrift"
		},
		{
			"id": "images",
			"type": "images",
			"title": "Billeder"
		}
	]
}

Dies ergibt die folgende Schnittstelle in der Verwaltung:

Um den Inhalt mit der obigen Methode zu extrahieren, kann/{name}/templates/sections/images.html folgendes enthalten:

<h1><{$section.headline|escape}></h1>

<{foreach $section.images as $image}>
	<img src="<{$image->getSrc(150, 150, 'box')}>">
<{/foreach}>

Wenn es um den Datentyp geht, ist es wichtig zu wissen, was die einzelnen Felder enthalten. Sie können entweder eineZeichenkette, ein Array oder ein Objekt sein. Mit anderen Worten, Sie sollten etwas Ähnliches tun:

[...]
<{foreach $section as $name=>$val}>
	<{if is_array($val)}>
		Wiederholer oder Bildfeld
	<{elseif is_object($val)}>
		Ein Bild
	<{else}>
		Text, Zahlen oder Ähnliches
	<{/if}>
<{/foreach}>
[...]

Wenn Sie die Typen product, category oder landing_page verwenden, wird die ausgewählte ID im Theme zurückgegeben, und Sie müssen das Objekt selbst mit den Methoden $webshop->getProductById(id),$webshop->getCategory(id) oder $webshop->getLandingPage(id) extrahieren. Beispiel:

[...]
<{if $product = $webshop->getProductById($section.product_id)}>
	<{$product->getName()|escape}>
<{/if}>
[...]

Beachten Sie, dass es immer möglich ist, var_dump zu verwenden, um zu untersuchen, was die Variable enthält, und sie korrekt zu durchlaufen.

Ansichten

Basierend auf der zuvor erwähnten Struktur werden im Folgenden die einzelnen Ansichten besprochen. Um die einzelnen Objekte und die zur Verfügung stehenden Methoden zu verstehen, empfehlen wir einen Blick auf unsere Vorlagen-API.

Laden Sie unser Thema Alaska herunter, um Beispiele für die verschiedenen Ansichten zu sehen.

Unsere Produkte

Die Produktansicht kann in product.html untergebracht werden, dies ist jedoch optional. Es ist immer index.html, die die einzelnen Ansichten behandelt. Wir empfehlen jedoch, diese Struktur zu verwenden. Um zu wissen, dass eine Produktansicht läuft, prüfen Sie, ob $product vorhanden ist.

In den Warenkorb legen

Produkte werden dem Warenkorb durch einen POST-Aufruf an eine beliebige Seite hinzugefügt - in der Regel nur die Seite, die Sie bereits anzeigen, mit den Argumenten product_id, attributes[{attribute_id}]={attribute_value_id} undamount. Das Attribut sollte nur hinzugefügt werden, wenn Produkte Varianten haben.

Ein einfaches Beispiel für das Hinzufügen von Produkten zum Warenkorb könnte so aussehen:

<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>

Mit Varianten:

<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>

Natürlich lässt sich das Ganze noch komplizierter gestalten, wenn Sie den Lagerbestand, Bündel usw. anzeigen möchten.

Landing Pages

Landingpages enthalten ein $landingpage und $products, die ein Array von Produkten auf der Seite angezeigt werden soll.

Wenn die Seite einen Pager erfordert, fügen Sie ihn wie folgt ein:

<{if $pager}>
	<{$pager->render()}>
<{/if}>

Kategorien

Kategorien enthalten eine $Kategorie und $Produkte, die ein Array von Produkten ist, die auf der Seite angezeigt werden sollen.

Wenn die Seite einen Pager erfordert, fügen Sie ihn wie folgt ein:

<{if $pager}>
	<{$pager->render()}>
<{/if}>

Statische Seiten

Statische Seiten enthalten eine $page.

Blog

Das Blog kann in zwei Seiten unterteilt werden: blog.html und blog_post.html, wobei die erste Seite eine Liste der Blogbeiträge über

<{$blog_posts = $webshop->getBlogPosts()}>

Die eigentliche Anzeige der einzelnen Blogeinträge erfolgt über die Variable $blog_post.

Wenn die Liste der Blogeinträge aus einer Kategorie stammt, ist auch eine $category mit dieser Kategorie vorhanden.

Produktbewertungen

In product_review.html haben Sie Zugriff auf $order, das ist Ihre Bestellung. Sie können nur Produkte überprüfen, die Sie gekauft haben. Aus der Bestellung können Sie die Produkte über $order->getOrderProducts() abrufen. Um die Produktbewertungen zu speichern, müssen Sie einen POST-Aufruf an dieselbe Seite mit folgendem Inhalt machen:

<{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 ist wahr, wenn der Kunde eine Bewertung abgegeben hat.

Um von Ihrer Bestellung aus auf die Bewertungsseite zu verlinken, verwenden Sie $order->getReviewUrl().

Die Suche funktioniert durch einen GET-Aufruf an /search, wobei das Argument?search= Ihr Suchbegriff sein muss. Beispiel:

<form action="/search">
	<input type="text" name="search" value="<{$get.search|escape}>"/>
	<input type="submit" value="Søg"/>
</form>

Durchsucht werden Produkte, Kategorien, Blogbeiträge und Zielseiten. Um das Ergebnis anzuzeigen, müssen Sie sich die vier Variablen$products, $categories, $blog_posts, $pages und $landing_pages ansehen.

Ob statische Seiten durchsucht werden, muss im Admin aktiviert werden.

Wunschzettel

Wenn sich Ihre Kunden in Ihrem Shop anmelden können, können Sie ihnen erlauben, Wunschlisten zu erstellen. Sie können so viele Wunschlisten erstellen, wie sie möchten. Eine Wunschliste hat einen Namen, eine Beschreibung und eine Auswahl an Produkten. Der Wunschzettel selbst hat eine öffentliche Adresse, damit Ihre Kunden einen Link senden können.

Die Wunschliste verwendet die folgenden Vorlagen:

Vorlage URL Beschreibung Relevante Variablen
wishlist.html /wishlist Die Seite mit der öffentlichen Wunschliste. $wishlist, die den Wunschzettel enthält. Siehe Methoden hier.
user-wishlists.html /user-wishlists Die Seite mit der Wunschliste des Benutzers. Erfordert Anmeldung. $customer->getWishlists(), um die Wunschlisten zu extrahieren.
user-wishlist.html /user-wishlist Die Seite zum Bearbeiten der Wunschliste und der Produkte $wishlist, die den Wunschzettel enthält. Siehe Methoden hier.

Um eine Wunschliste zu erstellen, muss ein POST von user-wishlists.html mit dem Namensfeld und einer optionalen Beschreibung gesendet werden. Zum Beispiel

<form action="" method="post">
    Navn
    <input type="text" name="name">

    Beskrivelse
    <textarea name="description"></textarea>

    <input type="submit" value="Opret">
</form>

Beachten Sie, dass Sie die Methoden $wishlist->getRemoteUrl() und $wishlist->getEditUrl() verwenden können, um Links zum Anzeigen und Bearbeiten der Wunschlisten zu erstellen.

In der Datei user-wishlist.html, in der die Wunschliste bearbeitet wird, müssen der Name und die Beschreibung alsName, Beschreibung und Status, der entweder aktiv oder geschlossen sein kann, gesendet werden. Die Produkte selbst, ihre Anzahl und eventuelle Kommentare müssen als Array im folgenden Format gesendet werden:

wishlist_product[{id}][name] = 'navn'
wishlist_product[{id}][comments] = 'kommentar'
wishlist_product[{id}][remove] = '1' // kun hvis produktet skal fjernes

Beispiel-Code:

<{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}>

Wenn eine variable Bearbeitung gesendet wird, kehrt die Seite wieder zur gleichen Bearbeitungsseite zurück. Andernfalls werden Sie zur Übersicht der Wunschliste weitergeleitet. Um den Wunschzettel zu löschen, muss eine Variable namensremove übergeben werden. Zum Beispiel.

<input type="submit" name="remove" value="Slet" onclick="return confirm('Er du sikker?');">

Um Produkte aus dem Shop zu einer Wunschliste hinzuzufügen, kann ein POST-Aufruf von einer beliebigen Seite mit den Feldernwishlist_id, product_id und einem optionalen attribute_value_id erfolgen, wenn das Produkt eine Variante hat. Beispiel:

<{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}>

Rückführungszentrum

Das Retourencenter ermöglicht es Ihren Kunden, selbst Retouren zu erstellen. Es muss in denShop-Einstellungen aktiviert werden. Sobald ein Kunde eine Retoure erstellt hat, muss diese in der Verwaltung genehmigt werden und es wird eine Gutschrift erstellt.

Die Rücksendezentrale verwendet die folgenden Vorlagen:

Vorlage URL Beschreibung Relevante Variablen
return.html /return Die Seite, auf der die Rückgabe erstellt wird $order mit der Bestellung, die der Kunde zurückgeben möchte. Siehe Methoden hier.
order-return.html /order-return Die Seite, auf der die Rückgabe anschließend angezeigt wird $order_return mit der Rückgabe. Siehe Methoden hier.
return_received.html E-Mail, die an den Kunden gesendet wird, wenn er eine Rückgabe erstellt $order_return mit der Rückgabe. Siehe Methoden hier.

Es gibt zwei Möglichkeiten für Ihre Kunden, die Retourenseite aufzurufen. Zum einen kann er die Bestellnummer und die E-Mail-Adresse auf seiner Bestellung eingeben. Der andere Weg ist der über einen direkten Link. Der direkte Link wird mit$order->getReturnUrl() aus der Bestellung extrahiert. Zum Beispiel

<{if $webshop->useReturnCenter() && !$order->getIsCreditNote()}>
	<a href="<{$order->getReturnUrl()|escape}>">Retuner varer</a>
<{/if}>

Wie im Beispiel zu sehen, ist es ratsam zu prüfen, ob es sich bei der Bestellung nicht um eine Gutschrift handelt und ob der Händler das Rückgabezentrum aktiviert hat. Das Beispiel kann überall dort verwendet werden, wo es eine $Bestellung gibt. Zum Beispiel in der Bestellübersicht des Kunden selbst oder in E-Mails.

Wenn Sie kein Login verwenden oder anderweitig wollen, dass der Kunde nach seiner Bestellung suchen kann, müssen Sie eine Suche mit Bestellnummer und E-Mail-Adresse in return.htmlimplementieren. Es sind die Felder webshop_order_id und E-Mail, die an /return gepostet werden sollten. Wenn die Bestellung gefunden wird, wird der Kunde zum Return geschickt, wenn nicht, wird$get.not_found gesetzt und Sie können eine Fehlermeldung im Thema anzeigen. Ein minimales Formular kann wie folgt aussehen:

<{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>
Erstellen einer Rückgabe

In der Datei return.html muss eine Liste von Bestellzeilen extrahiert werden, und der Kunde kann wählen, welche Produkte er zurückgeben möchte und warum. Im Gegensatz zu regulären Bestellansichten muss die Rückgabe eine Zeile pro Bestellzeile enthalten.

<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>

Es ist möglich, in der Verwaltung eine feste Versandart und einen festen Preis anzugeben. In diesem Fall wird die Versandart über$webshop->getReturnShipping($country_id) und der Preis über$webshop->getReturnShippingPrice($country_id) extrahiert, wenn er fest vorgegeben ist. Beispiel:

<{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}>

Die gewählte Zustellungsart, falls optional, muss als shipping_id gesendet werden.

Ansicht der Rückgaben

Sobald die Rückgabe erstellt ist, erscheint sie in order-return.html, die ein $order_returnmit den entsprechenden Methoden enthält.

/so

auch.html ist unsere Upselling-Seite. Im Grunde haben Sie Zugriff auf $product und können dem Kunden von dort aus Vorschläge machen. Zum Beispiel kann es sinnvoll sein, $product->getRelatedProducts(),$product->getAlsoBought() oder $webshop->getPopularProducts() zu verwenden.

404

Wird nur zur Anzeige von 404-Seiten verwendet.

410

Wird nur zur Anzeige von 410 Seiten verwendet.

Captcha

Ein Captcha wird automatisch eingefügt, wenn Sie versuchen, sich für den Newsletter anzumelden oder Kommentare zu schreiben. Dies dient der Vermeidung von Spam. Es ist möglich, die Seite selbst in captcha.html zu gestalten, und sie muss mindestens enthalten:

<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>

Anmeldung

Es ist möglich, Ihre Kunden in den Shop einloggen zu lassen. Wenn sie eingeloggt sind, gibt es einen$customer, der Informationen über den Benutzer enthält. Alle Seiten, die bearbeiten, einloggen, etc. müssen per POST an die Seite selbst übermittelt werden.

Name der Datei Beschreibung Relevante Variablen/Parameter im Formular
/user-edit.html Dient der Bearbeitung von Kundendaten. Es ist möglich, dem Kunden Felder hinzuzufügen. Weitere Informationen finden Sie in dieser Tabelle. 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 Frühere Bestellungen des Kunden $my_orders
/user-points.html Der Standpunkt des Kunden $my_points
/user-profile.html Einsicht in die Kundendaten $customer
/user-reset-password.html Wird für die Rücksetzung von Passwörtern verwendet email, password
/user-sign-in.html Anmeldeseite. Verwenden Sie redir, wenn der Kunde nach dem Login zu einer URL weitergeleitet werden soll. email, password, redir
/user-sign-up.html Ein Formular, das der Kunde zur Registrierung verwendet. name, email, phone, address, zipcode, city, company, vat_number, og country_id

Benutzerdefinierte Felder für den Kunden

Es ist möglich, in der Verwaltung benutzerdefinierte Felder für Ihre Benutzer zu definieren. Diese Felder werden wie folgt bearbeitet:

<{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}>

Loyalitätsprogramm

Mit dem Treueprogramm können Ihre Kunden bei der Ausführung von Bestellungen Punkte sammeln und ausgeben. Die Einrichtung wird unter Kunden > Treueprogramm verwaltet.

Mit den folgenden Methoden können Sie überprüfen, ob das Geschäft das Treueprogramm aktiviert hat und ob der Kunde eingeloggt ist und Punkte gesammelt hat, die er verwenden kann:

<{if $webshop->hasLoyaltyProgram() && $customer && $customer->getActivePoints()}>
	[Visning af point m.m.]
<{/if}>

Um anzuzeigen, wie viele Punkte der Kunde gesammelt hat und wie viele er für die aktuelle Bestellung ausgeben kann, können Sie das folgende Codebeispiel verwenden:

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}>

Das Feld, das Sie an den Warenkorb senden und das angibt, wie viele Punkte der Kunde verwenden wird, sollte use_points heißen und kann wie folgt aussehen:

<input type="number" name="use_points" value="<{$use_points}>" min="0" max="<{$customer->getPointsAvailable()}>"/>

Sie können $earns verwenden, um zu sehen, wie viel der Kunde für die Bestellung verdient:

Du optjener <{$earns|number_format:0:",":"."}> point på denne ordre.

Sie können das folgende Beispiel verwenden, um Ihr Treueprogramm zu beschreiben:

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()}>.

Wenn Sie eine Übersichtsseite über die Punkte erstellen möchten, können Sie user-points.html verwenden, wo Sie $my_pointsin einer Schleife durchlaufen und den Inhalt darstellen können. Schauen Sie sich die Klasse SafePoint an, um zu sehen, welche Methoden verfügbar sind.

Tipp: Sie können Ihre Bestellübersicht mit den folgenden CSS-Klassen gestalten: points_used, points_earned und has_profile.

Auschecken

Der Check-Out-Flow ist einfach eine Reihe von HTML-Seiten, die jeweils ein Formular enthalten, das Daten an sich selbst sendet, und wenn das nächste Feld gesetzt ist, leitet Shoporama zur nächsten Seite im Flow weiter. Normalerweise würden Sie die Schaltfläche "Next" auf name="next" setzen. Sie können jederzeit auf vorherige Seiten im Ablauf verlinken. Wenn der Kunde seine Daten eingegeben hat, werden diese in zwei Arrays gespeichert, $session_order und $session_del. Zum Beispiel:$session_order.name.

Name der Datei Beschreibung Relevante Variablen/Parameter im Formular
basket.html Zeigt den Inhalt des Warenkorbs an. Einfaches Beispiel, wie $basket verwendet wird:
<{foreach $basket as $line}>
	<{$line.amount}> x <{$line.product->getName()}>

	<{foreach $line.attributes as $a}>
		<{$a.name|escape}>: <{$a.value|escape}>
	<{/foreach}>
<{/foreach}>

Um die Nummer zu ändern, POSTen Sie sie wie folgt

[...]
<input name="amount[<{$line.id}>]" value="<{$line.amount}>" />
[...]

Um einen Rabattcode hinzuzufügen, muss ein Gutschein mit dem Rabattcode gepostet werden. Wenn der Rabattcode ungültig ist, wird $get.wrong_voucher in der Vorlage vorhanden sein.

Das Lieferland kann durch POSTing einer del_country_id mit der ID des Lieferlandes geändert werden.

$basket, $voucher, $voucher_discount, $campaign_ids, $campaign_discount, $price, $shipping_price, $total_price, $vat
address.html

Die Seite, auf der die Lieferinformationen eingegeben werden.

Wenn mailinglist auf 1 gesetzt ist, ist der Kunde für den Newsletter angemeldet.

Wenn create_profileauf 1 gesetzt ist, wird ein Profil für den Kunden erstellt, damit er sich später anmelden kann.

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

Dient zur Auswahl der Zustellungsmethode.

Die einzelnen Versandarten können über$webshop->getShippings() ausgelesen werden.

Um die Versandart zu speichern, muss eineshipping_id mit der ID dieser Versandart gepostet werden. Wenn der Versandart ein Paketshop zugeordnet ist, werden diese über $shipping->getDeliveryShops() extrahiert. Sie können den Zustellshop auf folgende Weise auswählen:

[...]
<{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

Die Autorisierungsseite. Dient zur Anzeige der Bestellung.

Wenn der Shop mehrere Zahlungsgateways enthält, können diese auf dieser Seite ausgewählt werden. Sie werden über $webshop->getPaymentGateways() abgerufen und über payment_gateway_idan switch übergeben.

$basket, $shipping, payment_gateway_id
thanks.html Dankeseite. Dient zur Anzeige der abgeschlossenen Bestellung. $order

Ajax

Shoporama hat zwei integrierte Ajax-Aufrufe. Der eine kann Produkte auf verschiedene Arten extrahieren (Filterung) und der andere ist eine allgemeine und einfache Suche, die Produkte, Kategorien und Landing Pages durchsucht.

Filtrierung

Die Filterung erfolgt in der Datei /ajax, die sich im Stammverzeichnis aller Shops befindet

Argument Beschreibung Beispiel für ein Beispiel
atags Eine Liste von Tags zu den Attributwerten, Attributwerte sind Einstellungen zu den Attributen in den Profilen der Produkte. Die Werte auf atags müssen durch Kommas getrennt werden, erlauben aber Gruppierungen, die durch Pipe als logischesODER getrennt sind.
ajax?atags=female,black|white
product_ids Liste der Produkt-IDs, getrennt durch eine Pipe.
ajax?product_ids=1|2|3|4
price_range Gibt Produkte zurück, die in eine Preisspanne fallen. Die Beträge müssen durch eine Pipe getrennt werden.
ajax?price_range=100|200
categories Eine durch Pipes getrennte Liste von Kategorien, in die die Produkte eingeordnet werden sollen. Wenn das Argument exclude=1 gesetzt ist, wird eine Liste von Produkten zurückgegeben, die die Kategorien nicht haben.
ajax?categories=5|9|2
ajax?categories=5|9|2&exclude=1
sort Die Sortierreihenfolge. Es können die Werte popular, weight, name,price, created gesetzt werden. Ob die Sortierreihenfolge auf- oder absteigend sein soll, wird angegeben, indem sort_orderentweder auf asc (aufsteigend) oder desc (absteigend ) gesetzt wird.
ajax?sort=price&sort_order=desc
attribute_values Eine Liste von IDs der Attributwerte, die die Produkte haben sollen. Die Liste wird durch Pipe getrennt. Wenn das Argumentexclude=1 gesetzt ist, wird eine Liste von Produkten zurückgegeben, die nicht übereinstimmen.
ajax?attribute_values=9|8|12
suppliers Durch Rohre getrennte Liste von Lieferanten-IDs.
ajax?suppliers=8|2
landing_pages Nach Mädchen getrennte Liste von Landing Page IDs, auf denen Produkte erscheinen sollen.
ajax?landing_pages=5|24
extension.{id} Wenn das Thema erweiterte Felder verwendet, können die Produkte anhand dieser Felder extrahiert werden. Es wird absolut gesucht, daher sind die Felder bool, multi,number und list am sinnvollsten. Durch Rohre getrennte Werte können verwendet werden, wenn die Produkte nur einem der Werte entsprechen müssen.
ajax?extension.foo=1&extension.tags=foo|bar
attribute_tags_in_stock Liste der Tags für Attributwerte, die auf Lager sein müssen. Die Liste kann durch Pipes getrennt werden.
ajax?attribute_tags_in_stock=foo|bar
attribute_tags Liste der Tags, die für die Produkte festgelegt werden müssen. Die Liste kann durch Pipes getrennt werden.
ajax?attribute_tags=foo|bar
attribute_tag Wie attribute_tags, aber nur mit einem einzigen Tag.
ajax?attribute_tag=foo
force_categories Eine durch Pipes getrennte Liste von Kategorie-IDs, die alle für die Produkte festgelegt werden müssen.
ajax?force_categories=5|9|2
limit Maximale Anzahl der zurückzusendenden Produkte.
ajax?limit=10
offset Startposition in Bezug auf die Position in der Liste der Produkte, die Sie abrufen möchten.
ajax?offset=100&limit=10
meta Pipe-getrennte Liste der zusätzlichen Felder, die Sie für die Produkte im Ergebnis sehen möchten. Wenn Siemeta=_all festlegen, werden alle zurückgegeben.
ajax?meta=foo|bar
ajax?meta=_all
only_in_stock_variants Auf 1 oder 0 gesetzt, je nachdem, ob jedes Produkt im Ergebnis nur Varianten enthalten soll, die auf Lager sind. Standard ist 0.
ajax?only_in_stock_variants=1
include_meta Setzen Sie diesen Wert auf 1 oder 0, je nachdem, ob Sie ein zusätzliches Metafeld im Ergebnis wünschen, das Beschreibungen der Produkte im Ergebnis enthält. Dies sind Informationen darüber, welche Attribute, Kategorien und Marken vorhanden sind. Die Voreinstellung ist 0.
ajax?include_meta=1
include_pagination Setzen Sie diesen Wert auf 1 oder 0, je nachdem, ob Sie im Ergebnis ein zusätzliches Paginierungsfeld mit Paginierungsinformationen wünschen. Die Felder im Array sind offset, limit, count, total. Die Standardeinstellung ist 0.
ajax?include_pagination=1
pretty Auf 1 oder 0 gesetzt, je nachdem, ob die json-Antwort schön formatiert werden soll oder nicht.
ajax?pretty=1

Die Antwort von /ajax ist ein Array in folgendem Format:

[
    {
        "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
            }
        ]
    }
]

Aus Geschwindigkeitsgründen wird die Antwort aus der Ajax-Datei zwischengespeichert, aber in der Testumgebung können Sie rebuild=1 als Argument hinzufügen, damit die Seite neu aufgebaut wird. Wir empfehlen, dies in der Produktionsumgebung nicht zu tun, da es die Seite erheblich verlangsamen kann.

Die Seite /ajax_search enthält eine allgemeine Suche nach Produkten, Kategorien und Landing Pages. Sie kann z.B. für eine Autovervollständigung in Ihrem Suchfeld verwendet werden. Sie nimmt die folgenden Argumente entgegen:

Argument Beschreibung Beispiel für ein Beispiel
term Schlüsselwort.
ajax_search?term=ostemad
limit Maximale Anzahl von Ergebnissen.
ajax_search?term=ostemad&limit=25
include Eine durch Kommata getrennte Liste der Datentypen, die Sie durchsuchen möchten. Die Werte könnenProdukte, Kategorien, blog_posts, Seiten und landing_pages sein.
ajax_search?term=ostemad&include=products,categories
pretty Auf 1 oder 0 gesetzt, je nachdem, ob die json-Antwort schön formatiert werden soll oder nicht.
ajax_search?term=ostemad&pretty=1

Das Ergebnis ist ein Array in folgendem Format:

[
    {
        "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"
    }
]

Diese Website verwendet Cookies

Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anzuzeigen und unseren Webverkehr zu analysieren.

Informationen über Ihre Nutzung unserer Website werden auch an unsere Partner für soziale Medien, Werbung und Analysen weitergegeben, die sie mit anderen Daten aus Ihren Interaktionen mit ihren Diensten kombinieren können.

Lesen Sie mehr über unsere Cookies