source: spip-zone/_plugins_/inclure-ajaxload/inclure-ajaxload.php @ 111365

Last change on this file since 111365 was 94446, checked in by arno@…, 5 years ago

Gestion de _SPIP_LIER_RESSOURCES: si true, alors ajoute des <link href=‘’> faciliter aspiration du site:
define("_SPIP_LIER_RESSOURCES", true);

File size: 6.8 KB
Line 
1<?php
2
3if (!defined("_ECRIRE_INC_VERSION")) return;
4if (!defined("_SPIP_LIER_RESSOURCES")) define("_SPIP_LIER_RESSOURCES", false);
5
6// Par defaut, cache de 2 heures pour l'ajax statique
7// possibilité de forcer une duree avec le critere {ttl_ajaxload=60*60*24}
8if(!defined("_DUREE_CACHE_AJAXSTATIC")) define("_DUREE_CACHE_AJAXSTATIC", 7200);
9
10
11// Evolution de #INCLURE pour inclusions ajaxload
12// #INCLURE{fond=xxx,....ajax,ajaxload} le fait
13function balise_INCLURE($p) {
14        $f = balise_INCLURE_dist($p);
15
16        if (false !== strpos($f->code, "'ajaxload'")) {
17                $f->code = preg_replace('/recuperer_fond/', 'recuperer_fond_ajax',
18                        $f->code, 1);
19
20                // inserer UNE FOIS le X-Spip_Filtre:INCLUREAJAXLOAD_affichemeta
21                // equivalent a #FILTRE{INCLUREAJAXLOAD_affichemeta}
22               
23                // attention cependant, si cet ajout est fait quelque soit la balise #INCLURE
24                // les tests [(#INCLURE{fond=x/y}|trim) si du contenu alors... ]
25                // ne fonctionnent plus car le retour peut contenir le code du header insere.
26                // on ne le fait donc uniquement si l'on croise un inclure avec {ajaxload}
27                // qui de toutes facons, lui, retourne la div pour le js.
28               
29                if(!defined("_INCLURE_AJAX_LOAD_INSERT")) {
30                        define("_INCLURE_AJAX_LOAD_INSERT", "oui");
31                        $f->code .= ".'<' . '"
32                                .'?php header("X-Spip-Filtre: \'.'
33                                        ."INCLUREAJAXLOAD_affichemeta"
34                                . " . '\"); ?'.'>'";
35
36                        $f->interdire_scripts = false;
37                }
38        }
39        return $f;
40}
41
42
43// cree un appel ahah vers ce recuperer_fond
44function recuperer_fond_ajax() {
45        $args = func_get_args();
46
47        $args[1]["fond"] = $args[0];
48
49        $cle = md5(serialize($args));
50        $ajax = entites_html(encoder_contexte_ajax($args[1]));
51       
52
53        $alt = entites_html(sinon($args[1]['ajaxloadalt'],$args[1]['fond']));
54        $message = $args[1]['ajaxload_message'];
55        $searching = sinon($args[1]['ajaxsearching'],
56                "<img src='".find_in_path('images/searching.gif')."' alt='$alt' />")
57                 . ($message ? " <span class='ajaxload_message'>$message</span>" : "");
58        // Le lien mène à l'action de pose du cookie no_js
59        $url = "spip.php?action=ia_nojs&amp;retour=".urlencode(parametre_url(self(),'no_js','oui'));
60
61        if (isset($args[2]['ajax']) AND $args[2]['ajax']=='1') 
62                $class_ajax = " ajaxbloc env-$ajax";
63
64        // Appliquer la methode:
65        // - soit laisser les automatismes Ajax de SPIP {ajaxload}
66        // - soit sauvegarder "en dur" le resultat HTML {ajaxload=html}
67        // - soit retourner l'url de la noisette {ajaxload=url}
68        // - soit retourner l'url du fichier html {ajaxload=url_html}
69        $methode = $args[1]["ajaxload"];
70        $entete = "<"."?xml version='1.0' encoding='".$GLOBALS['meta']['charset']."'?".">";
71        //echo $entete;
72
73        $ttl = _DUREE_CACHE_AJAXSTATIC;
74        if ($args[1]['ttl_ajaxload']) $ttl = valeur_numerique($args[1]['ttl_ajaxload']);
75
76        if ($methode == "url") {
77                $ajax = urlencode($ajax);
78                $ret = "spip.php?var_ajax=recuperer&amp;var_ajax_env=$ajax";
79               
80        } else if ($methode == "esi") {
81                $ajax = urlencode($ajax);
82                $ret = "<!--esi <esi:include src='spip.php?var_ajax=recuperer&amp;var_ajax_env=$ajax' />-->";
83                $ret .= "<esi:remove><div class='includestatic'><a href=\"#\" rel=\"spip.php?var_ajax=recuperer&amp;var_ajax_env=$ajax\">$searching</a></div></esi:remove>";
84
85        } else if ($methode == "url_html") {
86                $fichier = sous_repertoire(_DIR_VAR, 'cache-ajaxload').$cle.".html";
87
88                // Test sur le fichier
89                if (!file_exists($fichier) || _request('var_mode') == "recalcul"
90                                || (file_exists($fichier) && date("U") - @filemtime($fichier) > $ttl)
91                        ){
92                        //echo "RECALCULER";
93                        $contenu = $entete.call_user_func_array('recuperer_fond', $args);
94                                               
95                        ecrire_fichier($fichier, $contenu);
96                        // ecrire une version .gz pour content-negociation par apache, cf. [11539]
97                        //ecrire_fichier("$fichier.gz",$contenu, true);
98
99                }
100               
101                $ret = $fichier;
102               
103        } else if ($methode == "html") {
104               
105                $fichier = sous_repertoire(_DIR_VAR, 'cache-ajaxload').$cle.".html";
106               
107               
108                // Test sur le fichier
109                if (!file_exists($fichier) || _request('var_mode') == "recalcul"
110                                || (file_exists($fichier) && date("U") - @filemtime($fichier) > $ttl)
111                        ){
112                        //echo "RECALCULER";
113                        $contenu = $entete.call_user_func_array('recuperer_fond', $args);
114                        ecrire_fichier($fichier, $contenu);
115                        // ecrire une version .gz pour content-negociation par apache, cf. [11539]
116                        //ecrire_fichier("$fichier.gz",$contenu, true);
117
118                }
119               
120                if (_request('var_no_ajax')
121                OR _request('var_mode') == 'inclure')
122                        return $contenu;
123
124                $ret =
125                        "<div class='includestatic$class_ajax'><a href=\"$url\" rel=\"$fichier\">$searching</a></div>";
126                if (_SPIP_LIER_RESSOURCES) $ret .= "<link href='$fichier' rel='attachment' property='url'>";
127               
128               
129                //print_r($contenu);
130       
131        } else {
132                if (_request('var_no_ajax')
133                OR _request('var_mode') == 'inclure')
134                        return call_user_func_array('recuperer_fond', $args);
135       
136                $ret =
137                        "<div class='includeajax$class_ajax'><a href=\"$url\" rel=\"$ajax nofollow\">$searching</a></div>";
138                if (_SPIP_LIER_RESSOURCES) $ret .= "<link href='$url' rel='attachment' property='url'>";
139                       
140        }
141       
142        return $ret;
143}
144
145function remettre_fond_ajax($matches) {
146        $url = $matches[2];
147        $c = $matches[3];
148        $c = decoder_contexte_ajax($c);
149
150        $page = recuperer_fond($c["fond"],$c,array('trim'=>false));
151       
152        return $page;
153}
154
155function remettre_fond_ajax_static($matches) {
156        $url = $matches[3];
157        if (file_exists($url)) $page = join("", @file($url));
158        else $page = "";
159       
160        return $page;
161}
162
163function INCLUREAJAXLOAD_affichemeta($page) {
164
165        if (
166                (strpos($page, "includeajax") > 0 || strpos($page, "includestatic") > 0)
167                && !strpos($page, "<esi:remove><div class='includestatic'>") > 0
168        ) {
169
170                $javascript = '<?php if ($_COOKIE["no_js"] != "no_js" && !_IS_BOT && _request("no_js") != "oui") { ?>
171<script type="text/javascript"><!--
172document.write("<\/script><script>/*");
173//--></script>
174<meta http-equiv="refresh" content="2; url='.$GLOBALS["meta"]["adresse_site"].'/spip.php?action=ia_nojs&amp;retour=<?php echo urlencode(self(\'&\'));?>" />
175<script type="text/javascript">/* */</script>
176<?php } else { ?>
177<script type="text/javascript"><!--
178        document.cookie = "no_js=; expires=Thu, 01-Jan-70 00:00:01 GMT;";
179--></script>
180<?php } ?>'.$javascript;
181               
182                $page = str_replace("</head>", "$javascript</head>", $page);
183        }
184        return $page;
185}
186
187function INCLUREAJAXLOAD_affichage_final($page) {
188        // Si le visiteur est un robot de moteur de recherche,
189        // reconstituer les pages completes
190        if(_IS_BOT || (isset($_COOKIE["no_js"]) && $_COOKIE["no_js"] == "no_js") || _request("no_js") == "oui" ) {
191                include_spip("inc/filtres");
192                include_spip("public/assembler");
193                $page = preg_replace_callback(",(<div class='includeajax[^\']*'><a href=\"(.*)\" rel=\"(.*)\">.*</a></div>),msU", "remettre_fond_ajax", $page);
194                $page = preg_replace_callback(",(<div class='includestatic[^\']*'><a href=\"(.*)\" rel=\"(.*)\">.*</a></div>),msU", "remettre_fond_ajax_static", $page);
195        }
196
197        return $page;
198}
199
200function INCLUREAJAXLOAD_insert_head($flux) {
201        $flux .= "\n<script src=\"".find_in_path('javascript/inclure-ajaxload.js')."\" type=\"text/javascript\"></script>";
202        return $flux;
203}
204
205
206
207?>
Note: See TracBrowser for help on using the repository browser.