Changeset 58261 in spip-zone


Ignore:
Timestamp:
Feb 13, 2012, 1:44:45 PM (8 years ago)
Author:
bystrano@…
Message:

v0.9.0 - gere tous les types d'urls, et utilise le mecanisme de cache de spip

Location:
_plugins_/ajax_nav
Files:
4 added
1 deleted
7 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/ajax_nav/ajax_nav.js

    r57923 r58261  
    33  noarg:true, noempty: true, nonew: true, onevar: true, passfail: false, plusplus: true,
    44  regexp: false, undef: true, strict: true, white: false, smarttabs: true */
    5 /*global jQuery:true, History:true*/
     5/*global document:true, window:true, jQuery:true, $:true, History:true, prepareForAjax:true */
    66
    77function AjaxNav() {
    88    "use strict";
    9     var SITE_URL                = AjaxNav.options.siteURL,
    10     onAjaxNavReq                = $.Event("onAjaxNavReq"),
     9    var onAjaxNavReq            = $.Event("onAjaxNavReq"),
    1110    onAjaxNavLoad               = $.Event("onAjaxNavLoad"),
    1211    onAjaxNavLocalisedLoad      = $.Event("onAjaxNavLocalisedLoad");
    1312
    14     if ((document.URL.match(/^https/)!==null) &&
    15         (SITE_URL.match(/^http[^s]/)!==null)) {
    16         SITE_URL = SITE_URL.replace(/^http/, 'https');
    17     } else if ((document.URL.match(/^http[^s]/)!==null) &&
    18                (SITE_URL.match(/^https/)!==null)) {
    19         SITE_URL = SITE_URL.replace(/^https/, 'http');
     13    function addUrlParam(url, param, value) {
     14        var re;
     15        // le sommaire est un cas special...
     16        if (url.match(/sommaire[&]?/)) {
     17            url += '&' + param + '=' + value;
     18        } else { // le cas general
     19            if (url.match(/\?/)) {
     20                re = new RegExp('[&?]' + param + '=');
     21                if (url.match(re)) {
     22                    re = new RegExp('([&?])' + param + '=[^&]*');
     23                    if (value) {
     24                        url = url.replace(re, '$1' + param + '=' + value);
     25                    } else {
     26                        re = new RegExp(param + '=' + '[^&]*[&]?');
     27                        url = url.replace(re, '');
     28                        url = url.replace(/\?$/, '');
     29                    }
     30                } else {
     31                    url += '&' + param + '=' + value;
     32                }
     33            } else {
     34                url += '?' + param + '=' + value;
     35            }
     36        }
     37        return url;
    2038    }
    2139
    22     // parse la partie dynamique d'une url et retourne un objet contenant les parametres spip.
    23     function urlToVariables(urlString) {
    24         var tmpArray    = [],
    25         result          = {},
    26         i               = 0,
    27         variable        = '';
    28 
    29         // on ne garde que la partie dynamique de l'url, que ce soit le sommaire,
    30         // une url ajax, ou une url spip
    31         urlString = urlString.replace(SITE_URL, '');
    32         urlString = urlString.replace(/^#!/, '');
    33         urlString = urlString.replace(AjaxNav.options.urlPrefix, '');
    34 
    35         // on traite les ancres
    36         if (urlString.search(/#[^!]/) !== -1) {
    37             result.anchor = urlString.replace(/.*#([^!].*)/, '$1');
    38         }
    39         // on vire l'ancre
    40         urlString = urlString.replace(/(.*)#[^!].*/, '$1');
    41 
    42         // on separe les variables avant de les traiter une par une.
    43         tmpArray = urlString.split(/[\?\&]/g);
    44         for (i = 0; i < tmpArray.length; i += 1) {
    45             variable = tmpArray[i];
    46             // si format abbrege, on ajoute un param 'short' qui stock l'abbreviation.
    47             if ((i === 0) && ($.inArray('=', variable) === -1)) {
    48                 result.short = variable;
    49             } else { // sinon, on remplit l'objet...
    50                 variable                = variable.split('=');
    51                 result[variable[0]]     = variable[1];
    52             }
    53         }
    54         if (result.short) { // si abrege on calcule et ajoute les parametres page et id
    55             variable    = result.short.match(/^\D+/)[0];
    56             result.page = variable;
    57             if (result.short.match(/\d+$/)) {
    58                 result['id_' + variable] = result.short.match(/\d+$/)[0];
    59             }
    60         } else if (result.short === '') { // si url vide c'est une page de sommaire
    61             result.page = 'sommaire';
    62         }
    63 
    64         // on test si l'url doit etre chargee en ajax, et si c'est le cas, on le stock
    65         // dans le parametre 'ajax'.
    66         if ($.inArray(result.page, AjaxNav.options.pagesToAjaxify) !== -1) {
    67             result.ajax = true;
    68         } else {
    69             result.ajax = false;
    70         }
    71         // les liens de recalcul ne sont jamais a charger en ajax.
    72         if ((result.var_mode) && (result.var_mode.search('calcul') !== -1)) {
    73             result.ajax = false;
    74         }
    75 
    76         return result;
     40/*
     41    // tests
     42    if (addUrlParam('http://blabla.com/hello?param1=value1', 'param2', 'value2') !==
     43        'http://blabla.com/hello?param1=value1&param2=value2') {
     44        alert('1');
    7745    }
     46    if (addUrlParam('http://blabla.com/hello', 'param2', 'value2') !==
     47        'http://blabla.com/hello?param2=value2') {
     48        alert('2');
     49    }
     50    if (addUrlParam('http://blabla.com/sommaire', 'param2', 'value2') !==
     51        'http://blabla.com/sommaire&param2=value2') {
     52        alert('3');
     53    }
     54    if (addUrlParam('http://blabla.com/sommaire&param1=value1', 'param2', 'value2') !==
     55        'http://blabla.com/sommaire&param1=value1&param2=value2') {
     56        alert('4');
     57    }
     58    if (addUrlParam('http://blabla.com/hello?param1=value1&param2=value2', 'param1', 'value3') !==
     59        'http://blabla.com/hello?param1=value3&param2=value2') {
     60        alert('5');
     61    }
     62    if (addUrlParam('http://blabla.com/hello?param1=value1&param2=value2', 'param1', '') !==
     63        'http://blabla.com/hello?param2=value2') {
     64        alert('6');
     65    }
     66    if (addUrlParam('http://blabla.com/hello?param1=value1', 'param1', '') !==
     67        'http://blabla.com/hello') {
     68        alert('7');
     69    }
     70*/
    7871
    7972    ///////////////////////
    80     // updatePage  ////////
     73    // onStateChange //////
    8174    ///////////////////////
    82 
    83     function scrollToAnchor(anchor) {
    84         $('a[href$="' + anchor + '"]').filter(':first').each(function (i) {
    85             this.scrollIntoView();
    86         });
    87     }
    8875
    8976    // charge la page en ajax a chaque evenement statechange
    9077    $(window).bind('statechange', function() {
    91         var param, urlString, State = urlToVariables(History.getState().url);
    92 
    93         $('.ajax_nav').trigger(onAjaxNavReq);
    94 
    95         // on utilise la variable State pour calculer l'url a charger
    96         // en ajax.
    97         urlString = '';
    98         for (param in State) {
    99             if (State.hasOwnProperty(param)) {
    100                 if ((param === 'short') || (param === 'anchor') ||
    101                     (param === 'ajax')) {
    102                     continue;
    103                 } else if (param === 'page') {
    104                     urlString = AjaxNav.options.urlPrefix + 'page=' + State[param] + urlString;
    105                     if (AjaxNav.options.urlPrefix === '') { urlString = '?' + urlString; }
    106                 } else {
    107                     urlString = urlString + '&' + param + '=' + State[param];
     78        // si on est pas sur une page ajax, on oublie.
     79        if (!$('html').data('is_ajax_page')) {
     80            window.location.reload();
     81        }
     82        // on commence par demander des infos sur la page appelee.
     83        $.get(addUrlParam(History.getState().url, 'getinfos', 'svp'), function (data) {
     84            var i;
     85            // on decide si la page doit etre chargee en ajax.
     86            if ((!data.page) || ($.inArray(data.page, AjaxNav.options.pagesToAjaxify) === -1)) {
     87                window.location.reload();
     88            } else {
     89                // si l'url specifie une langue differente de la langue courante,
     90                // on recharge les divs localisees.
     91                document.title = data.title;
     92                if (data.lang !== $('html').attr('lang')) {
     93                    $('html').attr('lang', data.lang);
     94                    $('.loc_div').each(function (i) {
     95                        $(this).trigger(onAjaxNavReq);
     96                        $.get(addUrlParam(History.getState().url, 'getbyid', this.id),
     97                              function (data) {
     98                            var id = this.url.replace(/.*getbyid=/, '');
     99                            $('#' + id).empty().html(data).trigger(onAjaxNavLocalisedLoad);
     100                            prepareForAjax('#' + id);
     101                        });
     102                    });
    108103                }
    109             }
    110         }
    111         urlString += State.anchor ? ('#' + State.anchor) : '';
    112         urlString = SITE_URL + urlString;
    113         urlString += (urlString === SITE_URL) ? '?' : '&';
    114 
    115         // on commence par demander des infos sur la page appelee.
    116         $.get(urlString+'getinfos=svp', function (data) {
    117             var lang, body_classes, i;
    118 
    119             data = JSON.parse(data);
    120             lang = data.lang ? data.lang: (State.lang ? State.lang : '');
    121             body_classes = data.body_classes.split(' ');
    122 
    123             // si l'url specifie une langue differente de la langue courante,
    124             // on recharge les divs localisees.
    125             if (lang !== $('html').attr('lang')) {
    126                 // on actualise l'attribut lang..
    127                 $('html').attr('lang', lang);
    128                 $('.loc_div').each(function (i) {
    129                     var url = History.getState().url;
    130                     url += (url === SITE_URL) ? '?' : '&';
    131                     url += 'getbyid=' + this.id;
    132                     $(this).trigger(onAjaxNavReq);
    133                     $.get(url, function (data) {
    134                         var id = this.url.replace(/.*getbyid=/, '');
    135                         $('#' + id).empty().html(data).trigger(onAjaxNavLocalisedLoad);
    136                         rewriteLinksToAjax(); // a optimiser, ceci est appele trop souvent.
     104                // on recharge ensuite les elements 'ajax_nav'.
     105                $('.ajax_nav').trigger(onAjaxNavReq);
     106                $('.ajax_nav').each(function (i) {
     107                    $.get(addUrlParam(History.getState().url, 'getbyid', this.id),
     108                          function (data) {
     109                        var id  = this.url.replace(/.*getbyid=/, '');
     110                        $('#' + id).empty().html(data).trigger(onAjaxNavLoad);
     111                        prepareForAjax('#' + id);
    137112                    });
    138113                });
    139             }
    140             // comme spip utilise les class sur le body par defaut, il vaut mieux les mettre
    141             // a jour.
    142             $('body').removeClass()
    143             for (i = 0; i < body_classes.length; i += 1) {
    144                 $('body').addClass(body_classes[i]);
    145             }
    146         });
    147 
    148         // on recharge ensuite les elements 'ajax_nav'.
    149         $('.ajax_nav').each(function (i) {
    150             var url = History.getState().url;
    151             url += (url === SITE_URL) ? '?' : '&';
    152             url += 'getbyid=' + this.id;
    153             $.get(url, function (data) {
    154                 var id  = this.url.replace(/.*getbyid=/, '');
    155                 $('#' + id).empty().html(data).trigger(onAjaxNavLoad);
    156                 rewriteLinksToAjax(); // a optimiser, ceci est appele trop souvent.
    157             });
    158         });
    159     });
     114                // comme spip utilise les class sur le body par defaut, il vaut mieux les mettre
     115                // a jour.
     116                data.body_classes = data.body_classes.split(' ');
     117                $('body').removeClass()
     118                for (i = 0; i < data.body_classes.length; i += 1) {
     119                    $('body').addClass(data.body_classes[i]);
     120                }
     121            } // fin chargement ajax
     122        }); // fin getinfos
     123    }); // fin onStateChange
    160124
    161125    ///////////////////////
    162     // rewrite links //////
     126    // prepare for ajax ///
    163127    ///////////////////////
    164128
    165     function rewriteLinksToAjax() {
     129    function prepareForAjax(selector) {
    166130        var i;
    167 
    168         // pour les liens pas encore ajaxifies, on les rends inactifs et on attache un
    169         // pushState au click. Le chargement est alors declanche par l'evenement
    170         // changestate.
    171         $('a:not(".ajax_link")').each(function (i) {
    172 
    173             var urlParams = urlToVariables(this.href);
    174 
    175             if (urlParams.ajax) {
    176                 $(this).addClass('ajax_link');
    177                 $(this).click(function (event) {
    178                     // Continue as normal for cmd clicks etc
    179                     if ( event.which === 2 || event.metaKey ) { return true; }
    180                     History.pushState(urlParams, "", $(this).attr('href'));
    181                     event.preventDefault();
    182                     return false;
    183                 });
    184             }
     131        // on rends tous les liens inactifs et on attache un pushState au click.
     132        // Le chargement est alors declanche par l'evenement changestate.
     133        $(selector + ' a:not(".ajax_link")').each(function (i) {
     134            $(this).addClass('ajax_link');
     135            $(this).click(function (event) {
     136                // on ne change rien pour les ctr-click etc.
     137                if ( event.which === 2 || event.metaKey ) { return true; }
     138                History.pushState(null, null, $(this).attr('href'));
     139                event.preventDefault();
     140                return false;
     141            });
    185142            return;
    186143        });
    187144        // on attribue la classe ajax_nav aux elements a charger en ajax.
    188145        for (i = 0; i < AjaxNav.options.ajaxDivs.length; i += 1) {
    189             $('#' + AjaxNav.options.ajaxDivs[i]).addClass('ajax_nav');
     146            $(selector + ' #' + AjaxNav.options.ajaxDivs[i]).addClass('ajax_nav');
    190147        }
    191148        // on attribue des classes aux divs a recharger en cas de changement de langue
    192149        for (i = 0; i < AjaxNav.options.localizedDivs.length; i += 1) {
    193             $('#' + AjaxNav.options.localizedDivs[i]).addClass('loc_div');
     150            $(selector + ' #' + AjaxNav.options.localizedDivs[i]).addClass('loc_div');
    194151        }
    195152    }
    196153
    197     // on charge la page et on reecrit les liens concerne pour qu'il declanchent
    198     // un chargement ajax et une reecriture de la barre d'url.
    199     $(document).ready(function () {
    200         // test for History.js compatibiity
     154    $(function () {
     155        // on teste la compatibilite avec l'API History
    201156        if (!window.History) {
    202157            return false;
    203158        }
    204         rewriteLinksToAjax();
     159        // On regarde si la page et une page ajax, si oui on met un marqueur sur html
     160        $.get(addUrlParam(History.getState().url, 'getinfos', 'svp'), function (data) {
     161            if ((data.page) && ($.inArray(data.page, AjaxNav.options.pagesToAjaxify) !== -1)) {
     162                $('html').data('is_ajax_page', true);
     163                prepareForAjax('html');
     164            }
     165        });
    205166    });
    206167}
  • _plugins_/ajax_nav/ajax_nav_insert_head.php

    r58154 r58261  
    22function ajax_nav_insert_head($flux) {
    33
    4   if ($res = sql_select('valeur', 'spip_meta', 'nom="ajax_nav_config"')) {
    5     $options = sql_fetch($res);
    6     $options = unserialize($options['valeur']);
    7   }
     4  $options = unserialize($GLOBALS['meta']['ajax_nav_config']);
    85
    96  function prepare($options) {
     
    4340            if (typeof AjaxNav !== 'undefined') {
    4441                AjaxNav.options = {
    45                     urlPrefix: '"       . $options["urlPrefix"] . "',
    4642                    pagesToAjaxify: ["  . prepare($options["pagesToAjaxify"]) . "],
    4743                    ajaxDivs: ["        . prepare($options["ajaxDivs"]) . "],
    48                     localizedDivs: ["   . prepare($options["localizedDivs"]) . "],
    49                     siteURL: '"         . $GLOBALS['meta']['adresse_site'] . "/'
     44                    localizedDivs: ["   . prepare($options["localizedDivs"]) . "]
    5045                };
    5146                AjaxNav();
  • _plugins_/ajax_nav/formulaires/ajax_nav_config.html

    r57927 r58261  
    66      <ul>
    77    [(#SAISIE{fieldset, ajaxNavConfig, label=<:ajax_nav:conf_plugin:>})]
    8 
    9     <strong><:ajax_nav:url_prefix_titre:></strong>
    10     #SAISIE{input, urlPrefix, defaut=#ENV{urlPrefix}}
    118
    129    <strong><:ajax_nav:pages_titre:></strong>
  • _plugins_/ajax_nav/formulaires/ajax_nav_config.php

    r57927 r58261  
    1212  // Valeurs par defaut :
    1313  $options = array(
    14                    /* le prefix des urls. 'spip.php?' par defaut dans spip. */
    15                    "urlPrefix"          => "spip.php?",
    1614                   /* les types de page qui seront chargees en ajax. */
    1715                   "pagesToAjaxify"     => "sommaire article rubrique",
     
    3432  $erreurs = array();
    3533
    36   if (filter_var(_request('urlPrefix'), FILTER_VALIDATE_REGEXP,
    37                  array(
    38                        'options' => array(
    39                                           'regexp' => "/[,:;\'\"]/")
    40                        )
    41                  )
    42       ) {
    43     $erreurs['urlPrefix'] = "prefix d'url non-valide.";
    44   }
    45 
    4634  foreach(array('pagesToAjaxify', 'ajaxDivs', 'localizedDivs') as $i => $key) {
    4735    if (filter_var(_request($key), FILTER_VALIDATE_REGEXP,
     
    6250  $options =
    6351    array(
    64           'urlPrefix'           => _request('urlPrefix'),
    6552          'pagesToAjaxify'      => _request('pagesToAjaxify'),
    6653          'ajaxDivs'            => _request('ajaxDivs'),
  • _plugins_/ajax_nav/lang/ajax_nav_en.php

    r57927 r58261  
    66'trouver_doc' => 'For more infos about this plugin\'s configuration, please go to ',
    77'conf_plugin' => 'Plugin configuration :',
    8 'url_prefix_titre' => 'The prefix of your site\'s urls. \'spip.php?\' for a default install :',
    98'pages_titre' => 'The types of pages that will be loaded asyncronously :',
    109'pages_expli' => 'a list of space-separated page types, like: "sommaire article rubrique"',
  • _plugins_/ajax_nav/lang/ajax_nav_fr.php

    r57927 r58261  
    66'trouver_doc' => 'Pour de l\'aide sur la configuration de ce plugin, rendez-vous sur ',
    77'conf_plugin' => 'Configuration du plugin :',
    8 'url_prefix_titre' => 'Le pr&eacute;fixe des urls de votre site. \'spip.php?\' par d&eacute;faut dans spip :',
    98'pages_titre' => 'Les types de page qui seront charg&eacute;es en ajax :',
    109'pages_expli' => 'une liste de types de page separ&eacute;s par des espaces. p.ex: "sommaire article rubrique"',
  • _plugins_/ajax_nav/plugin.xml

    r57900 r58261  
    1414        <auteur>bystrano</auteur>
    1515        <licence>GNU/GPL</licence>
    16         <version>0.8.0</version>
     16        <version>0.9.0</version>
    1717        <etat>test</etat>
    1818        <description>
     
    2727        <categorie>navigation</categorie>
    2828
     29        <fonctions>ajax_nav_balises.php</fonctions>
    2930        <pipeline>
    3031                <nom>insert_head</nom>
     
    3637        </pipeline>
    3738        <pipeline>
    38                 <nom>affichage_final</nom>
    39                 <inclure>ajax_nav_affichage_final.php</inclure>
     39                <nom>styliser</nom>
     40                <inclure>ajax_nav_styliser.php</inclure>
    4041        </pipeline>
    4142
    4243        <necessite id="SPIP" version="[2.1.0;2.1.99]" />
    4344        <necessite id="saisies" version="[1.8.12;]" />
     45        <necessite id="spip_bonux" version="[2.3.0;]" />
    4446</plugin>
Note: See TracChangeset for help on using the changeset viewer.