8722 sujets

Développement web côté serveur, CMS

Bonjour,

J'ai mis en place sur mon site (toujours en local pour le moment) un système de commentaires indentés, qui fonctionne plutôt bien grâce aux fonctions suivantes :
class Threaded_comments
{
	public $parents  = array();
	public $children = array();
	
	function __construct($comments) {
		foreach ($comments as $comment) {
			if ($comment['parent_id'] === NULL) {
				$this->parents[$comment['comment_id']][] = $comment;
			} else {
				$this->children[$comment['parent_id']][] = $comment;
			}
		}
	}
	private function format_comment($comment, $depth) {
		
		// Ici on affiche les commentaires !
		
	}
	private function print_parent($comment, $depth = 0) {
		foreach ($comment as $c) {
			$this->format_comment($c, $depth);
			if (isset($this->children[$c['comment_id']])) {
				$this->print_parent($this->children[$c['comment_id']], $depth + 1);
			}
		}
	}
	public function print_comments() {
		foreach ($this->parents as $c) {
			$this->print_parent($c);
		}
	}
}

Ce genre de système est-il compatible avec un scroll infini ? (c'est-à-dire qui affiche les commentaires au fur et à mesure que scrolle dans la page) Ce qui me pose problème, c'est que l'on ne peut pas savoir d'avance où les commentaires doivent être placés.Par exemple, un commentaire récent, placé tout au début de la table dans la BDD, peut très bien devoir être affiché à la toute fin de la page seulement, s'il s'agit d'une réponse à un commentaire déjà ancien.

Je me demande quelle est la meilleure solution, et je n'ai pas réussi à en trouver des exemples sur le net : je pourrais par exemple stocker tous les commentaires (dans l'ordre d'affichage, cette fois) dans un tableau de session, puis les afficher 5 par 5 avec un système de "scroll infini". Ou les stocker plutôt dans une variable globale ? Dans un cas comme dans l'autre, on perd l'une des qualités majeures du scroll infini : le chargement des données uniquement lorsqu'il est nécessaire de les afficher, et non pas en totalité dès le départ.

Comment résoudre ces problèmes au mieux ? Je suis preneur de toutes les bonnes idées. Merci d'avance pour votre aide !
Modifié par Fix (30 Nov 2013 - 16:41)
Modérateur
Le problème des structure hiérarchiques à plat est effectivement que l'on doit charger tous les éléments pour comprendre la structure.

Une solution est d'utiliser un cache, deux solutions:
– rajouter des champs précalculés afin de rajouter la profondeur et la position de chaque commentaire.
– Créer une structure précalculée avec la profondeur, ids, etc que tu stockes en DB ou en fichier.

Dans les deux cas ces données devront être recalculées lors de: ajout d'un commentaire, suppression d'un commentaire, déplacement d'un commentaire, vidage du cache. (à voir selon les possibilités que tu implémentes).

Sinon selon la taille du site et du serveur, faire le bourrin et voir après si il y a besoin d'optimisation (méthode rationnelle)
Modérateur
p.s: La solution de stocker dans des champs de la table est plus lourde à la modification, mais très légère à l'obtention des résultats.

La seconde solution (stocker une structure) c'est le contraire.

Dans le cas de commentaires qui si ils sont chargés dans un contextes différent, tu n'auras pas besoin de ces informations, je conseille plutôt la seconde solution.
Réponse nette, claire et précise : exactement ce dont j'avais besoin Smiley cligne

Merci beaucoup ! Je vais tenter de mettre en place la première solution que tu proposes... et je rouvrirai ce sujet si cela est nécessaire.

Encore merci, et bon après-midi à tous !
Je savais bien que je rencontrerais un problème Smiley decu

J'ai appliqué la première proposition de kustolovic, et ça fonctionne bien.
Néanmoins, je rencontre la difficulté suivante : j'utilise une fonction ajax qui charge des commentaires supplémentaires lorsque l'utilisateur scrolle sur la page ; mais que faire si javaScript est désactivé ?

Dans l'idéal, si javaScript est désactivé, il faudrait charger et afficher tous les commentaires d'un coup. Mais cela suppose de :
1. détecter si javaScript est activé ou pas ;
2. s'il est activé, ne charger que 10 commentaires, par exemple ;
3. s'il n'est pas activé, charger tous les commentaires (ou même prévoir un système de pagination).

Et toutes mes recherches pour parvenir à faire cela sont restées vaines. Existerait-il un moyen pour rendre mon javaScript pas trop intrusif dans ce cas ?

Merci de votre aide !