Creare un'estensione phpbb

Rispondi
Avatar utente
Micogian
Amministratore
Messaggi: 104
Iscritto il: 28/11/2014, 19:32

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.listene" 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-group 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.

readers.zip
(4.68 KiB) Scaricato 626 volte
Rispondi