Forum CMS Made Simple FR

Version complète : Page(s) modifiée(s) par mail [RESOLU] Merci monsieur le Chauve...
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
Pages : 1 2
Citation :#~~~~~ NE PAS SUPPRIMER CE BLOC ~~~~~
#~ Version du CMS: 1.6.8
#~ Nom de l'hébergeur : free
#~ Informations Système :
#~~~~~ NE PAS SUPPRIMER CE BLOC ~~~~~

Bonjour à tous,
Je souhaite recevoir un mail m'indiquant qui a fait quoi, c'est à dire quelles pages ont été modifiées et le nom de l'utilisateur.
J'ai créé une balise utilisateur qui m'envoie un mail dès qu'une des pages a été modifiée. http://www.cmsmadesimple.fr/forum/viewtopic.php?id=753
Ensuite, j'ai bien vu qu'il existe un tag permettant d'indiquer les 10 dernières pages modifiées en utilisant la balise {recently_updated_fr leadin='Last Changed'}
Pourriez-vous m'aider à combiner les 2?
L'idéal serait d'avoir le nom de l'utilisateur, les pages modifiées et la date...
Merci à vous
cordialement
Lio
Est-ce que ça en vaut la peine ? Toutes ces infos sont dans le journal d'administration.
Il te suffit d'ajouter dans le mail l'adresse de cette page.
Sinon, étudie le fichier admin/adminlog.php et tu verras que toutes les infos sont dans la bd : cms_adminlog
Noyau ContentDeletePost Envoyé après qu'un contenu ait été supprimé du système
Noyau ContentEditPost Envoyé après que l'édition d'un contenu ait été enregistrée

Les évènements vont t'aider.

à ces deux évènements tu ajoutes le nom de ta balise utilisateur. Ainsi dès qu'une page sera modifiée ou supprimée tu en recevras un info par email

--! attention : ici on parle de contenu, pas de titre ou d'options de la page !--

ça se passe dans ton menu "Gestion des événements"
Merci Jean le chauve et bess pour vos explications...
bess : oui, j'ai bien vu les différents noyaux et j'arrive à :
- créer une balise utilisateur
- insérer le code pour recevoir le mail
cela fonctionne très bien
Je me suis sans doute mal exprimé ou n'ai rien compris à vos explications...
Il existe le tag {recently_updated_fr leadin='Last Changed'} permettant d'afficher la liste des 10 dernières modifications et sans doute davantage. Alors j'ai placé ce tag dans un gabarit pour voir l'effet... bon cela fonctionne, il m'affiche bien cette liste mais dans le décor, c'est normal, je ne lui ai pas précisé où et comment il devait l'afficher....
Je crois que mon problème est davantage une histoire de syntaxe de code php pour insérer cette liste dans un mail... et sans doute comment importer cette bd (cms_adminlog) dans mon mail....
merci
cordialement
Lio
laisse tomber ton tag et utilise la gestion des évènements, 3 clics souris en main et ca te résous ton soucis.
Oui, d'accord, cela j'y arrive
Exemple : je souhaite être averti avant qu'un utilisateur enregistre l'édition d'un contenu, j'utilise l'évènement : ContentEditPre
Je crée la balise utilisateur qui contient : mail('email_destinataire', 'sujet', 'Une page a été modifiée');
Je reçois un mail m'indiquant "Une page a été modifiée"

Mais qui? et quelle page? c'est là mon interrogation?
cordialement
Lio
Base-toi sur le code du plugin :
Code :
function smarty_cms_function_last_modified_by($params, &$smarty)
{
global $gCms;
$pageinfo = $gCms->variables['pageinfo'];
$id = "";
if (isset($pageinfo) && $pageinfo->content_last_modified_by_id > -1)
{
$id = $pageinfo->content_last_modified_by_id;
} else {
return "";
}
if(empty($params['fofunction smarty_cms_function_last_modified_by($params, &$smarty)
{
global $gCms;
$pageinfo = $gCms->variables['pageinfo'];

$id = "";

if (isset($pageinfo) && $pageinfo->content_last_modified_by_id > -1)
{
$id = $pageinfo->content_last_modified_by_id;
} else {
return "";
}

if(empty($params['format']))
{
$format = "id";
}
else
{
$format = $params['format'];
$userops =& $gCms->GetUserOperations();
$thisuser =& $userops->LoadUserByID($id);
}
$output = '';
if($format==="id") {
$output = $id;
} else if ($format==="username") {
$output = cms_htmlentities($thisuser->username);
} else if ($format==="fullname") {
$output = cms_htmlentities($thisuser->firstname ." ". $thisuser->lastname);
}
if( isset($params['assign']) ) {
$smarty = $gCms->GetSmarty();
$smarty->assign($params['assign'],$output);
return;
}
return $output;
}
tu récupères l'output et tu le places dans la fonction mail.
Merci monsieur,

il m'indique une erreur à la ligne 15
Parse error: syntax error, unexpected T_STRING, expecting ']'

$pageinfo = $gCms->variables['pageinfo'];

Désolé...

Lio
Oups, gouré de plugin : j'étais dans last_modified_by (mais ça marche quand même, je reçois le nom de l'utilisateur dans le mail.
Je vais te faire le bon.
En attendant, j'ai regarder la base de données (une première...), j'ai pris ce code
Code :
$output = '<div class="nav"><div class="heading">Dernières modifications</div>';
$output .= '<ul class="links">';
global $gCms;
$hm =& $gCms->GetHierarchyManager();
$db = &$gCms->db;
// Affiche la liste des 10 plus récentes pages modifiées à l'exception de la home page
$q = "SELECT * FROM ".cms_db_prefix()."content WHERE (type='content' OR type='link')
AND active = 1 AND show_in_menu = 1
ORDER BY modified_date DESC LIMIT 10";
$dbresult = $db->Execute( $q );
if( !$dbresult )
{
    echo 'DB error: '. $db->ErrorMsg()."<br/>";
}
while ($dbresult && $updated_page = $dbresult->FetchRow())
{
    $curnode =& $hm->getNodeById($updated_page['content_id']);
    $curcontent =& $curnode->GetContent();
    $output .= '<li class="updated">';
    $output .= '<a href="'.$curcontent->GetURL().'"><strong>'.$updated_page['content_name'].'</strong></a> ';
    $output .= $updated_page['titleattribute'];
    $output .= '<br />';
    $output .= 'page modifiée le : ' .$updated_page['modified_date'];
$output .= ' par : ' .$update_page['username'];
    $output .= '</li>';
}
$output .= '</ul></div>';
echo $output;

J'ai supprimer le "AND default_content != 1" et ai ajouté 2 lignes
$output .= 'page modifiée le : ' .$updated_page['modified_date'];
$output .= ' par : ' .$update_page['username'];

Naturellement, ça ne fonctionne pas.... J'ai bien les 10 dernières pages modifiées, la date, l'heure et par : et pas de username....
J'ai créé une nouvelle page sur le site où j'ai inséré la balise...
hummm...
la base de données est bien .cms_db_prefix(). Pour la recherche, il faut aller sur la table cms_users? Il faut bien interroger le cham "username"?Dans ce cas, il ne faut sans doute pas écrire ".$updated_page...; mais quoi donc... oui là ça n'a rien à voir avec cmsms, mais une méconnaissance des requêtes avec php...
Oui oui oui j'suis lourd... et en plus le mail, c'est pas gagné...
Lio
Voilà pour recevoir un mail avec les 5 dernières modifications.
Code :
$output = '<html><head></head><body><ul>';
$leadin = "Modifié : ";
$number = 5;
$showtitle='true';
$dateformat = "d.m.y h:m";
global $gCms;
$hm =& $gCms->GetHierarchyManager();
$db = &$gCms->db;
$q = "SELECT * FROM ".cms_db_prefix()."content WHERE (type='content' OR type='link')
AND default_content != 1 AND active = 1 AND show_in_menu = 1
ORDER BY modified_date DESC LIMIT 10";
$dbresult = $db->Execute( $q );
if( !$dbresult )
{
echo 'DB error: '. $db->ErrorMsg()."<br/>";
}
while ($dbresult && $updated_page = $dbresult->FetchRow())
{
$curnode =& $hm->getNodeById($updated_page['content_id']);
$curcontent =& $curnode->GetContent();
$output .= '<li>';
$output .= '<a href="'.$curcontent->GetURL().'">'.$updated_page['content_name'].'</a>';
if ((FALSE == empty($updated_page['titleattribute'])) && ($showtitle=='true'))
{
$output .= '<br />';
$output .= $updated_page['titleattribute'];
}
$output .= '<br />';

$output .= $leadin;
$output .= date($dateformat,strtotime($updated_page['modified_date']));
$output .= '</li>';
}
$output .= '</ul></body></html>';
$cmsmailer =& $gCms->modules['CMSMailer']['object'];
$cmsmailer->AddAddress('adresse@destinataire.fr');
$cmsmailer->SetFrom('webmaster@site.fr');
$cmsmailer->SetBody($output);
$cmsmailer->IsHTML(true);
$cmsmailer->SetSubject('modification de pages');
$cmsmailer->Send();
Je regarde pour le username.
Merci...
J'ai créé une balise utilisateur
J'ai inséré votre code
ai modifié les adresses mail ;-)
et là comment dois je intégrer mes "$output" dans le mail, j'ai bien lu qu'un mail sous php devait s'écrire : mail(to,subject,message,headers,parameters)
je dois intégrer les "$output" dans la partie "paramètres", non? Quelle serait la syntaxe?

ou cela se fait automatiquement avec cmsmailer??? oui, jusqu'au bout...
merci
Lio
Allez, en utilisant cmsMailer comme au-dessus et surtout en utilisant la table cms_adminlog au lieu de content :
Code :
global $gCms;
$db =& $gCms->GetDb();
$dateformat = '%x %X';          
$result = $db->Execute("SELECT * FROM ".cms_db_prefix()."adminlog ORDER BY timestamp DESC");
$totalrows = 5;
$limit = 5;
$result = $db->SelectLimit('SELECT * from '.cms_db_prefix().'adminlog ORDER BY timestamp DESC', $limit);
$output = '<html><head></head><body>';
if ($result && $result->RecordCount() > 0)
{
    $output .= "<table cellspacing=\"0\" class=\"pagetable\">\n";
    $output .= '<thead>';
    $output .= "<tr>\n";
    $output .= "<th>User</th>\n";
    $output .= "<th>itemid</th>\n";
    $output .= "<th>itemname</th>\n";
    $output .= "<th>action</th>\n";
    $output .= "<th>date</th>\n";
    $output .= "</tr>\n";
    $output .= '</thead>';
    $output .= '<tbody>';
    $currow = "row1";
    while ($row = $result->FetchRow()) {
    $output .= "<tr class=\"$currow\" onmouseover=\"this.className='".$currow.'hover'."';\" onmouseout=\"this.className='".$currow."';\">\n";
    $output .= "<td>".$row["username"]."</td>\n";
    $output .= "<td>".($row["item_id"]!=-1?$row["item_id"]:"&nbsp;")."</td>\n";
    $output .= "<td>".$row["item_name"]."</td>\n";
    $output .= "<td>".$row["action"]."</td>\n";
    $output .= "<td>".strftime($dateformat,$row['timestamp'])."</td>\n";
    $output .= "</tr>\n";
    ($currow == "row1"?$currow="row2":$currow="row1");
    }
$output .= '</tbody>';
$output .= '</table>';
}
else {
    $output .= '<p class="pageheader">adminlog</p></div>';
    $output .= '<p>vide</p>';
}
$output .= '</body></html>';
$cmsmailer =& $gCms->modules['CMSMailer']['object'];
$cmsmailer->AddAddress('adresse@mail');
$cmsmailer->SetFrom('adresse@mail');
$cmsmailer->SetBody($output);
$cmsmailer->IsHTML(true);
$cmsmailer->SetSubject('modification de pages');
$cmsmailer->Send();

Tout est inclus, tu n'as plus qu'à attacher l'udt aux événements.

Have fun Smile
Déolé, j'avais mis l'ancien code Wink c'est modifié.
Merci pour votre patience...
Alors, je reçois bien un mail avec les 9 ou 10 dernières modifications, le nom de la page, la date, l'heure, mais pas de "username"..

Si "pollux" écrit sur la page d'accueil que Lio est p--e c------s, bennn j'aimerai bien savoir que c'est pollux qui a écrit cela....
Bon, je quitte, pour ce soir, mais en tous les cas, une nette avancée grâce à vous "Jean le Chauve"!

demain je regarde le username...

bonne nuit
cordialement
Lio
J'ai remis le code et réinitialisé, je reçois bien mes données et un tableau avec le NOM (ouaiiiiiii), ce que pollux a fait et pas uniquement sur une page mais les modifs des modules aussi, les actions et la date et heures... bref, en voilà un tag qui devrait être inclu directement dans cmsms...
Ouhhh j'espère que je n'ai pas dit une bêtise....
Bon, merci "Jean le Chauve"
Bonne nuit à vous...
Je pense pouvoir mettre résolu
cordialement
Lio
Pas monsieur, Sa Seigneurie Cool
rho l'autre comment il se la pète..

bon il y a quelqu'un qui me ferrait un résumé du coup que je puisse l'ajouter au blog et au Wiki ?


edit : en fait si j'ai bien suivit il y a juste a créer une UDT et l'associé aux évènements que j'ai donné et c'est finit ?

Code :
global $gCms;
$db =& $gCms->GetDb();
$dateformat = '%x %X';          
$result = $db->Execute("SELECT * FROM ".cms_db_prefix()."adminlog ORDER BY timestamp DESC");
$totalrows = 5;
$limit = 5;
$result = $db->SelectLimit('SELECT * from '.cms_db_prefix().'adminlog ORDER BY timestamp DESC', $limit);
$output = '<html><head></head><body>';
if ($result && $result->RecordCount() > 0)
{
    $output .= "<table cellspacing=\"0\" class=\"pagetable\">\n";
    $output .= '<thead>';
    $output .= "<tr>\n";
    $output .= "<th>User</th>\n";
    $output .= "<th>itemid</th>\n";
    $output .= "<th>itemname</th>\n";
    $output .= "<th>action</th>\n";
    $output .= "<th>date</th>\n";
    $output .= "</tr>\n";
    $output .= '</thead>';
    $output .= '<tbody>';
    $currow = "row1";
    while ($row = $result->FetchRow()) {
    $output .= "<tr class=\"$currow\" onmouseover=\"this.className='".$currow.'hover'."';\" onmouseout=\"this.className='".$currow."';\">\n";
    $output .= "<td>".$row["username"]."</td>\n";
    $output .= "<td>".($row["item_id"]!=-1?$row["item_id"]:"&nbsp;")."</td>\n";
    $output .= "<td>".$row["item_name"]."</td>\n";
    $output .= "<td>".$row["action"]."</td>\n";
    $output .= "<td>".strftime($dateformat,$row['timestamp'])."</td>\n";
    $output .= "</tr>\n";
    ($currow == "row1"?$currow="row2":$currow="row1");
    }
$output .= '</tbody>';
$output .= '</table>';
}
else {
    $output .= '<p class="pageheader">adminlog</p></div>';
    $output .= '<p>vide</p>';
}
$output .= '</body></html>';
$cmsmailer =& $gCms->modules['CMSMailer']['object'];
$cmsmailer->AddAddress('adresse@mail');
$cmsmailer->SetFrom('adresse@mail');
$cmsmailer->SetBody($output);
$cmsmailer->IsHTML(true);
$cmsmailer->SetSubject('modification de pages');
$cmsmailer->Send();
Je pense que si on attache l'udt à plusieurs événements, vous allez être submergés de mails.
Peut-être l'événement LogoutPost serait le plus adapté.
d'autant plus que dans cet UDT, il renvoi à chaque fois les 10 dernières modifs :/ moyen niveau spam et doublon d'info en effet

il n'y a pas moyen d'utiliser les events comme source d'informations? et d'envoyer un email contenant les infos issu de l'évènement ? je suis sur que si, je regarderais quand je pourrais ce point
Pour info,

j'ai associé ce tag à l'évènement "ContentEditPre" donc, si je ne me trompe pas, il y a envoi d'un mail pour chaque modification de l'édition que ce soit d'un contenu de page ou d'un contenu dans un module. Alors oui, il y a un risque d'être submergé s'il y a 100 utilisateurs. Maintenant, il s'agit de trouver quel évènement serait le mieux approprié. Si on l'ajoute dès qu'un utilisateur se log... là aussi une tonne de mail...
Je regarde cela de plus près demain
Encore merci Sa Seigneurie...
Finalement, c'est pas si mal lorsqu'utilisé seulement avec LogoutPost (lorsqu'un utilisateur se déconnecte).
Le nombre de modifications (ou plutôt d'actions) est paramétrable en modifiant $limit = 5; (à la ligne 4).
J'ai également ajouté une condition sur le nom d'utilisateur afin de ne pas recevoir de mail si c'est nous-même qui nous connectons (admin) ; à modifier suivant vos paramètres ($username, ligne 5).
Voici un code plus "propre" :
Code :
global $gCms;
$db =& $gCms->GetDb();
$dateformat = '%x %X';          
$limit = 5;// nombre de lignes à afficher
$username = "admin";  // nom d'utilisateur à éviter    
$result = $db->Execute("SELECT * FROM ".cms_db_prefix()."adminlog ORDER BY timestamp DESC LIMIT $limit");
if ($result && $result->fields["username"] != $username){    
    $output = '<html><head></head><body>';    
    $output .= "<table border>";
    $output .= '<thead>';
    $output .= "<tr>";
    $output .= "<th>Utilisateur</th>";
    $output .= "<th>id de l'item </th>";
    $output .= "<th>nom de l'item</th>";
    $output .= "<th>action</th>";
    $output .= "<th>date</th>";
    $output .= "</tr>";
    $output .= '</thead>';
    $output .= '<tbody>';
    $currow = "row1";
    while ($row = $result->FetchRow()) {
        $output .= "<tr class=\"$currow\">";
        $output .= "<td>".$row["username"]."</td>";
        $output .= "<td>".($row["item_id"]!=-1?$row["item_id"]:"&nbsp;")."</td>";
        $output .= "<td>".$row["item_name"]."</td>";
        $output .= "<td>".$row["action"]."</td>";
        $output .= "<td>".strftime($dateformat,$row['timestamp'])."</td>";
        $output .= "</tr>";
        ($currow == "row1"?$currow="row2":$currow="row1");
     }      
    $output .= '</tbody>';
    $output .= '</table>';
    $output .= '</body></html>';
    $cmsmailer =& $gCms->modules['CMSMailer']['object'];
    $cmsmailer->AddAddress('adresseMail@destinataire');
    $cmsmailer->SetFrom('adresseMail@expediteur');
    $cmsmailer->SetBody($output);
    $cmsmailer->IsHTML(true);
    $cmsmailer->SetSubject('Compte-rendu après déconnexion d\'un utilisateur');
    $cmsmailer->Send();
}
Oui, c'est mieux, cela limite le nombre de mail... ensuite à affiner le nombre de modifs affichées désirées...
Beau tableau m'seigneur... je reçois l'avant dernière modif et non la dernière... hummm je l'ai placé dans l'évènement "ContentEditPre" et "ContentEditPost"...
Lorsque je le place dans "LogOutPost", il m'envoie bien la dernière à savoir "UserLogout"... y'a un truc qui m'échappe.
Encore merci!
Lio
HS total :

je tiens a dire au dieu belge, que son avatar est peu attrayant, certains diraient que c'est une blague, ... une histoire belge presque

fin de mon HS
idem : HS
Là, ça ne plaisante plus... mais que cache-t-il derrière son armure?... Ils sont comme ça en Belgique? Ah bon...
Lio (manant du .59) §-)
Pages : 1 2