Darf es etwas mehr als Smarty sein?
Du hast die Möglichkeit deine Drops mit Funktionen zu erweitern, indem du eine PHP-Klasse für dein Drop schreibst. Diese PHP-Klasse sollte sich innerhalb einer Datei mit dem Namen
drop.php
befinden und direkt im Ordner deines Drops abgelegt werden. Der Klassenname selbst
muss einer Namenskonvention folgen:
<dropid>Drop
Zur Erinnerung, die ID des Drops ist gleich dem Ordnernamen deines Drops.
Kann das entsprechende Drop dargestellt werden, wird eine Instanz dieser PHP-Klasse automatisch erstellt und unter deinem
$drop
Objekt als Eigenschaft
$drop.actions
angehängt. Du kannst so innerhalb vom Smarty auf öffentliche Methoden deiner Klasseninstanz zugreifen. Ebenso ist es möglich in der
init
Methode deiner Klasse beliebigen Code auszuführen, und so z.B. auf PHPQuery oder die Datenbank des Shops zuzugreifen.
Die Implementierung der
init
Methode innerhalb deiner Klasse ist Pflicht.
Ebenfalls wichtig ist, dass
deine Drop-Klasse von der Klasse DropActions
vererbt ist.
Sagen wir die ID deines Drops ist
MY_Sample
, dann sieht so die simpelste Implementation deiner Klasse aus:
<?php
class MY_SampleDrop extends DropActions {
/**
* Called when the Drop is initialized
*/
public function init() {
}
}
Auch hier siehst du wie wichtig es ist, deine Drop ID vernünftig zu präfixen, damit es zu keinen Kollisionen von Klassennamen im Code anderer kommen kann.
Die
init
Funktion wird übrigends noch vor der Ausgabe des Drop Templates ausgeführt, sodass du Daten des Drops hier erweitern kannst.
Zugriff auf Einstellungen deines Drops
Innerhalb deiner Klasse hast du mit
$this->drop
Zugriff auf die Daten deines Drops. Bitte beachte dass es sich hierbei um ein
assoziatives Array
handelt, und du auf Eigenschaften mit dem Array-Operator
[]
zugreifen musst:
echo $this->drop['myProperty'];
echo $this->drop['_internal']['guid'];
Dein Drop um Daten erweitern
Manchmal möchtest du die Daten deines Drops erweitern. Auch das ist über
$this->drop
möglich:
drop.php
class MY_SampleDrop extends DropActions {
public function init() {
$this->drop['newProperty'] = "Hallo Welt";
}
}
template.tpl
<h1>{$drop.newProperty}</h1>
Dein Drop um Aktionen erweitern
In deinem Smarty-Template ist es möglich auch auf öffentliche Methoden einer Klasseninstanz zuzugreifen, welche unter
$drop.actions
dem Smarty Template zur Verfügung steht. Das kannst du dir ebenfalls zunutze machen:
drop.php
class MY_SampleDrop extends DropActions {
public function init(){
}
/**
* Hole im Drop gewählte Artikel aus der Datenbank
*/
public function getArticles() {
$articles = array();
foreach ($this->drop['selectedArticles'] as $articleKey) {
$article = new Artikel();
$article->fuelleArtikel($articleKey); // JTL Shop Funktion
$articles[] = $article;
}
return $articles;
}
}
template.tpl
{assign var="dropArticles" value=$drop.actions->getArticles()}
<ul>
{foreach from=$dropArticles item="article"}
<li>{$article->cName}</li>
{/foreach}
</ul>
Smarty und PHPQuery nutzen
Der Code deiner Klasse wird in Hook 140 ausgeführt, was zur Folge hat, dass du Zugriff auf Smarty und PHPQuery hast:
drop.php
class MY_SampleDrop extends DropActions {
public function init(){
// etwas in den body der Seite einfügen
pq('body')->prepend('<h1>Hallo Welt</h1>');
// aktuelles Navigationsinfo Objekt holen
global $smarty;
$navInfo = $smarty->get_template_vars('oNavigationsinfo');
...
}
}
Sprachvariablen nutzen
In deiner
config.json
gibt es die Möglichkeit, Sprachvariablen über alle Drop-Instanzen hinweg zu definieren. Möchtest du auf diese innerhalb deiner Klasse zugreifen, nutze die
i18n
Methode welche durch
DropActions
vererbt wurde. Hier ein Beispiel:
config.json
{
...
"lang" : {
"hello-world" : {
"ger" : "Hallo Welt!",
"eng" : "Hello World!"
},
"hello-world-personal" : {
"ger" : "Hallo {0}, magst du {1}?",
"eng" : "Hello {0}, do you like {1}?",
}
}
}
drop.php
echo $this->i18n("hello-world");
echo $this->i18n("hello-world-personal", "Martin", "Dropper");
Durch weitere Parameter in der
i18n
Methode kannst du Platzhalterwerte für Platzhalter in der Sprachvariable vorgeben.
Storage API
Die Storage API bietet dir ab Dropper 100.13 die Möglichkeit, Strukturierte Daten eines Drops bequem auf dem Server zu laden, speichern und zu löschen.
Das Storage Interface eines Drops kann innerhalb der Drop Klasse mit
$this->storage
angesprochen werden.
Folgende Funktionen stehen zur Verfügung:
/**
* Sets a value inside the storage that can be retrieved via the given key
* @key - the key to save the data under
* @value - the data to save
* @scope - the scope under which to save the data - one of drop | instance | global
* @raw - if true, the data is NOT serialized before saving, and written to the file as it is
* @returns - true if successfull, false otherwise
*/
$this->storage->set($key, $value, $scope="instance" /* drop | instance | global */, $raw=false)
/**
* Gets a value from the storage that can be retrieved via the given key
* @key - the key to save the data under
* @scope - the scope under which to save the data - one of instance | drop | global
* @raw - if false, the data is deserialized after loading, if false the data is loaded from the file as it is
* @returns - the data for the given key or null if not found
*/
$this->storage->get($key, $scope="instance", $raw=false)
/**
* Removes the given key from the storeage
* @key - the key to save the data under
* @scope - the scope under which to handle the data - one of instance | drop | global
* @returns - true if removal was successfull, false otherwise (e.g. when key was not found)
*/
$this->storage->remove($key, $scope="instance")
Gespeicherte Daten befinden sich im Ordner
kk_dropper/storage/
. Je nach
$scope
können diese aber in verschiedenen Unterordnern liegen:
Ordnerstruktur Storage Scopes
kk_dropper
|_ storage
|_ Shared // Scope 'global'
|_ MY_SampleDrop
|_ Shared // Scope 'drop'
|_ 1231-afas-f123-sdff // Scope 'instance'
|_ 9afb-212a-fa26-54d1 // Scope 'instance'
|_ ... // Scope 'instance'
Für jeden Key
$key
wird innerhalb des entsprechenden scope-Ordners eine neue Datei angelegt, die den Namen von
$key
trägt. Durch die Scopes ist es möglich, dass ich unterschiedliche Instanzen eines Drops Daten teilen können (Scope
drop
), oder sogar alle Drops auf geteilten Daten arbeiten (Scope
global
).
Im Standard kapselt aber jede Drop Instanz seine eigenen Daten und hat nur darauf Zugriff (Scope
instance
).
drop.php
class MY_SampleDrop extends DropActions {
public function init(){
$data = ...; // darf alles sein
// saving
$this->storage->set("myData", $data);
// retrieval
$data = $this->storage->get("myData");
}
}