esit / datacollections
Es handelt sich um eine Erweiterung für das Open Source CMS Contao. Die Software stellt zwei Collections zur Verfügung und ist als Ersatz für den Einsatz für Arrays gedacht.
Installs: 51
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 1
Open Issues: 0
Type:contao-bundle
Requires
- php: ^8.2
- contao/core-bundle: ^5.3
- esit/ctoadapter: ^1.0
- esit/databaselayer: ^1.0
- esit/valueobjects: ^1.0
Requires (Dev)
- contao/test-case: ^5.3
- phpunit/phpunit: ^9.5
- roave/security-advisories: dev-master
README
Beschreibung
Bei dieser Software handelt es sich um eine Erweiterung für das Open Source CMS Contao. Die Software stellt zwei Collections zur Verfügung und ist als Ersatz für den Einsatz für Arrays gedacht.
Autor
e@sy Solutions IT: Patrick Froch info@easySolutionsIT.de
Voraussetzungen
- php: ^8.2
- contao/core-bundle:^5.3
- esit/valueobjects: ^1.0
- esit/databaselayer: ^1.0
Installation
Die Erweiterung kann einfach über den Manager installiert werden.
NameInterfaces
Die NameInterfaces sind für die Verwendung der DatabaseRowCollction
erforderlich. Damit sichergestellt ist, dass es
sich um valide Namen für Tabellen und Felder handelt, werden ValueObjects verwendet.
Es muss eine Aufzählung (Enumeration
) mit den Tabellennamen und je eine pro Tabelle mit den Feldnamen erstellt werden.
TablenamesInterface
Die Aufzählung, die das TablenamesInterface
implementiert, enthält die Namen aller relevanten Tabellen im Projekt.
use Esit\Valueobjects\Classes\Database\Enums\TablenamesInterface; enum Tablenames implements TablenamesInterface { case tl_content; case tl_test_data; }
FieldnamesInterface
Die Aufzählungen, die das FieldnamesInterface
implementieren, enthalten die Namen aller Felder einer Tabelle. Es
muss für jede Tabelle eine Aufzählung mit den entsprechenden Feldern geben.
use Esit\Valueobjects\Classes\Database\Enums\FieldnamesInterface; enum TlContent implements FieldnamesInterface { case id; case tstamp; case headline; } enum TlTestData implements FieldnamesInterface { case id; case tstamp; case specialdata; }
Collections
Grundfunktionen
Alle Collections erweitern die Doctrine\Common\Collections\ArrayCollection
und bietet so auch alle Funktionen aus Doctrine\Common\Collections\ArrayCollection
.
Im Einzelnen sind dies die folgenden Methoden:
- add
- clear
- contains
- containsKey
- current
get=> DurchgetValue
ersetzt, um die gleichen Methodennamen in allen Collections verwenden zu können.- getKeys
- getValues
- isEmpty
- first
- exists
- findFirst
- filter
- forAll
- indexOf
- key
- last
- map
- reduce
- next
- partition
- remove
- removeElement
set=> DurchgetValue
ersetzt, um die gleichen Methodennamen in allen Collections verwenden zu können.- slice
- toArray
- matching
ArrayCollection
Die ArrayCollection
ist für den direkten Ersatz von Arrays gedacht. Die Collection kann
beliebige Werte aufnehmen und bietet viele Methoden für den Umgang mit Arrays.
DatabaseRowCollction
Die DatabaseRowCollection
ist eine Spezialform der ArrayCollection. Sie bietet ebenfalls
viele Methoden für den Umgang mit Arrays. Ihr Zweck ist es, eine Tabellenzeile aufzunehmen.
Die Tabellenzeile kann mit save()
gespeichert werden. Des Weiteren bietet sie ein LazyLoading
von abhängigen Daten, wenn dies im DCA konfiguriert wurde.
Vewendung
Für die Erstellung der Collections gibt es eine Factory. Sie kann eine ArrayCollection
, eine
DatabaseRowCollection
und eine ArrayCollection
mit mehreren DatabaseRowCollection
s erstellen.
Vewendung der ArrayCollection
Hier wird die Erstellung und einige Methoden der ArrayCollection
gezeigt:
use Esit\Datacollections\Classes\Services\Factories\CollectionFactory; class MyClass { public function __construct(private readonly CollectionFactory $factory) { } public function useArray(): void { $myArrayCollection = $this->factory->createArrayCollection( ['t1' =>'test01', 't2' => 'test02'] ); // getValue echo $myArrayCollection->getValue('t1'); // => test01 // setValue $myArrayCollection->setValue('t3', 'Test03'); // fetchData $data = $myArrayCollection->fetchData(); // => ['t1' =>'test01', 't2' => 'test02', 't3' => 'Test03'] // Iterator foreach ($myArrayCollection as $k => $v) { echo "$k: $y"; } } }
Vewendung der DatabaseRowCollection
Für die Verwendung der DatabaseRowCollection
werden zunächst Enumerations vom Typ TablenamesInterface
und
FieldnamesInterface
benötigt (s.o.). Mit diesen können dann über die Factory die DatabaseRowCollection
s erstellt
werden. Da intern ValueObjects für die Namen der Tabellen und Felder verwendet werden, können nur DatabaseRowCollection
für existierende Tabellen erstellt werden und nur auf darin wirklich enthaltene Felder zugegriffen werden.
use Esit\Datacollections\Classes\Services\Factories\CollectionFactory; class MyClass { public function __construct(private readonly CollectionFactory $factory) { } public function useDatabaseRow(): void { // Eine leere Collection erstellen $myDbCollection = $this->factory->createDatabaseRowCollection( Tablenames::tl_test_data, [] // Hier können Daten als Array oder ArrayCollection übergeben werden. ); // setValue $myDbCollection->getValue(TlTestData::specialdata, 'TestValue'); // getValue echo $myDbCollection->getValue(TlTestData::specialdata); // => 'TestValue' // fetchData $data = $myDbCollection->fetchData(); // Alle Daten der Tabellenzeile als Array // ArrayCollection mit mehreren DatabaseRowCollections erstellen. $myCollections = $this->factory->createMultiDatabaseRowCollection( Tablenames::tl_test_data, [] // Hier können Daten als multidemensionales Array übergeben werden. ); // Iterator ($myCollections ist eine ArrayCollection, $oneDbCollection je eine DatabaseRowCollection) foreach ($myCollections as $oneDbCollection) { var_dump($oneDbCollection); // oder alle anderen Aktionen einer DatabaseRowCollection } } }
Für den Zugriff auf einen Wert wird immer ein FieldnamesInterface
benötigt.
Auf den DatabaseRowCollection
stehen die gleichen Methoden zur Verfügung, wie auf den ArrayCollection
. Zusätzlich
gibt es die Methode save
um den Datensatz zu speichern.
Arrays werden immmer als serialisierter String abgelegt und als ArrayCollection
zurückgegeben.
Wenn im DCA das LazyLoading konfiguriert ist, werden die abhängigen Daten automatisch beim Zugriff auf das Feld geladen und zurückgegeben.
LazyLoading
Damit die abhängigen Daten geladen werden können, muss das LazyLoading im DCA konfiguriert werden.
$table = 'tl_test_data'; $GLOBALS['TL_DCA'][$table]['fields']['author'] = [ 'label' => &$GLOBALS['TL_LANG'][$table]['author'], 'exclude' => true, 'inputType' => 'text', 'foreignKey' => 'tl_member.CONCAT(firstname,' ',lastname)', 'lazyloading' => ['table'=>'tl_member', 'field'=>'id', 'serialised'=>false], 'eval' => ['mandatory'=>true, 'maxlength'=>255], 'sql' => "varchar(255) NOT NULL default ''" ];
table
gibt die Tabelle an, aus der die Daten geladen werden sollen. field
gibt an, in welchem Feld der Fremdtabelle
der Wert gesucht wird und serialised
gibt an, ob es sich um einen Werte (false
) oder ein serialisiertes Array
von Werten handelt (true
).