Git Product home page Git Product logo

tricks's Introduction

REDAXO-Tricks!

Eine Sammlung nützlicher Tricks zu REDAXO CMS ab Version 5 → friendsofredaxo.github.io/tricks

Diese Website sammelt Lösungen und hilfreiche Code-Beispiele, die es aus verschiedenen Gründen nicht in die REDAXO-Dokumentation geschafft haben. Hier sind sie genau richtig, denn sie können von der Community bearbeitet und ergänzt werden. Wenn du mitmachen möchtest, lies weiter!

REDAXO Screenshots

✋ Mitmachen

  1. Öffne GitHub-Issues mit neuen Tricks, Ideen oder Anregungen
    Als Issue sammeln wir alles, was interessant sein könnte. Es muss noch nicht ausformuliert werden, sondern es reicht, wenn verständlich ist, worum es geht. Als Anregung dienen oft Diskussionen im Slack oder im Forum. Wenn dir also interessante Themen oder Codeschnipsel in die Finger kommen, halte sie gerne in einem Issue fest!
    Issues
  2. Bearbeite vorhandene Inhalte oder stelle neue Tricks ein
    Alle Inhalte dieser Website kannst du bearbeiten, indem du einen Fork des Repos machst, deine Anpassungen vornimmst und sie dann als Pull Request zurück gibst. Das erfordert Kenntnisse im Umgang mit Git und GitHub, aber keine Sorge, die Community hilft immer gerne.
    Tricks bearbeiten 🚀

Wenn du Fragen hast oder Hilfe benötigst, eröffne eine Diskussion auf Github oder melde dich im Slack-Chat. Eine Einladung erhältst du hier: redaxo.org/slack/

Danke! ❤️

tricks's People

Contributors

191977 avatar aeberhard avatar alxndr-w avatar ansichtsache avatar anveno avatar christophboecker avatar crydotsnake avatar cukabeka avatar danspringer avatar darwin26 avatar dependabot-preview[bot] avatar dependabot-support avatar dependabot[bot] avatar dtpop avatar eace avatar elricco avatar imgbot[bot] avatar ingowinter avatar javanita avatar koala avatar madiko avatar marcohanke avatar polarpixel avatar pschuchmann avatar schuer avatar skerbis avatar staabm avatar tbaddade avatar tgoellner avatar tobiaskrais avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tricks's Issues

Guidelines für Sicherheit (Injektions, CSRF, ...)

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.

  1. Ist dies erwünscht? Dann kümmere ich mich um die weitere Ausformulierung.
  2. Wer kann hier noch Themen beitragen. Oft wird ja nicht absichtlich etwas unsicher in Redaxo umgesetzt, sondern mangels besserem Wissen.

SQL-Injection in rex_sql verhindern

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.

CSRF in rex_form, YForm und eigenen Formularen verhindern

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.

Weitere Themen

  • SSL-Zertifikate
  • Passwort-Regeln bearbeiten

rex:ready event

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>.

Vorschlag zur Ergänzung bei Module > Minibeispiele oder Snippets: Autor

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

?>

Geschütze Dateien mit YCom Problem mit .htaccess

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 ...

Copyright Bildquellen - Tutorial mit Modul, das Bildquellen ausgibt

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

  1. nicht rechtsverbindlicher Hinweis, wann und wie Bildquellen angegeben werden müssen. (Eine Möglichkeit: Am Bild, hier vorgeschlagene Möglichkeit: extra Unterseite)
  2. Hinweis, wo im Medienpool Copyright-Infos angegeben werden können / müssen
  3. Modul-Beispielausgabe (siehe unten)
  4. Passendes MedienManager-Profil anlegen
<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>

Unterscheidung nach Benutzergruppen

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?

YForm be_manager_relation select aufhübschen

$('#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.

Notiz: Ändern des Startartikels on the fly

// 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);
}

Rootkategorie "Media" mit aktiviertem yrewrite

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).

Ansatz für ein simples Rewrite-Schema mit Parameter für rex_getUrl

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 EP URL_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).

YForm: Dataset-Export mit richtigen Umlauten für Excel

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.

YForm Pipe Notation Syntax

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' => '...']

Kopieren eines YForm Datensatzes

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>';
}

REDAXO Grundeinstellungen

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:

  • E-Mail-Verschlüsselung
  • Meta Infos
  • out5
  • PHPMailer
  • YForm
  • Multi-Domain (YRewrite oder x-core)

Danke und viele Grüße,
Franziska

REDAXO 5.3 eigene CSS fürs Backend - Workaround

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.

Fehlerbehebung

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?

SVGs werden nicht ausgegeben

Lösung:
Grund ist eine Änderung der .htaccess in REDAXO 5.5. Hier im Zweifel die betroffene Zeile auskommentieren.

Core kann nicht aktualisiert werden

Problem:
image

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`);

YForm kann nicht aktualisiert werden // FOREIGN KEY

Lösung:
Den betroffenen Fremdschlüssel in der Datenbank entfernen.

addons_project_add_own_js_css_files Ergänzung

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.

Yform Hidden Fields

Gregor Schrieb heute auf Slack [5:10 PM]
Für tatsächliche type=hidden-Felder gibt es zwei Möglichkeiten:

  1. $yform->setValueField('hidden', array("termin_bearbeiten","1", 'REQUEST'));
  2. $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)

Frage zu NGINX-Konfiguration für YRewrite

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...

yform: Auf Formulareingaben reagieren

$yf->setValueField('html',['','']);
if (rex_request('iamavalidator','int',0)) {
$yf->setValidateField('empty',['deinzuvalidierendesfeld','{{Bitte füllen Sie alle Felder aus}}']);
}

Code: Warum nur Einrückung statt ```?

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?

YForm + Select + E-Mail-Template + Sprog

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]') ?>


Cheatsheet Snippet 4.1 Style

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:
image
http://webbude.com/files/ooredaxo_41.pdf

Mein Vorschlag ist, sowas auch in den Tricks (oder der Doku) zu bauen.

Guidelines für repository maintainer

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.

diverse Tricks für yform

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"}');

Zu: geschützte Dateien mit YCom

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?

Vorschlag zur Ergänzung bei Module > Minibeispiele oder Snippets: Datum

// 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.

Todo: Die Geheimnisse von tolink()

Was ein Trick werden will

$article->toLink( 
                            [ 'pdf' => '1'
                            ],
                            [
                                'class' => 'menulink',
                                'rel' => '_blank', 
                                'alt' => $name
                                
                            ],'div',
                            [
                                'class' => 'divclass',
                                'title' => $name 
                            ]
  
  );

Template: Aus dem Frontend heraus in den Bearbeiten-Modus gehen

Artikel bearbeiten

<?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 } ?>

Erläuterung

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.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.