friendsofredaxo / tricks Goto Github PK
View Code? Open in Web Editor NEWTipps und Tricks rund um REDAXO 5
Home Page: https://friendsofredaxo.github.io/tricks/
License: MIT License
Tipps und Tricks rund um REDAXO 5
Home Page: https://friendsofredaxo.github.io/tricks/
License: MIT License
Wie schützt ihr Websites, die noch nicht online sein sollen, aber für den Kunden erreichbar / sichtbar? Via htpasswd? Gibt's da evtl. ein Addon/Klasse/Codeschnippsel, mit dem das bei euch automatisch im Projekt landet?
In kleinen Viewports gibt es aktuell keine Möglichkeit, per Klick zur Startseite zurück zu gelangen.
Würde an der Stelle noch gut passen.
zeile 188
ALT
$anchor = $this->buildAnchor((int) ($this->total / $this->limit), $this->text['last']);
NEU
$anchor = $this->buildAnchor(ceil($this->total / $this->limit), $this->text['last']);
Hintergrund: Ich will, dass in einer schönen Url verschiedene Get-Parameter auf dem einen Artikel abgebildet werden
Thomas Blum [1 month ago]
Du könntest dir da was selber umsetzen … Hänge dich an den URL_REWRITE
und wandel dann die Params um.
Thomas Blum [1 month ago]
Das ist der Part wie es früher in R4 passierte
https://github.com/redaxo/redaxo4/blob/24d34c7b95a9cb948dde5c5d630eb09d9ee3008a/redaxo/include/addons/url_rewrite/classes/class.rewrite_fullnames.inc.php#L110-L127
// konvertiert params zu GET/REQUEST Variablen
if($this->use_params_rewrite)
{
if(strstr($path,'/+/'))
{
$tmp = explode('/+/',$path);
$path = $tmp[0].'/';
$vars = explode('/',$tmp[1]);
for($c=0;$c<count($vars);$c+=2)
{
if($vars[$c]!='')
{
$_GET[$vars[$c]] = $vars[$c+1];
$_REQUEST[$vars[$c]] = $vars[$c+1];
}
}
}
}
Cukabeka [1 month ago]
Danke Dir - aber ich brauche ja 2 stellen, einmal bei rex_getUrl, damit die ++ in die URL reinkommen, und dann beim Interpretieren des Aufrufes.. Leider weiß ich das Snippet nicht so recht zu deuten, wie ich das damit hinbekommen könnte @thomas.blum
Cukabeka [1 month ago]
Und wohin damit dann? project addon als YREWRITE klasse? :thinking_face:
Thomas Blum [1 month ago]
Wieso Yrewrite?
aber ich brauche ja 2 stellen, einmal bei rex_getUrl
Das ist der EPURL_REWRITE
die zweite Stelle machst du wie das Url addon da hängst du dich an den EP YREWRITE_PREPARE
vom yrewrite addon. der wird aufgerufen, falls es zu der url keinen artikel gibt. an der stelle gibst du dann ein array zurück
[‘article_id’ => deine-id, ‘clang’ => deine-clang];
die restlichen params an der url setzt du dann in das $_GET
Thomas Blum [1 month ago]
das yrewrite addon selber brauchst du nicht zu erweitern
Thomas Blum [1 month ago]
URL_REWRITE
> Url als /artikel/key/value/
zurückgeben
YREWRITE_PREPARE
> die Url auflösen und dann article-id und clang-id zurückgeben, damit redaxo weiß welcher artikel aufgerufen werden soll
Stefan Cukabeka [1 month ago]
Danke Dir nochmal Thomas - ich merke, beim Thema EP habe ich null Ahnung. Wüsste nicht, wo ich jetzt mit den Infos starten sollte. Eine Klasse in den Project-Ordner legen?
Thomas Blum [1 month ago]
Ich schreib da nachher oder morgen mal was
Thomas Blum [1 month ago]
Das nachfolgende kannst du in die boot.php des project addons legen.
Jetzt müsstest du das Auswerten und das Schreiben der Urls umsetzen
<?php
\rex_extension::register('YREWRITE_PREPARE', function (\rex_extension_point $ep) {
// aufgerufene Url holen und auswerten
// wenn übergebene params enthalten sind, diese in $_GET und $_REQUEST speichern
// diese stehen dann in deinen Skripten über rex_get() bzw. rex_request() zur Verfügung
dump($ep);
$articleId = null;
$clangId = null;
return ['article_id' => $articleId, 'clang' => $clangId];
}, \rex_extension::EARLY);
rex_extension::register('PACKAGES_INCLUDED', function (\rex_extension_point $epPackagesIncluded) {
rex_extension::register('URL_REWRITE', function (\rex_extension_point $ep) {
// params auswerten
// und deine Url /article/param-key/param-value/ zurückgeben
dump($ep);
$url = '';
return $url;
}, rex_extension::EARLY);
}, rex_extension::EARLY);
Noch nicht fertig, aber ein Ansatz, um dieses Thema zu lösen (und ggf in ein Addon zu stecken).
Danke Thomas für deinen Einsatz!
Wie darf ich verstehen, dass nicht nach Benutzergruppen unterschieden wird. Haben alle angemeldeten Benutzer Zugriff auf die Daten? Ist es Aufwändig, das ganze nur für eine bestimmte Benutzergruppe freizuschalten? Gerne auch manuell im Code?
Und zu guter letzt. Laut Jan steht auth_media in der Community auf dem Programm. Ist dein Trick hier ein "Alternative" dazu oder ist es sinniger später auf Auth_Media umzusteigen?
Wir haben ein kleines Modul gebastelt, das Bilder auf einer Seite "Bildquellen" ausgibt, wenn diese einen Copyright-Hinweis haben. Wäre das was für die Tricks?
Inhalt des Tutorials
<section class="modul modul-text modul-copyright" id="modul-REX_SLICE_ID">
<div class="wrapper">
<?php
$images = array_filter(rex_sql::factory()->setDebug(0)->getArray('SELECT * FROM rex_media WHERE med_copyright != ""'));
foreach($images as $image) {?>
<div class="layout-wrapper">
<div class="content-wrapper">
<div class="modul-text-content">
<p><?php if($image['title']) { echo $image['title']; } else { echo "Ohne Titel"; } ?></p>
<p><?php echo $image['filename']; ?></p>
<p><?php echo $image['med_copyright']; ?></p>
</div>
<div class="image-wrapper image-right">
<div class="image-col">
<img src="/images/copyright_thumb/<?php echo $image['filename'];?>">
</div>
</div>
</div>
</div>
<?php } ?>
</div>
</section>
Die Kurzerklärung zum select Element lautet:
select|name|label|Frau=w,Herr=m|[no_db]|defaultwert|multiple=1|selectsize
Wenn ich hier zum Beispiel nur name, label, felder und dann noch multiple setzen will, kann ich statt
select|name|label|Opt1=opt1,Opt2=opt2,Opt3=opt3|||1
auch das schreiben:
select|name|label|Opt1=opt1,Opt2=opt2,Opt3=opt3|#multiple:1
die Zwischen-Pipes kann ich weglassen, weil ich mit der #
-Notation Keys angebe, die von YForm unabhängig von ihrer Position erkannt werden.
Es lassen sich auch mehrere Attribute hinzufügen:
text|geburtstag|Geburtstag*|#required:required|#grid:,datepicker
YForm lässt über die Notation # + Attributname
nur bestimmte Attribute zu (z.B. ['placeholder', 'autocomplete', 'pattern', 'required', 'disabled', 'readonly']
für ein input[type="text"]
. Wenn das nicht ausreicht kann man über #attributes:{"json":"objekt"}
alle möglichen Attribute setzen:
select|anrede|Anrede*|Bitte wählen=,Frau=Frau,Herr=Herr|#attributes:{"required":""}
text|vorname|Vorname*|#attributes:{"required":"","autofocus":"","placeholder":"zb Willi"}
Beispielformular
select|anrede|Anrede*|Bitte wählen=,Frau=Frau,Herr=Herr|#attributes:{"required":""}
text|vorname|Vorname*|#attributes:{"required":"","autofocus":""}
text|nachname|Nachname*|#attributes:{"required":""}
text|strasse_nr|Straße & Nr*|#attributes:{"required":""}
text|plz_ort|PLZ & Ort*|#attributes:{"required":""}
text|geburtstag|Geburtstag*|#grid:,datepicker|#attributes:{"required":"","data-yearrange":"c-100:c"}
email|email|E-Mail*|#attributes:{"required":""}
checkbox|irgendwasakzeptiert|Hiermit aktzeptiere ich irgendwas|#attributes:{"required":""}
submit||Chaka!
action|showtext|Danke fürs Mitmachen|<p class="form_success">|</p>|0
action|tpl2email|name_des_emailtemplates||[email protected]
Die #-Notation ist nicht auf Attributes beschränkt sondern funktioniert mit jedem Key. Auch das Label könnte man damit an eine beliebige stelle setzen:
|#label:Foo|
Man könnte also nur noch benannte keys nutzen:
text|#name:first_name|#label:Vorname|#...
oder eben auch:
text|#label:Vorname|#name:first_name|#...
Man kann so übrigens auch eigene Keys hinzufügen, und die dann im eigenen Template auslesen. Man braucht dazu also die Value-Klasse nicht anfassen.
Ist übrigens nichts Pipe-spezifisches, auch wenn man YForm über PHP nutzt kann man beide Varianten nutzen:
['first_name', 'Vorname']
(unbennant, Reihenfolge ist wichtig)
['name' => 'first_name', 'label' => 'Vorname']
(mit Keys, Reihenfolge ist egal)
|first_name|Vorname|
und |#name:first_name|#label:Vorname|
werden 1:1 in die beiden obigen PHP-Varianten übersetzt.
Und man kann aber eben auch beides mischen:
Pipe: |first_name|Vorname|#attributes:...|
PHP: ['first_name', 'Vorname', 'attributes' => '...']
Memo für mich aus Slack via @tbaddade
ich habs grad heute so gelöst aber halt mit radios
select|key|Label|{{ option.1 }}=1,{{ option.2 }}=2
im ytemplate dann
<?= sprogcard('option.REX_YFORM_DATA[field=key]') ?>
Alternativen? Vorschläge zum Aufbau?
Ich muss leider noch was melden ;-(
Mit der Zeile RewriteRule ^/?media/(.*\.(pdf|xlsx|xls|ppt|docx|pptx|rar|mpp|eps|txt|rtf|pub|pubx|doc|zip))$ /index.php?fileName=$1 [L]
in der .htaccess lassen sich keine xls, doc, docx, ... Dateien mehr am iPad Anzeigen. Es sind nur noch wirre Zeichen zu sehen. Nehme ich die Zeile raus, funktioniert alles wieder ...
Siehe … FriendsOfREDAXO/structure_tweaks#27
Könnte auch was für die Trickkiste sein.
Da in R53 die be_styles CSS Rules am Ende stehen, werden die eigenen CSS Rules überschrieben. Vorläufiger Workaround (Danke @tbaddade) zum Einbinden eigener CSS Styles:
rex_extension::register('PACKAGES_INCLUDED', function () {
rex_view::addCssFile($this->getAssetsUrl('deine-styles.css'));
});
Könnte z.B. in der boot.php im /project/ notiert werden.
Anleitung, was man dabei als Entwickler beachten muss und wenn möglich code-snippets.
Merker: In die Doku zu den einzelnen Editoren als FAQ aufnehmen.
[Doku markitUp!-Editor > dort habe ich es bereits vorbereitet]
cheatsheet_rex_article.md
gehört in die Doku und muss komplettiert werden.
// in die Boot deines AddOns setzen
$structureAddon = rex_addon::get('structure');
// $id durch einen Config-Wert oder durch Abfragen ersetzen
$structureAddon->setProperty('start_article_id', $id);
if (rex_request('article_id', 'int') == 0) {
$structureAddon ->setProperty('article_id', rex_article::getSiteStartArticleId());
} else {
$article_id = rex_request('article_id', 'int');
$article_id = rex_article::get($article_id) ? $article_id : rex_article::getNotfoundArticleId();
$structureAddon ->setProperty('article_id', $article_id);
}
R5 nutzt Pjax, deshalb reich der klassische jQuery document:ready
manchmal nicht. Die Alternative dazu ist der rex:ready
Event - der greift immer wenn neuer Content bereit steht, egal ob über Pjax oder nicht.
$(document).on('rex:ready', function (event, container) {
container.find('.selectpicker').selectpicker();
});
das findet sich so zum beispiel im be_style-Plugin. container
ist immer der Container, der ausgetauscht wurde. Initial bei document:ready ist es der <body>
.
https://github.com/FriendsOfREDAXO/tricks/blob/master/redaxo-argumentationshilfe.md in diesem Dokument habe ich mal angefangen, die Vorteile von REDAXO im Vergleich zu anderen CMS zusammenzutragen.
Ergänzungen können von FOR-Mitgliedern direkt bearbeitet werden, nicht-FOR-Mitglieder können hier ihre Erfahrungen und weitere Argumente einfügen, dann werde ich sie in das Dokument schreiben.
todo: Backups
todo: Link im Tricks-Repository einfügen
Eine gute Anlaufstelle um die Sicherheit der Website und des Servers zu überprüfen ist:
https://observatory.mozilla.org/
Hi,
wünsche mir für R5 für die Category, Article, Slice und Media etwas, das an das Cheatsheet im Webbude Style drankommt. Gerade die Auflistung aller API-Calls + ein paar Code-Snippets fand ich so nützlich, dass ich bis R4.7 immer noch das original PDF für R4.1 von @tbaddade zur Hand genommen habe:
http://webbude.com/files/ooredaxo_41.pdf
Mein Vorschlag ist, sowas auch in den Tricks (oder der Doku) zu bauen.
Wenn es auf der Website einen Hauptmenüpunkt "Media" gibt und yrewrite die Url dafür zu http://domain.tld/media/
umschreibt, landet man im Verzeichnis /media
. Um das zu verhindern muss in der .htaccess
die Zeile
RewriteCond %{REQUEST_FILENAME} !-d
entfernt und die Zeile
RewriteCond %{REQUEST_URI} !^redaxo/.*
zu RewriteCond %{REQUEST_URI} !^/?redaxo/?$
geändert werden.
Die zu entfernende Zeile besagt: nicht umschreiben wenn ein existierendes Verzeichnis aufgerufen wird. Die zu ändernde Zeile sorgt dafür, dass beim Aufruf von http://domain.tld/redaxo
trotz der vorher entfernten Anweisung das Verzeichnis redaxo
aufgerufen wird (und man sich somit noch im Backend einloggen kann).
Gerade vom @staabm geschickt bekommen und ich denke auch für REDAXO ein guter Tip wenn man mal größere Seiten mit mehr Cachefiles hat (was gaanz sicher oft existiert)...
Performance Infos
http://symfony.com/doc/current/performance.html#optimizing-all-the-files-used-by-symfony
Ist eher was für die Redaxo-Doku - oder?
https://github.com/FriendsOfREDAXO/tricks/blob/master/templates_navigation-factory.md
Gregor Schrieb heute auf Slack [5:10 PM]
Für tatsächliche type=hidden
-Felder gibt es zwei Möglichkeiten:
$yform->setValueField('hidden', array("termin_bearbeiten","1", 'REQUEST'));
$yform->setHiddenField('termin_bearbeiten', 1)
Ersteres ist ein Value-Field, landet also auch in der DB etc.
Letzteres ist einfach nur ein Hidden-Feld im Formular, womit Yform aber ansonsten nichts weiter macht.
(Hoffe das ist so korrekt, bin mir gerade selbst nicht ganz sicher)
Sobald die Leute sich ein wenig intensiver mit Github beschäftigt haben, werden sie so langsam die grenzen der weboberfläche erkennen und nach erweiterten use-case fragen.
das jquery projekt hat eine nette dokumentation die beschreibt wie man als repository maintainer (also als jemand der eingehende pull requests merged) arbeiten kann. dies beinhaltet z.b. wie man kleinere anpassungen machen kann bevor man merged (in den commits des pull request erstellers), oder wie man commits zusammenfassen kann o.ä.
http://contribute.jquery.org/repo-maintainers-guide/
es gibt mehrere projekte die sowas haben, z.b. auch symfony
http://symfony.com/doc/current/contributing/code/index.html
http://symfony.com/doc/current/contributing/code/patches.html
man könnte sich überlegen ob wir hier ein link verzeichnis pflegen zu "guten resourcen", oder ob man ggf. das beste/nützlichste aus diesen seiten zusammenfasst und ggf. übersetzt.
Ein Kunde bemängelte bei mir gerade falsche Umlaute beim Dataset-Export. Nach etwas längerem Suchen habe ich den Extension-Point YFORM_DATA_TABLE_EXPORT
gefunden, mit dem man die Daten bearbeiten kann, bevor sie in CSV konvertiert werden.
rex_extension::register('YFORM_DATA_TABLE_EXPORT', function(rex_extension_point $params)
{
$subject = $params->getSubject();
foreach ($subject as $key => $row) {
foreach ($row as $column => $value) {
$subject[$key][mb_convert_encoding($column, 'ISO-8859-1')] = mb_convert_encoding($value, 'ISO-8859-1');
}
}
return $subject;
});
Ich müsste das textlich noch etwas feiner ausarbeiten, daher zunächst nur als Issue.
YFom 'widget' mit dem man im modul yform tabelleneinträge a la medialist oder linklist auswählen kann
Eingabe:
REX_YFORM_TABLE_DATA[id=1 output="widget" table="rex_yform_table" field="field_a,'/',field_b"]
Ausgabe
$item = yform_table::query()->findId('REX_VALUE[1]');
text|geburtstag|Geburtstag*|||#required:required|#grid:,datepicker
die Zwischen-Pipes kannst du übrigens weglassen. mit der #
-Notation kann man allgemein einzelne Elemente auch überspringen, da man mit #
die Keys explizit angibt.
text|geburtstag|Geburtstag*|#required:required|#grid:,datepicker
text|vorname|Vorname*|#attributes:{"required":"","autofocus":"","data-yform":"pipe"}
über attributes kann man dem element alles mitgeben was man möchte
das ist in php auch geschmeidig: $f->setValue('text|vorname|Vorname*|#attributes:{"required":"","autofocus":"","data-yform":"pipe"}');
Hallo,
ich fände eine Sammlung kleinerer "Hacks" rund um Grundeinstellungen super. Die Infos sind in der Doku teils sehr verstreut - eine Bündelung wäre super.
Ideen (mit zwei offenen Fragen):
Paginierung für das Backend hochsetzen
Wo im Code des Core? (Antwort interessiert mich auch)
Tipps und Anleitung: https://redaxo.org/doku/master/paginierung
Medien-Pool
Nach Auswahl des Mediums Popup des Medien-Pools automatisch schließen
?
Empfohlene AddOns
Eine Sammlung an AddOns, die - neben den vom System mitgelieferten - geprüft und installiert werden sollten. Ich bin offen, meine Basics sind:
Danke und viele Grüße,
Franziska
-> /_docs/README.md
Bedenken:
Wie groß dürfen Mediadateien sein, damit ich bei
...
$managed_media = new rex_managed_media(rex_path::media($filename));
(new rex_media_manager($managed_media))->sendMedia();
...
keinen Speicherüberlauf bekomme?
$('#yform-formular-tag').find('select').find('option').each(function () {
var $this = $(this);
$this.text($this.text().replace(/\[id=\d+\]/g, ''));
}).end().select2();
Bei den be_manager_relation selects wird im Optionstext id=xx
ausgegeben. Das Snippet entfernt den id Teil und macht danach ein Select2 draus.
Mag das jemand als md-File übernehmen?
Hinweis
Die Zeilen 47 case: 'name'
und 50 case: 'status'
müssten ggf. von Tabelle zu Tabelle angepasst werden. Dort wird dem Feld "name" das Wort " Kopie" angehangen und das Feld "status" wird fest auf "0" gesetzt
<?php
/*
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Start
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Schritt 1
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Diese Datei selbst in das Addon "project" in den Ordner "backend" ablegen
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Schritt 2
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
YForm Feld "php" anlegen und dort diese 3 Zeilen notieren
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
<?php
include (rex_path::addon('project', 'backend/yform_copy.php'));
?>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ENDE
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
*/
$orgTable = rex_request('table_name', 'string', '');
$orgId = rex_request('data_id', 'int', 0);
if (rex_request('copy', 'bool')) {
if ($orgTable != '' && $orgId > 0) {
$sql = rex_sql::factory();
$data = $sql->getArray('SELECT * FROM ' . $orgTable . ' WHERE `id` = :id', ['id' => $orgId]);
if ($sql->getRows() == 1) {
$data = $data[0];
$sql = rex_sql::factory();
$sql->setTable($orgTable);
foreach ($data as $fieldName => $fieldValue) {
switch ($fieldName) {
case 'id':
break;
case 'name':
$sql->setValue($fieldName, 'Kopie ' . $fieldValue);
break;
case 'status':
$sql->setValue($fieldName, '0');
break;
default:
$sql->setValue($fieldName, $fieldValue);
break;
}
}
$sql->insert();
$newId = $sql->getLastId();
}
}
while(@ob_end_clean()){}
$context = rex_context::fromGet();
header('Location: ' . $context->getUrl(['data_id' => $newId, 'func' => 'edit', 'copy' => 0], false));
exit();
}
if ($orgId > 0) {
$context = rex_context::fromGet();
echo '<a class="btn btn-primary pull-right" href="' . $context->getUrl(['copy' => 1]) . '">Datensatz kopieren</a>';
}
Der API URL Parameter ist
index.php?rex-api-call
Hin und wieder in der README falsch notiert
index.php?rex_api_call
Quelle: https://github.com/redaxo/dokumentation/blob/master/create_addon/api/README.md
https://github.com/FriendsOfREDAXO/tricks/blob/master/addons_project_class_pagination.md
Quellcode bitte einrücken.. wie in Vorlage
@alexplusde
In der Vorlage steht:
Code wird einfach nur via Tabs eingerückt
Nicht die ``` verwenden
Warum ist das so? Werden die Inhalte irgendwie geparst und aufbereitet, und der Parser benötigt diese Form von Code-Auszeichnung?
Mag mal jemand erklären, in welcher Form die Inhalte der Tricks überhaupt verarbeitet werden?
Was ein Trick werden will
$article->toLink(
[ 'pdf' => '1'
],
[
'class' => 'menulink',
'rel' => '_blank',
'alt' => $name
],'div',
[
'class' => 'divclass',
'title' => $name
]
);
// Artikel erstellt am
$article_originalDate = rex_article::getCurrent()->getCreateDate();
$article_created = date("d.m.Y", $article_originalDate);
// letzte Aktualisierung
$article_update_originalDate = rex_article::getCurrent()->getUpdateDate();
$article_update = date("d.m.Y", $article_update_originalDate);
update: Fehlerkorrektur bei CreateDate. Danke für den Hinweis Thomas @tbaddade.
Auf Slack:
Frage von Thorben
gibt es evtl. eine saubere Möglichkeit js/css nur dann einzubinden, wenn man sich auf einer Backendseite zu einem spezifischen Addon befindet?
Antwort von Ingo
prüf in der boot.php des addons, ob in der url der parameter page passt
added this PHP snippet: Unbenannt
if (rex::isBackend() && rex_get('page', 'string', '') === 'dein_addon')
{
rex_view::addJsFile($this->getAssetsUrl('dein_addon.js'));
rex_view::addCssFile($this->getAssetsUrl('dein_addon.css'));
}
ist etwas anders als auf https://github.com/FriendsOfREDAXO/tricks/blob/master/addons_project_add_own_js_css_files.md beschrieben. evtl gut, das noch hinzuzufügen.
Ich würde mir wünschen, ein Kapitel dem Thema Sicherheit zu widmen und best practice bezogen auf Redaxo zu veröffentlichen. Dies könnte man zunächst in den Tricks entwickeln und dann gerne auch in die offizielle Doku überführen, wenn ausgereift.
aus Slack notiert:
Falsch:
...->getQuery("SELECT * FROM table WHERE id ='.$_GET['id'].'')
Hier könnte man mit $_GET['id']
eben fiese Sachen injezieren.
Ein bisschen besser, aber immer noch falsch:
...->getQuery("SELECT * FROM table WHERE id ='.rex_request('id', "int", 0).'')
Warum immer noch falsch? Weil das Konstrukt nicht aufgeht, wenn du bspw. einen String erwartest.
Richtig:
...->getQuery("SELECT * FROM table WHERE id =?', array(rex_request('id', "int", 0)))
Ersetzt den Platzhalter ?
mit dem Wert aus dem Array (2. Parameter)
Noch schöner:
...->getQuery("SELECT * FROM table WHERE id =:id', array(":id" => rex_request('id', "int", 0)))
Ersetzt den Platzhalter :id
mit dem Wert aus dem assoziativen Array. So behältst du den besten Überblick, wenn es darum geht, mehrere Parameter zu übergeben. Dabei werden die Werte sauber übergeben und eingesetzt, eine SQL-Injection ist dann nicht möglich.
In Redaxo 5.5 wurde Schutz vor Crosssite-Scripting eingebaut. Hier würde ich mir von @dergel wünschen, ein paar Guidelines an Entwickler zusammenzustellen.
$yf->setValueField('html',['','']);
if (rex_request('iamavalidator','int',0)) {
$yf->setValidateField('empty',['deinzuvalidierendesfeld','{{Bitte füllen Sie alle Felder aus}}']);
}
Das für eine bessere Übersicht führen.
Stattdessen im Beitrag die Autoren nennen?
Fehler, die in SLACK immer wieder gemeldet werden, könnten mit deren Lösung in den Tricks aufgenommen werden, ungefähr so:
Ich habe leider gerade nicht alles zur Hand. Was ist die grundsätzliche Meinung?
Lösung:
Grund ist eine Änderung der .htaccess in REDAXO 5.5. Hier im Zweifel die betroffene Zeile auskommentieren.
Lösung:
Diesen Befehl in der Datenbank ausführen
ALTER TABLE rex_config
DROP PRIMARY KEY,
ADD COLUMN `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `unique_key` (`namespace`,`key`);
Lösung:
Den betroffenen Fremdschlüssel in der Datenbank entfernen.
Ich verwende Plesk: Habe den Proxy Mode - also Apache - ausgeschalten und die Konfiguration in das Feld "Additional Headers" eingetragen. Leider kommt eine Fehlermeldung:
specified header is invalid "#}"
das kommt bei allen Anweisungen mit geschwungenen Klammern.
ausserdem hab ich gesehen, dass die # REWRITE RULE FOR JS/CSS VERSIONING
glaube ich da nicht enhalten ist, oder?
Vielleicht weiß jemand was dazu...
<?php if(rex_backend_login::hasSession()) { ?>
<a href="/redaxo/index.php?page=content/edit&article_id=REX_ARTICLE[field=id]&mode=edit">bearbeiten</a>
<?php } ?>
Als "Quick-and-Dirty-Lösung" zu einer Frontend-Edit-Alternative. Funktioniert nur, wenn man im Backend angemeldet ist.
Das könnte man auch mit Slices, Sidebars und Metadaten machen. Ich verwende das fortan in meinen Templates.
skerbis schrob:
Und dann klären wir wie hier der Workflow abläuft
Autor des aktuellen Artikels auslesen
[ wichtig: Name nicht login! ]
<?php
// Autor
$art_author = rex_article::getCurrent()->getCreateUser(); // den Nutzer auslesen = login-name
// den Nutzer aus der mySQL-DB auslesen = login-name
$user_sql = rex_sql::factory(); // sql-DB aufrufen
$user_sql->setQuery("SELECT name FROM " . rex::getTable('user') . " WHERE login = :login", array(":login" => $art_author)); // aus der sql-DB den Namen des Nutzers auslesen
$author = $user_sql->getValue('name'); // Ausgabe
// Autor (letzte Aktualisierung)
$art_author_update = rex_article::getCurrent()->getUpdateUser(); // den Nutzer auslesen = login-name
// den Nutzer aus der mySQL-DB auslesen = login-name
$user_sql = rex_sql::factory(); // sql-DB aufrufen
$user_sql->setQuery("SELECT name FROM " . rex::getTable('user') . " WHERE login = :login", array(":login" => $art_author_update)); // aus der sql-DB den Namen des Nutzers auslesen
$author_update = $user_sql->getValue('name'); // Ausgabe
?>
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.