Google+

Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Articol Ştergerea periodică a unor mesaje private
#1
Cerinţe :
  • un cont de administrator
  • acces prin FTP
  • câteva cunoştiinţe legate de utilizarea platformei MyBB
  • versiunea 1.6.* de MyBB (pe versiunea 1.4 nu s-a testat scriptul!)

În cadrul acestui articol voi vorbi puţin despre cum puteţi să ştergeţi periodic mesajele private din baza de date utilizând un task.
Mai întâi de toate va trebui să argumentez nevoia de a şterge unele mesaje private (prune). Păi s-ar putea, dacă aveţi o comunitate destul de mare (să zicem undeva pe la 1000 de membri), ca tabela cu mesajele private din baza de date să fie destul de mare. Nu este bine şi normal în acelaşi timp ca mesajele private ale unor utilizatori care nu mai activează pe forum să fie stocate degeaba în baza de date. De aici ar veni nevoia de a găsi o modalitate de a şterge aceste informaţii din baza de date.
Aşadar, în cele ce urmează o să vă prezint o metodă destul de simplă şi care nu necesită cunoştiinţe de programare sau lucru cu baze de date, în vederea realizării obiectivului propus. Pe scurt vom realiza un task (task-ul permite rularea periodică a unui script PHP), prin care vom realiza toţi paşii necesari obţinerii unui rezultat final satisfăcător.
Pentru a trece la realizarea propriu-zisă a task-ului va trebui să ne gândim la ce vrem să facă şi cum să facă scriptul acest lucru. Eu nu m-am gândit la ceva foarte complex... În principiu am zis că aş dori să se şteargă toate mesajele private mai vechi de X zile cât şi mesajele private mai vechi de Y zile (cu Y mai mic decât X) care au fost citite de cei cărora le-au fost destinate. Bine se putea renunţa la ce-a de a doua parte (cea cu Y) dar în acest fel am dorit să fie totuşi o soluţie cât mai flexibilă. Mai jos veţi vedea că dvs. aveţi posibilitatea de a renunţa la o parte.
Scriptul propus
Iată algoritmul propus pentru rezolvarea problemei :
1. Mai întâi se va executa o interogare a bazei de date prin care se va stoca în memorie mesajele private care vor rămâne în baza de date după efectuarea procesului de ştergere.
2. Dacă totul a decurs bine, la pasul anterior, atunci se vor şterge toate mesajele din tabelă şi AUTO INCREMENT-ul cheii "pid" se va reiniţializa cu 0.
3. Urmează să se introducă în tabelă toate mesajele salvate la pasul 1.
4. În final trebuie să refacem contoarele de mesaje private ale utilizatorilor. Nu de alta dar fără acest pas, unui membru i s-ar arăta că are 200 de mesaje private în total (cât avea înainte de ştergere), când el în realitate mai are doar 30...
Nu o să explic codul pe care l-am făcut, dar aş vrea să vă arăt cum îl puteţi utiliza. Codul meu ar fi următorul :

PHP Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php
function task_pmauto_task($task) {
    // CONFIGURARE
    $zile = 3; // numarul de zile trecute de la data citirii unui PM, dupa care se poate sterge
    $saptamani = 1; // numarul de saptamani trecute de la trimiterea unui PM, dupa care se poate sterge
    // DE AICI MAI JOS NU SE MODIFICA NIMIC!!!
    // variabile globale
    global $db;
    // time start-ul
    $time_start = microtime(true);
    $query = $db->simple_select("privatemessages", "*", "readtime >= " . intval(TIME_NOW - $zile * 86400) . " OR (dateline >= " . intval(TIME_NOW - $saptamani * 7 * 86400) . " AND readtime = 0)");
    // exista mesaje care vor fi restaurate?
    if ($db->num_rows($query) <= 0) {
        add_task_log($task, "Taskul a rulat cu succes. Din pacate niciun mesaj nu a fost restaurat!");
        // se iese din functie
        return;
    }
    // altfel se continua
    $rows = array();
    // contor
    $i = 0;
    // fiecare rand va fi salvat in memorie
    while ($row = $db->fetch_array($query))
        $rows[$i++] = $row;
    // dupa salvarea unor mesaje in memorie se va sterge tabela
    // verificam mai intai daca $i este un numar pozitiv si diferit de 0
    if ($i > 0) {
        // daca da se sterg toate inregistrarile din baza de date
        $db->query("TRUNCATE TABLE " . TABLE_PREFIX . "privatemessages");
        // se face o trunchiere pentru a se reseta auto incrementul la 1
        // mai departe vom reintroduce in baza de date mesajele din memorie
        foreach ($rows as $row) {
            // se sterge id-ul PM-ului din memorie
            unset($row['pmid']);
            // se escapeaza caracterul "'" din subiectul sau corpul unui mesaj (altfel apar erori la inserare in db)
            $row['subject'] = addcslashes($row['subject'], "'");
            $row['message'] = addcslashes($row['message'], "'");
            // se introduce PM-ul curent in baza de date
            $db->insert_query("privatemessages", $row);
        }
    }
    // se fac actualizarile de mesaje private pentru utilizatori
    // daca functia de update nu exista este inclusa
    if (function_exists("update_pm_count"))
        require_once MYBB_ROOT . 'inc/functions_user.php';
    // update-ul se face pentru fiecare utilizator in parte
    $query = $db->simple_select("users", "uid");
    while ($row = $db->fetch_array($query))
        update_pm_count(intval($row['uid']));
    // time end-ul
    $time_end = microtime(true);
    // se adauga un log
    add_task_log($task, "Taskul a rulat cu succes. Un numar de $i mesaje private au fost restaurate! (Rulat in : " . number_format($time_end - $time_start, 2) . " secunde.)");
}
?>

Cum să configuraţi acest script?!

Configurarea scriptului se face prin intermediul a două variabile din cadrul lui. Şi anume este vorba de următoarele două linii de cod :

PHP Code:
    $zile = 3; // numarul de zile trecute de la data citirii unui PM, dupa care se poate sterge
    $saptamani = 1; // numarul de saptamani trecute de la trimiterea unui PM, dupa care se poate sterge

- Prima variabilă, intitulată "zile" specifică numărul maxim de zile trecute de la data citirii unui mesaj privat de către destinatar, după care se poate şterge. Variabila trebuie să ia valori întregi pozitive. Dacă doriţi să nu se ţină cont de această restricţie atunci puteţi pune o valoare foarte mare. De exemplu dacă forumul are o vechime de 1 an, puteţi pune valoarea 366.
- Cea de-a doua variabilă a cărui nume e "saptamani" permite setarea unui număr de săptămâni trecute după care se poate şterge un mesaj, indiferent dacă a fost sau nu citit. La fel ca şi la variabila de mai sus, valoarea ataşată trebuie să fie număr întreg şi pentru a nu se ţine cont de această restricţie va trebui să o iniţializaţi cu o valoare cât mai mare.
Acestea fiind spuse să vedem cum se poate utiliza acest script.
Implementarea scriptului pe forumul dvs.
După ce aşi configurat aşa cum aţi dorit scriptul, va trebui să îl implementaţi pe forumul dvs. În acest sens ar trebui să urmaţi paşii de mai jos :
1. Creaţi pe server dvs., în directorul inc/tasks un fişier cu extensia PHP şi care să aibă numele "pmprune_task" (fără ghilimele).
2. După creare va trebui să îi editaţi şi să adăugaţi în acest fişier tot codul de mai sus (cele 55 de linii de cod). Salvaţi!
3. Acum va trebui să intraţi în panoul de administrare al forumului dvs., în cadrul secţiunii Tools & Maintenance. În meniul din stânga aveţi un link cu titlul "Task Manager", daţi click pe el.
4. Va trebui să adăugăm un nou task, lucru care se poate face cu ajutorul legăturii "Add New Task".
5. Se completează formularul care vă va apare după realizarea pasului 4. La titlu puteţi pune "Auto PM Cleaner", la descriere ce vreţi voi, la "Task File" va trebui să alegeţi din lista de fişiere pe cel cu numele "pmprune_task.php" creat la pasul 1 (dacă nu găsiţi fişierul atunci înseamnă că el nu există în directorul tasks din inc). Mai rămâne să completăm ultimele câmpuri care ne indică când va fi rulat task-ul nou creat. Dacă doriţi să fie rulat anual va trebui să completaţi respectând următoarea structură :
a) "Time: Minutes" cu "0" (fără ghilimele) ;
b) "Time: Hours" cu "0" (fără ghilimele) ;
c) "Time: Days of Month" cu "1" (fără ghilimele) ;
d) "Time: Weekdays" cu "Every Weekday" (fără ghilimele) ;
e) "Time: Months" cu "January" (fără ghilimele) ;
Cu această configuraţie task-ul va rula în fiecare an pe data 1 ianuarie ora 00:00. Adică exact la trecerea dintre ani!
6. Nu uitaţi să bifaţi şi opţiunea "Task enabled?" înainte de adăuga task-ul. Altfel el nu va rula. Dacă aţi făcut şi acest ultim pas, atunci puteţi apăsa pe butonul de adăugare a task-ului "Save Task".
Rularea task-ului pentru prima dată
Înainte de a rula pentru prima dată task-ul nou creat, ar trebui să faceţi un backup al bazei de date! După realizarea backup-ului puteţi rula task-ul apăsând pe imaginea "Run this task now" din dreptul task-ului cu titlul setat de dvs. ("Auto PM Cleaner"). Pentru a verifica că totul a decurs bine puteţi urma paşii de mai jos :
1. După rularea task-ului ar trebui să primiţi un mesaj pe un fundal verde. Dacă apare pe un fundal roşu sau pagina e albă, atunci dezactivaţi task-ul (debifând opţiunea "Task enabled?") şi cereţi ajutor pe forumul nostru.
2. Dacă pasul 1 s-a realizat cu succes şi task-ul avea opţiunea "Enable Logging?" bifată la adăugare, atunci pe pagina de la adresa : Task Manager > View Task Logs, ar trebui să apară un rând a cărui coloană "Task" să aibă valoarea "Auto PM Cleaner" sau titlul pe care l-aţi pus dvs. Coloana "Data" a rândului vă indică câte mesaje s-au restaurat. Dacă rândul nu apare şi log-urile sunt activitate atunci ceva nu e în regulă şi se recomandă de urgenţă dezactivarea task-ului şi postarea problemei pe forumul nostru. Altfel totul este OK.
Dacă rularea pentru prima oară a scriptului se termină cu succes, atunci nu aveţi de ce să vă faceţi griji pe viitor.
Aş mai vrea să vă rog să verificaţi periodic acest subiect, pentru că s-ar putea ca unele versiuni ce vor apărea de MyBB, să nu fie compatibile cu acest script.

Cam asta ar fi tot. Sper ca acest material să fie util cât mai multor persoane din cadrul comunităţii MyBB România. Vă mulţumesc şi vă urez multă baftă.

Copyright © Mihu 2010-2014. Toate drepturile rezervate.
Users : collective term for those who use computers. Users are divided into three types : novice, intermediate and expert.
Novice users : people who are afraid that simply pressing a key might break their computer.
Intermediate users : people who don`t know how to fix their computer after they`ve just pressed a key that broke it.
Expert users : people who break other people`s computers.
Reply
#2
Interesant articolul Mihu.

Dar nu ar fi mai simplu pur si simplu sa limitezi numarul de mesaje private pentru fiecare grup in parte? Daca pui o limita de 20 de mesaje, casuta se va umple, iar utilizatorul va fi obligat sa isi goleasca casuta de mesaje private atunci cand se umple.
E adevarat ca utilizatorii care nu mai sunt activi nu au cum sa isi mai goleasca casuta si atunci este necesar un astfel de task.

Multumesc oricum pentru articol, s-ar putea sa folosesc asa ceva in viitor. Smile
Reply
#3
Prefer un task decât acea opţiune de care ai vorbit tu.
Nu de alta dar dacă pun limita de 20 şi apoi îi trimit un mesaj unui user care are deja 20 de mesaje în căsuţă... El nu va primi mesajul deoarece va depăşi limita...
Users : collective term for those who use computers. Users are divided into three types : novice, intermediate and expert.
Novice users : people who are afraid that simply pressing a key might break their computer.
Intermediate users : people who don`t know how to fix their computer after they`ve just pressed a key that broke it.
Expert users : people who break other people`s computers.
Reply
#4
Super acest tutorial +1
Pentru a mentine un forum unitar si pentru a utiliza informatia intr-un numar cat mai mic de subiecte, va rugam ca inainte de a deschide o Discutie Noua sa folositi functia Cautare (Search) !
Cititi periodic
Regulamentul
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)