Skip to main content

📌 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 ManagementView Details
Dann im TAB Uploaded Versions die alten Pakete löschen.