Skip to content

Instantly share code, notes, and snippets.

@jdlx
Last active December 21, 2015 01:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jdlx/6230772 to your computer and use it in GitHub Desktop.
Save jdlx/6230772 to your computer and use it in GitHub Desktop.
Redaxo4 external Addon/Plugin settings drop-in code

redaxo4 ext. settings drop-in code

Allgemein

Settings werden nicht mehr wie gewohnt in der config.inc.php des Addons/Plugins gesaved, sondern – ala rex5 – in einem externen file. Die Trennung von eigentlichem Addon/Plugin Code und user settings birgt diverse Vorteile:

  • Änderungen der settings erfolgen nicht im/am eigentlichen Code des Addons/Plugins, der Code bleibt immer “sauber” (z.b. im Sinne eines VCS)
  • Settings überleben auch ein “Drüberinstallieren” des Addons/Plugins das nicht auf “per file” Basis erfolgt
  • Programmatische Update-Strategien werden erleichtert/ermöglicht:
    • Eine Installer Funktionalität kann “blind” den Addon Ordner austauschen ohne damit die settings zu überschreiben
    • Updates via VCS – z.b. einfaches git pull – sind immer problemloser wenn das eigentliche repos clean (aka unverändert) ist

Konzept/Schema

  • Default settings werden wahlweise in einem eigenen file oder direkt in der config notiert – sie dienen als Default
  • Das eigentliche settings file wird im Verzeichnis ./redaxo/include/data/ADDONNAME/ADDONNAME.settings.php gelagert (rex5 Pfadschema)
  • Änderungen der settings werden nur in das externe file geschrieben
  • Im Addon/Plugin wird das ext. user settings file – sofern vorhanden – nach den default settings included und überschreibt diese (merge)
  • Das settings file wird on save der settings ad hoc erstellt

Drop-in Code

Der erforderliche Code um dies umzusetzen hängt davon ab wie das jeweilige Addon seine settings handhabt, ist i.d.r aber relativ trivial.
Für Addons die nach dem klassischen rex Konzept ihre settings in der config.inc.php schreiben siehe nachfolgenden generischen Code..

<?php
// ....
// DEFAULT SETTINGS (vormals der "DYN" Block..)
////////////////////////////////////////////////////////////////////////////////
$REX["ADDON"][$mypage]["settings"]['foo'] = '0';
$REX["ADDON"][$mypage]["settings"]['bar'] = '1';
// ...
// EXTERNAL USER SETTINGS
////////////////////////////////////////////////////////////////////////////////
$user_prefs = $REX['INCLUDE_PATH'].'/data/addons/'.$mypage.'/'.$mypage.'.settings.php';
if(file_exists($user_prefs)) {
require_once $user_prefs;
}
// ....
<?php
/**
* XYZ Addon settings page
*/
// ...
// SAVE SETTINGS
////////////////////////////////////////////////////////////////////////////////
if($func == 'save_settings') {
$settings = rex_request('settings', 'array');
$user_prefs = $REX['INCLUDE_PATH'].'/data/addons/'.$mypage.'/'.$mypage.'.settings.php';
$content = '<?php'.PHP_EOL.PHP_EOL;
$it = new RecursiveIteratorIterator( new RecursiveArrayIterator($settings) );
foreach ($it as $k => $v) {
$path = '['.var_export(stripslashes($k), true).']';
$depth = $it->getDepth();
while($depth > 0) {
$depth--;
$path = '['.var_export(stripslashes($it->getSubIterator($depth)->key()), true).']'.$path;
}
$content .= '$REX["ADDON"]["'.$mypage.'"]["settings"]'.$path.' = '.var_export(stripslashes($v), true).';'.PHP_EOL;
}
if(!file_exists(dirname($user_prefs))) {
mkdir(dirname($user_prefs), $REX['DIRPERM'], true);
}
if(rex_put_file_contents($user_prefs, $content)){
echo rex_info('Settings save.');
include $user_prefs;
}else{
echo rex_warning('Failed to save settings..');
}
}
// ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment