tbaddade / redaxo_url

REDAXO 5 AddOn zur URL-Generierung für eigene AddOns (ehemals Url Control, ehemals Frau Schultze)
MIT License
46 stars 22 forks source link

Zusätzlicher EP URL_PROFILE_QUERY für komplexere Manipulation des Queries #262

Closed DanielWeitenauer closed 1 year ago

DanielWeitenauer commented 1 year ago

Über diesen EP ließen sich komplexere Abfragen realisieren, als sie mit URL_PROFILE_RESTRICTION möglich sind. Es werden z.B. Abfragen weiterer Tabellen möglich. Ich verwalte z.B. Sprachversionen eines Datensatzes in Inline-Relationen. Das bedeutet, der Status wird im Haupt-Datensatz, die URL-Daten in den Inline-Datensätzen verwaltet. Über den EP kann ich die Daten zusammenführen.

tbaddade commented 1 year ago

Danke @DanielWeitenauer

alxndr-w commented 1 year ago

@DanielWeitenauer eine alternative wäre gewesen, eine VIEW zu verwenden.

DanielWeitenauer commented 1 year ago

@alxndr-w Es gibt sicherlich mehrere Wege zum Ziel. Als jemand, der deutlich besser mit PHP als mit MySQL zurechtkommt, finde ich die Arbeit mit rex_yform_manager_query jedoch einfacher und eleganter zu handhaben.

alxndr-w commented 1 year ago

@DanielWeitenauer bleibt natürlich dir überlassen.

Ich profitiere jedenfalls immer davon, wenn mir jemand einen Tipp gibt über den Tellerrand hinauszuschauen - das Arbeiten direkt auf der DB ist oft deutlich performanter und die VIEW kapselt die JOINs so schön ab.

skerbis commented 1 year ago

@DanielWeitenauer hast du mal n Beispiel damit mir klar wird, wie ich das nutzen kann?

DanielWeitenauer commented 1 year ago

@skerbis Ich kann dir meinen konkreten Anwendungsfall erklären: Ich habe ein Addon mit einer News-ähnlichen Struktur von Datensätzen. Diese Datensätze haben Inhalte, die für alle Sprachen gleich sind und über den Eltern-Datensatz verwaltet werden und Inhalte, die sprachspezifisch sind und in Kinder-Datensätzen über Inline-Relationen verwaltet werden. Für jede Sprache wird automatisiert ein Relationsfeld mit zugehöriger Datentabelle erzeugt. Ich kann wunderbar aus den Kinderdatensätzen die URLs erzeugen, doch für einige Informationen muss ich auf den Elterndatensatz zugreifen. Z.B. um ein Statusfeld abzufragen, um nur Datensätze auszugeben, die online sind. Das kann ich leicht anfügen:

rex_extension::register('URL_PROFILE_QUERY', static function (rex_extension_point $ep): void {
        /** @var rex_yform_manager_query $query */
        $query = $ep->getSubject();
        /** @var Profile $profile */
        $profile = $ep->getParam('profile');

        // die Elterntabelle
        $table = rex::getTable(Item::TABLE); 
        // der Namen-Präfix der Kindertabellen - es wird für jede Sprache eine eigene Kindtabelle erzeugt, deren Name dann mit der Sprach-Id erweitert wird
        $table_content = rex::getTable(ItemContent::TABLE); 

        if (strpos($profile->getTableName(), $table_content) !== false) {
            $query->leftJoin($table, null, 'data.item_id', $table.'.id');
            $query->select($table.'.status');
            $query->where($table.'.status', 0, '>');
        }

        $ep->setSubject($query);
});
DanielWeitenauer commented 1 year ago

@alxndr-w Ich denke, wenn ein durchdachtes Framework vorhanden ist, kann man es ruhig verwenden. Dafür sind Yform und das URL-Addon ja in erster Linie gedacht. Falls es mal auf die Performance ankommt, steht dem direkten Zugriff auf die Datenbank ja nichts im Wege.

skerbis commented 1 year ago

Ah super danke.