[Astuce] Lister les articles par catégorie dans l'interface admin

klavklav Member
juillet 2008 modifié dans Modifications
Bonjour à tous,

J'ai modifié le fichier core/admin/index.php de la version blog beta 3 de manière à pouvoir lister les articles par catégorie.

Les catégories vides (ne contenant aucun article) seront également affichées. Ainsi qu'une catégorie "Articles égarés" qui contient tous les articles n'étant plus rattachés à aucune catégorie existante (si la catégorie dans laquelle ils étaient a été supprimée, par exemple).

Cela me permet, en ajoutant un peu de javascript, de déplacer directement les articles d'une catégorie à l'autre à la souris. Ce n'est pas encore totalement fonctionnel, mais vous pouvez voir ce que donne le résultat ici :
http://n.clavaud.free.fr/temp/tests/pluxml/admin.htm
(edit: testé uniquement avec Firefox et IE7 sous WinXP)

Sinon, voici le code de core/admin/index.php modifié (javascript non inclus) :
<?php
# Copyright (c) 2006 Skyline-arts.com. All rights reserved.

include('prepend.php');
if(!empty($_GET['del'])){
	$msg = $admin->delArticle($_GET['del']);
	header('Location: index.php?&msg='.urlencode($msg).'');
}
include('top.php');
?>

<h2>Liste des articles par catégorie</h2>

<?php

// TRI DES ARTICLES EXISTANTS
// motif pour lister tous les articles
$admin->getMode('admin','/^[0-9]{4}.([0-9]{3}|home|draft)(.[a-z0-9-]*)*.xml$/', $admin->config['bypage_admin']);
$admin->getFiles();
// dans un tableau de catégories
$abc = array();
if ($admin->aCats) {
  // dont on initialise à l'avance le contenu (catégories existantes)
  // cela permet d'inclure les catégories vides également
  foreach($admin->aCats as $cat_num => $cat_info) {
    $abc[$cat_info['name']] = array();
  }
}
$losts = array(); // articles perdus (dont la catégorie n'existe plus)
$homes = array(); // articles de la page d'accueil
$drafts = array(); // brouillons
// aucun article
if ($admin->uFiles == null) {
}
// au moins un article
else {
  $admin->getArticles();
  while($admin->result->loop()) {
    $article = $admin->result->result[$admin->result->i];
    // fait-il partie de la page d'accueil ?
    if($admin->result->f('cat_num') == 'home') {
      array_push($homes, $article);
    }
    // ou des brouillons ?
    else if ($admin->result->f('cat_num') == 'draft') {
      array_push($drafts, $article);
    }
    // ou d'une catégorie qui n'existe plus?
    else if(!isset($admin->aCats[$admin->result->f('cat_num')])) {
      array_push($losts, $article);
    }
		else {
		// ou d'une catégorie qui existe?
      $catname = $admin->aCats[$admin->result->f('cat_num')]['name'];
      // (plus besoin, on a initialisé les valeurs du tableau plus haut pour prendre en compte les catégories vides également)
      //if (!isset($abc[$catname])) $abc[$catname] = array();
      array_push($abc[$catname], $article);
    }
  }
  // on y ajoute la page d'accueil, les brouillons, les articles perdus
  $abc = array("Page d'accueil" => $homes)
         + $abc
         + array("Articles égarés" => $losts)
         + array("Brouillons" => $drafts);
}


// AFFICHAGE DU CONTENU DES CATEGORIES

echo '<ul>';
  
  foreach($abc as $nomCategorie => $listeArticles) {
    echo '<li><p>'.$nomCategorie.'</p><ul>';
    foreach($listeArticles as $numero => $contenu) {
      echo "<li><strong><a href=\"articles.php?p=".$contenu['file_num']."\">".$contenu['title']."</a></strong>
            | <a href=\"commentaires.php?p=".$contenu['file_num']."\">".$contenu['nb_com']." commentaire(s)</a> |
            ".nodir($contenu['filename'])." |
            <a href=\"?del=".$contenu['file_num']."\" onclick=\"Check = confirm('Supprimer cet article ?'); if(Check == false) return false;\" class=\"delete\">Suppr.</a></li>\n";
      }
    echo '</ul></li>';
  }
  
echo '</ul>';

include('foot.php');
?>
(edit : petit oubli de fermeture de balise corrigé)

Réponses

  • DanDan Member
    Bravo, ça fonctionne très bien, et cela permet de bien mieux se retrouver parmi les articles et catégories !

    Merci Klav :)
Connectez-vous ou Inscrivez-vous pour répondre.