Redaxo Tipps und Tricks.

Hier am Anfang stehen die Tipps und Tricks für Redaxo 5

Die Doku ist an der Stelle im Moment noch etwas dürftig, dabei sind die Funktionen hin und wieder ganz hilfreich. Deswegen hier auch mal etwas Basics.

Werte in Modul-Aktionen lesen bzw. schreiben

Die Modul-Aktionen lassen sich ja auf presave, postsave und postview zuweisen. Ich wollte grade mal einen Text säubern, den jemand im Wysiwyg Editor redactor 2 reinkopiert hat und hierfür die Presave Funktion nutzen. Nur … wie komme ich an die Werte und wie schreibe ich diese wieder rein? Redaxo ist oft einfacher als man denkt – wie man an diesem Beispiel sieht:

$thevalue = $this->getValue(1);
// hier alles mit $thevalue machen was man will und dann wieder
$this->setValue(1,$thevalue);

Sprachfelder in yform

Neulich habe ich mit einem recht erfahrenen Redaxo Kollegen ein Projekt zusammen gemacht. Dabei kam etwas für mich erstaunliches zutage: er hat noch nie yform benutzt. Für mich ausgesprochen unverständlich.

Ein immer mal wiederkehrendes Thema sind sprachabhängige Felder in yform. Braucht man das? Naja, hin und wieder ganz praktisch. In xform gab es mal so einen Feldtyp, der hat dann den Inhalt in ein Datenbankfeld geschrieben mit irgendwelchen lustigen Trennern. Das hat zwar funktioniert, war aber nicht unbedingt best practice.

Grundsätzlich ist es sinnvoll mehrsprachige Felder einheitlich zu benennen. Bei mir hat sich shorttext_1 für den Kurztext der Sprache 1, shorttext_2 für den Kurztext der Sprache 2 usw. bewährt. Man muss natürlich, wenn eine Sprache dazu kommt, für diese Sprache die Felder in yform zusätzlich anlegen. Eine Alternative dazu wäre eine Sprachreferenztabelle und die Inhalte in eine eigene Tabelle auszulagern, dann mit dem entsprechenden Sprachfeld versehen. In den meisten Fällen ist das aber gar nicht notwendig und sinnvoll.

Im Ausgabemodul (oder wo auch immer man die Werte braucht), greift man dann per SQL ungefähr so auf die jeweiligen Werte zu:

$qry = ‘SELECT name_’.rex_clang::getCurrentId().’ name, ‘ . ‘shorttext_’.rex_clang::getCurrentId().’ shorttext FROM meinetabelle’;

Wenn also alle Felder in den vielen Sprachen in yform angelegt sind, kann es im Backend bei der Eingabe leicht etwas unübersichtlich werden. Bei vier Feldern und fünf Sprachen wären das dann 20 Felder. Wie wäre es also mit einem einfachen Sprachumschalter? Genau das macht der untenstehende Code. Diesen Code ganz einfach in ein erstes HTML Element der yform Felddefinitionen einsetzen und schon hat man eine feine Sprachumschaltung. Die Buttons muss man natürlich für die eigene Sprachdefinition noch entsprechend benennen.

Auch dieses Praxisbeispiel zeigt mal wieder: yform kann zwar nicht alles, aber ist mit einfachen Mitteln auf die eigenen Bedürfnisse erweiterbar und anpassbar.

<p style="margin: 10px 0">
<button type="button" value="1" class="langswitch">Deutsch</button>&nbsp;&nbsp;&nbsp;
<button type="button" value="2" class="langswitch">Englisch</button>&nbsp;&nbsp;&nbsp;
<button type="button" value="0" class="langswitch">Alle</button>
</p>
<script type="text/javascript">
$(document).on('click', 'button.langswitch',function() {
if ($(this).val() == "0") {
$(".form-group").show();
} else {
$(".form-group[id$=_1]").hide();
$(".form-group[id$=_2]").hide();
$(".form-group[id$=_"+$(this).val()+"]").show();
}
});
</script>

Ab hier fangen die Tipps und Tricks für Redaxo 4 an.

Onlinestatus auf eine andere Sprache übertragen.

Im Redaxo wurde eine neue Sprache angelegt und die Inhalte wurden eingefüllt oder übertragen. Nun soll auch der Status online/offlne der Artikel synchronisiert werden. Hier hilft ein Griff in die Datenbanktrickkiste. Mit folgendem Skript lässt sich der Status von der Sprache mit der Id 0 (meistens die Standardsprache) auf die Artikel mit der Sprach Id 1 übertragen:

UPDATE rex_article t1 
INNER JOIN rex_article t2 ON
t2.id = t1.id
AND t1.clang = 1
SET t1.status = t2.status
WHERE t2.clang = 0;

… und – bevor es vergessen wird. Vor jeder (!), aber wirklich absolut jeder Manipulation an der Datenbank legen wir natürlich eine Sicherheitskopie an – nur so als Hinweis.

Ersten und letzten Slice einer Serie bestimmen.

Es kommt hin und wieder vor, dass man aus einer Reihe von Modulen eine Liste oder eine Galerie bauen will. Vor bzw. hinter der Liste soll ein bestimmter Code stehen. Aber wie bekommt man nun raus, ob es der erste oder der letzte Slice einer Gruppe ist? Man kann natürlich ein Anfangselement setzen und ein Endelement. Das ist aber fehlerträchtig, nicht jeder unbedarfte Redakteur kann damit umgehen und ruckzuck ist die ganze Seite zerschossen.

Hier mal ein Vorschlag zur Lösung der Problems:

$isFirst = false;
$isLast = false;
if (!isset($sliceLoop)) {
$sliceLoop = 1;
$isFirst = true;
}
$currentSlice = OOArticleSlice::getArticleSliceById("REX_SLICE_ID");
$nextSlice = $currentSlice->getNextSlice();

if (!is_object($nextSlice) || $nextSlice->getModulId() != "REX_MODULE_ID") {
$isLast = true;
unset($sliceLoop);
}

Modulabhängiges Javascript.

Javascript ins Template oder ins Modul? Im Modul ist es nicht besonders hübsch. Außerdem müsste man jQuery am Anfang der Seite laden, wenn das Modul jQuery nutzt.

Der Trick ist einfach:

Am Fuss kommt ins Template folgender Code:

<?php if (isset($REX['JS'])) { foreach ($REX['JS'] as $js) echo $js; } ?>

Dann kann man im Modul beispielsweise schreiben:

$REX['JS']['NIVOLIGHTBOX'] = '<script type="text/javascript"> $(document).ready(function(){ $(\'.gallery a\').nivoLightbox({ effect: \'fade\' }); }); </script>';

und alles wird gut.

Selectfeld in Redaxo Modul

Beispielcode für Copy and Paste …

<?php
$options = array('bald'=>'schon bald','akutell'=>'aktuell','vorbei'=>'vorbei');
?>
Bereich<br>
<select name="VALUE[1]" size="3">
<?php foreach ($options as $k=>$v) : ?>
<option value="<?php echo $k; ?>"<?php if ($k == "REX_VALUE[1]") echo ' selected="selected"' ?>><?php echo $v; ?></option>
<?php endforeach ?>
</select><br><br>

Spamschutz mit xForm per Honeypot

Formularspam ist ein Ärgernis. Auch Captchas lösen das Problem nicht – und sind auch ein Ärgernis. Recht gut bewährt sich seit Jahren der Honeypot (Honigtopf). Dabei wird ein Formularfeld per CSS ausgeblendet. Wenn in diesem Formularfeld etwas drin steht, wird die Mail nicht zugestellt. In Redaxo lässt sich das mit xForm sehr komfortabel lösen.

Zunächst braucht man ein Versandprogramm. Hierzu verwenden wir addons/xform/plugins/email/classes/action/class.xform.action_db2email.inc. Dieses kopieren wir an die gleiche Stelle und nennen es z.B. action_bd2email2. Auch die Klasse benennen wir um.

Anschließend kommt vor // ——- find mailto dieser Schnippsel:

// finde nospam label in list
if ($this->getElement(5) != FALSE && $this->getElement(5) != "") {
foreach($this->params["value_pool"]["email"] as $key => $value)
if ($this->getElement(5)==$key) {
if ($value) return true;
}
}

Als Action im Formular schreiben wir dann

action|db2email2|emailtemplate|emailfeld|mail[at]example.com|honeypotfield

Nicht vergessen, das Honeypot Feld per CSS auszublenden und Schluss ist mit Formularspam.