Dein Warenkorb ist leer

PHP API

Lerne wie du PHP in deinem Drop nutzten kannst

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");
    }
}