Du php dans le squelette à la place de #SESSION ou #CACHE 0 - comments Du php dans le squelette à la place de #SESSION ou #CACHE 0</code> 2018-03-01T11:09:54Z https://contrib.spip.net/Du-php-dans-le-squelette-a-la-place-de-SESSION-ou#comment496099 2018-03-01T11:09:54Z <p>Bonjour,</p> <p>j'aimerais intégrer à SPIP un compteur de fan fb.</p> <div class='precode'><pre dir='ltr' style='text-align: left;'><code><?php function fbLikeCount($id,$appid,$appsecret){ $json_url ='https://graph.facebook.com/'.$id.'?access_token='.$appid.'|'.$appsecret.'&fields=fan_count'; $json = file_get_contents($json_url); $json_output = json_decode($json); //Extract the likes count from the JSON object if($json_output->fan_count){ return $fan_count = $json_output->fan_count; }else{ return 0; } } echo fbLikeCount('IDFB','IDAPPLI','TOKEN');</code></pre></div> <p>ce code fonctionne sur un site classique, pas sur spip. Comment faire ?</p> Du php dans le squelette à la place de #SESSION ou #CACHE{0} 2016-11-29T11:57:32Z https://contrib.spip.net/Du-php-dans-le-squelette-a-la-place-de-SESSION-ou#comment489969 2016-11-29T11:57:32Z <p>J'ai intégré ces explications dans l'article dans une partie “performances pour gros traffics”, ainsi que d'autres éléments d'explications apportés par marcimat aujourd'hui sur spip-zone.</p> Du php dans le squelette à la place de #SESSION ou #CACHE{0} 2016-09-14T18:55:53Z https://contrib.spip.net/Du-php-dans-le-squelette-a-la-place-de-SESSION-ou#comment488992 2016-09-14T18:55:53Z <p>pour info : <strong>précisions de Cedric </strong> (<i>citations sur la liste spip-zone le 13/09/2016</i>)</p> <blockquote class="spip"> <p>Je dirais que plus le site a de traffic, plus il est important/intéressant d'utiliser le PHP pour ces tests liés à la session plutôt qu'une balise #SESSION.</p> </blockquote> <p>Pour un site qui n'a presque pas de traffic, les visiteurs ne tomberont presque jamais sur un cache et in fine ça ne fait pas beaucoup de différence qu'il soit sessionné ou pas.</p> <p>Pour un site qui a beaucoup de traffic, a contrario il est très bénéfique de partager le cache. Et si en plus une grande partie du traffic est faite par des visiteurs identifiés, ça devient capital pour éviter d'avoir une explosion du cache sessionné. <br class='autobr' /> ><br class='autobr' /> >> > Je rappelle encore une fois que les affichages conditionnés au visiteur<br class='autobr' /> >> > connecté sont LA seule raison qui justifie l'usage de PHP, et c'est même<br class='autobr' /> >> > une bonne pratique dans ce cas.<br class='autobr' /> ><br class='autobr' /> > D'accord, mais je me demande toujours si l'appel du PHP,<br class='autobr' /> > qui sert à tester la présence d'un admin à chaque hit, reste sans<br class='autobr' /> > répercussion sur le comportement et la performance du cache.<br class='autobr' /> ></p> <p>Justement, l'intérêt d'utiliser du PHP dans le squelette pour faire ça, c'est que le PHP est conservé tel quel dans le cache (qui par contre contient toutes les boucles et balises remplacées par leur résultat), et au service de la page on a juste un eval() sur le cache pour évaluer ce PHP de test qui reste.</p> <p>Comme il s'agit de quelques lignes de test par des if() c'est négligeable en terme de performance - en pratique tous les squelettes en cache provoquent déjà un eval() dès lors qu'ils ont un <INCLURE> dedans.<br class='autobr' /> Et de cette façon le squelette ne génère qu'un seul cache, partagé par tous les utilisateurs.</p> <p>Cédric</p> <p>> <i>Salut Cédric et merci pour ton explication:-) </i></p> Du php dans le squelette à la place de #SESSION ou #CACHE{0} 2016-09-14T17:59:49Z https://contrib.spip.net/Du-php-dans-le-squelette-a-la-place-de-SESSION-ou#comment488991 2016-09-14T17:59:49Z <p>En fait même un <code>{si_eval EXP}</code> ne fonctionnerait pas. On est obligé de faire calculer la boucle, et de mettre le PHP de test, ouvrant et fermant autour de la boucle. Autant faire une inclusion du coup.</p> Du php dans le squelette à la place de #SESSION ou #CACHE{0} 2016-09-14T17:34:34Z https://contrib.spip.net/Du-php-dans-le-squelette-a-la-place-de-SESSION-ou#comment488990 2016-09-14T17:34:34Z <p>Je t'assure Teddy que le coup du <code>{si session…}</code> en critère ne fonctionne pas, quelque soit la méthode que tu veux utiliser.</p> <p>Donc si ça marche chez toi c'est que soit ton squelette n'a pas de cache (ou ton SPIP), ou que tu passes un paramètre différent à ce squelette pour chaque visiteur, ou que tu utilises <code>#SESSION</code>, ou <code>#AUTORISER</code> ou quelque balise ou boucle ou critère qui demande un cache sessionné … avec le plugin Accès Restreint peut être.</p> <p>Le truc c'est que le critère SI écrit le résultat de l'expression pour la transmettre ensuite à l'itérateur. Il écrit le résultat, donc au moment du calcul du squelette. Si le squelette n'est pas recalculé, le résultat ne changera pas.</p> <p>Il faudrait peut être un critère <code>{si_eval EXP}</code> qui récupérerait l'expression, et l'évaluerait au moment du passage dans l'itérateur. Ça nécessiterait de modifier public/iterateur.php après le if de la ligne 27 donc.</p> Du php dans le squelette à la place de #SESSION ou #CACHE{0} 2016-09-14T17:04:23Z https://contrib.spip.net/Du-php-dans-le-squelette-a-la-place-de-SESSION-ou#comment488989 2016-09-14T17:04:23Z <p>Bonjour,</p> <p>@maieul, en effet, #EVAL ne fait pas parti de SPIP Bonux. Mais la boucle 'CONDITION' est bien offerte par SPIP Bonux.</p> <p>@JLuc, Euh… oui ça marche chez moi. Remarques bien la différence par rapport à ton code, c'est qu'il y a un échappement des crochets et accolades.</p> <p>Si tu désires utiliser session_get, tu peux l'utiliser en filtre je crois (là, pas testé) :</p> <div class='precode'><pre dir='ltr' style='text-align: left;'><code><BOUCLE_articles(ARTICLES){si #VAL{'nom'}|session_get}> #ID_ARTICLE <br /> </BOUCLE_articles></code></pre></div> <p>Car en principe, toutes fonctions PHP (ou presque) de SPIP peuvent être appliqués en filtre. Mais là, je prends des pincettes sur ce dernier bout de code.</p> Du php dans le squelette à la place de #SESSION ou #CACHE{0} 2016-09-14T16:52:49Z https://contrib.spip.net/Du-php-dans-le-squelette-a-la-place-de-SESSION-ou#comment488988 2016-09-14T16:52:49Z <p>Oui après test, je confirme que ça ne <code>#EVAL{get_session}</code> ne dépend pas de la session... que ce soit dans ou en dehors d'un critère de boucle, car la valeur est mise dans le cache.</p> <p>Le squelette de test est dans <a href="https://contrib.spip.net/Complements-a-php-squelette-session-cache0">le carnet wiki</a></p> Du php dans le squelette à la place de #SESSION ou #CACHE{0} 2016-09-14T16:17:46Z https://contrib.spip.net/Du-php-dans-le-squelette-a-la-place-de-SESSION-ou#comment488987 2016-09-14T16:17:46Z <p>Hello Teddy, (suite à discussion sur irc) as tu testé ce que tu proposes et confirmes tu que ça marche ? Car la balise #EVAL met en cache le résultat de son premier eval normalement, et le SI est évalué une seule fois avant l'exécution de la boucle.</p> Du php dans le squelette à la place de #SESSION ou #CACHE{0} 2016-09-14T15:51:38Z https://contrib.spip.net/Du-php-dans-le-squelette-a-la-place-de-SESSION-ou#comment488986 2016-09-14T15:51:38Z <p>J'ai complété l'article avec la possibilité d'utiliser la fonction <code>session_get</code> dans le php, à la place des pénibles <code>if (isset($GLOBALS["visiteur_session"]['statut']) AND $GLOBALS["visiteur_session"]['statut'])</code> comme le fait remarquer marcimat sur irc</p> <p>Mais cela suppose d'avoir inclu le fichier ecrire/inc/session.php dans le mes_options ou dans les options du plugin :<br class='autobr' /> <code>include_spip ('inc/session');</code></p> Du php dans le squelette à la place de #SESSION ou #CACHE{0} 2015-09-03T16:52:38Z https://contrib.spip.net/Du-php-dans-le-squelette-a-la-place-de-SESSION-ou#comment483523 2015-09-03T16:52:38Z <p>Je ne sais pas vous, mais moi, je dis merci Teddy !</p> <p>Ta proposition remplit exactement la fonction que je cherchais, l'accès automatique à une partie du site protégée, que l'on veut un tant soit peu limité à des visiteurs “enregistrés”.<br class='autobr' /> j'ai ajouté les plugins “Inscriptions 3” et “Champs Extra” pour personnaliser le formulaire d'entrée des visiteurs, le tour était joué.<br class='autobr' /> Mériterait de figurer dans le tuto “Accès Restreint”, dont c'est justement la faiblesse (les visiteurs doivent manifestement obligatoirement être validés manuellement pour avoir accès aux parties protégées puisque Jaz ne semble pas fonctionner... je viens d'y passer des heures...).</p> <p>Bref, encore <strong>merci Teddy !</strong></p> Du php dans le squelette à la place de #SESSION ou #CACHE{0} 2015-07-27T15:28:47Z https://contrib.spip.net/Du-php-dans-le-squelette-a-la-place-de-SESSION-ou#comment483134 2015-07-27T15:28:47Z <p>Bonjour,</p> <p>Je comprend bien que l'utilisation d'éléments comme</p> <div class='precode'><pre dir='ltr' style='text-align: left;'class="spip"><code><span class="re1">#SESSION</span><span class="re40">{nom}</span></code></pre></div> <p>oblige le cache du squelette qui le contient à se multiplier pour disposer d'une version correspondant à chaque auteur qui se connecte.</p> <p>Qu'en est il si on veut seulement contrôler l'affichage d'une partie de squelette en fonction du statut de connexion du visiteur, comme par exemple :</p> <div class='precode'><pre dir='ltr' style='text-align: left;'class="spip"><code> <span class="re4">[</span><span class="re4">(</span><span class="re1">#SESSION</span><span class="re40">{id_auteur}</span><span class="re50">|oui</span><span class="re4">)</span> <span class="re4">[</span><span class="re4">(</span><span class="re1">#PS</span><span class="re4">)</span><span class="re4">]</span> <span class="re4">]</span></code></pre></div> <p>Une seule version du chache serait pertinente pour tous les utilisateurs connectés, puisqu'on leur sert la même chose, mais est ce que celà fonctionne comme celà ?</p> Du php dans le squelette à la place de #SESSION ou #CACHE{0} 2015-02-14T12:30:57Z https://contrib.spip.net/Du-php-dans-le-squelette-a-la-place-de-SESSION-ou#comment479409 2015-02-14T12:30:57Z <p>#EVAL n'est pas propre a bonus me semble-t-il? je ne suis pas sûr que du coup on y gagne en terme de perf...</p> Du php dans le squelette à la place de #SESSION ou #CACHE{0} 2015-02-14T12:29:37Z https://contrib.spip.net/Du-php-dans-le-squelette-a-la-place-de-SESSION-ou#comment479408 2015-02-14T12:29:37Z <p>non, pas du tout. Si vous faites un <code><INCLURE></code> le cache de la page incluse est indépendant du cache de la page incluante. Si vous faite un <code>#INCLURE</code> le <code>#CACHE</code> de la page incluse n'est pas prise en compte.</p> <p>Voir <a href="http://geekographie.maieul.net/Les-differents-modes-d-inclusion" class='spip_url spip_out auto' rel='nofollow external'>http://geekographie.maieul.net/Les-differents-modes-d-inclusion</a></p> Du php dans le squelette à la place de #SESSION ou #CACHE{0} 2015-02-14T10:40:51Z https://contrib.spip.net/Du-php-dans-le-squelette-a-la-place-de-SESSION-ou#comment479407 2015-02-14T10:40:51Z <p>Est-ce que la balise #SESSION_SET fait également parti des balises demandant à créer un cache différent par session ?</p> Du php dans le squelette à la place de #SESSION ou #CACHE{0} 2015-02-13T22:44:34Z https://contrib.spip.net/Du-php-dans-le-squelette-a-la-place-de-SESSION-ou#comment479404 2015-02-13T22:44:34Z <p>J'ai un doute sur le dernier paragraphe de l'article, à propos de #CACHE{0} : lorsque l'on utilise pas la session, n'est-il pas souhaitable de mettre des #CACHE{0} dans toutes les noisettes incluses (SAUF celles incluses EN AJAX ou dépendantes de la session) et de mettre un cache non nul uniquement pour la page ? Bref, enlever #CACHE{0} sur des noisettes incluses ne revient-il pas à mettre en cache 2 fois le même contenu, une fois en mettant en cache la noisette et une fois en mettant en cache la page qui la contient ?</p> Du php dans le squelette à la place de #SESSION ou #CACHE{0} 2015-02-09T13:45:37Z https://contrib.spip.net/Du-php-dans-le-squelette-a-la-place-de-SESSION-ou#comment479339 2015-02-09T13:45:37Z <p>Hello,</p> <p>Et si on a le plugin SPIP Bonux, on peut faire ça :</p> <div class='precode'><pre dir='ltr' style='text-align: left;'><code><BOUCLE_visiteur_session (CONDITION) {si #EVAL{$GLOBALS\['visiteur_session'\]\['nom'\]}|oui}> <div class="bloc" id="inc_identification_sedeconnecter"> <h3 class="titre">[(#EVAL{$GLOBALS\['visiteur_session'\]\['nom'\]})]</h3> ... </div> </BOUCLE_visiteur_session></code></pre></div> <p>:-D</p>