FrameBeurk File
Fmbk/Module/Beurk/controleurUrlReecrite.php
<?php //FrameBeurk V0.65. Copyright Arnaud De Rette 2016. Licence CeCILL-C.
// - traduit les URL réécrites en alimentant les champs correspondants dans $_REQUEST
// - défini la fonction inverse Beurk_URL qui compose les URL.
// les adresses rewritées sont du format :
// Bloc (1) = accès par Ajax : /Ajax[-<DivVue>]
// Blocs (2a/2s) = Vue avec clef : /<ActVue>-<IdVue>[-slug][/champ1][/champ2]...
// Bloc (3) = Vue avec jeton clef : /<JetonVue>
// Blocs (4/4a/4s) = si erreur sur Maj : /SiErreur[-<DivVueErr>]/<ActVueErr>-<IdVueErr>[/champErr1][/champErr2]...
// Blocs (5/5a/5s) = Maj avec clef : /MAJ-<JetonAct>/<ActMaj>-<IdMaj>[/Attr1-Val1][/Attr2-Val2]...
// Blocs (6/6a) = Maj avec jeton clef : /MAJ/<JetonMaj>
$TRANSAC['Etape'] = 'Url'; // initialisation de l'action en cours
$TRANSAC['Url'] = array('Module' => 'Beurk', // module par défaut (utilisé par Beurk_traduit pour les messages de ce controleur)
'Erreur' => false);
$url = $_SERVER['REQUEST_URI']; //URL sans le serveur
$racine = $CONFIG['Param']['CheminInstal'];
// --------------- 1ère étape : analyse de la racine de l'URL --------------------------
if ($CONFIG['Param']['LangueUrl']) { // si gestion de la langue dans l'URL
$trouve = false;
foreach ($CONFIG['Param']['CheminUrlLangue'] as $langue => $cheminLang) {
if (strpos($url, $cheminLang) === 0) { // la racine de l'Url est reconnue
$trouve = true;
$racine = $cheminLang;
$DIALOG['Langue'] = $langue;
break;
}
}
if (! $trouve) { // URL avec langue non reconnue
$DIALOG['Langue'] = $CONFIG['Defaut']['Langue'];
Beurk_messageEtape("Langue non reconnue par l'interpreteur ", true);
}
} elseif (($racine !== '') && (strpos($url, $racine) !== 0)) { // si pas de langue dans l'URL et URL non reconnue
Beurk_messageEtape('redirection vers interpreteur à tord', true);
}
// ------------------- 2ème étape : analyse des actions ------------------------------
if (! $TRANSAC['Url']['Erreur']) {
$chemin = trim(substr($url, strlen($racine) + 1)); // on retranche la racine
if (! empty($chemin)) {
$blocs = explode('/', $chemin); // décomposition de l'URL (sans le répertoire local) en blocs séparés par '/'
$blocCourant = '0';
foreach($blocs as $bloc) {
$segments = explode('-', $bloc); //décomposition du bloc en segments séparés par '-'
switch ($blocCourant) { // 1er bloc ou bloc précédent terminé
case '0' :
/* if ($segments[0] == 'en' || $segments[0] == 'fr' || $segments[0] == 'bk') { // spécial ToolOscope : langue dans l'URL
$TRANSAC['LangueToolO'] = $segments[0];
} else */
if ($segments[0] == 'Ajax') { //bloc Ajax
$TRANSAC['Ajax']['Est'] = true; // à voir !!!!!!!
if (isset($segments[1]))
$_REQUEST['DivVue'] = $segments[1];
} elseif ($segments[0] == 'SiErreur') { //début SiErreur
if (isset($segments[1]))
$_REQUEST['DivVueErr'] = $segments[1];
$blocCourant = '4a';
} elseif ($segments[0] == 'MAJ') { //début Maj
if (count($segments) > 1) {
$blocCourant = '5a';
$_REQUEST['JetonAct'] = $segments[1];
} else
$blocCourant = '6a';
} else { // Début Vue
if (isset($_REQUEST['ActVue']))
$blocCourant = '-1'; //déjà une vue traitée : la suite de l'URL est ignorée
else {
if (count($segments) > 1) { // Vue avec clef
$_REQUEST['ActVue'] = Beurk_terminal($segments[0]);
$_REQUEST['IdVue'] = $segments[1];
if ($clefs = Beurk_tabClef('Vue', $_REQUEST['ActVue'], Beurk_entiteAction('Vue', $_REQUEST['ActVue'], $segments[1]))) // alimente $clefs avec les noms des champs de la vue
$blocCourant = '2s';
else
$blocCourant = '0'; // pas de suite au bloc Vue
} elseif ($segments[0] != '') // Vue avec jeton
$_REQUEST['JetonVue'] = $segments[0];
}
}
break;
case '4a' : // 1ère suite SiErreur
$_REQUEST['ActVueErr'] = Beurk_terminal($segments[0]);
$_REQUEST['IdVueErr'] = $segments[1];
if ($clefs = Beurk_tabClef('Vue', $_REQUEST['ActVueErr'], Beurk_entiteAction('Vue', $_REQUEST['ActVueErr'], $segments[1]))) // alimente $clefs avec les noms des champs de la vue
$blocCourant = '4s';
else
$blocCourant = '0'; // pas de suite au bloc SiErreur
break;
case '5a' : // 1ère suite MAJ avec jeton
$_REQUEST['ActMaj'] = $segments[0];
$_REQUEST['IdMaj'] = $segments[1];
/* if (isset($segments[2]))
$_REQUEST['IdRef'] = $segments[2]; */
$blocCourant = '5s';
break;
case '6a' : // suite MAJ avec clef
$_REQUEST['JetonMaj'] = $segments[0];
$blocCourant = '0'; //fin du bloc
break;
case '2s' : // 2ème suite Vue
$clef = array_shift($clefs);
if ($bloc != '' || ! isset($_REQUEST[$clef])) // on garde le champ renseigné en $_POST s'il est à blanc dans l'URL
$_REQUEST[$clef] = rawurldecode($bloc);
if (! $clefs)
$blocCourant = '0'; // pas de suite au bloc Vue
break;
case '4s' : // 2ème suite SiErreur
$clef = array_shift($clefs);
$_REQUEST[$clef . 'Err'] = rawurldecode($bloc);
if (! $clefs)
$blocCourant = '0'; // pas de suite au bloc Vue
break;
case '5s' : // 2ème suite(s) MAJ
if (count($segments) > 1)
$_REQUEST[$segments[0]] = rawurldecode($segments[1]);
else
Beurk_messageEtape('URL indéchiffrable (param suppl)', true);
break;
}
}
}
}
// pour test : http://localhost/Fmbk/affiche-123-coucou-les-gens/2/archives/MAJ-l56qvdf654qvdf654v/associe-4321-987/clef1-val1/clef2-val2
//remplace le header 404
header("Status: 200 OK", false, 200); // "HTTP/1.1 200 OK" ???
// nettoyage des variables temporaires
unset($url, $langue, $chemin, $blocs, $bloc, $blocCourant, $segments, $clefs, $clef);
//renvoie l'URL avec réécriture
function Beurk_URL($clefURL, $titrePage = '', $isAjax = false) {
global $DIALOG, $CONFIG;
$url = Beurk_cheminURL(); // url sans le serveur (et sans le slash final)
// Bloc (1) = accès par Ajax : /Ajax[-<DivVue>]
if ($isAjax) {
$url .= '/Ajax';
if (isset($clefURL['DivVue'])) {
$url .= '-' . $clefURL['DivVue'];
unset($clefURL['DivVue']);
}
}
// Blocs (3) = Vue avec un jeton clef : /<JetonVue>
if (isset($clefURL['JetonVue'])) {
$url .= '/' . $clefURL['JetonVue'];
unset($clefURL['JetonVue']);
// Blocs (2a/2s) = Vue avec clef : /<ActVue>-<IdVue>[-slug][/clef1][/clef2]...
} elseif (isset($clefURL['ActVue'])) {
$url .= '/' . Beurk_id($act = $clefURL['ActVue']) . '-';
unset($clefURL['ActVue']);
if (isset($clefURL['IdVue'])) {
$url .= Beurk_id($clefURL['IdVue']);
$ent = Beurk_entiteAction('Vue', $act, $clefURL['IdVue']);
unset($clefURL['IdVue']);
} else
$ent = '';
//titre de la page, si renseigné
if ($titrePage != '')
$url .= '-' . Beurk_slug($titrePage);
//autres champs de la clef
if ($clef = Beurk_tabClef('Vue', $act, $ent))
foreach($clef as $champ) {
if (isset($clefURL[$champ])) {
$url .= '/' . rawurlencode($clefURL[$champ]);
unset($clefURL[$champ]);
} else
$url .= '/';
}
}
// Blocs (4/4a/4s) = si erreur sur Maj : /SiErreur[-<DivVueErr>]/<ActVueErr>-<IdVueErr>[/clefErr1][/clefErr2]...
if (isset($clefURL['ActVueErr'])) {
$url .= '/SiErreur';
if ($isAjax && isset($clefURL['DivVueErr'])) {
$url .= '-' . $clefURL['DivVueErr'];
unset($clefURL['DivVueErr']);
}
$url .= '/' . Beurk_id($act = $clefURL['ActVueErr']) . '-';
unset($clefURL['ActVueErr']);
if (isset($clefURL['IdVueErr'])) {
$url .= Beurk_id($clefURL['IdVueErr']);
$ent = Beurk_entiteAction('Vue', $act, $clefURL['IdVueErr']);
unset($clefURL['IdVueErr']);
} else
$ent = '';
//autres champs de la clef
if ($clef = Beurk_tabClef('Vue', $act, $ent))
foreach($clef as $champ) {
if (isset($clefURL[$champ . 'Err'])) {
$url .= '/' . rawurlencode($clefURL[$champ . 'Err']);
unset($clefURL[$champ . 'Err']);
}
}
}
// Blocs (6/6a) = Maj avec un jeton clef : /MAJ/<JetonMaj>
if (isset($clefURL['JetonMaj'])) {
$url .= '/MAJ/' . $clefURL['JetonMaj'];
unset($clefURL['JetonMaj']);
// Blocs (5/5a/5s) = Maj avec clef et jeton anti-double soumission : /MAJ-<JetonAct>/<ActMaj>-<IdMaj>[/Attr1-Val1][/Attr2-Val2]...
} elseif (isset($clefURL['ActMaj'])) {
$url .= '/MAJ-' . $DIALOG['JetonAct'];
$url .= '/' . (Beurk_id($clefURL['ActMaj'])) . '-';
unset($clefURL['ActMaj']);
if (isset($clefURL['IdMaj'])) {
$url .= $clefURL['IdMaj'];
unset($clefURL['IdMaj']);
}
foreach($clefURL as $champ => $valeur) // champs restants
$url .= '/' . $champ . '-' . rawurlencode($valeur);
}
return $url;
}