voila ma colle,
mon site de base est constitué de pages avec différentes inclusions, et marche avec un menu de 5 rubriques:
<div id="inside">
<INCLURE{fond=inc-cadre}{id_rubrique}>
</div>
Dans inc-cadre.html il existe un menu qui se modifie suivant la rubrique (à cause de l'image différente et une css dyn différente)
<BOUCLE_menu(RUBRIQUES){racine}{par titre}{0,5}>
<li id="menu#ID_RUBRIQUE"><a href="[(#URL_RUBRIQUE)]" class="load" id="#ID_RUBRIQUE"></a></li>
</BOUCLE_menu>
jusque là, ç'est du pur spip
seconde étape:
grace à jQuery
je détourne l'appel de la rubrique au profit du fragment de page inc-cadre
et je garde cette fonction sur le menu des fragments inclus
la page va donc charger uniquement le contenu de inc-cadre dans le bloc id="inside"
l'astuce consiste a créer la fonction $(navigation); qui se poursuit dans le menu qui existe dans chaque fragment
voila le code qui marche même sur le menu des fragments de pages appellées par jQuery
<script type="text/javascript"><!--
$(navigation);
function navigation() {
$("a.load").click(function() {
var idrub =$(this).attr("id");
$.get( this.href, function(data) {
$("#css").attr("href","?page=insidecss&id_rubrique="+idrub);
$("#inside").html(data);
navigation();
});
return false;
});
//réecriture des liens du menu pour non intrusif js
$("a.load")
.each(function(i){
$(this).attr("href", function(){
var lelien = $(this).attr("href");
var idrub =$(this).attr("id");
var replaceby = "?page=inc-cadre&id_rubrique=";
mylink=this.href.replace(lelien,replaceby+idrub);
$(this).attr("href", mylink );
});
});
}
// --></script>
or, je suis devant un hic,
la propagation de ma fonction (je ne sais pas si ça s'appelle comme ça mais ça donne cet effet) marche sur les fragments inclus, mais je n'ai plus de crayons actifs,
et d'autre part, j'utilise un formulaire (forms et tables) que je ne peux pas rediriger proprement, après validation on revient sur inc-cadre
Voici donc mes 2 questions:
Est il possible de faire se "propager" les crayons dans une page incluse en js de la même manière que j'ai proçédé?
Y a-t-il plus simple que async_upload auquel je ne comprends rien pour valider un formulaire inclus en js?
or, je suis devant un hic,
la propagation de ma fonction (je ne sais pas si ça s'appelle comme ça mais ça donne cet effet) marche sur les fragments inclus, mais je n'ai plus de crayons actifs,
Oui, j'imagine bien, vu que on ne réinitialise pas les crayons sur ce fragment lorqu'il est chargé.
Il est peut être possible de faire du onAjaxLoad , je ne sais pas, il faudrait voir avec Renato par exemple.
Tu peux sans doute resynchroniser dans ta fonction navigation en reproduisant une partie du code d'init de crayons, quelque chose comme:
function navigation() {
$("a.load").click(function() {
var idrub =$(this).attr("id");
$.get( this.href, function(data) {
$("#css").attr("href","?page=insidecss&id_rubrique="+idrub);
var inside = $("#inside")
inside.html(data);
if (configCrayons.droits) {
jQuery(".crayon", inside)
.filter(configCrayons.droits)
.initcrayon();
}
navigation();
});
return false;
});
Dis nous si marche, nous pourrions peut-être en faire quelque chose de plus générique dans crayons lui-même.
à+
--
toggg
Tu peux sans doute resynchroniser dans ta fonction navigation en
reproduisant une partie du code d'init de crayons,
Ca ne suffira pas : il va aussi falloir demander au système quels sont
les droits attachés aux crayons qu'on vient de charger (c-à-d la liste
des crayons qu'on doit "activer" parmi tous ceux qu'on a reçus). Et
pour ça on n'a pas (encore) de mécanisme. (go go)
Tu peux sans doute resynchroniser dans ta fonction navigation en
reproduisant une partie du code d'init de crayons,
Ca ne suffira pas : il va aussi falloir demander au système quels sont
les droits attachés aux crayons qu'on vient de charger (c-à-d la liste
des crayons qu'on doit "activer" parmi tous ceux qu'on a reçus). Et
pour ça on n'a pas (encore) de mécanisme. (go go)
Ah effectivement, vu que là on se base sur les droits donnés lors de la livraison initiale de la page, ça ne marchera que si il y avait droit universel "*" ...
Si les droits changent pour le fragment, on risque d'en accorder de trop aussi... quoique, vu qu'on vérifie sur modification, ça ne fera pas grand mal.
C'est pas évident, il faudrait isoler le calcul des droits de tetecrayons.php ...
--
toggg
Tu peux sans doute resynchroniser dans ta fonction navigation en
reproduisant une partie du code d'init de crayons,
Ca ne suffira pas : il va aussi falloir demander au système quels sont
les droits attachés aux crayons qu'on vient de charger (c-à-d la liste
des crayons qu'on doit "activer" parmi tous ceux qu'on a reçus). Et
pour ça on n'a pas (encore) de mécanisme. (go go)
Ah effectivement, vu que là on se base sur les droits donnés lors de la livraison initiale de la page, ça ne marchera que si il y avait droit universel "*" ...
Si les droits changent pour le fragment, on risque d'en accorder de trop aussi... quoique, vu qu'on vérifie sur modification, ça ne fera pas grand mal.
C'est pas évident, il faudrait isoler le calcul des droits de tetecrayons.php ...
bouh, je torture le code,
mais je sèche
jQuery(".crayon, inside").filter(configCrayons.droits).initcrayon is not a function,
apparement, si je comprends bien, il faudrait reprendre les droits de chaque fragment?
et vous maitrisez mieux l'affaire que moi, j'ai tenté une copie de tetecrayons.php sans succès
si vous avez d'autres idées...
merci
++ touti
Tu peux sans doute resynchroniser dans ta fonction navigation en
reproduisant une partie du code d'init de crayons,
Ca ne suffira pas : il va aussi falloir demander au système quels sont
les droits attachés aux crayons qu'on vient de charger (c-à-d la liste
des crayons qu'on doit "activer" parmi tous ceux qu'on a reçus). Et
pour ça on n'a pas (encore) de mécanisme. (go go)
Ah effectivement, vu que là on se base sur les droits donnés lors de la livraison initiale de la page, ça ne marchera que si il y avait droit universel "*" ...
Si les droits changent pour le fragment, on risque d'en accorder de trop aussi... quoique, vu qu'on vérifie sur modification, ça ne fera pas grand mal.
C'est pas évident, il faudrait isoler le calcul des droits de tetecrayons.php ...
bouh, je torture le code,
mais je sèche
jQuery(".crayon, inside").filter(configCrayons.droits).initcrayon is not a function,
Ah désolé, j'avais oublié que pour crayons, ça n'est pas jQuery mais cQuery... il a sa version indépendante, regarde spip.php?page=crayons.js
Ne remplace par cQuery que dans ce truc.
Mais effectivement, je n'avais pas pensé au visiteur qui lui, n'a pas crayons. Il n'est chargé que si il y a au moins une zone éditable. Il faut donc conditionner cette opération:
if (cQuery && configCrayons.droits) {
cQuery(".crayon, inside").filter(configCrayons.droits).initcrayon();
}
apparement, si je comprends bien, il faudrait reprendre les droits de chaque fragment?
Ma suggestion ne marche en effet que pour quelqu'un qui a les droits universels. Enfin ... on a peut-être pas besoin de s'embéter de trop pour ces droits. Si la personne a déjà le reste de la page avec des droits, on peut imaginer qu'elle les a aussi sur ce fragment. De toute façon, il ne s'agit ici que de l'affichage du crayon, si la personne n'a finalement pas les droits sur ce fragment, toute mise à jour de sa part sera refusée. On risque en fait juste de donner des boutons ... qui débouchent sur un refus.
Donc, et en tout cas si tu travaille avec des droits limités à certains éléments, tu pourrais aussi ignorer ceux-ci et enlever le .filter(configCrayons.droits) dans l'expression ci-dessus.
Tu peux sans doute resynchroniser dans ta fonction navigation en
reproduisant une partie du code d'init de crayons,
Ca ne suffira pas : il va aussi falloir demander au système quels sont
les droits attachés aux crayons qu'on vient de charger (c-à-d la liste
des crayons qu'on doit "activer" parmi tous ceux qu'on a reçus). Et
pour ça on n'a pas (encore) de mécanisme. (go go)
Ah effectivement, vu que là on se base sur les droits donnés lors de la livraison initiale de la page, ça ne marchera que si il y avait droit universel "*" ...
Si les droits changent pour le fragment, on risque d'en accorder de trop aussi... quoique, vu qu'on vérifie sur modification, ça ne fera pas grand mal.
C'est pas évident, il faudrait isoler le calcul des droits de tetecrayons.php ...
bouh, je torture le code,
mais je sèche
jQuery(".crayon, inside").filter(configCrayons.droits).initcrayon is not a function,
Ah désolé, j'avais oublié que pour crayons, ça n'est pas jQuery mais cQuery... il a sa version indépendante, regarde spip.php?page=crayons.js
Ne remplace par cQuery que dans ce truc.
Mais effectivement, je n'avais pas pensé au visiteur qui lui, n'a pas crayons. Il n'est chargé que si il y a au moins une zone éditable. Il faut donc conditionner cette opération:
if (cQuery && configCrayons.droits) {
cQuery(".crayon, inside").filter(configCrayons.droits).initcrayon();
}
apparement, si je comprends bien, il faudrait reprendre les droits de chaque fragment?
Ma suggestion ne marche en effet que pour quelqu'un qui a les droits universels. Enfin ... on a peut-être pas besoin de s'embéter de trop pour ces droits. Si la personne a déjà le reste de la page avec des droits, on peut imaginer qu'elle les a aussi sur ce fragment. De toute façon, il ne s'agit ici que de l'affichage du crayon, si la personne n'a finalement pas les droits sur ce fragment, toute mise à jour de sa part sera refusée. On risque en fait juste de donner des boutons ... qui débouchent sur un refus.
Donc, et en tout cas si tu travaille avec des droits limités à certains éléments, tu pourrais aussi ignorer ceux-ci et enlever le .filter(configCrayons.droits) dans l'expression ci-dessus.
Genial!
ça marche impecc!
Je peux modifier les crayons dans le fragment appellé par javascript
<script type="text/javascript"><!--
$(navigation);
function reinitcrayon(){
if (cQuery && configCrayons.droits) {
cQuery(".crayon, inside").filter(configCrayons.droits).initcrayon();
}
function navigation() {
$("a.load").click(function() {
var idrub =$(this).attr("id");
$.get( this.href, function(data) {
$("#css").attr("href","?page=insidecss&id_rubrique="+idrub);
$("#inside").html(data);
reinitcrayon();
navigation();
});
return false;
});
Fantastique ; il faut mettre ce reinitcrayon() dans crayon.js, et on
va lui concocter un système client/serveur pour aller vérifier les
droits manquants sur les crayons. Avec une doc
Voir aussi si un reinitcrayons(le noeud du dom rechargé) suffit.
Bon, pour ceux que cela intéresse, je me suis bien amusé
Le principe pour que ça marche connecté ou non est de tester crayons, donc il a fallut ajouter un id="crayonsjs" que l'on peut tester
//on a ajouté id="crayonsjs" au script inclus pour tester son existence cf tetecrayons.php ligne 117
function reinitcrayon(){
if($("#crayonsjs").length){
//alert("crayons? oui");
if (cQuery && configCrayons.droits) {
cQuery(".crayon, inside").filter(configCrayons.droits).initcrayon();
}
} //else{alert("crayons? non");};
}
puis les fonctions de réecriture des urls pour inclure les fragments sans intrusion javascript