Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5

Afficher une liste : classement alphabétique?
#1

Citation :#~~~~~ NE PAS SUPPRIMER CE BLOC ~~~~~
#~ Version du CMS: 1.7.0
#~ Nom de l'hébergeur : OVH
#~ Informations Système :
#~~~~~ NE PAS SUPPRIMER CE BLOC ~~~~~
Bonjour!

Voilà, je souhaiterai ajouter un trombinoscope. Pour chaque personne, je voudrai créer une fiche à remplir indépendament des autres (comme les articles du module du même nom) et je voudrais pouvoir afficher ce trombi dans une page, en filtrant par catégorie (comédiens, musiciens...) et par ordre alphabétique (Comédiens : A=>Z etc...).

Le module de news est très proche de ce que je recherche, le seul problème étant qu'il n'est pas vraiment prévu pour faire un tri alphabétique, mais plutôt chronologique.

Existe-t-il un autre module plus adapté à mes besoins?
A défaut, quelqu'un a-t-il déjà modifié le module de news pour permettre ce type de classement?

Merci et bonne journée!
Répondre
#2

j'ai déjà eu la nécessité de gérer des traitements supplémentaires sur des modules qui étaient "trop" basique pour moi.

voilà la méthode utilisée

dans le gabarit news sommaire on y trouve cette ligne anodine :

Code :
{foreach from=$sommaire_news item=sommaire}
il s'agit donc d'un array() php qui va être parcouru. Dans cet array() tu possède toutes les infos qui doivent être ensuite afficher. C'est donc cet array() que tu va devoir trier.

pour ce faire ajouter en début de gabarit :

Code :
{maBalisePerso liste=$sommaire_news}
créer ensuite une balise utilisateur php nommée "maBalisePerso"

elle possède ce code :

Code :
global $gCms;
$smarty = &$gCms->GetSmarty();

$liste = $params['liste'];

/** TRAITEMENT DE TRI PHP A EFFECTUER **/
$listeTriee = $liste;
/** TRAITEMENT DE TRI PHP A EFFECTUER **/


$smarty->assign("sommaire_news",$listeTriee);
Cette balise sera appelée avec l'array() en entrée, tu code un algo de tri basé sur le champs que tu souhaites, une fois trié, on va aller écraser la valeur initiale de l'array() non triée par un array trié aux petits oignons Wink Le gabarit reprendra alors ton array() trié et l'affichera comme tu l'as toujours rêvé.

A l'inévitable question : comment on trie un array() PHP je te répondrais qu'il faut chercher sur le net, les exemple à ce sujet sont légions. Ici tu as déjà une solide base pour commencer
Répondre
#3

L'autre question : il y a t il un autre module que news, je pencherais sur du "Cataloguer" et autre... par contre je ne sais pas ses possibilités de trie... bien que mon astuce peut également être appliqué à ce cas de figure.
Répondre
#4

Il y a aussi JQueryTools avec "tablesort". Il suffit de modifier le template des news pour qu'il affiche une table : <table class="cms_sortable tablesorter">...</table>
Répondre
#5

Utiliser un modulé dédié à Jquery pour obtenir un classement alphabétique, c'est un peu rude quand même, non? Smile
Je dis ca, parce-qu'après on va encore me dire que je joue au bricolo, cela étant dit je crache pas dans la soupe, merci à vous deux pour ces pistes que je ne manquerai pas d'explorer. Je posterai la solution finale ici-même, tant qu'à faire (et si j'en trouve une).
N'empêche que pour la prochaine grosse à mise à jour de CMSMS refondre le module news pour en faire quelque-chose de plus général (moins ciblé news quoi) serait vraiment pas mal, et permettrait de faire un site dynamique très facilement avec vraiment pas grand-chose!
Répondre
#6

L'avantage du js (sans être obligé d'être un module), c'est que tu peux également trier en live sur d'autres critères.
Répondre
#7

*joue le chieur*

l'inconvenient du Js c'est que c'est pas implémenté sur 100% des postes clients

Big Grin
Répondre
#8

Effectivement.
Répondre
#9

Re;


Peut être plus simple

Si on a dans la catégorie "education" les articles

André
Bruno
Cédric
Mohamed

Code :
{news category="education" start="0"  number="4" sortby="news_title" sortasc="true"}


{news category="education,anglais" start="0"  number="4" sortby="news_title" sortasc="true"}   /*pour une sous catégorie anglais de la catégorie 'education*/
http://globus.net16.net/index.php?page=page-1

-.
Répondre
#10

Bonjour Isa46, effectivement c'est pas mal ca! Smile
Je savais que c'était possible de faire cela mais j'aurai aimé avoir plus d'options. Par exemple pouvoir définir si le tri va se faire sur le nom ou le prénom, mais vu qu'il n'existe pas de solution simple et rapide à mettre en place (comprendre prévu d'origine par le module), je me rabats sur ta solution qui est pas si mal finalement.
Répondre
#11

Bonjour !

je n'ai pas bien saisi le truc du JQueryTools. C'est quoi le principe ?

Autrement, par rapport à l'array $sommaire_news (chez moi, j'ai un $items (?)), si on le réarrange avant le foreach, est-ce que le tri aura une incidence sur le choix des articles affichés sur différentes pages (dans le cas où on utilise le paramètre 'page_limit') ??? Il me semble que non... Je ne sais pas comment fonctionne ce truc de page, mais je dirais qu'il ne contient pas plus d'éléments que la valeur de page_limit. Qu'en est-il ?

EDIT: J'ai regardé avec {$items|print_r} et il semble bien qu'il ne contienne pas tous les articles, mais seulement ceux qui sont censé s'afficher sur la page. Donc, le tri n'est effectif qu'à l'intérieur d'une même page... Une solution ? Faut aller bidouiller dans le code du module ?
Répondre
#12

@Yvan

Citation :il semble bien qu'il ne contienne pas tous les articles, mais seulement ceux qui sont censé s'afficher sur la page
tout a fait exact. si tu fais appel dans ton gabarit à un filtrage sur une catégorie "toto", tu trieras avec ma méthode uniquement les articles déjà filtré par cette catégorie. Même scénario avec le page_limit.

Si tu souhaites faire un filtre maison + une limitation ce n'est pas bien compliqué à faire cependant.

tu retires le page limit de l'appel à la balise {news}, puis tu reprends mon code de la balise utilisateur et tu la modifie ainsi

Citation :global $gCms;
$smarty = &$gCms->GetSmarty();

$liste = $params['liste'];

/** TRAITEMENT DE TRI PHP A EFFECTUER **/
$listeTriee = $liste;
/** TRAITEMENT DE TRI PHP A EFFECTUER **/


/** http://www.php.net/manual/fr/function.array-chunk.php **/
/** Retourne un tableau multidimensionnel indexé numériquement, commençant à 0, dont chaque dimension contient size éléments. **/
$my_page_limit = 50;
$listeTriee = array_chunk($listeTriee, $my_page_limit);
//On récupère la première page (50 premiers elements)
$listeTriee = $listeTriee [0];

$smarty->assign("sommaire_news",$listeTriee);
exemple vite fait a partie du manuel, je suis certain qu'il doit exister une méthode sub sur un array mais j'ai pas remis la main dessus...

edit : retrouvé Smile $listeTriee = array_splice($listeTriee, $my_page_limit);
Répondre
#13

Euh... Si je comprends bien, ton array_splice vire tout ce qui vient après le 50ème élément. Mais le but, c'était d'avoir plusieurs pages comme avec le vrai page_limit.

Mais mettons que j'aie rien compris à array_splice.

Je ne vois pas comment on va arriver à avoir plusieurs pages (genre 4 si on a 187 articles, par exemple). La variable pagecount va être à 1 par défaut si on a pas utilisé page_limit... Non ???
Répondre
#14

évidement, ma proposition court-circuite le principe de gestion des pages :/

donc soit tu affiches les 50 premiers éléments d'une liste bien triée sans notion de pagination possible
soit tu tries les éléments affichés dans une page en conservant la pagination générale

une solution déjà utilisée sur un hack perso de news serait de gérer toi même le n° de page via un paramètre dans l'URL

je te le dit d'avance, ca va générer d'autres questions et d'autres anomalies pour ceux qui sont tatillons comme la perte du n° de la dernière page vue si tu clic sur le détail d'une news avant de cliquer sur retour. A tester en local avant une mise en prod

le principe est donc de générer deux liens (URL courante + un paramètre supplémentaire) que tu afficheras comme étant page précédente et page suivante.

le n° de page récupéré par $param['nom_de_mon_param'] depuis le gabarit de sommaire des news, tu peux le passer à la balise utilisateur et l'utiliser ensuite dans le code précédent :


Citation :global $gCms;
$smarty = &$gCms->GetSmarty();

$liste = $params['liste'];
$nbPage = $params['nbPage'];

/** TRAITEMENT DE TRI PHP A EFFECTUER **/
$listeTriee = $liste;
/** TRAITEMENT DE TRI PHP A EFFECTUER **/


/** http://www.php.net/manual/fr/function.array-chunk.php **/
/** Retourne un tableau multidimensionnel indexé numériquement, commençant à 0, dont chaque dimension contient size éléments. **/
$my_page_limit = 50;
$listeTriee = array_chunk($listeTriee, $my_page_limit);
//On récupère la première page (50 premiers elements)
$listeTriee = $listeTriee [nbPage];

$smarty->assign("sommaire_news",$listeTriee);
le reste est une question d'algo et de réglage
Répondre
#15

Edit: mauvaise manip
Répondre
#16

Utilise Jquery
site du développeur et doc : http://tablesorter.com/docs/
Démo avec pagination : http://www.novell.com/communities/files/...enshot.jpg
code avec pagination : http://www.novell.com/communities/node/8...ade-simple
Répondre
#17

ça a l'air taré, mais il me faudra du temps pour maîtriser ce truc, je pense ! Merci, je jetterai un oeil à coup à sur !
Répondre
#18

C'est hyper simple :
Code :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us">
<head>
    <title>jQuery plugin: Tablesorter 2.0</title>
    <link rel="stylesheet" href="./css/style.css" type="text/css" />
    <script type="text/javascript" src="./js/jquery-1.3.1.min.js"></script>
    <script type="text/javascript" src="./js/jquery.tablesorter.js"></script>
    <script type="text/javascript" src="./js/jquery.tablesorter.pager.js"></script>
</head>
<body>
<table id="insured_list" class="tablesorter">
<thead>
<tr>
    <th>Last Name</th>
    <th>First Name</th>
    <th>Email</th>
    <th>Age</th>
    <th>Premium Amount</th>
</tr>
</thead>
<tbody>
<tr>
    <td>Mendes</td>
    <td>Domnic</td>
    <td>domnic@gmail.com</td>
    <td>29</td>
    <td>5500</td>
</tr>
<tr>
    <td>Bharne</td>
    <td>Sagar</td>
    <td>sbharne@yahoo.com</td>
    <td>25</td>
    <td>4500</td>
</tr>
<tr>
    <td>Rambo</td>
    <td>John</td>
    <td>sylvester@hotmail.com</td>
    <td>60</td>
    <td>10000</td>
</tr>
<tr>
    <td>Fernandes</td>
    <td>Timothy</td>
    <td>timothy@fernandes.com</td>
    <td>35</td>
    <td>6500</td>
</tr>
<tr>
    <td>Mendes</td>
    <td>Danny</td>
    <td>domnic@gmail.com</td>
    <td>29</td>
    <td>5500</td>
</tr>
<tr>
    <td>Karpe</td>
    <td>Sagar</td>
    <td>sbharne@yahoo.com</td>
    <td>25</td>
    <td>4500</td>
</tr>
<tr>
    <td>Stallone</td>
    <td>Sylvester</td>
    <td>sylvester@hotmail.com</td>
    <td>60</td>
    <td>10000</td>
</tr>
<tr>
    <td>Fernandes</td>
    <td>Domnic</td>
    <td>timothy@fernandes.com</td>
    <td>35</td>
    <td>6500</td>
</tr>
</tbody>
</table>
<div id="pager" class="pager">
    <form>
        <img src="images/first.png" class="first"/>
        <img src="images/prev.png" class="prev"/>
        <input type="text" class="pagedisplay"/>
        <img src="images/next.png" class="next"/>
        <img src="images/last.png" class="last"/>
        <select class="pagesize">
            <option value="">LIMIT</option>
            <option value="2">2 per page</option>
            <option value="5">5 per page</option>
            <option value="10">10 per page</option>
            
        </select>
    </form>
</div>
<script defer="defer">
    $(document).ready(function()
    {
        $("#insured_list")
        .tablesorter({widthFixed: true, widgets: ['zebra']})
        .tablesorterPager({container: $("#pager")});
    }
    );
</script>
</body>
</html>
Tu trouveras tout le nécessaire (images, css et js) ici : http://www.novell.com/communities/files/...xample.zip
Répondre
#19

Ok, c'est simple de faire copier-coller de ton exemple (et encore, je dis ça, mais je suis sûr que j'aurais mille m*rdes), mais le truc, c'est que j'aimerais avoir la même chose qu'avant (ou presque) avec un tri qui soit effectif sur l'ensemble des pages (http://www.coord21.ch/test_cmsms/public_...pratiques/)
Rien que le code JS qui met les classes aux lignes de la table fait 3 km et j'y comprends que dalle... Donc bon, en l'état, je suis pas monstre confiant !
Répondre
#20

Bon, j'ai regardé plus en détail et je suis pas vraiment convaincu. C'est bien pour faire une liste de personnes ou de produits, mais pas une liste d'articles... Dans mon cas, c'est bcp plus propre de mettre un titre pour chaque thème et de mettre ensuite la liste d'articles associés à ces thèmes.

Ce que je veux, c'est trier les articles grâce à la liste de champs personnalisés de type check-box et pouvoir avoir plusieurs pages, au cas où j'ai trop d'articles pour les afficher sur une seule.

Utiliser JQuery et tablesorter me semble possible, mais ce sera franchement pas beau. Je sais pas... C'est nul !
Répondre
#21

Re,

Cette petite discussion n'est pas sans m'en rappeler une autre
http://www.cmsmadesimple.fr/forum/viewtopic.php?id=1838

suivre le lien de Calguy pour ceux que çà intéresse

-.
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 6 visiteur(s)