Forum

Créations de Modules » Vos Modules Notifications | PHPBoost 5.2

Myster Membre non connecté

Booster Mortier

Rang

Avatar

Inscrit le : 04/10/2010 à 19h18

Messages: 995

Le 09/01/2019 à 19h19
Bonjour à toutes et à tous,

Aujourd'hui je vous présente un module pour PHPBoost 5.2.

Notifications!


Un module permettant d'envoyer des notifications à vos membres lorsque d'autres personnes interagissent avec leurs contenus. C'est-à-dire que si un membre poste un sujet sur le forum et qu'un autre membre envoie un message dans ce sujet, le membre qui a créé le sujet recevra une notification lui indiquant que le membre a ajouté une réponse à son sujet.

De base le module de notifications ne communique pas avec les différents modules de PHPBoost, c'est pour cela que vous devez mettre en oeuvre les addons qui sont proposés sur cette page !

Liste des fonctionnalités!




  • Envoyer une notification à un membre, ou tous les membres depuis l'administration
  • Gérer le nombre de notifications par pages
  • Archivage des notifications une fois lues
  • Supprimer une notification en particulier (ou toutes d'un coup)
  • Activation/Désactivation de la suppression automatique des notifications après la lecture
  • Recevoir des notifications sur les différents modules de PHPBoost grâce aux addons ci-dessous
  • Option permettant l'archivage automatique des notifications (à activer dans l'administration)
  • Possibilité d'archiver une notification spécifique si l'option d'archivage automatique n'est pas activée.



Mais pourquoi tu nous parles d'addons ?


Les addons sont des petits morceaux de code à ajouter sur le module pour lequel il a été fait afin justement "d'activer" les notifications pour ce module. Vous trouverez de plus amples détails ci-dessous.

Preview du module


module52notif
module52notif1
notif3
notif4

Lien de téléchargement


Pour télécharger le module Notifications pour PHPBoost 5.2 Cliquez-ici

Les addons


Donc comme vous l'aurez compris ce module fonctionne grâce à des addons ! Sans cela, la seule fonctionnalité du module c'est de pouvoir envoyer une notification à un membre depuis votre espace d'administration, ce n'est pas vraiment ce que l'on souhaite j'imagine ! Donc voici les différents addons

Recevoir une notification lorsque quelqu'un poste un message dans notre sujet[
Recevoir une notification lorsque qu'un modérateur ou administrateur supprime notre sujet
Recevoir une notification lorsqu'un membre répond à notre sondage
Recevoir une notification lorsqu'un modérateur ou un administrateur verrouille notre sujet
Recevoir une notification lorsqu'un modérateur ou un administrateur déverrouille notre sujet
Recevoir une notification lorsque notre contribution est mise à jour
Connaître le nombre de notification(s) dans le module connect ..

A FAIRE ABSOLUMENT AVANT D'INTEGRER LES ADDONS


Certains addons nécessite des champs que certaines requêtes SQL de PHPBoost 5.2 n'ont pas (N'ayez crainte vous n'avez juste qu'à modifier une ligne pour demander à PHPBoost qu'il prenne en compte une colonne en plus ..)
Notez que dans la PHPBoost 5.2 final il n'y aura pas besoin de faire les deux modifications ci-dessous car les colonnes seront prise en compte .. En attendant si vous utilisez une RC, vous devez le faire

Caché :

  • Il nous faut l'user_id du créateur du topic pour les différentes notifications donc allez dans forum/post.php, puis à la ligne 256 remplacez

Code PHP :
 
            $topic = PersistenceContext::get_querier()->select_single_row_query('SELECT idcat, title, nbr_msg, last_user_id, last_msg_id, status
            FROM ' . PREFIX . 'forum_topics
            WHERE id=:id', array(
                'id' => $idt_get
            ));
 


Par ceci:

Code PHP :
 
            $topic = PersistenceContext::get_querier()->select_single_row_query('SELECT user_id, idcat, title, nbr_msg, last_user_id, last_msg_id, status
            FROM ' . PREFIX . 'forum_topics
            WHERE id=:id', array(
                'id' => $idt_get
            ));
 


  • Et pour finir il nous faut le titre du sujet donc allez dans forum/action.php à la ligne 69 puis remplacez ceci:

Code PHP :
 
$topic = PersistenceContext::get_querier()->select_single_row(PREFIX . 'forum_topics', array('user_id', 'idcat', 'first_msg_id', 'last_msg_id', 'last_timestamp'), 'WHERE id=:id', array('id' => $msg['idtopic']));
 


Par le code suivant:
Code PHP :
$topic = PersistenceContext::get_querier()->select_single_row(PREFIX . 'forum_topics', array('user_id', 'title', 'idcat', 'first_msg_id', 'last_msg_id', 'last_timestamp'), 'WHERE id=:id', array('id' => $msg['idtopic']));;


Voilà c'est tout ! :)

Liste des addons


Le forum

Recevoir une notification lorsque quelqu'un poste un message dans notre sujet

Caché :

Dans forum/post.php, vers la ligne 340 juste après:

Code PHP :
 
$last_msg_id = $Forumfct->Add_msg($idt_get, $topic['idcat'], $contents, $topic['title'], $last_page, $last_page_rewrite);
 


Ajoutez ceci:

Code PHP :
 
                    if ($topic['user_id'] != AppContext::get_current_user()->get_id())
                      {
                        $notify = New Notifications();
                        $notify->set_sender_id(AppContext::get_current_user()->get_id());
                        $notify->set_recipient_id($topic['user_id']);
                        $notify->set_reading(0);
                        $notify->set_date(time());
                        $notify->set_content(NotificationsFormat::contenu('forum.msg', array(
                            'url_username' => UserUrlBuilder::profile(AppContext::get_current_user()->get_id())->rel(),
                            'username' => AppContext::get_current_user()->get_display_name(),
                            'sujet' => $topic['title'],
                            'url' => PATH_TO_ROOT . "/forum/topic" . url('.php?id=' . $idt_get . $last_page, '-' . $idt_get . $last_page_rewrite . '.php', '&') . '#m' . $last_msg_id
                        )));
                        Notifications::add_notification($notify);
                      }
 


Recevoir une notification lorsque qu'un modérateur ou administrateur supprime notre sujet
Caché :

A la ligne 80 dans forum/action.php, juste en dessous de
Code PHP :
$Forumfct->Del_topic($msg['idtopic']); //Suppresion du topic.


ajoutez ceci:

Code PHP :
 
if($topic['user_id'] != AppContext::get_current_user()->get_id())
{
    $notify = New Notifications();
    $notify->set_sender_id(AppContext::get_current_user()->get_id());
    $notify->set_recipient_id($topic['user_id']);
    $notify->set_reading(0);
    $notify->set_date(time());
    $notify->set_content(NotificationsFormat::contenu('forum.del.topic', array(
    'url_username' => UserUrlBuilder::profile(AppContext::get_current_user()->get_id())->rel(),
    'username' => AppContext::get_current_user()->get_display_name(),
    'sujet' => $topic['title'],
    )));
    Notifications::add_notification($notify);
}
 


Recevoir une notification lorsqu'un membre répond à notre sondage
Caché :

  • Dans forum/action.php vers la ligne ligne 215 en dessous de:


Code PHP :
            PersistenceContext::get_querier()->update(PREFIX . 'forum_poll', array('voter_id' =>  implode('|', $voter_id), 'votes' =>  implode('|', $array_votes)), 'WHERE idtopic=:id', array('id' => $idt_get));


Ajoutez ceci:

Code PHP :
 
                    if ($topic['user_id'] != AppContext::get_current_user()->get_id())
                      {
                        $notify = New Notifications();
                        $notify->set_sender_id(AppContext::get_current_user()->get_id());
                        $notify->set_recipient_id($topic['user_id']);
                        $notify->set_reading(0);
                        $notify->set_date(time());
                        $notify->set_content(NotificationsFormat::contenu('forum.poll', array(
                            'url_username' => UserUrlBuilder::profile(AppContext::get_current_user()->get_id())->rel(),
                            'username' => AppContext::get_current_user()->get_display_name(),
                            'sujet' => $topic['title'],
                            'url' => PATH_TO_ROOT . "/forum/topic.php?id=".$idt_get
                        )));
                        Notifications::add_notification($notify);
                      }
 


Recevoir une notification lorsqu'un modérateur ou un administrateur verrouille notre sujet
Caché :
Dans le fichier forum/action.php vers la ligne 230 juste en dessous de
Code PHP :
 $Forumfct->Lock_topic($idt_get); 


Ajoutez ceci:

Code PHP :
 
                    if ($topic['user_id'] != AppContext::get_current_user()->get_id())
                      {
                        $notify = New Notifications();
                        $notify->set_sender_id(AppContext::get_current_user()->get_id());
                        $notify->set_recipient_id($topic['user_id']);
                        $notify->set_reading(0);
                        $notify->set_date(time());
                        $notify->set_content(NotificationsFormat::contenu('forum.lock.topic', array(
                            'url_username' => UserUrlBuilder::profile(AppContext::get_current_user()->get_id())->rel(),
                            'username' => AppContext::get_current_user()->get_display_name(),
                            'sujet' => $topic['title'],
                            'url' => PATH_TO_ROOT . "/forum/topic.php?id=".$idt_get
                        )));
                        Notifications::add_notification($notify);
                      }
 


Recevoir une notification lorsqu'un modérateur ou un administrateur déverrouille notre sujet
Caché :
Dans le fichier forum/action.php vers la ligne 239 juste en dessous de
Code PHP :
 $Forumfct->Unlock_topic($idt_get); 


Ajoutez ceci:

Code PHP :
 
                    if ($topic['user_id'] != AppContext::get_current_user()->get_id())
                      {
                        $notify = New Notifications();
                        $notify->set_sender_id(AppContext::get_current_user()->get_id());
                        $notify->set_recipient_id($topic['user_id']);
                        $notify->set_reading(0);
                        $notify->set_date(time());
                        $notify->set_content(NotificationsFormat::contenu('forum.unlock.topic', array(
                            'url_username' => UserUrlBuilder::profile(AppContext::get_current_user()->get_id())->rel(),
                            'username' => AppContext::get_current_user()->get_display_name(),
                            'sujet' => $topic['title'],
                            'url' => PATH_TO_ROOT . "/forum/topic.php?id=".$idt_get
                        )));
                        Notifications::add_notification($notify);
                      }
 



Les contributions

Pour les contributions j'ai fait qu'un seul addon donc à voir si y'a encore des choses à faire à ce niveau plus tard ..

Recevoir une notification lorsque notre contribution est mise à jour
Caché :
Rendez-vous dans /user/contribution_panel.php vers la ligne 111

Juste en dessous de :
Code PHP :
 
        //Enregistrement en base de données
        ContributionService::save_contribution($contribution);
 


Ajoutez ceci:

Code PHP :
 
                        $notify = New Notifications();
                        $notify->set_sender_id(AppContext::get_current_user()->get_id());
                        $notify->set_recipient_id($topic['user_id']);
                        $notify->set_reading(0);
                        $notify->set_date(time());
                        $notify->set_content(NotificationsFormat::contenu('update.contrib', array(
                            'url_username' => UserUrlBuilder::profile(AppContext::get_current_user()->get_id())->rel(),
                            'username' => AppContext::get_current_user()->get_display_name(),
                            'contribution' => $topic['title'],
                            'url' => PATH_TO_ROOT."/user/contribution_panel.php?id=".$id_to_update
                        )));
                        Notifications::add_notification($notify);
 



Module: "Connect"

Connaître le nombre de notification(s) dans le module connect ..

Caché :
  • Allez dans connect/phpboost/ConnectModuleMiniMenu.class.php vers la ligne 47 juste en dessous de :
    Code PHP :
    $unread_contributions = UnreadContributionsCache::load();

    Ajoutez ceci :
    Code PHP :
    $nbr_notifications = NotificationsService::count('WHERE recipient_id=:recip_id AND reading=0', array('recip_id' => $user->get_id()));

    Puis pour déclarer dans le template le nombre de notifications:
    Vers la ligne 107 de ce même fichier juste en dessous de :
    Code PHP :
                        'NUMBER_UNREAD_CONTRIBUTIONS' => $contribution_number,

    Ajoutez ceci :
    Code PHP :
                        'NBR_NOTIFICATIONS' => $nbr_notifications,


    Vous pouvez maintenant afficher le nombre de notifications dans connect_mini.tpl qui se trouve dans connect/templates/connect_mini.tpl ou dans /templates/{Votre theme}/modules/connect/connect_mini.tpl



Update pour PHPBoost 5.2.4 Voir ici: https://www.phpboost.com/forum/topic-17395-3+notifications-phpboost-5-2.php#m165004 Edité par Myster Le 13/12/2019 à 18h15
Site web    
Swan Membre non connecté

Booster Mortier

Rang

Avatar

Inscrit le : 31/05/2013 à 12h34

Messages: 778

Le 10/01/2019 à 11h34
On est pas aux pièces ^^
Site web    
Myster Membre non connecté

Booster Mortier

Rang

Avatar

Inscrit le : 04/10/2010 à 19h18

Messages: 995

Le 10/01/2019 à 13h22
Module disponible :)
Site web    
babsolune Membre non connecté

Modérateur

Rang

Avatar

Equipe Graphique

Inscrit le : 16/05/2008 à 12h52

Messages: 2391

Le 11/01/2019 à 05h50
En 1, bravo et merci pour ce module, je ne l'ai pas encore testé en profondeur mais je lui trouve déjà une certaine utilité :)

En 2, mes premières remarques #PasTaper :)
Myster :
Sans cela, la seule fonctionnalité du module c'est de pouvoir envoyer une notification à un membre depuis votre espace d'administration, ce n'est pas vraiment ce que l'on souhaite j'imagine

Dans l'idée je suis plutôt intéressé, ça permet aux admins de mettre l'accent sur tel ou tel événement du site qui ne serait pas forcement en évidence (mais pas que), mais je verrai bien un "système" pour que l'utilisateur ait le choix d'accepter d'en recevoir ou pas et la possibilité de créer des "catégories" d'envoi de notifications avec le choix pour les membres de s'inscrire à toutes/chaque catégorie, un peu comme pour les newsletters

Côté fichiers, mes remarques ne sont que d'ordre rédactionnel donc rien d'important:
- tu as oublié le @since dans les docblocks, qui correspond à la date de création des fichiers, aujourd'hui le @version suffit puisque c'est récent mais dans les futures versions de phpboost le @version aura été modifié et on n'aura plus l'info de création.
- en description plusieurs fichiers ont la mention "Cette classe founit une interface...", il manque un p'tit r je pense.
Il y en a d'autres de-ci de-là, notamment dans les commentaires de fonction. ;)

Et je suis conscient que le module est naissant, je passerai donc sous silence un GuestbookConfig dans un admincontroller, le texte en dur dans le mini, du style dans un tpl, le manque de h1 dans les tpl (w3c), le manque de balises header/article/footer (framework phpboost), une structure en <table> à l'heure de la flexbox/gridbox, les indentations/sauts de ligne dans les fichiers tpl/php.

Côté code, et là mon incompétence n'aura d'égale que la légitimité de mes interrogations ^^, concernant les add-ons, je vois que les ajouts dans les modules cibles sont quasiment similaires et surtout qu'il y a du texte en dur (ce que je comprends dans le cas présent, sinon il faudrait créer les variables de langues dans chaque module) qui empêche le multilingue (c'est balo):
- N'y aurait-il pas un moyen de créer le code coté module notifications et faire un appel "simplifié" dans le module correspondant ?
Un genre de
NotificationsService::send_notifications('module_name');

je pense surtout à la simplicité de remettre les codes après une mise à jour de pbt impactant les fichiers.
- Est-ce qu'une vérif de présence du module notifications dans les modules cible ne serait pas nécessaire pour le cas où on désinstallerai le module notifications(ne serait-ce que par inadvertance :D ) ?

En 3, j'ai dit bravo ? ah oui, en 1, alors encore bravo :)


Site web    
Myster Membre non connecté

Booster Mortier

Rang

Avatar

Inscrit le : 04/10/2010 à 19h18

Messages: 995

Le 11/01/2019 à 09h55
Citation :
Dans l'idée je suis plutôt intéressé, ça permet aux admins de mettre l'accent sur tel ou tel événement du site qui ne serait pas forcement en évidence (mais pas que), mais je verrai bien un "système" pour que l'utilisateur ait le choix d'accepter d'en recevoir ou pas et la possibilité de créer des "catégories" d'envoi de notifications avec le choix pour les membres de s'inscrire à toutes/chaque catégorie, un peu comme pour les newsletters


Oui effectivement je vais voir pour faire quelque chose qui permet de recevoir ou pas des notifications.

Citation :
Côté fichiers, mes remarques ne sont que d'ordre rédactionnel donc rien d'important:
- tu as oublié le @since dans les docblocks, qui correspond à la date de création des fichiers, aujourd'hui le @version suffit puisque c'est récent mais dans les futures versions de phpboost le @version aura été modifié et on n'aura plus l'info de création.
- en description plusieurs fichiers ont la mention "Cette classe founit une interface...", il manque un p'tit r je pense.
Il y en a d'autres de-ci de-là, notamment dans les commentaires de fonction. ;)


Ca sera corrigé dans une prochaine version :)

Citation :
Et je suis conscient que le module est naissant, je passerai donc sous silence un GuestbookConfig dans un admincontroller, le texte en dur dans le mini, du style dans un tpl, le manque de h1 dans les tpl (w3c), le manque de balises header/article/footer (framework phpboost), une structure en <table> à l'heure de la flexbox/gridbox, les indentations/sauts de ligne dans les fichiers tpl/php.


Concernant le guestbook config, effectivement par flemme de créer les fichiers j'ai copier/coller pour retirer, j'ai dû en oublier un :)
Et pour le reste de tes affirmations je vais voir ce que je peut faire, y'a pas de soucis ! :D

Citation :
(ce que je comprends dans le cas présent, sinon il faudrait créer les variables de langues dans chaque module)

Justement non hier en fouillant un peu j'ai pu trouvé un fichier de langue avec par exemple $lang['trucbidule'] = 'Bienvenue sur le site :site', et la variable :site était passer ensuite dans un array en php, donc ça dois être possible de faire un fichier lang, incluant les variables à l'intérieur, ça éviterai de mettre du texte en dur dans le module

Citation :
- Est-ce qu'une vérif de présence du module notifications dans les modules cible ne serait pas nécessaire pour le cas où on désinstallerai le module notifications(ne serait-ce que par inadvertance :D ) ?


Oui peut-être bien mais je ne trouve pas de fonction du genre module_exist('nom_du_module')

Et merci ! Bonne journée à toi :) Edité par Myster Le 11/01/2019 à 09h56
Site web    
babsolune Membre non connecté

Modérateur

Rang

Avatar

Equipe Graphique

Inscrit le : 16/05/2008 à 12h52

Messages: 2391

Le 11/01/2019 à 10h08
Myster :
Oui peut-être bien mais je ne trouve pas de fonction du genre module_exist('nom_du_module')


celle-là je la connais bien :D #HomeLanding #VérifieSiYATousLesModules
ModulesManager::is_module_installed('notifications') && ModulesManager::is_module_activated('notifications')


Myster :
[...] mme de créer les fichiers j'ai copier/coller [...]
hey! c'est ma méthode ça! pas touche :p Edité par babsolune Le 11/01/2019 à 10h11


Site web    
Myster Membre non connecté

Booster Mortier

Rang

Avatar

Inscrit le : 04/10/2010 à 19h18

Messages: 995

Le 11/01/2019 à 10h11
Donc en gros à chaque addons un coup de

Code PHP :
 
if(ModulesManager::is_module_activated('notifications'))
{
// MON CODE ?
}
 
Site web    
babsolune Membre non connecté

Modérateur

Rang

Avatar

Equipe Graphique

Inscrit le : 16/05/2008 à 12h52

Messages: 2391

Le 11/01/2019 à 10h14
yep, à tenter mais je n'ai jamais vu une seule, toujours les deux. Edité par babsolune Le 11/01/2019 à 10h14


Site web    
Myster Membre non connecté

Booster Mortier

Rang

Avatar

Inscrit le : 04/10/2010 à 19h18

Messages: 995

Le 11/01/2019 à 10h23
Oui mais bon je pense pas que la deuxième soit nécessaire, si le module est activé, c'est qu'il est obligatoirement installé ?
Site web    
babsolune Membre non connecté

Modérateur

Rang

Avatar

Equipe Graphique

Inscrit le : 16/05/2008 à 12h52

Messages: 2391

Le 11/01/2019 à 10h47
dans une logique de pure sémantique... oui :D


Site web    
Myster Membre non connecté

Booster Mortier

Rang

Avatar

Inscrit le : 04/10/2010 à 19h18

Messages: 995

Le 11/01/2019 à 10h51
:lol

Suite à suggestion de M-ickael

  • Possibilité d'avoir une option pour archiver automatiquement les nouvelles notifications à la lecture .. Cette option ne peut pas être activé avec la suppression automatique, vu qu'elle elle supprime directement .. Donc vous pouvez essayer mais vous arriverez pas à l'activer (question de logique) toute est une question de logique :lol
  • Ajout d'une icône "Archiver" à côté de l'icone "Supprimer" des notifications (Vous pouvez archiver une à une chaque notification)


Maintenant je me penche sur ce fameux fichier de langue pour éviter du texte en dur ! :D
Site web    
Myster Membre non connecté

Booster Mortier

Rang

Avatar

Inscrit le : 04/10/2010 à 19h18

Messages: 995

Le 11/01/2019 à 12h30
Bonjour,

Petite update pour vous dire que désormais il n'y aura plus de texte en dur pour les notifications, et le système de réception vas être revu pour une meilleure

Pour l'envoi du contenu d'une notification là sans texte en dur ça donne ça :

Code PHP :
   // Code à titre d'exemple, variable fausse .. 
$notify->set_content(StringVars::replace_vars(LangLoader::get_message('notification.forum.msg', 'common', 'notifications'), array('sujet' => $topic['title'], 'user' => $user))); 


Je vais voir pour faire une fonction qui raccourci encore tout ça parce que là c'est long encore !



Edité par Myster Le 11/01/2019 à 12h30
Site web    
MickaelFR Membre non connecté

Booster Missile

Rang

Avatar

Inscrit le : 20/01/2014 à 11h01

Messages: 1474

Le 11/01/2019 à 12h39
ça va changer mes CSS du coup, vu que j'ai mis des balises <span id"xx">....</span>
Myster Membre non connecté

Booster Mortier

Rang

Avatar

Inscrit le : 04/10/2010 à 19h18

Messages: 995

Le 11/01/2019 à 12h41
Normalement non mais y'aura de nouvelles balises tpl à mettre tout ça (pour les archives notamment le petit bouton de d'archivage à côté des notifications)
Site web    
Myster Membre non connecté

Booster Mortier

Rang

Avatar

Inscrit le : 04/10/2010 à 19h18

Messages: 995

Le 11/01/2019 à 12h45
Voilà donc le code "officiel"

Code PHP :
 
$notify->set_content(NotificationsFormat::contenu('notification.forum.msg', array('username' => 'Myster', 'sujet' =>'Testeeeee')));
 


De plus il s'adapte à chaque variable de langue, suffit que dans une variable de langue vous ayez par exemple

$lang['msg'] = 'Bienvenue sur le site :site nous sommes ravis de vous compter parmi nos membres :username allez sur le sujet suivant :sujet';

Suffit d'ajouter un nouveau champ dans le array du genre

Code PHP :
$notify->set_content(NotificationsFormat::contenu('notification.msg', array('username' => 'Myster', 'sujet' =>'Testeeeee', 'site' => 'Mon super site')));
Site web    
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie