PHPackages                             esit/datacollections - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. esit/datacollections

ActiveContao-bundle[Utility &amp; Helpers](/categories/utility)

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.

2.1.6(1y ago)02432proprietaryPHPPHP ^8.2

Since Sep 16Pushed 10mo ago1 watchersCompare

[ Source](https://github.com/eS-IT/datacollections)[ Packagist](https://packagist.org/packages/esit/datacollections)[ RSS](/packages/esit-datacollections/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependencies (7)Versions (41)Used By (0)

Datacollections
===============

[](#datacollections)

Beschreibung
------------

[](#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
-----

[](#autor)

**e@sy Solutions IT:** Patrick Froch

Voraussetzungen
---------------

[](#voraussetzungen)

- php: ^8.2
- contao/core-bundle:^5.3
- esit/valueobjects: ^1.0
- esit/databaselayer: ^1.0

Installation
------------

[](#installation)

Die Erweiterung kann einfach über den Manager installiert werden.

NameInterfaces
--------------

[](#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

[](#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

[](#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
-----------

[](#collections)

### Grundfunktionen

[](#grundfunktionen)

Alle Collections erweitern die `Doctrine\Common\Collections\ArrayCollection`und bietet so auch alle Funktionen aus [`Doctrine\Common\Collections\ArrayCollection`](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html).

Im Einzelnen sind dies die folgenden Methoden:

- [add](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#add)
- [clear](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#clear)
- [contains](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#contains)
- [containsKey](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#containsKey)
- [current](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#current)
- [get](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#get) =&gt; Durch `getValue` ersetzt, um die gleichen Methodennamen in allen Collections verwenden zu können.
- [getKeys](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#getkeys)
- [getValues](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#getvalues)
- [isEmpty](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#isempty)
- [first](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#first)
- [exists](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#exists)
- [findFirst](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#findfirst)
- [filter](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#filter)
- [forAll](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#forall)
- [indexOf](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#indexof)
- [key](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#key)
- [last](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#last)
- [map](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#map)
- [reduce](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#reduce)
- [next](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#next)
- [partition](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#partition)
- [remove](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#remove)
- [removeElement](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#removeelement)
- [set](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#set) =&gt; Durch `getValue` ersetzt, um die gleichen Methodennamen in allen Collections verwenden zu können.
- [slice](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#slice)
- [toArray](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#toarray)
- [matching](https://www.doctrine-project.org/projects/doctrine-collections/en/stable/index.html#matching)

### ArrayCollection

[](#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

[](#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
---------

[](#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

[](#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

[](#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

[](#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`).

### CommonData

[](#commondata)

Die `DatabaseRowCollection` kann zusätzliche Daten verwalten, die nicht in der Datenbank gespeichert werden können. Die ist nützlich, wenn man den Daten für die Ausgabe zusätzliche Werte mitgeben will.

Es gibt zu diesem Zweck eine extra Collection, in der die zusätzlichen Daten abgelegt werden. Mit den folgenden Methoden kann darauf 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.
        );

        // Zusätzlichen Wert berechnen und hinterlegen
        $myDbCollection->setCommonValue('incremented_id', $myDbCollection->getValue('id') + 1);

        // Zusätzlichen Wert abfragen
        echo $myDbCollection->getCommonValue('incremented_id'); // => id + 1

        // Alle zusätzlichen Werte als Array beziehen
        $commonData = $myDbCollection->getCommonDataAsArray(); // ['incremented_id' => id + 1]
    }
}
```

###  Health Score

37

—

LowBetter than 83% of packages

Maintenance50

Moderate activity, may be stable

Popularity12

Limited adoption so far

Community11

Small or concentrated contributor base

Maturity64

Established project with proven stability

 Bus Factor1

Top contributor holds 93.3% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~5 days

Total

35

Last Release

419d ago

Major Versions

1.0.8 → 2.0.02024-10-09

1.0.9 → 2.0.32024-11-07

### Community

Maintainers

![](https://www.gravatar.com/avatar/11d693bb4abc8287c3a3b558873e80f65e2b8a7fcdfd10f87e578a11ff97173c?d=identicon)[eS-IT](/maintainers/eS-IT)

---

Top Contributors

[![eS-IT](https://avatars.githubusercontent.com/u/1199106?v=4)](https://github.com/eS-IT "eS-IT (14 commits)")[![zonky2](https://avatars.githubusercontent.com/u/1045318?v=4)](https://github.com/zonky2 "zonky2 (1 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/esit-datacollections/health.svg)

```
[![Health](https://phpackages.com/badges/esit-datacollections/health.svg)](https://phpackages.com/packages/esit-datacollections)
```

###  Alternatives

[codefog/contao-haste

haste extension for Contao Open Source CMS

42650.8k139](/packages/codefog-contao-haste)[madeyourday/contao-rocksolid-custom-elements

Create your own, nestable content elements using a modular system. End the WYSIWYG chaos with your own content elements.

50341.9k12](/packages/madeyourday-contao-rocksolid-custom-elements)[codefog/contao-news_categories

News Categories bundle for Contao Open Source CMS

3183.3k6](/packages/codefog-contao-news-categories)[terminal42/contao-folderpage

Provides a new page type for Contao that allows you to group pages into folders.

18147.9k9](/packages/terminal42-contao-folderpage)[inspiredminds/contao-wowjs

Integrates WOW.js for Contao content elements and form fields.

1813.0k](/packages/inspiredminds-contao-wowjs)[inspiredminds/contao-glightbox

Contao extension to integrate GLightbox.

1223.3k1](/packages/inspiredminds-contao-glightbox)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
