TYPO3 Extensions - YAG & Comments kombinieren

Wie kombiniert man die beiden hervorragenden TYPO3 Extensions YAG (Yet Another Gallery) und Comments, so dass jedes Bild kommentierbar ist?

Für ein aktuelles Projekt hat sich der Kunde eine Bildergalerie gewünscht. Hierbei sollten die Seitenbenutzer jedes Bild einzeln kommentieren können. Dies ist eine Standard-Anforderung und sollte leicht umzusetzen sein.

Wie sich herausstellte, harmonieren die beiden, an sich sehr guten Extensions, nicht besonders gut miteinander. Dies zeigte auch eine schnelle Google-Recherche. Viele Typo3 Programmierer stehen vor dem Problem, dass sich zwar eine Galerie oder ein Album mit der Kommentarfunktion versehen lässt, nicht jedoch einzelne Bilder.

connetation:// hat hierzu eine Lösung entwickelt, wobei nicht direkt in den Extension-Code eingegriffen wird. Dies sollte vermieden werden, um Updates der Extensions zu ermöglichen.

Das Problem mit Triggering prefix

Die Comments- Extension sieht vor, einzelne TYPO3-Seiten kommentieren zu können. Wie sieht es jedoch aus, wenn nicht einzelne Seite kommentiert werden sollten, sondern dies abhängig eines anderen Parameters? Auch hierfür sieht die Extension eine Möglichkeit vor. Mit Triggering prefix lässt sich ein alternativer URL-Parameter bestimmen. Somit ist nicht die Page ID, die zu kommentierende Entity, sondern ein selbst Wählbare. Im TS muss man Comments jedoch noch mitteilen, welcher Key den eindeutigen Wert beinhaltet und auf welche Tabelle sich dies bezieht:

plugin.tx_comments_pi1.showUidMap.PARAMETER = KEY
plugin.tx_comments_pi1.prefixToTableMap.PARAMETER = TABLE

Die YAG Extension verwendet

tx_yag_pi1[yag][galleryUid]
tx_yag_pi1[yag][albumUid]
tx_yag_pi1[itemListOffset]

um die aktuelle Galerie, das Album und das Bild zu identifizieren.

Daraus ergeben sich zwei Probleme

  1. Das Array hat zwei Ebenen. Sowohl galleryUid als auch albumUid sind innerhalb von yag. Die Comments Extension lässt sich aber auf nur einen Key konfigurieren.
  2. Das Bild wird durch itemListOffset nicht eindeutig identifiziert. Erst mit der albumUid in Kombination ist das Bild eindeutig. Erschwerend kommt dazu, dass sich die Position eines Bildes innerhalb eines Albums ändern kann und somit auch der itemListOffset.

Eine eigene Extension

Man kann die Comments Extension umschreiben. Somit kann diese mit verschachtelten Arrays umgehen, sowie mit der Kombination von mehreren Parametern. Man steht jedoch vor dem Problem, dass man dann keine Security-Updates einspielen kann ohne alle Umbauten erneut zu implementieren. Das Problem, dass sich itemListOffset eines Bildes ändert besteht somit nach wie vor.

Alternativ kann man die YAG Extension umschreiben, und somit die URL um einen eindeutigen Parameter erweitern. Dazu bietet sich die uid der Tabelle tx_yag_domain_model_item an. Diese identifiziert ein Bild eindeutig. Aber auch hier hat man das Problem von Security-Updates.

Die einfachste Lösung ist eine eigene Extension, um YAG und Comments zu verbinden. Hier kommen wir mit wenigen Code-Zeilen aus und können beide Extensions updaten.

Per XCLASS überschreiben wir die Klasse tx_comments_pi1

class ux_tx_comments_pi1 extends tx_comments_pi1 {
    function main($content, $conf) {
        $yag = t3lib_div::_GP('tx_yag_pi1');
       
        if( isset($yag['yag']['albumUid']) && isset($yag['itemListOffset']) ) {
            $limit = (intval($yag['itemListOffset']) - 1) . ', 1';
            $rowImage = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows('uid', 'tx_yag_domain_model_item', 'album = ' . intval($yag['yag']['albumUid']) . ' AND hidden = 0 AND deleted = 0 ', null, 'sorting', $limit);
            $sql = $GLOBALS['TYPO3_DB']->SELECTquery('uid', 'tx_yag_domain_model_item', 'album = ' . intval($yag['yag']['albumUid']) . ' AND hidden = 0 AND deleted = 0 ', null, 'sorting', $limit);

            if( ! empty($rowImage) ) {
                $_GET['tx_yag_pi1']['imageUID'] = $rowImage[0]['uid'];
            }
        }
       
        $content = parent::main($content, $conf);
        return $content;
    }
}

Wenn von YAG die Parameter albumUid und itemListOffset gesetzt sind, holen wir uns aus der Tabelle tx_yag_domain_model_item die entsprechende uid und setzten sie im $_GET-Array.
Nun können wir Comments auf diese neue id konfigurieren.

Hier können sie obigen code als TYPO3 Extension herunterladen.
Getestet haben wir mit TYPO3 4.5.32, YAG 3.1.1 und Comments 1.6.4