en | fr  | Contact  | Print  | Share

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($urlstrlen($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"false200);    // "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;
}


© 2010-2015 by ToolOscope SASU. © 2016-2018 by Arnaud De Rette. All rights reserved