phpBB Italia chiude!
phpBB Italia ringrazia tutti gli utenti che hanno dato fiducia al nostro progetto per ben 9 anni, e che, grazie al grande lavoro fatto da tutto lo Staff (rigorosamente a titolo gratuito), hanno portato il portale a diventare il principale punto di riferimento italiano alla piattaforma phpBB.

Purtroppo, causa motivi personali, non ho più modo di gestirlo e portarlo avanti. Il forum viene ora posto in uno stato di sola lettura, nonché un archivio storico per permettere a chiunque di fruire di tutte le discussioni trattate.

Il nuovo portale di assistenza per l'Italia di phpBB diventa phpBB-Store.it, cui ringrazio per aver deciso di portare avanti questo grande progetto.

Grazie ancora,
Carlo - Amministratore di phpBB Italia

Top 10

Supporto MODs generale.
Avatar utente
peter6777
Utente Pro
Utente Pro
Messaggi: 93
Iscritto il: 26/02/2010, 23:06
Versione: 3.0.6
Server: UNIX/Linux

Top 10

Messaggio da peter6777 » 09/03/2010, 1:27

Ciao,
ho incrociato 2 Mod per tirare fuori una tabella a 3 settori da inserire nella home del mio forum che fa vedere:
nella 1: gli ultimi 10 argomenti scritti,
nella 2: 10 utenti più attivi ( questi due presi dalla mod TOP_FIVE, modificata un pochino per portarla a 10)
nella 3: 10 argomenti più visti (questa è una MOD sviluppata da Carlino e modificata da Bingo)... tutto funziona e si vede, e ciò mi fa molto contento perchè finalmente inizio a capire come è strutturato phpbb e come si muove.
Ho però un arcano da proporre:
Le cose non combaciano proprio, in quanto la MOD TOP FIVE lavora tenendo conto dei permessi dell'utente in quanto ogni utente vede gli ultimi 10 messaggi scritti in base ai suoi permessi ( e ne vede sempre e comunque 10); con la MOD di Carlino l'utente vede i 10 messaggi più visti in assoluto MENO i messaggi che non può vedere...in pratica un utente con meno privilegi dell'amministratore ne vede ad esempio soltanto 6 di messaggi, vede i 6 messaggi più visti in assoluto in base ai suoi permessi e non i primi 10 messaggi in base ai suoi peressi (l'amministratore cioè io ne vedo invece 10)....non so se mi sono spiegato, spero di si!

Provo a postare i due diversi codici php:

Questo è il codice php dela MOd TOP FIVE (da me mdificata in TOP TEN) con query ULTIMI 10 TOPIC, gli ultimi 10 utenti registrati (anche se è ancora scritta io non l'ho ustata) e i PRIMI 10 UTENTI ATTIVI :

Codice: Seleziona tutto

/**
*
* @package phpBB3
* @version $Id: top_five.php,v 1.0.5 2009/08/17 06:20:00 EST rmcgirr83 Exp $
* @copyright (c) 2009 Rich McGirr
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/

/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
	exit;
}

/**
* Include only once.
*/
if (!defined('INCLUDES_TOP_FIVE_PHP'))
{
	define('INCLUDES_TOP_FIVE_PHP', true);
	
	global $auth, $cache, $config, $user, $db, $phpbb_root_path, $phpEx, $template;

    $user->add_lang('mods/top_five');

	// grab auths that allow a user to read a forum
	$forum_array = array_unique(array_keys($auth->acl_getf('!f_read', true)));

	// we have auths, change the sql query below
	$sql_and = '';
	if (sizeof($forum_array))
	{
		$sql_and = ' AND ' . $db->sql_in_set('p.forum_id', $forum_array, true);
	}

	// grab all posts that meet criteria and auths
	$sql_ary = array(
		'SELECT'	=> 'MAX(p.post_time) as post_time, u.user_id, u.username, u.user_colour, t.topic_title, t.forum_id, t.topic_last_post_id',
		'FROM'		=> array(TOPICS_TABLE => 't', POSTS_TABLE => 'p'),
		'LEFT_JOIN'	=> array(
			array(
				'FROM'	=> array(USERS_TABLE => 'u'),
				'ON'	=> 'p.poster_id = u.user_id',
   			),
		),
		'WHERE'		=> 'p.topic_id = t.topic_id
			   AND p.post_approved = 1
			   AND t.topic_moved_id = 0' . $sql_and,
		'GROUP_BY'	=> 't.topic_id',
		'ORDER_BY'	=> 'post_time DESC',
	);

	$result = $db->sql_query_limit($db->sql_build_query('SELECT', $sql_ary), 5);

    while( $row = $db->sql_fetchrow($result) )
    {
   
		$view_topic_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $row['forum_id'] . '&p=' . $row['topic_last_post_id'] . '#p' . $row['topic_last_post_id']);
		$topic_title = censor_text($row['topic_title']);

       	$template->assign_block_vars('top_five_topic',array(
       		'U_TOPIC' 		=> $view_topic_url,
       		'USERNAME_FULL'	=> $user->lang['BY'] . ' ' . get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']),
       		'TOPIC_TITLE' 	=> $user->lang['IN'] . ' ' . $topic_title));
    }

    $db->sql_freeresult($result);

	// an array of user types we dont' bother with
	// could add board founder (USER_FOUNDER) if wanted
	$ignore_users = array(USER_IGNORE, USER_INACTIVE);
	
	// top five posters
	if (($user_posts = $cache->get('_top_five_posters')) === false)
	{
	    $user_posts = array();

		// grab users with most posts
	    $sql = 'SELECT user_id, username, user_colour, user_posts
	       	FROM ' . USERS_TABLE . '
			WHERE ' . $db->sql_in_set('user_type', $ignore_users, true) . '
				AND user_posts <> 0
	       ORDER BY user_posts DESC';
		$result = $db->sql_query_limit($sql, 5);

		while ($row = $db->sql_fetchrow($result))
		{
			$user_posts[$row['user_id']] = array(
				'user_id'		=> $row['user_id'],
                'username'		=> $row['username'],
                'user_colour'	=> $row['user_colour'],
				'user_posts'    => $row['user_posts'],
			);
		}
        $db->sql_freeresult($result);

		// cache this data for 5 minutes, this improves performance
		$cache->put('_top_five_posters', $user_posts, 300);
	 }

	 foreach ($user_posts as $row)
	 {
		$username_string = get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']);

		$template->assign_block_vars('top_five_active',array(
			'S_SEARCH_ACTION'	=> append_sid("{$phpbb_root_path}search.$phpEx", 'author_id=' . $row['user_id'] . '&sr=posts'),
			'POSTS' 			=> $row['user_posts'],
			'USERNAME_FULL'		=> $username_string)
	   );
    }

    // newest registered users
	if (($newest_users = $cache->get('_top_five_newest_users')) === false)
	{
	    $newest_users = array();

	    // grab most recent registered users
		$sql = 'SELECT user_id, username, user_colour, user_regdate
			FROM ' . USERS_TABLE . '
			WHERE ' . $db->sql_in_set('user_type', $ignore_users, true) . '
				AND user_inactive_reason = 0
			ORDER BY user_regdate DESC';
		$result = $db->sql_query_limit($sql, 5);

		while ($row = $db->sql_fetchrow($result))
		{
			$newest_users[$row['user_id']] = array(
				'user_id'				=> $row['user_id'],
				'username'				=> $row['username'],
     			'user_colour'			=> $row['user_colour'],
                'user_regdate'			=> $row['user_regdate'],
			);
		}
	    $db->sql_freeresult($result);

		// cache this data for 5 minutes, this improves performance
		$cache->put('_top_five_newest_users', $newest_users, 300);
	 }

	 foreach ($newest_users as $row)
	 {
		$username_string = get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']);

		$template->assign_block_vars('top_five_newest',array(
			'REG_DATE'			=> $user->format_date($row['user_regdate']),
			'USERNAME_FULL'		=> $username_string)
	   );
    }
}
?>

Questo invece è il codice della Mod di Carlino (c'è solo il codice php di riferimento alla query dei 10 topics più visti inseriti in index.php in quanto mi seriva soltanto questo) :

Codice: Seleziona tutto

// ----- inizio MOD Ultimi 10 Topics e i 10 topics più visti  - Carlino1994 modificata da Bingo 24.01.2010
    $sql = "SELECT topic_id, forum_id, topic_title, topic_first_poster_name, topic_views FROM " . TOPICS_TABLE . " ORDER BY topic_views DESC LIMIT 0,10";
    $result = $db->sql_query($sql);

    while ($row = $db->sql_fetchrow($result))
    {
       if ($auth->acl_get('f_read', $row['forum_id']) == 1) {
          $template->assign_block_vars('topics_view', array(
             'VIEW_LINK'    => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=" . $row['forum_id'] . "&t=" . $row['topic_id']),
             'VIEW_TITOLO'    => $row['topic_title'],
             'VIEW_AUTHOR'    => $row['topic_first_poster_name'],
             'VIEW_VIEWS'     => $row['topic_views']
          ));
       }
    }
    $db->sql_freeresult($result);
    // FINE QUERY 10 TOPICS PIU' VISTI
// ----------------------------------------------

Qualcuno è in grado di modificare la query di Carlino (il secondo code) in modo che ogni utente del forum, in base ai suoi permessi, veda comunque i suoi 10 messaggi più visti, proprio come TOP FIVE?

Grazie ciao

Avatar utente
Micogian
Leader Programmatori
Leader Programmatori
Messaggi: 3704
Iscritto il: 07/01/2010, 8:51
Versione: 3.2.0
Server: UNIX/Linux
PHP: 5.4.36
Database: MySQL 5.1.70-log
Località: Udine
Contatta:

Re: Top 10

Messaggio da Micogian » 09/03/2010, 6:24


Avatar utente
peter6777
Utente Pro
Utente Pro
Messaggi: 93
Iscritto il: 26/02/2010, 23:06
Versione: 3.0.6
Server: UNIX/Linux

Re: Top 10

Messaggio da peter6777 » 09/03/2010, 10:38

bingo ha scritto:Hai provato questa ? http://www.phpbb.it/forum/viewtopic.php?f=63&t=21984

Ma è appunto da quel topic che ho preso il codice, e quella query (solo quella dei 10 topic più visti) tiene conto si dei permessi utente, ma si limita soltanto ad eliminare dall'output i topic di cui non ha il permesso di accesso. Invece vorrei che in base ai permessi utente l'output fosse sempre di 10 topic, che sono in realtà i primi 10 topic in base ai permessi dell'utente, e non quelli assoluti di tutto il forum.

Avatar utente
Micogian
Leader Programmatori
Leader Programmatori
Messaggi: 3704
Iscritto il: 07/01/2010, 8:51
Versione: 3.2.0
Server: UNIX/Linux
PHP: 5.4.36
Database: MySQL 5.1.70-log
Località: Udine
Contatta:

Re: Top 10

Messaggio da Micogian » 09/03/2010, 10:59

Questo era un problema del quale avevo tenuto conto, probabilmente è sufficiente aumentare il numero dei topic da controllare.
Mi spiego meglio, non ho sotto mano il codice ma mi sembra che avevo fatto questo ragionamento: prelevo un certo numero di Topics dal Database, tolgo quelli che non hanno i permessi di visibilità tra quelli che rimangono ne scelgo 10.
Il problema è che rimangono meno di 10, quindi la soluzione è quella di aumentare il numero iniziale.
Se poi scegli 100 Topics dei quali ci sono 95 protetti ovvio che il problema persiste.

Questo per lo meno era nelle intenzioni, proverò a dare un'occhiata al mio codice, resta sempre la possibilità di aumentare il numero dei Topics e modificare il template che ne visualizza solo 10.


EDIT

Ho controllato il codice, ecco quello che si riferisce agli ultimi Posts.

Codice: Seleziona tutto

// Controlla gli ultimi 50 topics, elimina quelli senza permesso di lettura e crea un array limitato a 10 records.

$sql4 = "SELECT pt.topic_id, pt.forum_id, pt.topic_title, pt.topic_time, pt.topic_type, pt.topic_moved_id, pt.topic_last_poster_name, pp.post_id, pp.post_time
FROM " . TOPICS_TABLE . " pt ," . POSTS_TABLE . " pp
WHERE pt.topic_id = pp.topic_id
AND pt.topic_type = 0
AND pt.topic_moved_id = 0
ORDER BY pp.post_time DESC LIMIT 0,50";
    $result4 = $db->sql_query($sql4);
    $topic_cor = '' ;

    $x = 0 ;
    while ($row4 = $db->sql_fetchrow($result4))
    {
       if ($auth->acl_get('f_read', $row4['forum_id']) == 1) {
       if( $row4['topic_id'] <> $topic_cor && $x < 11 ){
           $template->assign_block_vars('last_posts_list', array(
              'VIEW_LINK'    => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=" . $row4['forum_id'] . "&t=" . $row4['topic_id']),
              'VIEW_TITOLO'    => $row4['topic_title'],
              'VIEW_AUTHOR'    => $row4['topic_last_poster_name'],
              'VIEW_VIEWS'     => $row4['topic_views'],
              'LAST_DATA'      => date("d.m.Y",$row4['post_time'])
               ));
      $x = ++$x ;   
              }
       }
       $topic_cor = $row4['topic_id'] ;
    }
    $db->sql_freeresult($result4);
Naturalmente può essere adattato alle altre Liste.
Vengono prelevati 50 posts, ma il ciclo while controlla che non siano dello stesso Topic e il conteggio dei record si ferma a 10. Se non sono sufficienti 50 posts per estrarne 10 validi si aumenta il numero da controllare.
L'unico problema è se la Lista debba riguardare la data del Topic o la data dell'ultima risposta, qui il discorso è soggettivo.
Da un lato potremmo avere tra gli ultimi post una discussione molto vecchia ma con risposta recente, dall'altra un elenco esclusivamente per data di creazione.

Avatar utente
peter6777
Utente Pro
Utente Pro
Messaggi: 93
Iscritto il: 26/02/2010, 23:06
Versione: 3.0.6
Server: UNIX/Linux

Re: Top 10

Messaggio da peter6777 » 09/03/2010, 14:23

Bravo Bingo,
se secondo te questa può essere una soluzione va bene, la voglio provare poi ti dico. Secondo me sarebbe più giusto avere tra gli ultimi post una discussione molto vecchia ma con risposta recente...

Questo codice che hai fornito è da sostituire a quello che ho postato nel primo messaggio (della tua vecchia mod per intenderci)?

Avatar utente
Carlo
Amministratore
Amministratore
Messaggi: 9957
Iscritto il: 19/04/2009, 10:24
Sesso: Maschio
Versione: 3.2.0
Server: UNIX/Linux
PHP: 7.1.0
Database: MySQL(i) 10.0.27-MariaDB-cll-lve
Località: Puglia
Contatta:

Re: Top 10

Messaggio da Carlo » 09/03/2010, 14:31

@bingo: Si potrebbe anche trovare un'altro sistema, con una query e script php più leggeri. Ovvero estrapolare tutti gli ID dei forum in cui l'utente ha i permessi di lettura, e poi aggiungerli al WHERE nella query:

Codice: Seleziona tutto

[..] WHERE [..] forum_id IN (1, 2, 3, 4, 5) [..]
MODs | Stili | Traduzioni MOD
Ogni MP contenente una richiesta di supporto verrà ignorato.

Avatar utente
Micogian
Leader Programmatori
Leader Programmatori
Messaggi: 3704
Iscritto il: 07/01/2010, 8:51
Versione: 3.2.0
Server: UNIX/Linux
PHP: 5.4.36
Database: MySQL 5.1.70-log
Località: Udine
Contatta:

Re: Top 10

Messaggio da Micogian » 09/03/2010, 14:58

peter6777 ha scritto:Questo codice che hai fornito è da sostituire a quello che ho postato nel primo messaggio (della tua vecchia mod per intenderci)?
Si, sostituisce quello precedente, ma per quanto riguarda gli ultimi Posts, non per le altre Liste.

@Carlino1994 : è una soluzione anche quella, il problema è che ogni Forum è strutturato in maniera diversa, ci potrebbero essere un bel pò di Forum e molti gruppi con permessi diversi.
E' una strada comunque percorribile, si tratta di provare.

Avatar utente
peter6777
Utente Pro
Utente Pro
Messaggi: 93
Iscritto il: 26/02/2010, 23:06
Versione: 3.0.6
Server: UNIX/Linux

Re: Top 10

Messaggio da peter6777 » 09/03/2010, 15:18

avete guardato come è strutturato il codice php della mod Top_five? L'ho postato nel primo messaggio. Secondo me li in mezzo c'è la soluzione ma io non ci capisco una ceppa...

Avatar utente
peter6777
Utente Pro
Utente Pro
Messaggi: 93
Iscritto il: 26/02/2010, 23:06
Versione: 3.0.6
Server: UNIX/Linux

Re: Top 10

Messaggio da peter6777 » 09/03/2010, 15:29

Ho cambiato il codice in index.php:

Non è cambiato nulla Bingo, io da amministratore vedo i 10 topic più visti, se provo i permessi di un utente, ne vedo soltanto 6.

Avatar utente
Micogian
Leader Programmatori
Leader Programmatori
Messaggi: 3704
Iscritto il: 07/01/2010, 8:51
Versione: 3.2.0
Server: UNIX/Linux
PHP: 5.4.36
Database: MySQL 5.1.70-log
Località: Udine
Contatta:

Re: Top 10

Messaggio da Micogian » 09/03/2010, 15:59

peter6777 ha scritto:Ho cambiato il codice in index.php:

Non è cambiato nulla Bingo, io da amministratore vedo i 10 topic più visti, se provo i permessi di un utente, ne vedo soltanto 6.
Aspetta un pò, io non l'ho mai provata questa, vediamo dove può esserci il problema.
Secondo me nel valore di $x che aumenta solo se la condizione è corretta.
Forse è sbagliato in quella posizione.
Prova così:

Codice: Seleziona tutto

// Controlla gli ultimi 50 topics, elimina quelli senza permesso di lettura e crea un array limitato a 10 records.

$sql4 = "SELECT pt.topic_id, pt.forum_id, pt.topic_title, pt.topic_time, pt.topic_type, pt.topic_moved_id, pt.topic_last_poster_name, pp.post_id, pp.post_time
FROM " . TOPICS_TABLE . " pt ," . POSTS_TABLE . " pp
WHERE pt.topic_id = pp.topic_id
AND pt.topic_type = 0
AND pt.topic_moved_id = 0
ORDER BY pp.post_time DESC LIMIT 0,50";
    $result4 = $db->sql_query($sql4);
    $topic_cor = '' ;
$x = 0 ;
    while ($row4 = $db->sql_fetchrow($result4))
    {
       if ($auth->acl_get('f_read', $row4['forum_id']) == 1) {
       if( $row4['topic_id'] <> $topic_cor && $x < 11 ){
      $x = ++$x ; 
           $template->assign_block_vars('last_posts_list', array(
              'VIEW_LINK'    => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=" . $row4['forum_id'] . "&t=" . $row4['topic_id']),
              'VIEW_TITOLO'    => $row4['topic_title'],
              'VIEW_AUTHOR'    => $row4['topic_last_poster_name'],
              'VIEW_VIEWS'     => $row4['topic_views'],
              'LAST_DATA'      => date("d.m.Y",$row4['post_time'])
               ));
              }
       }
       $topic_cor = $row4['topic_id'] ;
    }
    $db->sql_freeresult($result4);
La condizione dice: se il Forum ha i permessi di lettura e se il topic è diverso da quello precedente e comunque il numero dei records non sia superiore a 10 crea le variabili e aumenta il valore di $x.
In teoria non fa una grinza, l'importante è che il numero $x non aumenti se non viene creata la variabile e quindi ne dovrebbe creare 10, salvo che tra i 50 posts non ci siano 44 riservati.

Ma, dovrei provarla, poi ti so dire.

Rispondi

Torna a “Supporto MODs”

Chi c’è in linea

Visitano il forum: Nessuno e 38 ospiti