8768 sujets

Développement web côté serveur, CMS

Bonjour à tous,

je m'adresse à ceux qui développent des addons Widget pour Elementor en Php, si il y en a ici:

lorsque l'on déclare une classe extends \Elementor\Widget_Base pour créer un widget, il existe une méthode content_template, en plus de la méthode render qui permet d'utiliser un langage de templating et du javascript.

Je ne comprends pas le rôle de cette fonction car pour l'instant je n'ai pas pu trouver un cas où elle apportait quelque chose de plus que la fonction render.

Lorsque content_template est déclarée:
- quand on charge le widget dans l'éditeur c'est le contenu de la fonction render qui est affiché dans la preview
- quand on modifie un élément dans l'éditeur d'Elementor (colonne de gauche), c'est le contenu retourné par la fonction qui est affiché et on perd ce qui était affiché précédemment par la méthode render()

L'usage que j'ai vu, c'est qu'en général on duplique le contenu de la fonction render et on le colle dans la fonction content_template et ensuite on le gère avec un langage de templating associé à du Javascript.

Je ne comprends pas le rôle de cette fonction....
Modifié par lionel_css3 (20 Jan 2023 - 09:39)
La méthode content_template() est utilisée pour définir le contenu du widget qui sera utilisé pour le rendu côté client. Elle est généralement utilisée en conjonction avec la méthode render(), qui définit le contenu du widget côté serveur.

La méthode render() permet de générer le contenu HTML du widget en utilisant les données de configuration de widget qui ont été définies dans l'éditeur de widgets. La méthode content_template() permet de définir le contenu qui sera utilisé pour le rendu côté client, en utilisant un langage de template tel que Handlebars ou Mustache.

La différence entre les deux méthodes est que render() génère le contenu HTML côté serveur, tandis que content_template() définit le contenu qui sera utilisé pour le rendu côté client. Cela permet de séparer la logique de génération de contenu de la logique de rendu, et de rendre le widget plus performant en utilisant le rendu côté client pour les modifications de contenu mineures.

En résumé, la méthode content_template() est utilisée pour définir le contenu qui sera utilisé pour le rendu côté client, en utilisant un langage de template. Elle permet de séparer la logique de génération de contenu de la logique de rendu, et de rendre le widget plus performant en utilisant le rendu côté client pour les modifications de contenu mineures.
JENCAL a écrit :
La méthode content_template() est utilisée pour définir le contenu du widget qui sera utilisé pour le rendu côté client. Elle est généralement utilisée en conjonction avec la méthode render(), qui définit le contenu du widget côté serveur.......


Merci pour ta réponse,

entre temps j'ai creusé l'affaire et j'en ai conclu ceci, qui est un peu en contradiction avec ce que tu dis Smiley biggrin Smiley biggrin :

- on peut se passer d'utiliser la fonction content_template()
- pour le coté client (le site public que voient les visiteurs) c'est uniquement la fonction render() qui entre en jeu

Au niveau de l'éditeur Elementor
- si on déclare seulement render(): quand on modifie le contenu d'un contrôle, du texte par exemple, le rafraichissement dans la preview est lent et on voit que le widget est rechargé souvent.
- si on rajoute dans render() la capacité 'inline editing' on peut éditer dans la preview avec fluidité mais l'édition dans le contrôle est toujours saccadée.
- si on déclare content_template() avec rien dedans (dans un premier temps): après rafraichissement du navigateur l'inline editing fonctionne toujours si on a pas touché au contrôle avant (dans la barre de gauche de l'éditeur Elementor), mais dès qu'on modifie un contrôle, le contenu du widget disparait (c'est le contenu vide de la fonction content_template qui apparait), Il faut donc répliquer l'affichage des settings avec tout le barnum Javascript dans la fonction content_template et maintenant l'édition à partir du contrôle sera fluide.
Par contre on a perdu l'édition en ligne dans la preview du widget, il faut donc la répercuter en Javascript aussi

Donc en résumé:
render() est obligatoire: pour afficher le widget sur le site frontal ET dans l'éditeur Elementor
render() est exécuté dans tous les cas au chargement de l'éditeur

content_template() permet d'améliorer l'interactivité et ne sert QUE dans l'éditeur Elementor

content_template() sera exécutée après la toute première action dans un contrôle (barre de gauche Elementor) et continuera de l'être (render() ne sera pas re-exécutée)

au chargement de l'éditeur si on édite dans le widget sans avoir touché au contrôle, c'est toujours render() qui opère mais dès qu'on aura touché à un contrôle c'est content_template qui reprend la main.

J'ai mis un moment à comprendre ça, et ça explique pourquoi tout est dupliqué dans les deux fonctions (au niveau Php dans render() et au niveau Js dans content_template())

pour s'en rendre compte il suffit de mettre ces deux commentaires respectivement dans les deux fonctions:

<p>je suis dans la fonction render()</p>

<p>je suis dans la fonction content_template()</p>

Je déplore un peu que ce soit mal expliqué dans la doc, je prépare un gros tuto sur le dev de widgets Elementor et je ferai une vidéo exprès pour clarifier ce point...








.