Ça y est, j’ai trouvé mon souci : des règles d’accès ont été créées en même temps que le contexte en Anglais,
restreignant l’accès depuis le web ; je les ai supprimées.
J’ai donc un plug-in
LangDetectSwitch actif sur l’événement onHandleRequest avec le code suivant :
<?php
/*
@param $_GET['lang']
*/
// ce snippet ne concerne pas le contexte "manager"
if ( $modx->context->get('key') != "mgr" ) {
// détecte la langue du navigateur
$langTmp = explode(',',$_SERVER['HTTP_ACCEPT_LANGUAGE']);
$lang = strtolower(substr(chop($langTmp[0]),0,2));
// prend en compte la demande de l'utilisateur
if ( !empty($_GET['lang']) )
$_SESSION['webLang'] = $_GET['lang'];
else if ( empty($_SESSION['webLang']) )
$_SESSION['webLang'] = $lang;
// sinon on garde la valeur qu'on avait enregistré pour la session courante
// bascule vers le nouveau contexte
switch ($_SESSION['webLang']) {
case '':
case 'fr':
$modx->switchContext('web');
$modx->setOption('cultureKey', 'fr');
break;
// --
case 'en':
default:
$modx->switchContext('english');
$modx->setOption('cultureKey', 'en');
break;
}
}
et j’ai aussi un snippet
LangLinks (qui remplace BabelLinks car dans mon cas les alias des pages sont identiques dans les différents contextes, et j’utilise le mode friendly URL donc impossible de distinguer les contextes avec les alias des pages comme le fait BabelLinks), avec le code suivant :
<?php
if ($modx->context->get('key') == "mgr") return;
// full_implode() permet notamment de créer des adresses contenant des paramètres de $_GET
// exemple qui récupère tous les paramètres GET existants pour reconstituer l'URL :
// full_implode($_GET, '=', '&', '?');
if (!function_exists('full_implode')) {
function full_implode ($array, $keyGlue, $valGlue, $prefix="") {
if (is_array($array)) {
$imp = $prefix;
if (!empty($array)) {
// get the last array element
end($array);
$lastKey = key($array);
$lastVal = $array[$lastKey];
unset($array[$lastKey]);
// implode into string
foreach ($array as $key => $val) { // reset internal array pointer
$imp .= $key . $keyGlue . $val . $valGlue;
}
// and glue the last element to the end
$imp .= $lastKey . $keyGlue . $lastVal;
}
return $imp;
}
else
return '';
}
}
$tmpGET = $_GET;
unset($tmpGET['q']); // unset MODx page variable 'q' (will be set just after)
if (array_key_exists('lang', $tmpGET))
unset($tmpGET['lang']); // unset our param 'lang' to not define it several times
$url = $modx->makeUrl( $modx->resource->get('id'), $context );
$tmpGET['lang'] = (isset($lang))? $lang : '';
$url .= full_implode($tmpGET, '=', '&', '?');
return ($url);
qui s’utilise très simplement comme ceci :
<a href="[[LangLinks? &lang=`fr`]]">version française</a>
Tout ça avec la gestion automatique de contextes par le plug-in Babel cité plus haut, ça marche super bien.
Décidemment, je commence à aimer MODx Revolution