Tri des articles

Bonjour,

Avant toute chose, félicitations pour cet excellent script qu'est Pluxml. Je suis moi-même à fond dans la politique du "light, fonctionnel & pratique" alors quand je trouve des scripts comme celui-là, je me dis que le monde est bien fait et qu'il y a des codeurs qui font du bon boulot ! Le code est clair, structuré, on peut ainsi aisément faire des modifs à loisir pour adapter selon ses besoins : tout ce qu'il me faut pour me sentir à l'aise !

Ceci étant dit, tout n'est pas parfait ;) Et c'est bien normal à ce stade d'évolution de Pluxml !

Je suis en train de me configurer un site sous Pluxml pour en promouvoir un autre (un que je fais moi ;) et d'ailleurs dès que j'en aurais fini, je tenterai une intégration dans Pluxml...j'ai déjà commencé d'ailleurs) et j'ai un petit souci du côté de l'affichage des articles : je me suis aperçu qu'ils n'étaient pas triés par date de rédaction ! Bigre ! Ils ont à priori l'air d'être trié selon leurs identifiants, me trompe-je ?

Or j'ai besoin de pouvoir les trier par date. D'autant que le fait d'avoir mis le champ date accessible dans le formulaire d'édition est une excellente idée qui offre un maximum de souplesse ! Surtout, Skyline, ne l'enlève pas ! J'irais même plus loin dans ce principe. Pour ma part j'ai tendance à oublier ce champ (l'habitude des autres scripts...) du coup je retourne souvent redéfinir la date après avoir fait une modif. En ce sens, il serait intéressant d'ajouter une case à cocher pour que la date soit tout le temps mise-à-jour automatiquement, sauf si on la décoche !
Ce serait alors pratique & ergonomique.

Bref, je m'écarte, là n'est pas le problème. Serait-il donc possible d'avoir un tri par date ? Si je ne m'abuse, je pense qu'il faudrait modifier la fonction arrayArticles() de la classe pluxml. Je ne l'ai pas encore fait en me disant que peut être cela avait déjà été fait par quelqu'un...

Réponses

  • Malheureusement avec la strcture de pluxml on ne peux (raisonnablement) pas trier les articles par date, laisse moi un peu d'expliquer le fonctionnement du moteur pluxml :
    - l'utilisateur veut afficher une page de pluxml
    - pluxml regarde ce qu'il y a dans l'url et dans le fichier de config pour définir un mode (article, home, categories) et un motif de nom de fichier.
    - après pluxml recherche tous les fichiers xml correspondant au motif
    - il les range par ordre alphabétique inverse (donc par identifiant inverse car le nom d'un fichier commence par l'identifiant)
    - il n'en garde que le nombre à afficher pour les déparser
    - etc...
  • Et pourquoi pas dans le panel administration mettre un " ordre "....

    Et donc mettre par exemple pour le 1er article " 1 " et le second " 2 " et faire en sortes que sa imprime sur l'url le chifre " 1 " ou " 2 "... au départ, et comme celà il classe les article à l'ordre inverse de l'alphabet et donc on a l'ordre qu'on veut...

    Plus compliquer maintenant, c'est lorsque l'on veut les rangés par date...
  • SamRay1024SamRay1024 Member
    novembre 2006 modifié
    Ok. Merci pour ces renseignements. Je pense qu'il y a moyen de faire quelque chose. J'essaie de faire ce quelque chose et je repasserai ici pour annoncer le résultat.
  • Après si tu veux coder toi-même tu peux faire fonctionner pluxml avec la date au début de chaque nom de fichier xml, c'est possible et je peux te dire que ça marche très bien pour ensuite trier par date.
  • SamRay1024SamRay1024 Member
    novembre 2006 modifié
    En fait j'avais dans l'idée de trier le tableau pluxml->a_article une fois rempli grâce à la fonction usort et une fonction de callback qui permette la comparaison des dates.

    Cela dit ta solution m'intéresse ; je suis tout ouïe :).
  • J'ai peur que ta solution ralentisse beaucoup le script si tu as un grand nombre d'articles, enfin c'est à essayer.
  • Je suis bien d'accord, mais à défaut d'autre chose...;-)
  • SamRay1024SamRay1024 Member
    novembre 2006 modifié
    Bon, ca y'est, j'ai trouvé 5 minutes pour coder le tri. Je mets la solution au cas où cela intéresserait certains.

    Tout ce passe dans class.pluxml.php. Il faut trouver :
    function arrayArticles(){
    
    	for($i=0;$i<sizeof($this->a_file);$i++) {
    	$this->a_article[$i] = $this->parseArticle($this->a_file[$i]);
    	}
    		
    }
    
    Et remplacer tout ça par ce qui suit :
    function arrayArticles(){
    
    	for($i=0;$i<sizeof($this->a_file);$i++) {
    	$this->a_article[$i] = $this->parseArticle($this->a_file[$i]);
    	}
    		
    	usort($this->a_article, array( $this, 'triArticles'));
    }
    	
    function triArticles( $aArticle1, $aArticle2 )
    {
    	$aDate1 = date::heureIso2Admin($aArticle1['date']);
    	$aDate2 = date::heureIso2Admin($aArticle2['date']);
    		
    	$aDate1['time'] = explode( ':', $aDate1['time'] );
    	$aDate2['time'] = explode( ':', $aDate2['time'] );
    		
    	$iDate1 = mktime($aDate1['time'][0], $aDate1['time'][1], $aDate1['time'][2], $aDate1['month'], $aDate1['day'], $aDate1['year']);
    	$iDate2 = mktime($aDate2['time'][0], $aDate2['time'][1], $aDate2['time'][2], $aDate2['month'], $aDate2['day'], $aDate2['year']);
    		
    	if ($iDate1 == $iDate2)	return 0;
    	return ($iDate1 > $iDate2) ? -1 : 1;
    }
    
    C'est tout !

    Ps : une idée pour optimiser : mettre la date au format entier (nb de secondes depuis le 1er jan 1970) directement dans les fichiers xml en plus de la date iso. Comme cela on restreindrait la fonction de tri à la comparaison puisqu'il ne serait plus nécessaire de transformer les dates à chaque fois pour les comparer ; ce qui allègerait pas mal le traitement je pense ;).
  • Je vois une faiblesse à ta solution c'est que tu tris tes billets après que pluxml n'ai gardé que ceux à afficher, suivant comment ça se passe au niveau de la pagination tu peux avoir des surprises dans l'ordre de tes billets.
  • Exact...Faut que je médite un peu plus alors ;)
  • et en modifiant le template? comme ceci :
    <?php # En mode 'home' # ?>
    		<?php if($pluxml->mode == 'home') : ?>
    		<div id="content">
    		
    		<!-- ajoute la liste des articles par ordre chronologique -->
    		<?php
    
    			// création d'un nouvel objet pluxml
    			$pluxml2 = new pluxml('pluxml/conf/config.xml','pluxml/conf/categorie.xml');
    
    			// masque de recherche (motif) = tous les articles
    			$pluxml2->motif = '/^[0-9]{4}.([0-9]{3}|home)(.[a-z0-9-]*)*.xml$/';
    			$pluxml2->arrayFiles();
    			$pluxml2->arrayArticles();
    			echo 'Tous les articles par ordre chronologique :<br />';
    
    			// tri de la liste des articles par leur date de publication
    			$tri_par_date = array();
    			while($pluxml2->loopArticles()):
    				array_push($tri_par_date, $pluxml2->a_article[$pluxml2->a_index]['date']);
    			endwhile;
    			arsort($tri_par_date);
    
    			// affichage de la liste des articles
    			foreach($tri_par_date as $id => $Val) {
    				$num = $pluxml2->a_article[$id]['file_num']+0;
    				echo '<br /><h2 class="articletitle"><a href="?'.$num.'-'.$pluxml2->a_article[$id]['art_name'].'">'.$pluxml2->a_article[$id]['title'].'</a></h2>';
    				echo $pluxml2->a_article[$id]['chapo'];
    				echo '<p class="post-info">'.date::dateIso2Hum($pluxml2->a_article[$id]['date']).'</p>';
    			}
    			echo '<br />';
    		?>
    		
    		</div>
    		<?php endif; ?>
    <?php # Fin mode 'home' # ?>
    
    ca revient à réécrire les fonction '__' mais bon... c'est tout ce que j'ai trouvé...
Connectez-vous ou Inscrivez-vous pour répondre.