📌 MODX Spickzettel
📚 Meine Sammlung von MODX-Snippets usw.
🔄 PARSER (wenn mit ! dann ohne Cache)
- TV →
[[*templatevar]] - Chunk →
[[!$chunk]] - Snippet →
[[snippet]] - Placeholder →
[[+platzhalter]] - Link →
[[~link]] - System-Einstellung →
[[++einstellung]] - Ausklamern →
[[- parser]](Minus deaktiviert den Parser)
MODX Tag Syntax: https://docs.modx.com/current/en/building-sites/tag-syntax
🔁 Wenn User ungleich ID 1 dann Redirect zur Resource 42
if ($modx->user->get('id') != 1) {
$modx->sendRedirect($modx->makeUrl(42)); # goto Errorpage
exit();
}
👤 Name des Users mit der ID 1
$user = $modx->getObject('modUser', 1);
return $user->get('username');
🌐 IP-Adresse
if (isset($_SERVER['REMOTE_ADDR'])) $ipCode = $_SERVER['REMOTE_ADDR']; else $ipCode='0:0:0:0:0:0:0:0';
return $ipCode;
🔒 Nur Admin oder einen bestimmten IP-Bereich zulassen
<?php
# Aufruf im Template: [[!ipEngage? &ipStart=`90.67.111.42` &ipEnd=`90.67.111.47`]]
if (isset($_SERVER['REMOTE_ADDR'])) $ip = $_SERVER['REMOTE_ADDR']; else $ip = "127.0.0.1";
$code = ip2long($ip);
$low = ip2long($modx->getOption('ipStart', $scriptProperties, '127.0.0.1'));
$high = ip2long($modx->getOption('ipEnd', $scriptProperties, '127.0.0.1'));
if ($code <= $high && $code >= $low) {
return;
}
# only if Admin
# elseif ($modx->user->isMember(array('Administrator'))){
# only if UserID=1
elseif ($modx->user->get('id') == '1') {
return;
}
else {
# du kommst hier nicht rein! Weiterleitung auf localhost ;-)
$modx->sendRedirect('http://127.0.0.1/', 0);
}
📺 Wert eines TVs lesen
# $tv_output = $modx->resource->getTVValue('meinTV'); // TV des aktuellen Dokuments, oder:
$doc = $modx->getObject('modResource', 42);
$tv_output = $doc->getTVValue('meinTV');
🗄️ mySQL
SQL-Select Beispiel mit den letzten 42 Einträgen
Reines SQL mit $modx->query() (direkter Ersatz für DBAPI):
$sql = "SELECT *
FROM {$modx->config['table_prefix']}tabelle
WHERE id > 0
ORDER BY id DESC
LIMIT 42";
$result = $modx->query($sql);
if ($result) {
while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
echo 'File: ' . $row['column1'] . "\n- "
. $row['column2'] . "\n- "
. $row['column3'] . "\n- "
. $row['column4'] . '<br />';
}
}
SQL-Abfrage über PDOStatement
$stmt = $modx->query('SELECT * FROM `modx_tabelle` ORDER BY `id` DESC LIMIT 42');
if ($stmt && $stmt instanceof PDOStatement) {
$output .= "<table align='center' border='1' cellspacing='0' cellpadding='5'>";
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$output .= "<tr><td>"
. $row['column1'] . "</td><td>"
. $row['column2'] . "</td><td>"
. $row['column3'] . "</td><td>"
. $row['column4'] . "</td></tr>\n";
}
$output .= "</table>";
}
return $output;
Mehr Info auf: bobsguides.com
oder:
<?php
# Lade eine DB Tabelle in Platzhalter (z.B.: [[+gbtext]]) - Chunk: tplGuestbookForm
$stmt = $modx->query('SELECT * FROM `modx_custom_guestbook` WHERE `gbactive`="1" ORDER BY `id` DESC');
if ($stmt && $stmt instanceof PDOStatement) {
$output = '';
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$output .= $modx->getChunk('tplGuestbookForm', $row, '[[+', ']]');
}
}
return $output;
❌ Delete
<?php
$table = 'modx_custom_test';
$where = 'name=`Mayer`';
$count = $modx->exec("DELETE FROM $table WHERE $where");
return $count . ' Einträge gelöscht!';
🧮 eine MODX Funktion im Snippet
<?php
# Funktion - zähle aktivierte Einträge (oder Summe ;- )
function rnSumRows() {
global $modx; # $modx muss vor Gebrauch einer Funktion definiert werden!
$stmt = $modx->query('SELECT * FROM `modx_custom_guestbook` WHERE `gbactive`="1"');
if ($stmt && $stmt instanceof PDOStatement) {
$sum = '0';
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$sum = $sum + $row['gbactive'];
}
}
return $sum;
}
$gbsum = rnSumRows();
🔢 row count – Beispiel: [[!guestbookQty?active=1]]
<?php
$stmt = $modx->query('SELECT * FROM `modx_custom_guestbook` WHERE `gbactive`='.$active);
if ($stmt && $stmt instanceof PDOStatement) {
$count = 0;
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$count = $stmt->rowCount();
}
}
return $count;
🧩 Template Variablen (TV)
TV ja/nein
[[*meinTV:is=`ja`:then=`Ausgabe1`:else=`Ausgabe2`]]
Gutes TV-Beispiel, um den Seitentitel für jede Resource zu schalten →
Eingabetyp: Optionsschaltfläche
Eingabe-Optionswerte: ja||nein
Standardwert: ja
Dann im Template:
[[*Seitentitel:is=`ja`:then=`<h2>[[*pagetitle]]</h2>`:else=``]]
📅 Events via TV (eventDate) und getResources sortiert ausgeben
[[!getResources? &parents=`[[*id]]` &tpl=`EventsTpl` &limit=`20`
&dateFormat=`%d.%m.%Y` &includeTVs=`1` &sortbyTV=`eventDate` &sortdirTV=`ASC` &sortby=``]]
erforderliche Parameter:
&parents – (string) Komma-aufgeteilt
&tpl – (Chunk-Template)
Info: Wenn ich z.B. nur den Seitentittle haben will, geht das auch gut ohne extra Template:
&tpl=`@INLINE [[+pagetitle]]`
🖼️ Ein Bild per TV + phpthumbof verkleinern + bei Mausklick das Original zeigen
Update: ich benutzte nur noch den Fork pThumb (gleiche Syntax, aber schneller!)
https://extras.modx.com/package/pthumb
<div class="bild">
<a href="[[*tvBild]]" target="_blank"><img style="border: 0pt none;" title="größer ansehen" src="[[*tvBild:phpthumbof=`w=640&zc=1`]]" alt="" /></a>
</div>
oder ohne TV:
src="[[!phpthumbof?input=`assets/images/stories/bild.jpg` &options=`w=640&h=480&zc=1`]]"
Das eigentlich geniale daran ist die Tatsache, dass die Bilder verkleinert im Cache liegen und so die Seite schneller geladen wird. :wink:
🧱 Chunk mit phpthumbof, TV per if-Snippet
[[!If?
&subject=`[[*meineBilder]]`
&operator=`eq`
&operand=``
&then=``
&else=`
<div class="img">
<a href="[[*meineBilder]]" target="_blank"><img style="border: 0pt none;" src="[[*meineBilder:phpthumbof=`w=640&h=480&zc=1`]]" alt="Bild größer ansehen" /></a>
</div>
`
]]
Chunk mit phpthumbof, TV per Output-Filter (ressourcenschonender)
[[*meineBilder:neq=``:then=`
<div class="img">
<a href="[[*meineBilder]]" target="_blank"><img style="border: 0pt none;" src="[[*meineBilder:phpthumbof=`w=640&h=480&zc=1`]]" alt="Bild größer ansehen" /></a>
</div>
`:else=``]]
mehr Infos dazu im Blog von Belafonte:
Image Manipulation with phpThumbOf in MODx Revolution
🔀 if-Snippet – das gleiche geht auch per Output-Filter
Bedingung: wenn Seite ID 1, dann mache das, sonst mache dieses:
[[If?
&subject=`[[*id]]`
&operator=`eq`
&operand=`1`
&then=`mache das`
&else=`mache dieses`
]]
[[*id:is=`1`:then=`mache das`:else=`mache dieses`]]
🎞 Slide-Show aus Bildern von Ressourcen, die ein TV-Image haben (z.B. Banner)
Das jQuery Cycle Lite Plugin gibt es hier: Cycle Lite Plugin
Chunk1 – tplBannerFade
<div class="banneranim">
[[!getResources?
&parents=`1,21,26`
&resources=`1,21,26`
&depth=`1`
&limit=`10`
&includeTVs=`1`
&processTVs=`1`
&tvFilters=`tvBanner==%`
&sortby=`RAND()`
&tpl=`tplBannerAnim`]]
</div>
<script type="text/javascript">
$(document).ready(function(){$('.banneranim').cycle({fx:'fade',speed:2000,timeout:5000,next:'.banneranim',pause:0});});
</script>
Wichtig ist: &tvFilters=`tvBanner==%` – damit werden nur nicht leere TVs angezeigt.
Chunk2 – tplBannerAnim
<img style="border: 0pt none; text-align: center;"
src="[[+tv.tvBanner:phpthumbof=`w=640&h480`]]" alt="" />
🕒 Einen Chunk per Snippet (z.B. Slideshow) jahreszeitlich aufrufen
<?php
# Fällt ein Datum in die Sommerzeit
# 1 bei Sommerzeit, ansonsten 0
if (date("I") == 1) {
$chunk = $modx->getChunk('Slide-Sommer');
}
else {
$chunk = $modx->getChunk('Slide-Winter');
}
return $chunk;
📆 Code nur einmal am Tag ausführen (ungetestet) – z.B. Hintergrundbild wechseln
<?php
# Tage seit Beginn der UNIX-Epoche (1970-01-01 00:00:00 UTC)
$timestamp = time();
$UnixTag = date('U', $timestamp) / 86400;
$UnixTag1 = intval($UnixTag);
$UnixTag2 = $modx->getPlaceholder('UnixTag');
if ($UnixTag1 > $UnixTag2) {
$modx->setPlaceholder('UnixTag', $UnixTag1);
# weiterer Code ...
}
return;
🔁 Eine Variable an eine Resource oder einen Chunk weitergeben
Im Snippet wird die Variable $wert in einen Platzhalter gespeichert, z.B.:
$modx->setPlaceholder('wert', $wert);
Im HTML-Bereich:
[[+wert]]
🧹 Alte Packages entfernen
Installer → Package Management → View Details
Dann im TAB Uploaded Versions die alten Pakete löschen.