Zum Inhalt springen

Seiten anhand von System-Kategorien auslesen (SQL)

Erstellt am 27. Januar 2016 · 1 Antwort · letzte Antwort am 29. Januar 2016

Tags: Kategorien, Datenbank, Frage

identiq ·

Hey Leute,

ich brauche mal eure Hilfe. Irgendwie sehe ich gerade den Wald vor lauter Bäumen nicht mehr.
Folgendes Szenario:

Ich habe eine ganz normale TYPO3 7 Instanz, mit sagen wir, 2 Seiten (Über uns & Leistungen).
Des Weiteren habe ich 3 System-Kategorien. In diesem Beispiel "Kategorie1, Kategorie2, Kategorie3".

Die Seite "Über Uns" hat die Kategorien "Kategorie1 und Kategorie2" zugeteilt bekommen.
Die Seite "Leistungen" hat die Kategorien "Kategorie2 und Kategorie3" zugeteilt bekommen.

Nun brauche ich einen SELECT im TypoScript, der mir alle Seiten ausliest, welche sowohl die Kategorie 2, als auch die Kategorie3 zugeordnet bekommen hat. (In diesem Fall müsste die Seite "Leistungen" die gewünschte Ausgabe sein.)

Bevor wir das in TypoScript machen, denke ich mir, ist es in einfachen SQL besser..

Folgende 3 Tabellen existieren ja hierfür in TYPO3:

"pages", "sys_category", "sys_category_record_mm"

pages - table:
+-----+----------+------------+
| uid |  title   | categories |
+-----+----------+------------+
|   3 | About us |          2 |
|   4 | Services |          2 |
+-----+----------+------------+
sys_category - table:
+-----+-------+
| uid | title |
+-----+-------+
|   1 | Kategorie1 |
|   2 | Kategorie2 |
|   3 | Kategorie3 |
+-----+-------+
sys_category_record_mm - table:
+-----------+-------------+------------+
| uid_local | uid_foreign | tablenames |
+-----------+-------------+------------+
|         2 |           4 | pages      |
|         2 |           3 | pages      |
|         1 |           4 | pages      |
|         3 |           3 | pages      |
+-----------+-------------+------------+

Nun habe ich hier eine einfache SQL - Abfrage, welche mit alle Seiten ausgibt, die eine Kategorie haben.

SELECT DISTINCT title FROM pages
JOIN sys_category_record_mm ON sys_category_record_mm.uid_foreign = pages.uid
WHERE sys_category_record_mm.tablenames = 'pages'

Diese SQL - Abfrage liefert mir nun bei den 3 Tabellen folgende Ausgabe:

+----------+
|  title   |
+----------+
| Leistungen|
| Über Uns |
+----------+

Allerdings brauche ich nur die Seite "Leistungen". Halt die Seite, welche sowohl Kategorie2, als auch Kategorie3 zugeordnet ist.

Ich habe an etwas ähnlichem wie folgt gedacht, allerdings weiß ich auch, dass das nicht funktionieren kann, da ich weiterhin beide Einträge bekomme, da ich hier eine OR-Condition habe...

SELECT DISTINCT title FROM pages
JOIN sys_category_record_mm ON sys_category_record_mm.uid_foreign = pages.uid
WHERE sys_category_record_mm.tablenames = 'pages' AND (sys_category_record_mm.uid_local = 2 OR sys_category_record_mm.uid_local = 3)

Hat jemand von euch eine Idee, wie ich das am Besten lösen kann?

Bin für jeden Tipp dankbar!!

Viele Grüße!

identiq ·

Und so geht es mit TYPO3 - Boardmitteln:

20 = HMENU
20 {
    special = categories
    # Show all pages with categories 1, 2 and 3
    special.value = 1,2,3
    1 = TMENU
    1.NO {
        # get comma-separated list of uid's of the categories the page belongs to
        stdWrap.field = _categories
        # check the _categories field if it contains the categories you need.
        stdWrap.if {
            value = 2,3
            equals.field = _categories
        }
    }
}