Questa è una semplice Guida che spiega come si realizza una estensione, l'estensione si chiama "Readers" e consente di inserire nell'indice del forum, in corripondenza dei rispettivi forum, il numero dei visitatori online o che si sono collegati negli ultimi 5 minuti.
Con le nuove versioni di PHPBB sono sconsigliate le modifiche al codice di sistema, eventuali modifiche si possono inserire mediante "estensioni" che sono costituite da codice php o html che viene aggiunto in determinate posizioni previste nei file php o del template.
Vediamo ora quali sono i passi per realizzare l'estensione "readers"
1) Introduzione
La prima cosa da fare prima nello sviluppo di un'estensione é scegliere i nomi delle cartelle che la ospiteranno.
L'estensione va inserita nella cartella "ext" utilizzando questo modo: "ext/nome_autore/nome_estensione".
Nel nostro caso useremo "ext/micogian/readers/"
All'interno della cartella "readers" troveranno posto i file e le cartelle dell'estensione.
2) Il file composer.json
Il primo file da creare è composer.json che va creato nella cartella "readers".
Il file "composer.json" contiene i dati sull'estensione, cosa si propone di fare, chi è l'autore e e quali sono le versioni di php e phpbb compatibili.
Il nostro "composer.json" contiene quanto segue;
Codice: Seleziona tutto
{
"name": "micogian/readers",
"type": "phpbb-extension",
"description": "Aggiunge nell'indice del Forum, in corrispondenza del titolo dei rispettivi forums, il numero dei visitatori online",
"homepage": "http://www.floraitaliae.actaplantarum.org/",
"version": "1.0.1",
"time": "2018-10-30",
"license": "GPL-2.0",
"authors": [
{
"name": "Micogian",
"email": "giannidose@tin.it",
"homepage": "http://www.floraitaliae.actaplantarum.org/",
"role": "Developer"
},
{
"name": "Vincenzo Langella",
"homepage": "http://www.blogantropo.it",
"role": "Previous MOD Developer"
}
],
"require": {
"php": ">=5.4",
"composer/installers": "~1.0"
},
"extra": {
"display-name": "Forum Readers",
"soft-require": {
"phpbb/phpbb": "3.2.*@dev"
}
}
}
Dato che l'estensione che stiamo creando modifica il php dobbiamo creare una cartella di nome "config" e al suo interno creare un file di nome "services.yml"
In questo file andremo a specificare le variabili di phpbb che ci serviranno nel php per passarle poi al template.
Questo è il contenuto del file "config/ services.yml"
Codice: Seleziona tutto
services:
micogian.readers.listener:
class: micogian\readers\event\listener
arguments:
- '@dbal.conn'
- '@template'
- '@auth'
- '@user'
- '%core.root_path%'
tags:
- { name: event.listener }
4) Il file listener.php.
Il file "listener.php" è quello che contiene le modifiche al php che intendiamo aggiungere al sistema.
Nella prima parte definiamo le variabili che abbiamo richiesto in precedenza nel fle "config/services.yml", in questo modo:
Codice: Seleziona tutto
<?php
/**
*
* Total readers on index extension for the phpBB Forum Software package.
*
* @copyright (c) 2018 Giovanni Dose (Micogian)
* @license GNU General Public License, version 2 (GPL-2.0)
*
*/
namespace micogian\readers\event;
/**
* Event listener
*/
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class listener implements EventSubscriberInterface
{
protected $db;
protected $template;
protected $auth;
protected $user;
protected $root_path;
protected $phpEx;
public function __construct(\phpbb\db\driver\driver_interface $db, \phpbb\template\template $template, \phpbb\auth\auth $auth, \phpbb\user $user, $root_path )
{
$this->db = $db;
$this->template = $template;
$this->auth = $auth;
$this->user = $user;
$this->root_path = $root_path;
}
Dobbiamo sapere che nel file php di sistema co sono delle posizioni chiamate "event" che se richiamate inseriranno il nostro codice.
Abbiamo la necessità di utilizzare 2 eventi, uno riguarda la lingua che ci permetterà di aggiungere delle variabili di lingua e uno riguarda un evento disponibile nel file "includes/functions_display.php"
Gli "event" si richiamano in questo modo:
Codice: Seleziona tutto
static public function getSubscribedEvents()
{
return array(
'core.user_setup' => 'load_language_on_setup',
'core.display_forums_modify_template_vars' => 'forums_modify_template_vars',
);
}
Codice: Seleziona tutto
public function load_language_on_setup($event)
{
//language start
$lang_set_ext = $event['lang_set_ext'];
$lang_set_ext[] = array(
'ext_name' => 'micogian/readers',
'lang_set' => 'common',
);
$event['lang_set_ext'] = $lang_set_ext;
}
Codice: Seleziona tutto
public function forums_modify_template_vars($event)
{
$forum_row = $event['forum_row'];
$row = $event['row'];
$forum_id = $row{'forum_id'};
$forum_name = $row{'forum_name'};
$parent_id = $row['parent_id'];
// Total readers inizio prima parte
$array_readers = obtain_users_online($forum_id);
$total_readers = $array_readers['guests_online'] + $array_readers['visible_online'];
$sql_readers = 'SELECT *
FROM ' . FORUMS_TABLE . "
WHERE parent_id = $forum_id";
$result_readers = $this->db->sql_query($sql_readers);
while($row_readers = $this->db->sql_fetchrow($result_readers)){
$array_readers = obtain_users_online($row_readers['forum_id']);
$total_readers = $total_readers + $array_readers['guests_online'] + $array_readers['visible_online'];
}
$readers_row = array(
'TOT_READERS' => $total_readers,
);
$forum_row = array_merge($forum_row, $readers_row);
$event['forum_row'] = $forum_row ;
}
Codice: Seleziona tutto
<?php
/**
*
* Total readers on index extension for the phpBB Forum Software package.
*
* @copyright (c) 2018 Giovanni Dose (Micogian)
* @license GNU General Public License, version 2 (GPL-2.0)
*
*/
namespace micogian\readers\event;
/**
* Event listener
*/
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class listener implements EventSubscriberInterface
{
protected $db;
protected $template;
protected $auth;
protected $user;
protected $root_path;
protected $phpEx;
public function __construct(\phpbb\db\driver\driver_interface $db, \phpbb\template\template $template, \phpbb\auth\auth $auth, \phpbb\user $user, $root_path )
{
$this->db = $db;
$this->template = $template;
$this->auth = $auth;
$this->user = $user;
$this->root_path = $root_path;
}
static public function getSubscribedEvents()
{
return array(
'core.user_setup' => 'load_language_on_setup',
'core.display_forums_modify_template_vars' => 'forums_modify_template_vars',
);
}
public function load_language_on_setup($event)
{
//language start
$lang_set_ext = $event['lang_set_ext'];
$lang_set_ext[] = array(
'ext_name' => 'micogian/readers',
'lang_set' => 'common',
);
$event['lang_set_ext'] = $lang_set_ext;
}
public function forums_modify_template_vars($event)
{
$forum_row = $event['forum_row'];
$row = $event['row'];
$forum_id = $row{'forum_id'};
$forum_name = $row{'forum_name'};
$parent_id = $row['parent_id'];
// Total readers inizio prima parte
$array_readers = obtain_users_online($forum_id);
$total_readers = $array_readers['guests_online'] + $array_readers['visible_online'];
$sql_readers = 'SELECT *
FROM ' . FORUMS_TABLE . "
WHERE parent_id = $forum_id";
$result_readers = $this->db->sql_query($sql_readers);
while($row_readers = $this->db->sql_fetchrow($result_readers)){
$array_readers = obtain_users_online($row_readers['forum_id']);
$total_readers = $total_readers + $array_readers['guests_online'] + $array_readers['visible_online'];
}
//$string_readers = ($total_readers == 0) ? '' : (($total_readers == 1) ? '(1 lettore)' : '(' . $total_readers . ' lettori)');
//$string_readers = ($total_readers == 0) ? '' : (($total_readers == 1) ? '(1 {L_READERS_1})' : '(' . $total_readers . ' {L_READERS_2})');
// Total readers fine prima parte
$readers_row = array(
'READERS' => $string_readers,
'TOT_READERS' => $total_readers,
);
$forum_row = array_merge($forum_row, $readers_row);
$event['forum_row'] = $forum_row ;
}
}
Abbiamo bisogno di 2 variabili per la stringa da inserire nel template, se nel forum c'è un solo visitatore useremo la parola "lettore", se sono di più useremo "lettori",
Nella versione in lingua inglese useremo "reader" e "readers"
Dobbiamo creare la cartella language e al suo interno le cartelle "en" e "it" dove inseriremo i rispettivi file "common.php" che verranno aggiunti ai file "common.php" di sistema.
Il "common.php" della cartella "it"
Codice: Seleziona tutto
<?php
/**
*
* @package Micogian - Readers
* @copyright (c) 2018 Micogian
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
if (!defined('IN_PHPBB'))
{
exit;
}
if (empty($lang) || !is_array($lang))
{
$lang = array();
}
$lang = array_merge($lang, array(
'READERS_1' => 'lettore',
'READERS_2' => 'lettori',
));
Codice: Seleziona tutto
<?php
/**
*
* @package Micogian - Readers
* @copyright (c) 2018 Micogian
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
if (!defined('IN_PHPBB'))
{
exit;
}
if (empty($lang) || !is_array($lang))
{
$lang = array();
}
$lang = array_merge($lang, array(
'READERS_1' => 'reader',
'READERS_2' => 'readers',
));
Adesso che abbiamo completato i file php dell'estensione che ci forniscono le variabili richieste, dobbiamo pensare a dove inserirle nel template.
Il template che elabora la lista dei topics è "forumlist_body.html" e qui sorge un problema.
Gli eventi sono righe di codice di questo tipo:
Codice: Seleziona tutto
<!-- EVENT forumlist_body_forum_row_before -->
Teoricamente non si potrebbe inserire l'estensione, ma possiamo farlo inserendo una semplice riga nella posizione voluta.
E' una modifica al codice di sistema ma è una semplice riga che non stravolge il codice, dobbiamo solamente avere cura di inserire questa riga se aggiornuimo la versione di phpbb.
Nel file "forumlist_body.html" troviamo la riga
Codice: Seleziona tutto
<a href="{forumrow.U_VIEWFORUM}" class="forumtitle">{forumrow.FORUM_NAME}</a>
Codice: Seleziona tutto
<!-- EVENT forumlist_body_readers -->
Il contenuto del file "forumlist_body_readers.html" è il seguente
Codice: Seleziona tutto
<!-- IF forumrow.TOT_READERS == 1 -->
<i class="icon fa-group fa-fw" aria-hidden="true"></i>
<span style="color: #FF0000;"><em>( {forumrow.TOT_READERS} {L_READERS_1})</em></span>
<!-- ELSEIF forumrow.TOT_READERS > 1 -->
<i class="icon fa-user-plus fa-fw" aria-hidden="true"></i>
<span style="color: #FF0000;"><em>( {forumrow.TOT_READERS} {L_READERS_2})</em></span>
<!-- ENDIF -->