Zum Inhalt

Entitäten

Doctrine

Die Datenmodellelierung im Contentfly CMS erfolgt objektorientiert über sogenannte Entitäten. Eine Entität repräsentiert eine Datenbank-Tabelle und wird als PHP-Klasse angelegt. Die Verbindung von objektorientierter Entität und der relationalen Datenbank erfolgt über Doctrine ORM (Object Relational Mapping).

Konfiguation der Entitäten

Im Doctrine ORM gibt es verschiedene Möglichkeiten die Entitäten zu konfigurieren (z.B. Welche Eigenschaft/Property in der Entität soll auf welches Datenbank-Feld von welchem Typ gemappt werden?): XML, YAML oder PHP-Annotations.

Im Contentfly CMS werden nur PHP-Annotations unterstützt. Doctrine-basierte Annotationen müssen dabei mit @ORM\ angesprochen werden:

@ORM\Table(name="testtabelle")

Weiterführende Informationen zu Doctrine ORM:

Standard-Entitäten

Das Contentfly CMS bringt bereits einige vordefinierte Entitäten mit, die beispielsweise für die Benutzerverwaltung zuständig sind. Die Standard-Entitäten finden Sie im Ordner appcms/areanet/PIM/Entity

  • User Benutzer, kann durch PHP-Traits erweitert werden
  • Group Benutzergruppe, kann durch PHP-Traits erweitert werden
  • Permission Berechtigungen einer Gruppe
  • Token Aktive Tokens von eingeloggten Benutzern oder statischen API-Tokens
  • PushToken Token von iOS- und Android-Geräten für Push-Notifications
  • File Dateien, kann durch PHP-Traits erweitert werden
  • Folder Dateiordner, kann durch PHP-Traits erweitert werden
  • Nav Benutzerdefinierter Navigationsbereich im Contentfly CMS UI
  • NavItem Benutzerdefinierter Navigationseintrag unterhalt eines Navigationsbereiches im Contentfly CMS UI
  • ThumbnailSetting Bildgrößen, die automatisch im Dateisystem für jede Bilddatei angelegt werden

Anpassung Standard-Entitäten

Die Standard-Entitäten User, Group, File und Folder_ können durch PHP-Traits erweitert werden, siehe Anpassung Standard-Entitäten

Benutzerdefinierte Entitäten

Benutzerdefinierte Enitäten müssen im Ordner custom/Entity gespeichert werden und von der Klasse Areanet\PIM\Entity\Base, Areanet\PIM\Entity\BaseTree oder Areanet\PIM\Entity\BaseSortable erben. Für jede Eigenschaft/Property müssen in der Entität entsprechende Getter- und Setter-Methoden vorhanden sein.

Arten von Entitäten

Einfache Entität

 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
<?php
namespace Custom\Entity;

use Areanet\PIM\Entity\Base;
use Areanet\PIM\Classes\Annotations as PIM;
use Custom\Classes\Annotations as CUSTOM;
use Areanet\PIM\Entity\BaseSortable;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="test")
 * @PIM\Config(label="Test")
 */
class Test extends Base
{
    /**
     * @ORM\Column(type="string", unique=false)
     * @PIM\Config(showInList=40, label="Titel")
     */
    protected $titel;

    /**
     * @return mixed
     */
    public function getTitel()
    {
        return $this->titel;
    }

    /**
     * @param mixed $titel
     */
    public function setTitel($titel)
    {
        $this->titel = $titel;
    }

}

Achtung: Getter/Setter ab der Version 1.5.1 optional

Ab der Version 1.5.1 müssen die Getter- und Setter-Methoden nicht mehr zwingend implementiert werden. Das Contentfly CMS emuliert fehlende Getter- und Setter-Methoden automatisch.

Sortierbare Entität

Sortierbare Entitäten erhalten ein zusätzliches (verstecktes) Sortierfeld und können im Contentfly CMS UI per Drag'n Drop sortiert werden.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<?php
namespace Custom\Entity;

use Areanet\PIM\Entity\BaseSortable;
use Areanet\PIM\Classes\Annotations as PIM;
use Custom\Classes\Annotations as CUSTOM;
use Areanet\PIM\Entity\BaseSortable;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="test_sortable")
 * @PIM\Config(label="Test sortierbar")
 */
class Test extends BaseSortable
{
    /...
}

Entität mit Baumstruktur

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<?php
namespace Custom\Entity;

use Areanet\PIM\Entity\BaseTree;
use Areanet\PIM\Classes\Annotations as PIM;
use Custom\Classes\Annotations as CUSTOM;
use Areanet\PIM\Entity\BaseSortable;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="test_tree")
 * @PIM\Config(label="Baumtest")
 */
class Test extends BaseTree
{
    /...
}

Mehrsprachige Entitäten / I18N

Das Contentfly CMS unterstützt I18N-Entitäten, um Inhalte mehrsprachig anzulegen. Die I18N-Funktionalität des Contentfly CMS bezieht sich dabei auf die Annahme, dass es in allen Sprachen die gleichen Inhalte (mit entsprechenden Übersetzungen) gibt. Sobald Sie beispielsweise einen deutschen Inhalt einer Entität anlegen, steht Ihnen dieser automatisch in allen anderen Sprachen zur Übersetzung zur Verfügung - und umgekehrt.

Abkürzung I18N

Die Abkürzung I18N bezieht sich auf das Wort Internationalisierung. In der englischen Übersetzung internationalization befinden sich 18 Buchstaben zwischen dem ersten Buchstaben i und dem letzten Buchstaben n.

I18N-Konfiguration

Bevor Sie mehrsprachige Entitäten verwenden können, müssen Sie die verfügbaren Sprachen in der Konfiguration definieren.

custom/config.php

1
2
<?php
$configDefault->APP_LANGUAGES = array('de', 'en');

I18N-Entitäten

Um eine Entität mehrsprachfähig zu machen, verwenden Sie einfach die entsprechende I18N-Entität:

  • Einfache Entität: BaseI18N anstatt Base
  • Sortierbare Entität: BaseSortableI18N anstatt BaseSortable
  • Entität mit Baumstruktur: BaseTreeI18N anstatt BaseTree

API-Aufruf bei I18-Entitäten

Aus diesem Grund muss bei allen API-Aufrufen die Sprache über den Parameter lang mit übergeben werden.

Mehrsprachige Entitäten verfügen über einen zusammengesetzten Primary Key in der Datenbanken. Bezieht sich bei normalen Entitäten der Primary Key lediglich auf das Feld id, so umfasst er bei I18N-Entitäten die Felder id und lang.

Beispiel

id lang title
1 de rot
1 en red
2 de blau
2 en blue

Löschen von Datensätzen/Sprachvarianten

Wird eine Sprachvariante eines Datensatzes gelöscht, werden aufgrund der Datenstruktur automatisch alle Sprachen dieses Datensatzes gelöscht. Es handelt sich also nicht um die Löschung einer Übersetzung, sondern immer um die Löschung des ganzen Datensatzes anhand der ID. Sie können aber über das User Interface Benutzer(gruppen) anlegen, die für bestimmte Sprachen nur Zugriff zum Übersetzen ohne Löschfunktion haben.

Gruppierung von Entitäten

Standardmäßig werden benutzerdefinierte Entitäten im Ordner custom/Entity abgelegt, diese erscheinen im User Interface automatisch in der Gruppe "Inhalt". Mit der Version 1.5.0 können Sie nun zusätzlich Entitäten über eigene Ordner gruppieren. Diese werden anhand des Ordnernamens im User Interface in der Navigation dargestellt - siehe Srceenshot.

Gruppierte

custom/Entity

  • News.php (automatisch im Ordner Inhalt)
  • Kunden.php (automatisch im Ordner Inhalt)
  • Settings
    • ..
  • Shop
    • ..
  • CRM
    • Mandanten.php
    • Ansprechpartner.php
    • Aufgaben.php
    • Schritte.php

Keine Unterstützung von Unterordnern

Beachten Sie bitte, dass unterhalt von custom/Entity lediglich eine Ordnerebene unterstützt wird, also z.B. custom/Entity/Products/Cars.php - eine Untergruppierung in der Form von custom/Entity/Products/Cars/SUV.php wird nicht unterstützt.

Die Reihenfolge der Entitäten in der Navigation können über die Klassen-Annotation sort definiert werden, die manuelle Sortierung der Ordner/Gruppen ist derzeit nicht möglich.

1
2
3
4
5
6
<?php
...
/**
 * @PIM\Config(..., sort=10)
 */
...

Annotations

Klassen-Annotationen

Die Klassen-Annotationen gelten für die gesamte Entität. Auf Doctrine-Ebene muss hier zwingend die Annotation @ORM\Entity gesetzt und zusätzlich der entsprechende Tabellennamm in der Datenbank definiert werden. Im Folgenden sind die zusätzlichen Konfigurationsmöglichkeiten des Contentfly CMS @PIM\Config aufgeführt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
...
/**
 * @ORM\Entity
 * @ORM\Table(name="TABLE_NAME")
 * @PIM\Config(label="LABEL", sortBy="SORT_PROPERTY_NAME", sortOrder="ASC/DESC", sortRestrictTo="PROPERTY_NAME", labelProperty="PROPERTY_NAME", hide=false, readonly=false)
 */
class Test extends Base
{
...

Optionen für @PIM\Config:

Eigenschaft Typ Standard Beschreibung
label String Name der Entität im Contentfly CMS UI
sortBy String id Eigenschaft, nach er in den Listen im Standard sortiert werden soll
sortOrder String ASC ASC / DESC
sortRestrictTo String Begrenzt die Sortierung bei BaseSortable-Entities auf die eingetragene Eigenschaft (z.B. "Eigenschaften" sollen nur sortiert werden können, wenn im Filter eine "Kategorie" ausgewählt wurde)
labelProperty String Feld, das in den Contentfly CMS UI Formularen anstatt "Objekt ID bearbeiten" angezeigt werden soll
hide Boolean false Entität wird nicht in der Contentfly CMS UI Navigation aufgelistet
readonly Boolean false Entität kann im Contentfly CMS UI nicht bearbeitet werden
tabs JSON-String Optional können die Eigenschaften in den Bearbeitungs-Formularen des Contentfly CMS UI auf mehrere Tabs aufgeteilt werden: {'tabKey1' : 'Tab Title 1', 'tabKey2' : 'Tab Title 2'} ````
viewMode Integer o 0 = In der Listenansicht wird ein Löschen- und Bearbeiten-Button dargestellt. / 1 = In der Liste wird der Löschen-Button nicht dargestellt, dafür ein Anzeige-Button, mit dem das Objekt lesend geöffnet/angezeigt werden kann. Der Löschen-Button wird dafür im Bearbeitungsformular links unten angezeigt.
sort Integer 0 Sortierung der Entität im UI in der Navigation auf der linken Seite

Eigenschaften-Annotationen

Anhand den Standard-Doctrine-Annotationen ermitteld das Contentfly CMS automatisch das passende Formularfeld und Darstellung im Contentfly CMS UI.

  • Typ string = Einzeiliges Textfeld
  • Typ text = Mehrzeiliges Textfeld
  • Typ boolean = Checkbox
  • ...

Dieses Standard-Verhalten kann aber durch spezielle Annotationen des Contentfly CMS (@PIM) ergänzt und/oder angepasst werden.

Allgemein

1
2
3
4
5
6
<?php
/**
  * @ORM\Column(type="string")
  * @PIM\Config(showInList=40, label="Titel")
  */
protected $titel;

Optionen für @PIM\Config:

Eigenschaft Typ Standard Beschreibung
label String Name der Eigenschaft im Contentfly CMS UI
showInList Integer Zeigt den Inhalt dieser Eigenschaft in der Auflistung der Entität an der an eingegebenen Position an. Im obigen Beispiel wird die Eigenschaft titel in der Liste in der Spalte 40 angezeigt. Siehe Hinweis (1)
hide Boolean false Das Formularfeld ist im Contentfly CMS UI Formular versteckt
readonly Boolean false Das Formularfeld kann im Contentfly CMS UI Formular nur gelesen werden
tab String Schlüssel des Tabs, in dem die Eigenschaft optional im Contentfly CMS UI angezeigt werden soll. Dieser Schlüssel/Key muss in der Klassen-Annotation @PIM\Config in der Option tabs entsprechend konfiguriert sein.
isFilterable Boolean false Die Einträge aus dieser Eigenschaft werden als Filter angezeigt. Siehe Hinweis (2)
isDatalist Boolean false Rendert eine Filterliste einer Eigenschaft mit isFilterable=true als Auto-Suggest-Feld dar. Siehe Hinweis (3)
encoded Boolean false Automatische Verschlüsselung der Inhalte in der Datenbank. Siehe Hinweis (4)

(1) Hinweis für showInList

Properties vom Typ Multijoin, Multifile und Checkbox (Many2Many-Joins) werden aus Performance-Gründen nicht in der Liste geladen und dargestellt.

(2) Hinweis für isFilterable

  • Bei join/multijoin/virtualjoin-Eigenschaften werden die entsprechenden Einträge aus verknüpften Entität geladen
  • Bei normalen Eigenschaften (z.B. vom Typ String) werden alle eindeutigen, gespeicherten Werte aufgelistet
  • Select- und Boolean-Felder werden automatisch in den Filtern angezeigt

(3) Hinweis für isDatalist

Die Option isDatalist ist nur für join/multijoin-Eigenschaften vefügbar

(4) Hinweis für encoded

  • nur für normale Text-Eigenschaften (Type String und Text) verfügbar
  • Konfigurationsvariable SECURITY_CIPHER_KEY muss gesetzt sein.

Pflichtfeld

Das Contentfly CMS UI erkennt automatisch, ob eine Eigenschaft einen NULL-Wert enthalten darf und stellt das gerenderte Formularfeld entsprechend als Pflichtfeld oder optionales Feld dar. Ob eine Eigenschaft einen NULL-Wert enthalten darf wird über die Doctrine-Annotation @ORM\Column konfiguriert

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?php
/**
  * @ORM\Column(type="string", nullable=true)
  * @PIM\Config(showInList=40, label="Kein Pflichtfeld")
  */
protected $keinPflichtfeld;

/**
  * @ORM\Column(type="string", nullable=false)
  * @PIM\Config(showInList=50, label="Pflichtfeld")
  */
protected $pflichtfeld;

Hinweis

Ohne Angabe der Option nullable sind alle Eigenschaften standardmäßig Pflichtfelder!

Feldtypen

Das Contentfly CMS ermittelt aus den angegebenen Annotations automatisch den entsprechenden Feldtyp, also auch wie das Feld im Contentfly CMS UI im Formular ausgegeben wird.