Contao-News

Wir informieren Dich hier regelmäßig zu Updates, stellen Best-Practice-Arbeiten vor und berichten über Aktuelles aus dem Contaoversum.

Auf den aktiven Datensatz im DCA zugreifen

von Leo Feyer – Aus der Praxis

Der Zugriff auf den aktiven Datensatz im DCA ist ein weiters nützliches Entwickler-Feature in TYPOlight 2.8. Bisher stellte das Data Container-Objekt nur die ID des aktiven Datensatzes zur Verfügung, was häufig weitere Datenbankabfragen in Callback-Funktionen erforderlich machte.

Einen Feld-Callback verwenden

Die Module Eventliste und Eventliste-Menü nutzen beide ein Drop-Down-Menü, um das Listenformat auszuwählen. Die Optionen variieren jedoch je nach Modultyp. Die Callback-Funktion sieht wie folgt aus:

public function getFormats(DataContainer $dc)
{
    $objModule = $this->Database->prepare("SELECT type FROM tl_module WHERE id=?")
                                ->limit(1)
                                ->execute($dc->id);

    if ($objModule->type == 'eventmenu')
    {
        // Return option list A
    }
    else
    {
        // Return option list B
    }
}

Die zusätzliche Datenbankabfrage war notwendig, weil der Modultyp über das DCA-Objekt nicht ausgelesen werden konnte. Ab Version 2.8.RC2 kann man jedoch direkt auf den aktiven Datensatz zugreifen:

public function getFormats(DataContainer $dc)
{
    if ($dc->activeRecord->type == 'eventmenu')
    {
        // Return option list A
    }
    else
    {
        // Return option list B
    }
}

Einen onsubmit_callback verwenden

Beim Anlegen eines neuen Mitglieds wird das Erstellungsdatum mit Hilfe eines Callbacks gespeichert. Da der Data Container bisher nur die ID des Datensatzes enthielt, sieht der Callback wie folgt aus:

public function storeDateAdded(DataContainer $dc)
{
    $objUser = $this->Database->prepare("SELECT * FROM tl_member WHERE id=?")
                              ->limit(1)
                              ->execute($dc->id);

    if ($objUser->numRows < 1 || $objUser->dateAdded > 0)
    {
        return;
    }

    // Fallback solution for existing accounts
    if (objUser->lastLogin > 0)
    {
        $time = $objUser->lastLogin;
    }
    else
    {
        $time = time();
    }

    $this->Database->prepare("UPDATE tl_member SET dateAdded=? WHERE id=?")
                   ->execute($time, $objUser->id);
}

Mit der neuen Zugriffsmöglichkeit auf den aktiven Datensatz wird die zusätzliche Abfrage überflüssig:

public function storeDateAdded(DataContainer $dc)
{
    if ($dc->activeRecord->dateAdded > 0)
    {
        return;
    }

    // Fallback solution for existing accounts
    if ($dc->activeRecord->lastLogin > 0)
    {
        $time = $dc->activeRecord->lastLogin;
    }
    else
    {
        $time = time();
    }

    $this->Database->prepare("UPDATE tl_member SET dateAdded=? WHERE id=?")
                   ->execute($time, $dc->id);
}

Der Zugriff auf den aktiven Datensatz ermöglicht es, Callbacks zu schreiben, die keine zusätzlichen Datenbankabfragen benötigen. Und obwohl das sicherlich nicht in allen Fällen anwendbar sein wird, sollte es die Gesamtzahl der Abfragen verringern und so die Performance von TYPOlight steigern.

Alle News anzeigen

Kommentare

Kommentar von Leo Unglaub |

Hallo Leo,
das ist ein wirklich praktisches Feature. Vielen Dank dafür, das wird in der Tat helfen sehr viele Query's zu sparen.
Viele Grüße
Leo

Einen Kommentar schreiben

Bitte addieren Sie 8 und 6.