🔧 pdoTools
pdoTools – schnelle Alternative für klassische MODX-Snippets
pdoTools kann folgende Extras für MODX Revolution ersetzen:
- pdoResources – schneller Ersatz für
getResources - pdoCrumbs – schneller Ersatz für `BreadCrumb]
- pdoField – schneller Ersatz für
getResourceFieldundUltimateParent - pdoPage – schneller Ersatz für
getPage - pdoMenu – schneller Ersatz für
Wayfinder
siehe auch: docs-pdoTools (englisch)
pdoToos hat mehr Funktionen und ist eine schnellere Alternative zu den anderen Snippets. Daher ist die Syntax nicht immer gleich.
Ein Grund für die Geschwindigkeit ist z.B. dass der Parameter includeTVs in pdoResources kein einfacher Schalter (boolean) ist, um die TV-Abfrage zu aktivieren. Hier gebt ihr die gewünschten TVs an, z.B.:
includeTVs=`tvClass,tvPfad,tvDatum` – es werden also nur geziehlt TVs abgefragt!
🧩 Anwendungsbeispiele
🥖 Brotkrümel (pdoCrumbs)
[[!pdoCrumbs?
&context=`web5`
&depth=`2`
&showHome=`1`
&showAtHome=`0`
&showContainer=`1`
&tplWrapper=`@INLINE <ul class="breadcrumb">[[+output]]</ul>`
&tplCurrent=`@INLINE <li>[[+menutitle]]</li>`
&tpl=`@INLINE <li><a href="[[+link]]">[[+menutitle]]</a></li>`
&outputSeparator=``
]]
🧭 Navigationsmenü (pdoMenu)
[[!pdoMenu?
&context=`web5`
&parents=`0`
&level=`2`
&tpl=`tplBS3.WF.row`
&tplOuter=`@INLINE [[+wf.wrapper]]`
&tplParentRow=`tplBS3.WF.row.parent`
&tplInnerRow=`tplBS3.WF.row.inner`
]]
🧭 Navigationsmenü mit der Anzahl der Kinder
[[pdoMenu?
&context=`web5`
&parents=`0`
&level=`2`
&countChildren=`1`
&tplInner=`@INLINE [[+wrapper]]`
&tplParentRow=`@INLINE <li[[+classes]]><a href="[[+link]]" [[+attributes]]>[[+menutitle]]</a> ([[+children]])</li>[[+wrapper]]`
]]
📄 Inhalte aus den Kindressourcen (pdoResources)
[[!pdoResources?
&context=`web3`
&parents=`[[*id]]`
&tpl=`tplBS3-2Column`
&limit=`0`
&idx=`0`
&includeContent=`1`
&showUnpublished=`0`
&includeTVs=`tvGaleriePfad`
&sortby=`menuindex`
&sortdir=`asc`
]]
Info zur Eigenschaft &idx=`0`:
Bei pdoTools 1.9.7-pl scheint das Festlegen einer Start-IDX nicht zu funktionieren. Bei mir startet diese immer mit einer 1 (bei getResources funktioniert es). Scheint ein Bug zu sein? Habe das derzeit im entsprechenden Template mit einem Output Filter so gelöst:
[[+idx:add=`-1`]]
🧭 Wayfinder mit UltimateParent
[[!Wayfinder?
&contexts=`web2`
&startId=`[[UltimateParent? &topLevel=`1`]]`
&level=`1`
&rowTpl=`tplBS.WF.row`
&outerTpl=`tplBS.WF.outer`
&parentRowTpl=`tplBS.WF.row.parent`
&innerRowTpl=`tplBS.WF.row.inner`
]]
🧭 dasselbe mit pdoMenu und pdoField
[[!pdoMenu?
&context=`web2`
&parents=`[[*id:pdoField=`{"topLevel":1,"field":"id"}`]]`
&level=`1`
&tpl=`tplBS.WF.row`
&tplOuter=`tplBS.WF.outer`
&tplParentRow=`tplBS.WF.row.parent`
&tplInnerRow=`tplBS.WF.row.inner`
]]
oder
[[!Wayfinder? &contexts=`web` &level=`1` &startId=`[[UltimateParent]]` &rowTpl=`wfRow` &hereTpl=`wfHere` &rowIdPrefix=`menu`]]
[[!pdoMenu? &context=`web` &parents=`[[*id:pdoField=`{"topLevel":1,"field":"id"}`]]` &level=`1` &tpl=`wfRow` &tplHere=`wfHere` &rowIdPrefix=`menu`]]
🧱 getResources – Spaltentext aus den Childs parsen
[[*id:is=`42`:then=`
[[!getResources:default=``?
&context=`web2`
&parents=`[[*id]]`
&tpl=`web2tplGrid`
&limit=`0`
&depth=`0`
&includeContent=`1`
&showUnpublished=`0`
&showHidden=`0`
&sortby=`menuindex`
&sortdir=`asc`
]]`:else=``]]
dasselbe mit pdoResources
[[*id:is=`42`:then=`
[[!pdoResources:default=``?
&context=`web2`
&parents=`[[*id]]`
&tpl=`web2tplGrid`
&limit=`0`
&depth=`0`
&includeContent=`1`
&showHidden=`0`
&showUnpublished=`0`
&sortby=`menuindex`
&sortdir=`asc`
]]`:else=``]]
web2tplGrid (Beispiel für Bootstrap 5)
<div class="grid-item col-md-6">
[[+tv.Seitentitel:is=`ja`:then=`<h4>[[+longtitle:default=`[[+pagetitle]]`]]</h4>`:else=``]]
[[+introtext:notempty=`<span class="float-end [[+introtext]]"></span>`]]
[[+content]]
</div>
📅 getResources für aktuelle Events (tvFilters nach Datum)
[[!getResources:default=`Keine Events vorhanden`?
&context=`web`
&parents=`62`
&tpl=`tplEvents`
&limit=`20`
&sortbyTV=`tvEventDateEnd`
&sortdirTV=`asc`
&sortby=``
&includeContent=`1`
&tvFilters=`tvEventDateEnd>=[[!getStrftime? &format=`%Y-%m-%d %H:%M`]]`
]]
dasselbe mit pdoResources
[[!pdoResources:default=`Keine Events vorhanden`?
&context=`web`
&parents=`62`
&depth=`0`
&tpl=`tplEvents`
&limit=`20`
&includeContent=`1`
&showUnpublished=`0`
&includeTVs=`tvEventDateEnd`
&sortby=`tvEventDateEnd`
&sortdir=`asc`
&tvFilters=`tvEventDateEnd>=[[!getStrftime? &format=`%Y-%m-%d %H:%M`]]`
]]
📄 getResources für eine One-Page-Seite (alle Parent-Ressourcen)
[[getResources?
&context=`web6`
&parents=`0`
&limit=`0`
&depth=`0`
&sortby=`menuindex`
&sortdir=`asc`
&includeTVs=`1`
&processTVs=`1`
&includeContent=`1`
&tpl=`web6tplContent`]]
dasselbe mit pdoResources für eine One-Page-Seite
[[pdoResources?
&context=`web6`
&parents=`0`
&resources=`[[pdoMenu:striptags? &context=`web6` &parents=`0` &level=`0` &tpl=`@INLINE [[+id]]`]]`
&depth=`0`
&limit=`0`
&tpl=`web6tplContent`
&includeContent=`1`
&showUnpublished=`0`
&includeTVs=`tvClass,tvClassCol,tvGaleriePfad`
&sortby=`menuindex`
&sortdir=`asc`
]]
Hier muss auch der Parameter &resources angegeben werden, z.B.:
&resources=`351,367,350,349,358,365,370,352`
Ich Liste alle Ressourcen IDs dynamisch mit dem pdoMenu auf.
📄 getResources Pagination mit getPage
[[!getPage:default=`Keine Events vorhanden`?
&context=`web7`
&element=`getResources`
&elementClass=`modSnippet`
&parents=`[[*id]]`
&depth=`0`
&limit=`5`
&tpl=`tplEvents`
&pageVarKey=`page`
&pageFirstTpl=`<li class="control"><a[[+classes]][[+title]] href="[[+href]]">Erste</a></li>`
&pageLastTpl=`<li class="control"><a[[+classes]][[+title]] href="[[+href]]">Letzte</a></li>`
&dateFormat=`%Y-%m-%d`
&includeContent=`1`
&showHidden=`0`
&includeTVs=`1`
&sortbyTV=`tvEventDateEnd`
&sortdirTV=`asc`
&sortby=``
&tvFilters=`tvEventDateEnd>=[[!getStrftime? &format=`%Y-%m-%d %H:%M`]]`
]]
</div>
[[!+page.nav:notempty=`
<div class="paging">
<ul class="pageList">
[[!+page.nav]]
</ul>
</div>
`]]
dasselbe mit pdoResources und pdoPage
[[!pdoPage:default=`Keine Events vorhanden`?
&context=`web7`
&element=`pdoResources`
&parents=`[[*id]]`
&depth=`0`
&limit=`5`
&tpl=`tplEvents`
&pageLimit=`100`
&includeContent=`1`
&showUnpublished=`0`
&includeTVs=`tvEventDateEnd`
&sortby=`tvEventDateEnd`
&sortdir=`asc`
&tplPage=`@INLINE <li><a href="[[+href]]">[[+pageNo]]</a></li>`
&tplPageWrapper=`@INLINE <div class="pagination"><ul class="pageList">[[+first]][[+prev]][[+pages]][[+next]][[+last]]</ul></div>`
]]
[[!+page.nav]]
(habe hier meine eigene ul-Klasse "pageList" eingetragen)
🧩 Parent Title anzeigen
[[getResourceField? &id=`[[UltimateParent]]` &field=`menutitle`]]
dasselbe mit pdoField
[[*id:pdoField=`{"topLevel":1,"field":"menutitle"}`]]
oder
[[!pdoField? &id=`[[*id]]` &field=`pagetitle` &top=`1`]]
🎯 Wenn Parent ID 42 ist, dann tu das
[[*id:pdoField=`{"topLevel":1,"field":"id"}`:is=`42`:then=`
tu das
`:else=`
sonst tu das
`]]
📅 Datum im Template aus pdoResources ausgeben
[[+publishedon:date=`%Y-%m-%d`]]
anstatt wie bei getResources
[[+publishedon:strtotime:date=`%Y-%m-%d`]]