Input filter + inclusion javascript

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Salut,

J'ai un petit petit probleme avec un module que je suis en train de développer. Il s'agit d'un filtre d'entrée qui nécessite le chargement d'un fichier JavaScript pour l'affichage.

En simplifiant, la saisie donne :

[Mon tag]

Et une fois filtré, cela donne quelquechose du style :

<span onClick="ma_fonction_javascript();">Bidule</span>

L'inclusion du fichier .js contenant la fonction "ma_fonction_javascript();" doit se faire au moment de l'affichage. J'ai donc utilisé hook_nodeapi(), et j'inclus mon fichier .js (via drupal_add_js()) au niveau de l'opération "view" si un node contenant un champ utilisant mon filtre est sur le point d'être affiché.

Problème : celà marche nickel pour l'affichage des nodes, mais pas si j'utilise mon filtre dans un block. En effet, l'affichage des blocks ne déclenche pas hook_nodeapi().

Connaissez-vous une méthode pour que je puisse effectuer l'inclusion de mon fichier .js si un block utilisant mon filtre d'entrée est sur le point d'être affiché ?

Help :)

Merci !

Forum : 
Version de Drupal : 

C'est très difficile à faire dans le cas général. En effet, les filtres d'entrées peuvent être utilisés dans autre chose que les noeuds et les blocs (par exemple le pied de page).

Pour faire ce que tu veux faire, des concessions sont nécessaires. Je vois deux approches :

  • soit intégrer ton fichier ".js" inconditionnellement (ajoute le dans un $may_cache = false du hook_menu())
  • soit desactiver le cache de ton filtre (renvoyer true lorsque $op = 'no cache' de ton hook_filter()

L'inconvénient de la première approche est que le javascript sera chargé même sur les pages qui ne le nécessite pas (la charge porte sur le client). Celui de la deuxième approche est que cela desactive le cache sur tout les filtres de ton format d'entrée (la charge porte ainsi sur le serveur).

Merci de ta réponse.

Je pense que je vais plutôt opter pour la première solution (inclusion inconditionnelle du .js), car elle ne nécessite pas de désactiver le cache pour mon filtre (qui apporte un important gain de performances).

Au final, cela simplifie aussi pas mal mon code (même si c'est moins propre que ce que j'imaginais idéalement).