je suis en plein dans Modx revo actuellement j'ai pas testé cmsmadesimple
Si j'ai choisi Modx c'est parce que j'aime bien le système de séparation templates( juste html+balises templates) / programmes.
La gestion de groupes et d'utilisateurs native ( avec des permissions très détaillées, très poussé comme système ... le plus ardu à saisir en fait mais le plus puissant que j'ai vu ...) , pour le site communal que je suis en train de faire une vraie gestion des groupes d'utilisateurs était primordiale ... cela a laissé beaucoup de cms de côté
La facilité de développement d'addon simple ou compliqué aussi.
Modx Revolution pêche un peu côté extra mais se rattrape rapidement.
Un exemple de plugin ( crée les balises figure et figcaption à partir d'une classe img lors du parsage de la page web avant son rendu ) :
<?php
/**
* Create tag figure from tag image, start from source code of Directresize
*
* @package img2figure
*---------------------------------------------------------------
* api modx utilisées :
* modx->lexicon->load(lexique);
* modx->event;
* modx->resource
//héritage xpdo
* modx->getOption(option,tableau d'options prioritaire,valeur par défaut) // il est possible de redéfinir les options pour : une ressource, un utilisateur ...
*/
$modx->lexicon->load('img2figure:default');
$classe = $modx->getOption('img2figure.cssclass',null,'photo');
$legende= $modx->getOption('img2figure.legende',null,0);
// legende : 0 = valeur du alt pour figcaption
// legende : 1 = valeur du title pour figcaption
// legende : 2 = valeur alt+title
$e = &$modx->event;
switch ($e->name) {
case "OnWebPagePrerender":
$o = $modx->resource->_output;
//print_r('1'.$o.'2');
$reg = "/<img[^>]*>/";
preg_match_all($reg, $o, $imgs, PREG_PATTERN_ORDER);
for($n=0;$n<count($imgs[0]);$n++) {
//-----------------------
//-----------------------
$img = $imgs[0][$n];
preg_match("/class *= *[\"|'][^\"']*[\"']/",strtolower($img),$array);
if ($array[0] <> "") {
$baliseclass=$array[0];
}
preg_match("/$classe/",$baliseclass,$verif_light);
if ($verif_light[0] == $classe) {
$alt = "";
$title = "";
$style = "";
preg_match("/(style|Style|STYLE) *= *[\"|'][^\"']*[\"']/",$img,$array);
if ($array[0] <> "") {
$style = $array[0];
}
preg_match("/(alt|Alt|ALT) *= *[\"|'][^\"']*[\"']/",$img,$array);
if ($array[0] <> "") {
$alt = preg_replace("/alt *= *[\"|']/ui","",$array[0]);
$alt = preg_replace("/[\"']*/ui","",$alt);
$alt = trim($alt);
}
preg_match("/(title|Title|TITLE) *= *[\"|'][^\"']*[\"']/",$img,$array);
if ($array[0] <> "") {
$title = preg_replace("/title *= *[\"|']/ui","",$array[0]);
$title = preg_replace("/[\"']*/ui","",$title);
$title = trim($title);
}
if ($alt <> "" || $title <> "") {
if ($legende <> 1) $figcaption = $alt;
if (($legende ==2) && $alt <> "" && $title <> "") $figcaption .= "<br />";
if (($legende>0) && $title <> "") $figcaption .= "$title";
} else {
$figcaption = "";
}
$img=str_replace($style,'',$img);
$balisefigure ="<figure class=\"$classe\" $style>$img<figcaption>$figcaption</figcaption></figure>";
$o = str_replace($imgs[0][$n],$balisefigure,$o);
}
####################################
}
$reg = "#(<p.*?>)(.*?)(</p>)#";
preg_match_all($reg, $o, $p, PREG_PATTERN_ORDER);
for($n=0;$n<count($p[0]);$n++) {
$reg = "#(<figure.*?>)(.*?)(</figure>)#";
preg_match_all($reg, $p[2][$n], $fig, PREG_PATTERN_ORDER);
if (count($fig[0])>0) {
$r=preg_replace(array('#<figure #','#</figure>#'),array('</p><figure ','</figure><p>'),$p[0][$n]);
$r=preg_replace('#<p></p>#','',$r);
$o = str_replace($p[0][$n],$r,$o);
}
}
$modx->resource->_output = $o;
break;
default :
return;
break;
}
un petit snippet :
<?php
return date('Y-m-d');
appelé 'today'
et utilisé comme ceci dans un template comme parmètre d'un autre snippet :
[[!getResourcesBis? &tplFirst=`agendaTplAFirst` &sortdirTV=`ASC` &sortbyTV=`date_evenement` &tvFilters=`date_evenement>>[[!today]]` &parents=`23,24,25` &showHidden = `1` &includeTVs=`1` &where=`{"template:=":16}` &tpl=`agendaTplA`]]
chaque snippet a ses propres templates mais que l'on peut remplacer si besoin comme ci-dessus en donnant le nom d'un 'chunk' en paramètre
( &tplFirst=`agendaTplAFirst` )