Datasource

Mit einer \Alvine\Application\Platform\Types\Datasource werden Daten bereit gestellt.
Um eine Datasource zu erstellen wird ein \Alvine\Application\Platform\Types\Context Objekt benötigt.
Die Datasource stellt dafür die Methode getContextBuilder zu verfügung.
Diese liefert den passenden Builder zurück.
Wird kein Mandant und keine Sprache definiert, werden diese Informationen aus der Anwendung geholt.

$contextBuilder=\Alvine\Application\Platform\Builder\DataSource\Commerce\Item::getContextBuilder();
$dataSource = new \Alvine\Application\Platform\Builder\DataSource\Commerce\Item($contextBuilder->getContext());

Wenn das Objekt erstellt wurde, wird die Methode prepare aufgerufen.
Diese Methode dient zur Vorbereitung der Datasource.

Die Daten werden erst geladen, wenn die Methode iterate aufgerufen wird.
Die interne queue wird geprüft, wenn keine Daten enthalten sind, wird stockUp aufgerufen und füllt die queue auf.
iterate liefert den nächsten Datensatz der queue zurück.

foreach($datasource->iterate() as $item) {
  ...
  ...
}

Builder

Die Klasse \Alvine\Application\Platform\Builder\DataSource bildet die Grundlage der Datenquellen für das Erstellen von Inhalten.
Das können zum Beispiel HTML Dateien für das Frondend sein oder XML Dokumente für das Ausspielen an Amazon oder eBay.

Die prepare Methode, wurde hier um die Methoden zum Erweitern und Manipulieren der Datasource erweitert.

injectMethods werden in der Methode stockUp aufgerufen und erweitern die Daten einer Datasource.
finalizeMethods werden in der Methode finalize aufgerufen und können am Schluss, nachdem alle injectMethods gelaufen sind, die Daten nochmal manipulieren

injectMethods

Methoden die mit dem Funktionsnamen injectDataSource beginnen, werden automatisch aufgerufen.
Das einbinden dieser Methoden kann zum Beispiel über einen Trait gemacht werden.

finalizeMethods

Methoden die mit dem Funktionsnamen finalizeDataSource beginnen, werden automatisch aufgerufen.
Das einbinden dieser Methoden kann zum Beispiel über einen Trait gemacht werden.

FromModel

Mit der Datasource \Alvine\Application\Platform\Builder\DataSource\FromModel, werden Daten aus der Datenbank geladen,
als Grundlage wird ein Model \Alvine\Application\Platform\Model\Entity verwendet.

In der prepare Methode, wird eine Liste mit IDs geladen die bearbeitet werden sollen.
In der stockUp Methode, werden die IDs bearbeitet und die Daten werden geladen.
Diese Daten, sind immer nur die Basisdaten der jeweilgen Tabelle des Modells.
Wenn zusätzliche Infomationen benötigt werden, muss eine injectMethod definiert werden.

IDs einschränken

Wenn zum Beispiel nur eine bestimmte Anzahl von IDs geladen werden sollen, kann diese Liste beim erstellen übergeben werden.
In diesem Beispiel, werden 2 Produkte geladen, IID 1425 und IID 1426 .

$contextBuilder=\Alvine\Application\Platform\Builder\DataSource\Commerce\Item::getContextBuilder();
$dataSource = new \Alvine\Application\Platform\Builder\DataSource\Commerce\Item($contextBuilder->getContext(), [1425,1426]);
foreach($datasource->iterate() as $item) {
  ...
  ...
}

Delta

Die Datasource kann mit Delta umgehen.
Dazu muss eine UUID beim erstellen übergeben werden.
Über die UUID wird der letzte Zeitpunkt definiert wann das letzte Mal abgefragt wurde.
Wenn änderungen identifiziert wurden , werden nur diese Datensätze geliefert.

$contextBuilder=\Alvine\Application\Platform\Builder\DataSource\Commerce\Order\Delivery::getContextBuilder();
$dataSource = new \Alvine\Application\Platform\Builder\DataSource\Commerce\Order\Delivery($contextBuilder->getContext(), null, [1425,1426]);

Einschränkungen

Es ist eine freie Einschränkung über ein \Alvine\Persistence\Relation\SQL\Where Objekt möglich.
In diesem Beispiel werden Lieferungen von einer Bestellung geladen.
Diese sollen den Status ausgeliefert haben und zu dieser Bestellnummer passen.

Damit auch die Positionen geladen werden, wurde hier der Trait
\Alvine\Application\Platform\Builder\DataSource\Implementation\Commerce\Order\Position verwendet.


$where=new \Alvine\Persistence\Relation\SQL\Where();

/**
 * nur Lieferungen dieser Bestellung
 */
$where->addFilter(new \Alvine\Persistence\Relation\Field\Integer('sh_delivery', 'OID'), $oid);

/**
 * nur ausgelieferte
 */
$where->addFilter(new \Alvine\Persistence\Relation\Field\Integer('sh_delivery', 'state'), 15); 

$contextBuilder=\Alvine\Application\Platform\Builder\DataSource\Commerce\Order\Delivery::getContextBuilder();
$datasource=new class($contextBuilder->getContext(), null, null, $where) extends \Alvine\Application\Platform\Builder\DataSource\Commerce\Order\Delivery {

    /**
     * Positionen mit laden
     */
    use \Alvine\Application\Platform\Builder\DataSource\Implementation\Commerce\Order\Position;
};

foreach($datasource->iterate() as $delivery) {
    $deliveries->append($delivery);
}