TYPO3 6.x Kategorien auslesen und verwenden

Mit der TYPO3 6.x gab es einen neuen Tab “Kategorien” /category für die Seiteneigenschaften (pages) und für die Datensätze (tt_content). Ihr könnt nun z.B. auf der root Seite (ID=1) im List-Modus neue Kategorien anlegen und verwalten.

In den Seiteneigenschaften könnt Ihr nun die angelegten Kategorien auswählen!
Unter “Spezial-Menüs ” gibt es auch neue Menüs für die Kategorie-Ausgabe! Auch das HMENU hat nun einen neuen  special erhalten = categories! Hier könnt Ihr dann ein Menü mit den Kategorien aufbauen.

Das special-Menü baut sich in etwa so auf:

# Menu of categorized pages
categorized_pages < .default
categorized_pages {
special = categories
special.value.field = selected_categories
special.relation.field = category_field
special.sorting = title
special.order = asc
stdWrap {
outerWrap = <ul>|</ul>
}
}

# Menu of categorized content elements
categorized_content = RECORDS
categorized_content {
categories.field = selected_categories
categories.relation.field = category_field
tables = tt_content
conf.tt_content = TEXT
conf.tt_content {
field = header
typolink.parameter = {field:pid}#{field:uid}
typolink.parameter.insertData = 1
wrap = <li>|</li>
}
wrap = <ul>|</ul>
}

Was ich noch benötigt habe, ist eine Ausgabe, für die ausgewählte Kategorie! Hier dazu das passende typoscript:

#kategorie auslesen
10 = CONTENT
10 {
wrap = <p>|</p>
table = pages
select {
uidInList.field = uid
#root ID - Kats abgespeichert
<strong>pidInList = 1</strong>
selectFields = sys_category.title
join = sys_category_record_mm ON pages.uid = sys_category_record_mm.uid_foreign JOIN sys_category ON sys_category.uid = sys_category_record_mm.uid_local
where = sys_category_record_mm.tablenames = 'pages'
orderBy = sys_category.sorting
}
renderObj = TEXT
renderObj {
field = title
wrap = |
}
}

Hier ein weiteres Beispiel mit sys_category und das auslesen einer Kategorie in Verbindung mit Bootstrap col´s

lib.pageCategories = CONTENT
lib.pageCategories {
	table = sys_category
	select {
		languageField = sys_language_uid
		pidInList = 16
		selectFields = sys_category.title
		join = sys_category_record_mm ON sys_category.uid = sys_category_record_mm.uid_local
		where = sys_category_record_mm.tablenames = "pages" AND sys_category.parent = 1
		andWhere.field = uid
		andWhere.intval = 1
		andWhere.wrap = sys_category_record_mm.uid_foreign=|
		orderBy = sys_category.sorting

		max = 1
	}
	renderObj = CASE
	renderObj {
		key.field = uid

		2 = TEXT
		2.value = col-sm-6 col-md-6

		3 = TEXT
		3.value = col-sm-3 col-md-3

		4 = TEXT
		4.value = col-sm-3 col-md-3 no-image

		default = TEXT
		default.value = col-sm-3 col-md-3

	}

	stdWrap.ifEmpty.cObject = TEXT
	stdWrap.ifEmpty.cObject.value = col-sm-3 col-md-3
}

hier wird nun die ausgewählte Kategorie ausgelesen und kann perfekt weiter verwendet werden.
Kann noch erweitert werden mit z.B.: “separator = ,” oder “removeEmptyValues = 1”

Bitte postet mir Eure Erfahrungen und Snippets im Bereich “sys_category” ! Vielen Dank.

Eure Meinung zu dem Artikel ist gefragt! Schreibt mir ein Kommentar

Hat Euch der Artikel weitergeholfen oder gefallen?
Ich freue mich auf einen Blick auf meine Amazon-Wunschliste. Vielen Dank!

Hat Euch der Artikel weitergeholfen oder gefallen? Ich freue mich auf einen Blick auf meine Amazon-Wunschliste. Vielen Dank!Ich bin freiberuflicher TYPO3-Entwickler, Web-Entwickler und Frontend-Entwickler. Ich arbeite im und für das Web etwas mehr als 12 Jahre. Mehr Infos zu der TYPO3 Internetagentur - INGENIUMDESIGN.

Leave a Reply

Captcha * Time limit is exhausted. Please reload CAPTCHA.

27 Kommentare

  1. Chris

    Ach und noch etwas, wenn ich die Kategorie als CSS-Klasse ausgeben möchte, ist es auch möglich nicht nur die Unterkategorie sondern zusätzlich auch die Elternkategorie auszugeben?

  2. Chris

    Hallo zusammen!
    Ist es denn möglich nur die Unterkategorien einer bestimmten ID auszugeben? Beispielsweise alle Unterkategorien der ID 1 oder alternativ die Struktur zu verschachteln?
    Wäre über jeden Tipp dankbar! 🙂

    Grüße,
    Chris

    – Hauptkategorie 1 (ID 1)
    –– Unterkategorie 1 der Hauptkategorie 1 (ID 2)
    –– Unterkategorie 2 der Hauptkategorie 1 (ID 3)
    – Hauptkategorie 2 (ID 4)
    –– Unterkategorie 1 der Hauptkategorie 2 (ID 2)
    –– Unterkategorie 2 der Hauptkategorie 2 (ID 6)

    Hauptkategorie 1

    Unterkategorie 1 der Hauptkategorie 1

    Hauptkategorie 2

  3. Pingback: sys_category.title um tt_content.image.20 wrappen

  4. poste auf jeden Fall mal einen Status. Würde mich freuen! Danke

  5. Hi

    Nach zwei Tagen wildem “Kategorienauslesen” würde es mich freuen, wenn quasi als OP zu diesem Thema einmal auf folgenden Thread schauen könntest: http://stackoverflow.com/questions/28516829/how-to-get-page-categories-in-typoscript-and-use-with-tx-news

    Der Usecase: Redaktor vergibt Kategorien in tx_news, und kategorisiert dann auch Seiten (sind ja dieselben sys_categories. Per TS werden dann auf allen Seiten zu den Seitenkategorien passende News ausgegeben.

    Bei mir hat nichts funktioniert an allen herumschwirrenden Beispielen, ausser meiner eigenen Antwort (bei der ich später noch eine Variante mit “RECORDS” ausprobieren will). Was hältst du davon?

    Und: weisst du, ob es schon ein forge-Ticket zu dem Thema gibt? Die sys_categories sollten doch per getText zu holen sein, ohne MySQL-Übungen.

    Kategorische Grüsse
    Urs

  6. ich habe mal ein neues BSP eingefügt wo ich Bestimmte Kat´s ID auslesen könnt. D.h. man kann damit auch von einer bestimmten Kat alle Unter-Kat´s auslesen.

  7. kinge

    Hi,

    vielen Dank für deinen Post, hat mir sehr weitergeholfen. Ich habe eine Liste von Kategorien erstellt, in der die kategorisierten Seiten untergeordnet dargestellt werden:
    lib.categorylist = COA
    lib.categorylist {
    10 = CONTENT
    10 {
    table = sys_category
    select {
    pidInList = 54
    orderBy sys_category.uid
    selectFields = title
    }
    renderObj = COA
    renderObj{
    10 = TEXT
    10 {
    field = title
    wrap = |
    }
    20 = CONTENT
    20 {
    table = sys_category
    select {
    uidInList.field = uid
    pidInList = 54
    leftjoin = sys_category_record_mm ON (sys_category.uid = sys_category_record_mm.uid_local) JOIN pages ON (sys_category_record_mm.uid_foreign = pages.uid)
    where = (tablenames = ‘pages’)
    orderBy = sys_category.sorting
    }
    renderObj = COA
    renderObj{
    10 = TEXT
    10 {
    field = title
    typolink.parameter = {field:uid}
    typolink.parameter.insertData = 1
    wrap = |
    }
    wrap = |
    }
    wrap = |
    }
    wrap = |
    }
    }
    wrap = Kategorisierte Seiten|
    }

    Bei den Kategorien werden aber Unterkategorien auf der gleichen Ebene angezeigt. Hast du einen Tipp, wie ich hier die Kategoriestruktur abgebildet bekomme?

    Besten Dank und viele Grüße!

  8. Klaus

    …natürlich falsch, es wird die “uid_foreign” der Tabelle “sys_category_record_mm” ausgegeben.

    Hat jemand eine Idee, wie ich an die “uid” der Tabelle “sys_categorie” rankomme? Mit “field = title” klappts, aber mit “field = uid” nicht.

  9. Klaus

    ….natürlich falsch, es wird nicht die Anzahl sondern die “uid_foreign” der Tabelle “sys_category_record_mm” ausgegeben.

    Hat jemande eine Idee wie ich an die uid der tabelle “sys_category” komme? Mit “field = title” klappts ja auch….

  10. Klaus

    Hallo zusammen!
    Kann ich auch die uid der Kategorie richtig auslesen?
    So kriege ich nur die Anzahl der Kategorien als Schleife!? “4,4,4,4,”

    renderObj = TEXT
    renderObj {
    field = uid
    wrap = |
    stdWrap.wrap = |,
    split {
    token = ,
    token.noTrimWrap = || |
    }
    }

  11. Die Email steht unter “Kontakt”
    Viele Grüße

  12. Martin

    Hallo,
    auf Gist habt Ihr versucht, die ID-Tags mehrerer Kategorien einzubinden. So wie es dort geschrieben steht, geht es nicht:
    renderObj = TEXT
    renderObj {
    field = title
    wrap = |
    stdWrap.wrap = |,
    split {
    token = ,
    token.noTrimWrap = || |
    }
    }

    statt dessen funktioniert:
    renderObj = TEXT
    renderObj {
    field = title
    wrap = |
    noTrimWrap = || |
    }

    Danke für den Rest des Codes.

    Eine Frage noch: Wäre es möglich, in TS den Rückgabewert über eine IF-Abfrage auszuwerten? Ich stelle mir soetwas vor wie: Binde einen RECORD nur ein, wenn er die gleiche Kategorie hat wie die Seite …

    Viele Grüße
    Martin

  13. Zabinetta

    Hi,
    Hat jemand von euch schon media-Kategorien von sys_file ausgelesen? In TYPO3 6.1 ? Oder weiß ob das mit Typoscript überhaupt geht?
    Das Problem dabei ist vermutlich, daß sowohl sys_file als auch sys_category in der Rootpage (pid=0) liegen….

    Mein Stand ist momentan (zeigt nichts an):
    tt_content.uploads.20.renderObj.30 {
    htmlSpecialChars >
    data = file:current:description
    required = 0
    preCObject = TEXT
    preCObject {
    data = file:current:creator
    wrap = Autor: |
    required = 1
    }
    value = {file:current:description}
    insertData = 1

    postCObject = COA
    postCObject{
    # …..
    30 = CONTENT
    30 {
    table = sys_file
    select{
    uidInList.data = file:current:uid
    ############## hier. RECORDS geht natürlich nicht weil ich da nicht joinen kann
    pidInList = 0
    ################
    selectFields = sys_category.title
    join = sys_category_record_mm ON sys_file.uid = sys_category_record_mm.uid_foreign JOIN sys_category ON sys_category.uid = sys_category_record_mm.uid_local
    where = 1 = 1
    andWhere = sys_category_record_mm.tablenames = ‘sys_file’
    #orderBy = sys_category.sorting
    }
    stdWrap.outerWrap = Kategorie(n): 
    renderObj = TEXT
    renderObj {
    field = sys_category.title
    wrap = |
    }

    }

    }
    }

  14. step

    Hab es aktuell lokal. werde es heut mal umziehen und dir einen admin account einrichten. Danke vorab.

    Zugang sende ich Dir per E-Mail – bitte kurz den Kontakt an mich per E-Mail senden.

    Die Kommentare hier die nicht zielführend sind darfst du gern löschen.

  15. dann müsste ich mir einmal das TYPO3 bei Dir selbst anschauen!

  16. step

    sowohl im Template Setup via TYPO3 Backend gepflegt oder über ausgelagerte .ts Datei beie ANsätze geben hier einzig Tag aus ohne weitere Klasse oder ID

  17. step

    Das gibt hier leider gar nichts im BODY Tag aus.

  18. Sebastian

    genau so geht das bei mir 😉
    https://gist.github.com/stepgit/11017184#comment-1213840

    #Normal Body
    page.bodyTag >
    page.bodyTagCObject >
    page.bodyTagCObject = COA
    page.bodyTagCObject {

    #Kategorie auslesen
    10 = CONTENT
    10 {
    wrap =
    table = pages
    select {
    languageField = sys_language_uid
    uidInList.field = uid
    pidInList = 1
    selectFields = sys_category.title
    join = sys_category_record_mm ON pages.uid = sys_category_record_mm.uid_foreign JOIN sys_category ON sys_category.uid = sys_category_record_mm.uid_local
    where = sys_category_record_mm.tablenames = ‘pages’
    orderBy = sys_category.sorting
    }
    renderObj = TEXT
    renderObj {
    field = title
    }
    }
    }

    wichtig, die pidInList = xx prüfen! Hier die ID angeben, wo die Kategorien abgespeichert sind!

  19. step

    Hi Sebastian,

    vielen Dank aber das klappt hier nicht – es wird kein Wert ausgegeben.

    anbei mal mein Versuch als gist (da hier im Kommentar vermitlich einige Zeichen verbogen/gelöscht werden):
    https://gist.github.com/stepgit/11017184

  20. Sebastian

    schau mal, so hatte ich mir das gedacht:

    #KATEGORIE im body
    page.bodyTag >
    page.bodyTagCObject >
    page.bodyTagCObject = COA
    page.bodyTagCObject {

    #Kategorie auslesen
    10 = CONTENT
    10 {
    wrap =
    table = pages
    select {
    languageField = sys_language_uid
    uidInList.field = uid
    pidInList = 1
    selectFields = sys_category.title
    join = sys_category_record_mm ON pages.uid = sys_category_record_mm.uid_foreign JOIN sys_category ON sys_category.uid = sys_category_record_mm.uid_local
    where = sys_category_record_mm.tablenames = ‘pages’
    orderBy = sys_category.sorting
    }
    renderObj = TEXT
    renderObj {
    field = title
    #stdWrap.wrap = |,
    #split {
    # token = ,
    # token.noTrimWrap = || |
    #}
    }
    }

    }

  21. step

    der erste wrap wurde um das html body tag “beschnitten”

    soll lauten spitze-Klammer-aufbody id”|”spitze-Klammer-zu

  22. step

    setup.ts

    lib.bodyClasses = TEXT
    lib.bodyClasses.value {
    wrap =
    table = sys_category
    select {
    pidInList = 1
    join = sys_category_record_mm ON(sys_category_record_mm.uid_local=sys_category.uid)
    where = sys_category_record_mm.tablenames=’pages’
    andWhere.dataWrap = sys_category_record_mm.uid_foreign = {TSFE:id}
    }
    renderObj = TEXT
    renderObj {
    field = title
    wrap = |
    }
    }

    page.bodyTagCObject = < lib.bodyClasses

    Mein Versuch funktioniert hier leider nicht (es wird kein Wert ausgegeben).

    Auch der LOAD_REGISTER Ansatz war bisher leider nicht erfolgreich.

    Bin für jeden Tipp dankbar.

  23. Sebastian

    das kannst du doch um deinen “wrap” bauen!
    oder Du packst alles in {register:namehier}

  24. step

    ok ich kann nun den jeweils aktiven Kategorienamen (Titel) bspw. im Frontend ausgeben. Danke für den Beitrag bis hier her.

    Aber nun suche ich nach einer Lösung diese Angabe als CSS Klasse (oder wahlweise ID) dem body-Tag mitzugeben.

    Jemand hierzu eine Idee?

  25. Sebastian

    eine gute Frage 😉
    muss ich mir mal anschauen! Aber wenn Du dazu schon vorher eine Lösung findest, kannst Du die uns gerne mitteilen 😉

    Grüße

  26. stefan

    super sache danke.
    gibt es eine möglichkeit die sys_categories im backend auf bestimmte ordner zu beschränken?
    also z.b. in den tx_news werden die ja nun auch verwendet. aber die kategorien will man vielleicht dann nicht für den restlichen seitenbaum verwenden sondern andere.
    gruss
    stefan

Next ArticleTYPO3 - Ausgabe ohne Sonderzeichen und Leerzeichen