Creare un'estensione phpbb

Area dedicata alle guide di phpBB 3
Rispondi
Avatar utente
Micogian
Globalmod
Globalmod
Messaggi: 599
Iscritto il: 17/03/2016, 17:53
Link del Forum: https://www.actaplantarum.org

Creare un'estensione phpbb

Messaggio da Micogian »

Esempio di creazione di un'estensione
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"
        }
    }
}
3) Il file "services.yml".

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 }
In questo file abbiamo stabilito di richiamare l'evento "event.listener" e pertanto andremo a creare una cartella di nome "event" e al suo interno il file "listener.php"

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;
	}
Queste sono le variabili di sistema che utilizzeremo per la nostra estensione.
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',
		);
	}
A seguire creiamo le 2 funzioni richiamate, la prima riguarda la lingua e contiene il percorso dell'estensione

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;
	}
La seconda funzione ha lo scopo di controllare e calcolare i visitatori connessi al forum:

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 ;			
	}
Il file "listener completo è il seguente:

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 ;			
	}
}
5) Il file di lingua

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',
));
e quello della cartella "en"

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',
));
6) Il template

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 -->
Il problema è che nel file "forumlist_body.html" non esiste un "EVENT" subito dopo il titolo del Forum.
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>
e aggiungiamo questa che ci crea l'evento "forumlist_body_readers"

Codice: Seleziona tutto

<!-- EVENT forumlist_body_readers -->
Torniamo alla nostra estensione e creiamo le seguenti cartelle:"styles/all/template/event/" e all'interno della cartella "event" inserire il file che richiama l'evento, cioè "forumlist_body_readers.html"
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 -->
L'estensione è completata, va abilitata da PCA e fornirà il numero dei lettori online per ogni Forum presente nell'indice.
micogian_readers.zip
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.
Avatar utente
alefalcon
Utente
Utente
Messaggi: 79
Iscritto il: 19/02/2018, 7:54
Link del Forum: https://forum.grnet.it

Re: Creare un'estensione phpbb

Messaggio da alefalcon »

Salve, ho installato l'estensione, abilitata da PCA, cancellato la cache del forum (3.2.3) e del browser, ma non vedo nulla.



P.S.

Rettifico: mi era sfuggita la modifica al file forumlist_body.html. Adesso funziona. Grazie per l'estensione/MOD
Avatar utente
Micogian
Globalmod
Globalmod
Messaggi: 599
Iscritto il: 17/03/2016, 17:53
Link del Forum: https://www.actaplantarum.org

Re: Creare un'estensione phpbb

Messaggio da Micogian »

Le estensioni sono costituite da parte di codice che va inserito in posizioni apposite chiamate EVENT ma per questa estensione non esiste un EVENT nella posizione voluta, ho pensato pertanto di creare un EVENT che inserisce il codice in quella posizione. Non è una manovra molto ortodossa ma è l'unica che permette all'estensione di funzionare.
Bisogna ricordarsi però, che in caso di aggiornamento della versione phpbb bisogna reinserire l'EVEN nel nuovo file forumlist_body.html.
Rispondi