Quick links: Content - sections - sub sections
EN FR
Quick Search Advanced search
 
Page

  [Opened] Question sur les "meta" à partir d'une zone (bogue global gjCoord ?)

Posted by dantahoua on 12/01/2010 22:07

Salut!!! J'ai certaines zones qui ont besoin de fichiers "css" ou "js" particuliers, mais qui sont inutiles dans les pages ne chargeant pas ces zones. En utilisant

{meta_html css '/styles/my.css'}
{meta_html js 'fooscript.js'}

dans le template de la zone je m'en tire pas mal avec quelque if. Mais est-il possible à partir d'une zone de faire un truc du genre $rep->addCSSLink(...) ? Toujours histoire d'essayer d'optimiser... Merci.

  [Opened] Question sur les "meta" à partir d'une zone

Reply #1 Posted by laurentj on 12/02/2010 13:08

Salut,

l'objet reponse courant est rattaché au coordinateur, qui est dispo dans la variable global gJCoord.

  [Opened] Question sur les "meta" à partir d'une zone

Reply #2 Posted by dantahoua on 12/02/2010 15:28

Merci, effectivement je l'avais oublié lui ce gJCoord... Par contre je me pose une question sur ma façon de faire. Mon but est d'activer le cache sur les zones, comme ça je limite les requêtes SQL à la BD puisque mes zones s'occupent d'aller chercher une grosse partie de mon contenu. Mais si la zone est en cache, est-ce que mes css et autre js correspondant vont être toujours ajouté dans l'entête de la page? Ma logique me dit que non puisque la zone est en cache...

  [Opened] Question sur les "meta" à partir d'une zone

Reply #3 Posted by laurentj on 12/03/2010 16:20

effectivement non, si c'est fait dans la méthode _createContent. Maintenant peut-être peux tu te débrouiller en redéfinissant la méthode getContent. Tu fais tes manips, et appelle ensuite parent::getContent.

  [Opened] Question sur les "meta" à partir d'une zone

Reply #4 Posted by dantahoua on 12/03/2010 17:40

Marrant, j'ai fait quelques tests vite faits, quand on utilise l'ajout de js ou css via le template avec {meta_html css '/styles/my.css'} ben là ça fonctionne même avec le cache activé. La page est gérée une première fois, tout est correct, j'ai 8 requêtes SQL. La seconde fois, tout est correct (y compris l'ajout de css ou js) et je n'ai que ma requête de base qui est faite... Donc le cache à fonctionner mais apparemment le template a été lu et exécuté (au moins les meta). Est-ce que je me trompe? Par contre effectivement si je mets l'ajout de css ou js dans _createContent, ça ne fonctionne pas lors de l'appel du cache... La méthode getContent : d'après l'api, c'est elle qui retourne le cache ou appel _createContent si je ne m'abuse. Donc si je l'override, en gros je fais la même chose sauf que juste avant d'appeler le cache c'est là que je check pour mes css et js... Je n'ai pas le code devant moi, je ne suis pas chez moi, mais je vais essayer lundi. Merci.

  [Opened] Question sur les "meta" à partir d'une zone

Reply #5 Posted by laurentj on 12/03/2010 22:36

Ah oui en effet, les metas du template sont executées, même si le cache est activé, puis que les meta ne concernent pas le contenu même du template.

pour le getContent, faut faire un truc du genre:

function getContent() {
<code>
   // ici tes traitements

   return parent::getContent();

}

</code>

Tu n'as donc pas à gérer toi-même le cache et cie.

  [Opened] Question sur les "meta" à partir d'une zone

Reply #6 Posted by dantahoua on 12/06/2010 17:02

Bon, j'ai fait pas mal d'essais , ta méthodes fonctionne mais en fait ne change rien à mon problème. J'utilise le cache pour éviter à chaque fois de refaire des connexions à la BD, hors l'info "meta" correspondant à une section est elle aussi dans la BD (je la récupère en même temps que le contenu de la section). Donc au final ici ça ne change rien, si je vais chercher les infos dans la BD dans le getContent... Ces infos ne seront pas plus mises en cache et donc forcé une requête pour chaque section alors que leur contenu est dans le cache...

Je pense que je vais retourner à ma première idée, soit de maintenir un champ spécifique de script à mettre dans la page pour chaque page. De toutes façon je n'ai pas le choix de faire au moins une requête, celle qui sert à aller chercher la page affichée -> Cette requête renseigne le programme sur les sections à aller chercher pour chaque page. Le contenu des sections peut lui être mis en cache. Me suffirait de récupérer la liste des scripts à mettre dans la page lors de la première requête.

  • 1-On appel une page genre http://toto.loc/index/gros
  • 2-Le contrôleur de base va cherche le contenu de base et les infos de la page "gros" (alias unique) avec une requête. C'est là que je pourrais rajouter mon code pour aller chercher les scripts à ajouter (par exemple liste des scripts à aller chercher séparer par des ; dans un champ page_js et un autre page_css).
  • 3-Cette page est découpée en x zones (il a un champ nombre de zone dans la BD)
  • 4-Dans le contrôleur, pour chaque zone j'appel la zone qui génère mon contenu en lui passant l'id de la page et la zone.
  • 5-Dans mon fichier zone, je récupère les sections dans la BD pour la zone et la page passée en paramètre et je rempli mon template. La page "gros" à 2 zones, chacune contenant 3 sections, je fais donc 3 requêtes par zone soit un total de 6 requêtes pour aller chercher mon contenu. Cette partie peut être mise en cache.

Une des sections qui est affiché seulement sur cette page à besoin d'un javascript bien particulier "cart.js", assé lourd.

  • 6-J'affiche la page avec le contenu renvoyé par les zones.

Du côté de l'admin, quand je glisse un section dans une zone d'une page, je rempli une table ou un champ avec les scripts nécessaire pour cette page. C'est un peu plus lourd à gérer car je dois toujours checker si tel ou tel page à besoin de tel ou tel script au moment de l'ajout/enlèvement de sections, mais bon c'est du côté CMS.

  • Sans le cache : 7 requêtes
  • Avec le cache : 1 requête.

Avez vous d'autres suggestions?

  [Opened] Question sur les "meta" à partir d'une zone

Reply #7 Posted by dantahoua on 12/07/2010 17:32

Je crois que j'ai trouvé une parade, avec jCache.

Je crée le cache avec jcache dans "_createContent". jCache::set($page_id.$zone_id, $value)

Dans "getContent" je check si le cache correspondant à la $key formé par l'id de la page existe. jCache::get($page_id.$zone_id)

Si oui, j'ajoute les metas sinon c qu'il n'y en a pas... Ça fonctionne super avec quelques if autour.

Bon mais là y'a un truc bizarre. À chaque fois que je fais un

$GLOBALS[['gJCoord']]->response->addCSSLink('toto.css');

Il recharge la page autant de fois que j'ajoute un fichier différent via l'objet global.

Si j'ajoute 'toto.css','gros.css' et 'test.js', je vois avec le deboggueur que l'application repasse 4 fois sur jSession::end(); de jCoordinator (probablement normal puisque ces fichiers n'existe pas physiquement pour mes tests, il doit faire une erreur not-found). Mon controlleur de base est appelé alors 4 fois! (Je le vois avec le déboggueur de Komodo et aussi tout simplement au niveau de l'affichage qui devient beaucoup plus lent).

En fait j'ai essayé aussi à partir du controlleur de base pour voir et le problème est le même, dés que l'on ajoute une CSS ou un JS via l'objet global, ça recharge x fois pour x fichier ajoutés. Pas de pb si j'utilise $rep->addCSSLink() mais ici j'ai besoin de l'objet global à partir de la zone.

À partir du tpl, pas de pb, mais cela ne peut pas fonctionner dans mon cas avec le dynamisme et le cache.

Laurent as tu une idée?

  [Opened] Question sur les "meta" à partir d'une zone (bogue global gjCoord ?)

Reply #8 Posted by dantahoua on 12/08/2010 02:38

Un peu de clarté: Si je fais addCSSLink('toto.css') dans le gjCoord global , il recharge la page au complet (il la génère deux fois). Si je fais addCSSLink('/'.'toto.css') dans le gjCoord global, il ne recharge pas deux fois la page au complet, même si il ne trouve pas le fichier et même si il passe deux par jSession::end(). (erreur not found si je check avec le débogueur avec un point d'arrêt sur jSession::end() dans jcoordinator.class.php pour request sur le fichier css).

Doit y avoir un truc que je saisit pas encore très bien à ce niveau, mais bon cela fonctionne très bien avec des path correct et des fichiers réellement présents! Moi et mes idées de faire des tests sur des fichiers qui sont pas là...

Bon à force je vais finir par bien connaître Jelix en profondeur. :D

Désolé de spammer le forum.

 
Page
  1. Question sur les "meta" à partir d'une zone