Module articles [Réglé]
affichage des articles les plus visités
Créations de Modules
xela Membre non connecté
-
Modérateur
- Voir le profil du membre xela
- Inscrit le : 26/12/2015
- Groupes :
-
Equipe Rédaction
je souhaiterai afficher, dans un petit menu, le nom (comprenant l'url) des articles les plus visités allant de 1 à 10 du site.
Ce serait une sorte de top 10 en gros.
Est ce que quelqu'un a une piste ?
Merci d'avance
Xela
babsolune Membre non connecté
-
Administrateur
- Voir le profil du membre babsolune
- Inscrit le : 16/05/2008
- Site internet
- Groupes :
-
Equipe Développement
xela Membre non connecté
-
Modérateur
- Voir le profil du membre xela
- Inscrit le : 26/12/2015
- Groupes :
-
Equipe Rédaction
merci babsolune mais ce serait sympa si quelqu'un pouvait m'expliquer les étapes à suivre ou si un tuto existe sur le forum.
Merci d'avance pour votre aide
janus57 Membre non connecté
-
Booster Fusée
- Voir le profil du membre janus57
- Inscrit le : 07/12/2007
- Groupes :
-
Equipe Assistance
La doc est dans la doc, mais faut s'y connaître en PHP (OO et mvc si possible).
Cordialement, janus57
j1.seth Membre non connecté
-
Administrateur
- Voir le profil du membre j1.seth
- Inscrit le : 01/09/2008
- Site internet
- Groupes :
-
Chef de Projet
-
Equipe Développement
xela Membre non connecté
-
Modérateur
- Voir le profil du membre xela
- Inscrit le : 26/12/2015
- Groupes :
-
Equipe Rédaction
J'ai effectivement fait un tour sur la doc et on pourrait partir de zéro pour créer un module facilement cependant je pense comme babsolune que partir du module Téléchargement est une bonne idée.
En remplaçant le nombre de download par le nombre de vues et associer les articles correspondants.
Quelqu'un l'a déjà fait? Un petit coup de main?
Merci
Xela
babsolune Membre non connecté
-
Administrateur
- Voir le profil du membre babsolune
- Inscrit le : 16/05/2008
- Site internet
- Groupes :
-
Equipe Développement
un avantage c'est que le nombre de vues est déjà implémenté dans le module articles
Pour commencer, as tu déjà créé le minimodule? (vide pour l'instant)
Edit : Sa mère la pauvre
Entre ça et la page d'accueil en prepa, je n'ai plus de neurones .... 
http://prntscr.com/ab3ki0
Édité par babsolune Le 04/03/2016 à 15h16
xela Membre non connecté
-
Modérateur
- Voir le profil du membre xela
- Inscrit le : 26/12/2015
- Groupes :
-
Equipe Rédaction
xela Membre non connecté
-
Modérateur
- Voir le profil du membre xela
- Inscrit le : 26/12/2015
- Groupes :
-
Equipe Rédaction
Sinon j'ai vu que tu l'avais déjà fait. J'ai la version 5.0.1 de phpboost, j'espère que la doc a été mise à jour....
xela Membre non connecté
-
Modérateur
- Voir le profil du membre xela
- Inscrit le : 26/12/2015
- Groupes :
-
Equipe Rédaction
J'ai bien compris que tu avais déjà beaucoup de travail, donc comme il n'y a pas le feu, j'attendrai ta réponse (aujourd'hui ou un autre jour).
Merci d'avance
babsolune Membre non connecté
-
Administrateur
- Voir le profil du membre babsolune
- Inscrit le : 16/05/2008
- Site internet
- Groupes :
-
Equipe Développement
Dans l'idée il te faut 3 nouveaux fichiers à placer dans le module articles + modifier ArticlesExtentionPointProvider.class.php
le fichier php : ArticlesModuleMiniMenu.class.php à placer dans articles/phpboost
le fichier tpl : ArticlesTopView.tpl à déclarer dans ton nouveau fichier php et à placer dans articles/templates
article_mini.css à déclarer dans ArticlesExtentionPointProvider.class.php et à placer dans articles/templates
xela Membre non connecté
-
Modérateur
- Voir le profil du membre xela
- Inscrit le : 26/12/2015
- Groupes :
-
Equipe Rédaction
Donc j'ai utilisé comme base le module Download et j'ai effectué des modifications.
Je ne suis vraiment pas sûr des modifs .....
Dossier phpboost du module articles
ArticlesModuleMiniMenu.class.php
Code PHP :
<?php /*################################################## * ArticlesModuleMiniMenu.class.php * ------------------- * begin : March 5, 2016 * copyright : (C) 2016 SILVERPROD * email : silverprod.shost.ca@gmail.com * * ################################################### * * This program is a free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ###################################################*/ /** * @author SILVERPROD <silverprod.shost.ca@gmail.com> */ class ArticlesModuleMiniMenu extends ModuleMiniMenu { public function get_default_block() { return self::BLOCK_POSITION__RIGHT; } public function get_menu_id() { return 'module-mini-articles'; } public function get_menu_title() { return ArticlesConfig::load()->is_sort_type_date() ? LangLoader::get_message('last_articles_files', 'common', 'articles') : LangLoader::get_message('most_view_articles_files', 'common', 'articles'); } public function is_displayed() { return ArticlesAuthorizationsService::check_authorizations()->read(); } public function get_menu_content() { //Create file template $tpl = new FileTemplate('articles/ArticlesTopView.tpl'); //Assign the lang file to the tpl $tpl->add_lang(LangLoader::get('common', 'articles')); //Load module config $config = ArticlesConfig::load(); //Load module cache $articles_cache = ArticlesCache::load(); //Load categories cache $categories_cache = ArticlesService::get_categories_manager()->get_categories_cache(); $articlesfiles = $articles_cache->get_articlesfiles(); $tpl->put_all(array( 'C_FILES' => !empty($articlesfiles), 'C_SORT_BY_DATE' => $config->is_sort_type_date(), 'C_SORT_BY_NOTATION' => $config->is_sort_type_notation(), 'C_SORT_BY_NUMBER_VIEW' => $config->is_sort_type_number_view() )); $displayed_position = 1; foreach ($articlesfiles as $file) { $articlesfile = new ArticlesFile(); $articlesfile->set_properties($file); $tpl->assign_block_vars('articlesfiles', array_merge($articlesfile->get_array_tpl_vars(), array( 'DISPLAYED_POSITION' => $displayed_position ))); $displayed_position++; } return $tpl->render(); } } ?>
ArticlesExtensionPointProvider.class.php
Code PHP :
<?php /*################################################## * ArticlesExtensionPointProvider.class.php * ------------------- * begin : March 5, 2016 * copyright : (C) 2016 SILVERPROD * email : silverprod.shost.ca@gmail.com * * ################################################### * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ###################################################*/ /** * @author SILVERPROD <silverprod.shost.ca@gmail.com> */ class ArticlesExtensionPointProvider extends ExtensionPointProvider { public function __construct() { parent::__construct('articles'); } public function home_page() { return new ArticlesHomePageExtensionPoint(); } public function comments() { return new CommentsTopics(array(new ArticlesCommentsTopic())); } public function css_files() { $module_css_files = new ModuleCssFiles(); $module_css_files->adding_running_module_displayed_file('articles_mini.css'); $module_css_files->adding_running_module_displayed_file('articles.css'); return $module_css_files; } public function feeds() { return new ArticlesFeedProvider(); } public function scheduled_jobs() { return new ArticlesScheduledJobs(); } public function search() { return new ArticlesSearchable(); } public function sitemap() { return new ArticlesSitemapExtensionPoint(); } public function tree_links() { return new ArticlesTreeLinks(); } public function url_mappings() { return new UrlMappings(array(new DispatcherUrlMapping('/articles/index.php'))); } } ?>
Dossier template du module articles
ArticlesTopView.tpl
Code PHP :
<table id="table-mini-articles"> <thead> <tr> <th><i class="fa # IF C_SORT_BY_DATE #fa-calendar# ELSE #fa-trophy# ENDIF #"></i></th> <th>${LangLoader::get_message('form.name', 'common')}</th> # IF NOT C_SORT_BY_DATE # <th><i class="fa # IF C_SORT_BY_NUMBER_VIEW #fa-view# ELSE #fa-star-o# ENDIF #"></i></th> # ENDIF # </tr> </thead> <tbody> # IF C_FILES # # START articlesfiles # <tr> <td># IF C_SORT_BY_DATE #<time datetime="{articlesfiles.DATE_ISO8601}">{articlesfiles.DATE_DAY_MONTH}</time># ELSE #{articlesfiles.DISPLAYED_POSITION}# ENDIF #</td> <td # IF C_SORT_BY_NOTATION #class="mini-articles-table-name"# ENDIF #> <a href="{articlesfiles.U_LINK}" title="{articlesfiles.NAME}"> {articlesfiles.NAME} </a> </td> # IF NOT C_SORT_BY_DATE # <td># IF C_SORT_BY_NUMBER_VIEW #{articlesfiles.NUMBER_VIEW}# ELSE #{articlesfiles.STATIC_NOTATION}# ENDIF #</td> # ENDIF # </tr> # END articlesfiles # # ELSE # <tr> <td colspan="# IF C_SORT_BY_DATE #2# ELSE #3# ENDIF #">${LangLoader::get_message('no_item_now', 'common')}</td> </tr> # ENDIF # </tbody> </table>
articles_mini.css
Code HTML :
.mini-articles-table-name {
max-width: 84px;
}Édité par xela Le 06/03/2016 à 00h46
xela Membre non connecté
-
Modérateur
- Voir le profil du membre xela
- Inscrit le : 26/12/2015
- Groupes :
-
Equipe Rédaction
je suis sur la bonne voie ou je me plante totalement ?

Si c'est bon, dois-je désinstaller puis réinstaller le module avec les modifs?
Édité par xela Le 06/03/2016 à 00h52
j1.seth Membre non connecté
-
Administrateur
- Voir le profil du membre j1.seth
- Inscrit le : 01/09/2008
- Site internet
- Groupes :
-
Chef de Projet
-
Equipe Développement
Vous êtes sur la bonne voie, par contre il n'y a pas de fichier de cache de base dans le module articles donc la ligne
$articles_cache = ArticlesCache::load();ne fonctionne pas pour le moment. Inspirez vous de DownloadCache et modifiez la requete SQL.
Il faut également ajouter les lignes suivantes dans ArticlesExtensionPointProvider.class.php pour appeler le menu :
[code=php]
public function menus()
{
return new ModuleMenus(array(new ArticlesModuleMiniMenu()));
}
{/code]
babsolune Membre non connecté
-
Administrateur
- Voir le profil du membre babsolune
- Inscrit le : 16/05/2008
- Site internet
- Groupes :
-
Equipe Développement

on va y aller en douceur
Certes c'est de l'anglais, mais phpboost nomme ses fonctions en relation avec leurs actions
ArticlesExtensionPointProvider.class.php
adding_running_module_displayed_file peut se traduire par "utiliser le fichier seulement quand le module (articles) est actif", je pense que tu préfèrerais qu'il soit utilisé sur toutes les pages => adding_always_displayed_file
ArticlesModuleMiniMenu.class.php
- get_default_block defini la position du mini => ok
- get_menu_id défini l'id du mini => ok
- get_menu_title défini le titre => pas ok : ArticlesConfig = tu charges la config du module articles et regardes ce que retourne la fonction "classement par date". Problème : ArticlesConfig.class.php ne contient pas cette fonction, ça va te retourner une erreur. Langloader va chercher la traduction de last_articles_files et most_view_articles_files dans le fichier common.php du module articles. si elles n'existent pas => erreur.
On veut juste un titre fixe qui ne dépend pas d'une fonction, on va donc charger seulement le Langloader et on crée la ligne de traduction dans le fichier common.php du module articles
Code PHP :
return LangLoader::get_message('most_viewed_articles', 'common', 'articles');
et dans le fichier common.php du module on ajoute
Code PHP :
tu mets ce que tu veux comme traduction, ici on affiche une suite de mot, on met donc ce qu'on veut (n'oublie pas de créer la même ligne dans le fichier de langue "english" pour être complet $lang['most_viewed_articles'] = 'Articles les plus vus';
)- is_displayed vérifie les autorisations quand le mini est affiché => ok
- get_menu_content : défini le contenu du mini, là, on rentre dans le dur

Pour l'instant en recopiant/modifiant le download, tu appeles des fonctionnalités qui existent dans download mais pas dans articles => erreur
pour le début c'est bon :
FileTemplate => défini le tpl qui va gérer l'affichage
Langloader charge le fichier de langue nécessaire pour la traduction
Ensuite c'est là qu'on va différer du download, ici on veut récupérer les données de la table articles dans la base de données, lire la liste des articles pour l'afficher en fonction du nombre de vues
dans l'ordre
on initialise la date
on défini la fonction "va chercher dans la base de données"
on défini l'id de départ des articles (on veut voir parmis tous les articles donc = 1)
on défini les résultats parmis les différentes options de la table articles, en ordonnant par nombre de vues et on va limiter aux 10 premiers résultats (tu pourras modifier ce nombre en fonction de tes besoins)
Code PHP :
$now = new Date(); $querier = PersistenceContext::get_querier(); $top_view = 1; $results = $querier->select('SELECT articles.*, member.*, com.number_comments, notes.average_notes, notes.number_notes, note.note, cat.rewrited_name AS rewrited_name_cat FROM ' . PREFIX . 'articles articles LEFT JOIN ' . PREFIX . 'articles_cats cat ON cat.id = articles.id_category LEFT JOIN ' . DB_TABLE_MEMBER . ' member ON member.user_id = articles.author_user_id LEFT JOIN ' . DB_TABLE_COMMENTS_TOPIC . ' com ON com.id_in_module = articles.id AND com.module_id = 'articles' LEFT JOIN ' . DB_TABLE_AVERAGE_NOTES . ' notes ON notes.id_in_module = articles.id AND notes.module_name = 'articles' LEFT JOIN ' . DB_TABLE_NOTE . ' note ON note.id_in_module = articles.id AND note.module_name = 'articles' AND note.user_id = :user_id AND (published = 1 OR (published = 2 AND publishing_start_date < :timestamp_now AND (publishing_end_date > :timestamp_now OR publishing_end_date = 0))) ORDER BY articles.number_view DESC LIMIT 10 ', array( 'user_id' => AppContext::get_current_user()->get_id(), 'timestamp_now' => $now->get_timestamp() ));
AND = On vérifie que l'article est publié
ORDER BY = défini l'option choisie pour le classement - DESC pour ordre décroissant, ASC pour ordre croissant
LIMIT = nombre d'articles à afficher
Ensuite on récupère chaque résultat un par un en utilisant les fonctions du module articles
on défini le nom de la liste et on appelle les variables template du module articles
on passe au résultat suivant
on envoie au tpl
Code PHP :
while($row = $results->fetch())
{
$article = new Article();
$article->set_properties($row);
$tpl->assign_block_vars('articles_items', $article->get_tpl_vars());
$top_view++;
}
return $tpl->render();Je te rassure, je n'y connaissais pas grand chose non plus, j'applique juste une vieille méthode :
1 - Comment c'est fait dans d'autres modules ?
2 - Essayons de l'adapter à mes besoins

il ne reste plus qu'à utiliser les variables templates du module articles dans le tpl, en n'oubliant pas de mettre le préfixe défini dans le traitement des résultats :
On initialise la liste => START ma liste
on affiche le nom de l'article, son lien et le nombre de vues
On ferme la liste => END ma liste, qui s’arrêtera à 10 articles (selon le nombre défini dans LIMIT)
Code TPL :
Bien sur une meilleure mise en page est possible avec un tableau par exemple, là on a le minimum syndical

Tu remarqueras qu'on ne déclare pas le conteneur du mini (module-mini-container, module-mini-top, etc) puisque c'est phpboost qui s'en charge en récupérant le titre et le contenu déclaré pour les mettre dans les emplacements qui vont bien
Pour les css, il faut faire attention. Comme le fichier css est appelé tout le temps et après les css du thème, les classes définies dans article_mini.css peuvent prendre le pas sur celles du thème. Il faut donc précéder les classes css de l'id du mini module
par exemple
a { color: #0055ff }
=> tous les liens du site seront bleus
#module-mini-articles a { color: #0055ff }
=> seuls les liens du mini seront bleus
Enjoy
Édité par babsolune Le 06/03/2016 à 08h24
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie
