MetaModels Interfaces

Warnung

Noch im Aufbau!

Die MetaModels Interfaces bilden die Basis der Interfaces und ermöglichen den Zugriff auf ein MetaModel bis hin zum einzelnen Item.

Viele Arbeiten bei dem Einsatz bzw. Verwendung der Interfaces konzentrienen sich auf die Abfrage vorhandenener Daten eines MetaModel. Hier folgt der Aufbau analog dem Aufbau einer Abfrage oder Auflistung über das Contentelement bzw. Frontend-Modul mit

Zudem können über die Interfaces eines MetaModel auch verschiedene Objekte (MetaModel, Attribut, Item) auch erstellt, die Werte verändert oder Eigenschaften abgefragt werden wie Anzahl oder Sprache.

MetaModelsServiceContainer Interface:

Mit dem MetaModelsServiceContainer Interface kann eine Verbindung zu MetaModels aufgebaut werden. Dies ist zum Beispiel notwendig, wenn auf MetaModel außerhalb eines MetaModel-Templates zugegriffen werden soll.

Für einen Zugriff benötigt man einen “Service Container”, den man sich z.B. im globalen Scope holen kann

$container = $GLOBALS['container']['metamodels-service-container'];

Anschließend kann mit einem Interface daruaf zugegriffen werden - z.B.:

$factory = $container->getFactory();

Mit dem Zugriff über $GLOBALS kann in eigenen Templates und Programmierungen leicht auf den Service-Container zugegriffen werden. Andere Möglichkeiten wären über Events wie z.B. “MetaModelsEvents::SUBSYSTEM_BOOT”.

Aktuelle Informationen unter: IMetaModelsServiceContainer

Interfaces:

getFactory()
gibt den Zugriff auf MetaModels zurück

getAttributeFactory()
gibt den Zugriff auf die Attribute zurück

getFilterFactory()
gibt den Zugriff auf die Filter zurück

getRenderSettingFactory()
gibt den Zugriff auf die Render-Einstellungen zurück

getEventDispatcher()
gibt den Zugriff auf die Event-Dispatcher zurück

getDatabase()
gibt den Zugriff auf die Datenbank zurück

getCache()
gibt den Zugriff auf die Cache zurück

setService($service, $serviceName = null)
fügt einen eigenen Service dem Container hinzu

getService($serviceName)
gibt den Zugriff auf einen Service mit dem übergebenen Namen zurück

ServiceContainerAware Interface:

Mit dem ServiceContainerAware Interface kann man Zugriff auf den Service-Container erhalten oder einen neuen Service-Container zuweisen.

Aktuelle Informationen unter: IServiceContainerAware

Interfaces:

setServiceContainer(IMetaModelsServiceContainer $serviceContainer)
setzt den zu verwendenden Service-Container

getServiceContainer()
gibt den Service-Container zurück

Factory Interface:

Mit dem Factory Interface können Instanzen eines MetaModel erstellt und bestimmte Eigenschafen abgefragt werden.

Die Erstellung eines neuen MetaModel ist nicht vorgesehen - wenn auch möglich - da für die Erstellung sehr komplexe Parameter mit übergeben werden müssten und die Erstellung auf die Arbeit aus dem Backend ausgerichtet ist.

Aktuelle Informationen unter: IFactory

Interfaces:

getMetaModel($strMetaModelName);
erstellt eine MetaModel-Instanz mit dem übergebenen Namen

translateIdToMetaModelName($intMetaModelId);
gibt den Namen zu einer MetaModel-ID zurück

collectNames();
gibt alle MetaModel-Namen als Array zurück

getServiceContainer();
gibt den Service-Container zurück

Warnung

Die Methoden byTableName, byId und getAllTables wurden in der Version 2.0 entfernt

byTableName($strTableName);
Methode getMetaModel($strMetaModelName); verwenden

byId($intMetaModelId);
Methode getMetaModel($strMetaModelName); mit translateIdToMetaModelName($intMetaModelId); verwenden

getAllTables();
Methode collectNames(); verwenden

MetaModel Interface:

Mit dem MetaModel-Interface können Eigenschaften einer MetaModel-Instanz abgefragt bzw. beeinfusst werden.

Zunächst muss eine MetaModels-Instanz über den Namen eines MetaModel erzeugt werden siehe Factory Interface:)

$objMetaModel = \MetaModels\IFactory::getMetaModel($strMetaModelName);

bzw. inklusive des Service-Containers:

1
2
3
4
5
6
7
<?php
/** @var \MetaModels\IMetaModelsServiceContainer $container */
$container = $GLOBALS['container']['metamodels-service-container'];

$factory = $container->getFactory();
$strMetaModelName = $factory->translateIdToMetaModelName($intMetaModelId);
$objMetaModel = $factory->getMetaModel($strMetaModelName);

Anschließend kann eine Eigenschaft abgefragt oder gesetzt werden - z.B. die Abfrage aller vorhandenen Attribute:

$arrAttributes = $objMetaModel->getAttributes();

Aktuelle Informationen unter: IMetaModel

Interfaces:

getServiceContainer()
gibt den Service-Container zurück

get($strKey)
gibt die Konfigurationseinstellungen zurück

getTableName()
gibt die Tabellen-Namen des instanzierten MetaModel zurück

getName()
gibt die Namen des instanzierten MetaModel zurück

isTranslated()
prüft, ob das instanzierten MetaModel Übersetzungen erstellen kann

hasVariants()
prüft, ob das instanzierten MetaModel Varianten erstellen kann

getAvailableLanguages()
gibt alle Sprachcodes als Array des instanzierten MetaModel zurück

getFallbackLanguage()
gibt den Sprachcode der Fallbacksprache des instanzierten MetaModel zurück

getActiveLanguage()
gibt den Sprachcode der aktiven Sprache des instanzierten MetaModel zurück

addAttribute(IAttribute $objAttribute)
fügt ein Attribut in die interne Liste der Attribute ein

hasAttribute($strAttributeName)
prüft, ob ein Attribut mit dem gegebenen Namen in der internen Liste der Attribute vorhanden ist

getAttributes()
gibt ein Array mit allen Attributen des instanzierten MetaModel zurück

getInVariantAttributes()
gibt ein Array mit den Attributen des instanzierten MetaModel zurück welche nicht als Varianten definiert sind

getAttribute($strAttributeName)
gibt die Instanz des Attributes mit dem gegebenen Attributnamen zurück

getAttributeById($intId)
gibt die Instanz des Attributes mit der gegebenen Attribut-ID zurück

findById($intId, $arrAttrOnly = array())
gibt das Item mit der gegebenen ID zurück; optional kann ein Array mit Attributnamen angegben werden, deren Werte zurück zu gegeben werden sollen

getEmptyFilter()
erzeugt einen “leeres” Filterobjekt ohne Filterregeln

prepareFilter($intFilterSettings, $arrFilterUrl)
erzeugt ein Filterobjekt aus einer gegebenen Filter-ID und einem optionalen Array mit Filterparametern z.B. für die Übernahme von GET-Werten aus einer URL

findByFilter( $objFilter, $strSortBy = '', $intOffset = 0, $intLimit = 0, $strSortOrder = 'ASC', $arrAttrOnly = array() )
gibt die Items zurück, welche mit einem gegbenen Filter in dem instanzierten MetaModel ermittelt werden - neben den Parametern der Sortierung, Offset, Limit und Sortierrichtung, kann ein Array mit Attributnamen angegben werden, deren Werte zurück zu gegeben werden sollen

getIdsFromFilter( $objFilter, $strSortBy = '', $intOffset = 0, $intLimit = 0, $strSortOrder = 'ASC' )
gibt die IDs der Items zurück, welche mit einem gegbenen Filter in dem instanzierten MetaModel ermittelt werden - die Parametern der Sortierung, Offset, Limit und Sortierrichtung können angegeben werden

getCount($objFilter)
gibt die Anzahl der Items zurück, die nach einem gegebenen Filter ermittelt werden

findVariantBase($objFilter)
gibt alle Items einer Varianten-Basis zürück, die nach einem gegebenen Filter ermittelt werden

findVariants($arrIds, $objFilter)
gibt alle Varianten-Items eines Arrays mit IDs und einem gegebenen Filter zurück

findVariantsWithBase($arrIds, $objFilter)
gibt alle Varianten-Items eines Arrays mit IDs und einem gegebenen Filter zurück; die Abfrage unterscheidet nicht zwischen Items einer Varianten-Basis und -Items

getAttributeOptions($strAttribute, $objFilter = null)
gibt alle Optionen eines gegebenen Attributs zurück; Optional kann ein Filter angegeben werden

saveItem($objItem)
speichert ein gegebenes Item bzw. es wird ein neues Item erzeugt, wenn keine ID mit übergeben wurde

delete($objItem)
löscht ein gegebenes Item

getView($intViewId = 0)
gibt die Instanz der Render-Einstellungen des instanzierten MetaModel zurück

Items Interface:

Mit dem Items-Interface können Eigenschaften der Items abgefragt werden.

Zunächst muss eine MetaModels-Instanz über die ID oder dem Namen eines MetaModel erzeugt und anschließend z.B. über einen Filter eine Liste von Items ermittelt werden.

$objItems = $objMetaModel->findByFilter($objFilter);

Anschließend kann eine Eigenschaft abgefragt werden - z.B. die Abfrage zur Anzahl aller vorhandenen Items:

$intAmountItems = $objItems->getCount();

Aktuelle Informationen unter: IItems

Interfaces:

getItem()
gibt das aktuelle Item zurück

getCount()
gibt die Anzahl der Items zurück

first()
setzt den Zeiger auf das erste Element der Items

prev()
setzt den Zeiger auf das nächste Element der Items

last()
setzt den Zeiger auf das letzte Element der Items

reset()
resettet das aktuelle Ergebnis

getClass()
gibt die CSS-Klasse des aktuellen Items zurück (first, last, even, odd)

parseValue($strOutputFormat = 'text', $objSettings = null)
parst das aktuelle Item und gibt das Ergebnis als Array der Attribute zurück; für die Ausgaben in XHTML/HTML5 müssen die Render-Einstellungen als $objSettings übergeben werden z.B. $objMetaModel->getView(3)

parseAll($strOutputFormat = 'text', $objSettings = null)
parst alle Items und gibt das Ergebnis als Array der Items mit dessen Attributen zurück; für die Ausgaben in XHTML/HTML5 müssen die Render-Einstellungen als $objSettings übergeben werden z.B. $objMetaModel->getView(3)

Item Interface:

Mit dem Item-Interface können Eigenschaften eines Item abgefragt werden.

Zunächst muss eine MetaModels-Instanz über die ID oder dem Namen eines MetaModel erzeugt und anschließend z.B. über einen Filter (ggf. auch leerer Filter)eine Liste von Items ermittelt werden.

$objItem = $objMetaModel->findByFilter($objFilter);

Anschließend kann eine Eigenschaft abgefragt werden - z.B. die Abfrage des Wertes eines Attributs:

$valAttribute = $objItems->get($strAttributeName);

Ein neues Item wird wie folgt erzeugt:

$objItem = new \MetaModels\Item($objMetaModel, array());

In dem übergebenen Array können “Key-Value-Paare” übergeben werden - dies ist aber nur bei einfachen Item-Typen wie Text sinnvoll.

Aktuelle Informationen unter: IItem

Interfaces:

get($strAttributeName)
gibt den Wert eines Attributes bei gegebenem Attributnamen zurück

set($strAttributeName, $varValue)
setzt den Wert eines Attributes bei gegebenem Attributnamen

getMetaModel()
gibt die Instanz des Items zurück

getAttribute($strAttributeName)
gibt die Instanz eines Attributes bei gegebenem Attributnamen zurück

isVariant()
ermittelt, ob das Item eine Variante eines anderen Items ist

isVariantBase()
ermittelt, ob das Item eine Variantenbasis ist

getVariants($objFilter)
gibt ein Array mit den Varianten des Items zurück oder null, wenn das Item keine Varianten beherrscht

getVariantBase()
gibt das Item der Variantenbasis zurück; für ein Item ohne Varianten ist die Variantenbasis das Item selbst

parseValue($strOutputFormat = 'text', $objSettings = null)
rendert das Item im vorgegebenen Format; als Rohdaten [raw] werden die Daten immer mit ausgegeben inkl. Attribute referenzierter MetaModel

parseAttribute($strAttributeName, $strOutputFormat = 'text', $objSettings = null)
rendert ein einzelnes Attribut des Item im vorgegebenen Format; als Rohdaten [raw] werden die Daten immer mit ausgegeben inkl. Attribute referenzierter MetaModel

copy()
erstellt ein neues Item als Kopie eines vorhandenem Items

varCopy()
erstellt ein neues Item als Kopie eines vorhandenem Items als Variante

save()
speichert den aktuellen Wert bzw. Werte für das Item

Beispiel:

Das folgende Beispiel soll einen kleinen Einstieg in die Arbeit mit den Interfaces demonstrieren. Das Beispiel kann z.B. in eine Template-Datei eingefügt und per Inserttag {{file::mm_interfaces.html5}} in einem Artikel-Inhaltselement ausgegeben werden.

Das Beispiel bezieht sich auf den Ausbau von “Das erste MetaModel”.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
/* Parameter (Beispiel) */

// Name der MetaModel Tabelle (siehe "Das erstes Metamodel")
$strModelName = 'mm_mitarbeiterliste';
// ID der Render-Einstellungen "FE-Liste"
$intRenderId = 2;

/* Interface */

// Den 'service container' kann man erhalten, wenn man ihn aus dem globalen Scope holt,
// oder aber indem man auf das Event \MetaModelsEvents::SUBSYSTEM_BOOT (oder eines der
// konkretisierten Events für Backend/Frontend) lauscht.
// (Container nur notwendig, wenn außerhalb des MM-Zugriffs)
/** @var \MetaModels\IMetaModelsServiceContainer $container */
$container = $GLOBALS['container']['metamodels-service-container'];
// MM Factory
$factory = $container->getFactory();
// MetaModel erzeugen, wenn Tabellen/MetaModel-Name bekannt.
$objMetaModel = $factory->getMetaModel($strModelName);
// MetaModel erzeugen, wenn nur id bekannt ($metaModelId == tl_metamodel.id des MetaModel).
//$objMetaModel = $factory->getMetaModel($factory->translateIdToMetaModelName($metaModelId));
// leerer Filter
$objFilter = $objMetaModel->getEmptyFilter();
// alle Items
$objItems = $objMetaModel->findByFilter($objFilter);
// alle Items geparst zu Array mit HTML5 Knoten
$arrItems = $objItems->parseAll('html5', $objMetaModel->getView($intRenderId));
// alternativ nur Knoten raw und text
//$arrItems = $objItems->parseAll('text');
//print_r($arrItems);

/* Ausgabe */

// Anzahl der Items
echo 'Anzahl: '.$objItems->getCount()."<br>\n";

// Variante 1 - Items-Objekt
/*
foreach ($objItems as $objItem)
{
    echo $objItem->get('name')."<br>\n";
}
*/

// Variante 2 - Items-Array
foreach ($arrItems as $arrItem)
{
    echo $arrItem['html5']['name']."<br>\n";
}