- Struttura Estensione
- Modifiche database - UMIL sostituito da Migrazioni
- Includi estensioni file di lingua
- File edits - Meglio non modificare nulla, basta usare Eventi e auditor
- Compatibilità
Il cambiamento più evidente dovrebbe essere la posizione delle estensioni sono memorizzati in 3.1. In phpBB 3.0 tutti i file sono stati messi nella cartella principale del nucleo. Nella versione 3.1 è stata introdotta una directory speciale per le estensioni. È chiamato
ext/
.1.1 Directory
Ogni estensione ha la propria directory. Tuttavia, è possibile (e consigliabile) utilizzare anche una directory vendor aggiuntivo (con il nome dell'autore o il nome dell'autore-gruppo). Nel caso della mia newspage i file saranno in
Codice: Seleziona tutto
phpBB/ext/nickvergessen/newspage/
Codice: Seleziona tutto
new directory | current directory
------------------------+----------------
.../newspage/ |
acp/ | phpBB/includes/acp/
| phpBB/includes/acp/info/
adm/style/ | phpBB/adm/style/
config/ | ---
controller/ | ---
event/ | ---
language/ | phpBB/language/
migrations/ | ---
styles/ | phpBB/styles/
1.2 Importante nuovi file
C'è un nuovo file, le vostre esigenze di estensione, in modo da essere riconosciuto dal sistema. È chiamato
composer.json
:specifica i requisiti del proprio interno proprio come alcune informazioni sull'autore. Il layout è un semplice array JSON, i tasti in realtà dovrebbe spiegare abbastanza.
Nota: non si deve cambiare l'elemento
type
.nella sezione
require
è anche possibile specificare altre estensioni che sono necessari per poter installare questo. (La convalida per questo non è ancora implementata, ma sarà in 3.1.0)Codice: Seleziona tutto
{
"name": "nickvergessen/newspage",
"type": "phpbb-extension",
"description": "Adds a extra-page to the board where a switchable number of news are displayed. The text can be shorten to a certain number of chars. Also the Icons can be switched of (post icons, user icons)",
"homepage": "https://github.com/nickvergessen/phpbb3-mod-newspage",
"version": "1.1.0",
"time": "2013-03-16",
"license": "GPL-2.0",
"authors": [
{
"name": "Joas Schilling",
"email": "nickvergessen@gmx.de",
"homepage": "http://www.flying-bits.org",
"role": "Lead Developer"
}
],
"require": {
"php": ">=5.3.3"
},
"extra": {
"display-name": "phpBB 3.1 NV Newspage Extension",
"soft-require": {
"phpbb/phpbb": ">=3.1.0-RC2,<3.2.*@dev"
}
}
}
ext.php
. Può essere utilizzato per estendere le funzionalità durante l'installazione (chiamato abilitazione) e la disinstallazione (chiamato disabilita + cancellazione dei dati) proprio interno:Codice: Seleziona tutto
<?php
// this file is not really needed, when empty it can be ommitted
// however you can override the default methods and add custom
// installation logic
namespace nickvergessen\newspage;
class ext extends \phpbb\extension\base
{
}
Mentre in 3.0 appena creato un nuovo file nella directory principale di phpBB, si potrebbe desiderare di utilizzare il nuovo sistema di controllo di 3.1 in futuro. I tuoi link cambiano in qualcosa di simile
phpBB/newspage.php
a phpBB/app.php/newspage
al primo posto, ma con una piccola regola .htaccess questo può essere riscritto per phpBB/newspage
Per collegare una regola di routing specifica al proprio interno, è necessario definire la radice nelle vostre estensioni
config/routing.yml
Per il semplice avvio della newspage, 2 regole sono abbastanza. La prima regola è per la pagina di base attualmente
newspage.php
, la seconda è per l'impaginazione, come newspage.php?start=5
. La prima regola imposta una pagina predefinita (1), mentre la seconda regola richiede una seconda parte del URL da un numero intero.Codice: Seleziona tutto
newspage_base_controller:
path: /newspage
defaults: { _controller: nickvergessen.newspage.controller:base, page: 1 }
newspage_page_controller:
path: /newspage/{page}
defaults: { _controller: nickvergessen.newspage.controller:base }
requirements:
page: \d+
_controller
defines a service (nickvergessen.newspage.controller
) and a method (base
) of the class which is then called. Services are defined in your extensions config/services.yml
. Services are instances of classes. Services are used, so there is only one instance of the class which is used all the time. You can also define the arguments for the constructor of your class. The example definition of the newspage controller service would be something similar to:Codice: Seleziona tutto
services:
nickvergessen.newspage.controller:
class: nickvergessen\newspage\controller\main
arguments:
- @auth
- @cache
- @config
- @dbal.conn
- @request
- @template
- @user
- @controller.helper
- %core.root_path%
- %core.php_ext%
phpBB/config/services.yml
, può anche essere usato come argomento, così come alcuni stringa predefinita (come core.root_path
qui).Nota: Le classi di phpBB/ext/ vengono caricati automaticamente con il loro nome namespace e di classe, per cui backslash (
\
) rappresentare le directory. In questo caso la classe nickvergessen\newspage\controller\main
sarebbe situato in phpBB/ext/nickvergessen/newspage/controller/main.php
Per ulteriori spiegazioni su Routing e Servizi vedere la documentazione di Symfony 2.1.
In questo esempio il mio
controller/main.php
sarebbe simile alla seguente:
Codice: Seleziona tutto
<?php
/**
*
* @package NV Newspage Extension
* @copyright (c) 2013 nickvergessen
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
namespace nickvergessen\newspage\controller;
class main
{
/**
* Constructor
* NOTE: The parameters of this method must match in order and type with
* the dependencies defined in the services.yml file for this service.
*
* @param \phpbb\config $config Config object
* @param \phpbb\template $template Template object
* @param \phpbb\user $user User object
* @param \phpbb\controller\helper $helper Controller helper object
* @param string $root_path phpBB root path
* @param string $php_ext phpEx
*/
public function __construct(\phpbb\config\config $config, \phpbb\template\template $template, \phpbb\user $user, \phpbb\controller\helper $helper, $root_path, $php_ext)
{
$this->config = $config;
$this->template = $template;
$this->user = $user;
$this->helper = $helper;
$this->root_path = $root_path;
$this->php_ext = $php_ext;
}
/**
* Base controller to be accessed with the URL /newspage/{page}
* (where {page} is the placeholder for a value)
*
* @param int $page Page number taken from the URL
* @return Symfony\Component\HttpFoundation\Response A Symfony Response object
*/
public function base($page = 1)
{
/*
* Do some magic here,
* load your data and send it to the template.
*/
/*
* The render method takes up to three other arguments
* @param string Name of the template file to display
* Template files are searched for two places:
* - phpBB/styles/<style_name>/template/
* - phpBB/ext/<all_active_extensions>/styles/<style_name>/template/
* @param string Page title
* @param int Status code of the page (200 - OK [ default ], 403 - Unauthorized, 404 - Page not found, etc.)
*/
return $this->helper->render('newspage_body.html');
}
}
Se ora aggiungiamo la voce per la nostra estensione nella tabella phpbb_ext, e andiamo a
example.tld/app.php/newspage/
è possibile visualizzare il file di modello. Congratulations! Hai appena finito l'esempio "Ciao Mondo" per phpBB Extensions. ![Wink ;)](./images/smilies/icon_e_wink.gif)
1.4 Moduli ACP
Questa sezione si applica anche ai moduli MCP e UCP.
Come accennato prima questi file sono anche spostati nella directory di estensioni. Le informazioni file, attualmente sono situati nel
phpBB/includes/acp/info/acp_newspage.php
, sarà ext/nickvergessen/newspage/acp/main_info.php
e il modulo stesso viene spostato dalla phpBB/includes/acp/acp_newspage.php
to ext/nickvergessen/newspage/acp/main_module.php
. Al fine di essere in grado di caricare automaticamente i file in base al nome di classe abbiamo bisogno di fare alcuni piccoli aggiustamenti alle classi stesse.Per quanto riguarda il
main_info.php
Hai bisogno di regolare il nome della classe da acp_newspage_info
a main_info
e si deve anche modificare il valore di 'filename'
in returned array.
Codice: Seleziona tutto
<?php
/**
*
* @package NV Newspage Extension
* @copyright (c) 2013 nickvergessen
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
namespace nickvergessen\newspage\acp;
class main_info
{
function module()
{
return array(
'filename' => '\nickvergessen\newspage\acp\main_module',
'title' => 'ACP_NEWSPAGE_TITLE',
'version' => '1.0.1',
'modes' => array(
'config_newspage' => array('title' => 'ACP_NEWSPAGE_CONFIG', 'auth' => 'acl_a_board', 'cat' => array('ACP_NEWSPAGE_TITLE')),
),
);
}
}
Codice: Seleziona tutto
<?php
/**
*
* @package NV Newspage Extension
* @copyright (c) 2013 nickvergessen
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
namespace nickvergessen\newspage\acp;
class main_module
{
var $u_action;
function main($id, $mode)
{
// Your magic stuff here
}
}
2. Cambiamenti del database, UMIL sostituiti da Migrazioni
Wiki/Migrazioni
Fondamentalmente le migrazioni verso lo stesso come i file 3.0 UMIL. Svolge le modifiche al database del vostro MOD/Extension. La più grande differenza tra le migrazioni e UMIL presente è, che mentre tu avessi un file con una matrice in UMIL per tutte le modifiche, si dispone di un file per la versione in Migrazioni. Ma diamo ancora uno sguardo alla newspage.
Codice: Seleziona tutto
$versions = array(
'1.0.0' => array(
'config_add' => array(
array('news_number', 5),
array('news_forums', '0'),
array('news_char_limit', 500),
array('news_user_info', 1),
array('news_post_buttons', 1),
),
'module_add' => array(
array('acp', 'ACP_CAT_DOT_MODS', 'NEWS'),
array('acp', 'NEWS', array(
'module_basename' => 'newspage',
'module_langname' => 'NEWS_CONFIG',
'module_mode' => 'overview',
'module_auth' => 'acl_a_board',
),
),
),
),
'1.0.1' => array(
'config_add' => array(
array('news_pages', 1),
),
),
'1.0.2' => array(),
'1.0.3' => array(
'config_add' => array(
array('news_attach_show', 1),
array('news_cat_show', 1),
array('news_archive_per_year', 1),
),
),
);
Il newspage non ha nessuna modificha allo schema del database, quindi userò l'esempio del Wiki. In pratica è necessario disporre di due metodi nel file di classe della migrazione:
public function update_schema()
and public function revert_schema()
, per cui entrambi i metodi restituiscono un array con i cambiamenti:
Codice: Seleziona tutto
public function update_schema()
{
return array(
'add_columns' => array(
$this->table_prefix . 'groups' => array(
'group_teampage' => array('UINT', 0, 'after' => 'group_legend'),
),
$this->table_prefix . 'profile_fields' => array(
'field_show_on_pm' => array('BOOL', 0),
),
),
'change_columns' => array(
$this->table_prefix . 'groups' => array(
'group_legend' => array('UINT', 0),
),
),
);
}
Codice: Seleziona tutto
public function revert_schema()
{
return array(
'drop_columns' => array(
$this->table_prefix . 'groups' => array(
'group_teampage',
),
$this->table_prefix . 'profile_fields' => array(
'field_show_on_pm',
),
),
'change_columns' => array(
$this->table_prefix . 'groups' => array(
'group_legend' => array('BOOL', 0),
),
),
);
}
revert_schema()
dovrebbe quindi annullare tutte le modifiche apportate al update_schema()
.2.2 Cambiamenti Dati
Le modifiche dei dati, come l'aggiunta di moduli, autorizzazioni e configurazioni, sono forniti con la funzione
update_data()
.Questa funzione restituisce pure un array. L'esempio per l'aggiornamento della versione 1.0.0 del newspage sarà simile alla seguente:
Codice: Seleziona tutto
public function update_data()
{
return array(
array('config.add', array('news_number', 5)),
array('config.add', array('news_forums', '0')),
array('config.add', array('news_char_limit', 500)),
array('config.add', array('news_user_info', 1)),
array('config.add', array('news_post_buttons', 1)),
array('module.add', array(
'acp',
'ACP_CAT_DOT_MODS',
'ACP_NEWSPAGE_TITLE'
)),
array('module.add', array(
'acp',
'ACP_NEWSPAGE_TITLE',
array(
'module_basename' => '\nickvergessen\newspage\acp\main_module',
'modes' => array('config_newspage'),
),
)),
array('config.add', array('newspage_mod_version', '1.0.0')),
);
}
2.3 Dipendenze e finitura migrazioni
Ora ci sono solo due cose rimaste, il file di migrazione ha bisogno. La prima cosa è un controllo che permette di vedere phpbb se la migrazione è già installato, anche se non ha ancora eseguito (f.e. quando si aggiorna da un 3,0 MOD per un Estensioni 3.1).
Il modo più semplice per questo per verificare, potrebbe essere la versione del MOD, ma quando si aggiungono le colonne di tabelle, si può anche verificare se esistono:
Codice: Seleziona tutto
public function effectively_installed()
{
return isset($this->config['newspage_mod_version']) && version_compare($this->config['newspage_mod_version'], '1.0.0', '>=');
}
3.1.0-a1
Migrazione:
Codice: Seleziona tutto
static public function depends_on()
{
return array('\phpbb\db\migration\data\v310\alpha1');
}
Un file completo potrebbe assomigliare a questo:
Codice: Seleziona tutto
<?php
/**
*
* @package migration
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License v2
*
*/
namespace nickvergessen\newspage\migrations\v10x;
class release_1_0_0 extends \phpbb\db\migration\migration
{
public function effectively_installed()
{
return isset($this->config['newspage_mod_version']) && version_compare($this->config['newspage_mod_version'], '1.0.0', '>=');
}
static public function depends_on()
{
return array('\phpbb\db\migration\data\v310\dev');
}
public function update_data()
{
return array(
array('config.add', array('news_number', 5)),
array('config.add', array('news_forums', '0')),
array('config.add', array('news_char_limit', 500)),
array('config.add', array('news_user_info', 1)),
array('config.add', array('news_post_buttons', 1)),
array('module.add', array(
'acp',
'ACP_CAT_DOT_MODS',
'ACP_NEWSPAGE_TITLE'
)),
array('module.add', array(
'acp',
'ACP_NEWSPAGE_TITLE',
array(
'module_basename' => '\nickvergessen\newspage\acp\main_module',
'modes' => array('config_newspage'),
),
)),
array('config.add', array('newspage_mod_version', '1.0.0')),
);
}
}
3. Includere i file di lingua nell'estensione
Poiché i file di lingua nel proprio interno non vengono rilevati dal
$user->add_lang()
più, è necessario utilizzare il metodo $user->add_lang_ext()
. Questo metodo accetta due argomenti, il primo è il nome completo dell'estensione (compreso il fornitore) e la seconda è il nome del file o array di nomi di file. così per caricare la mia notizia file di lingua pagina ora chiamo
Codice: Seleziona tutto
$user->add_lang_ext('nickvergessen/newspage', 'newspage');
phpBB/ext/nickvergessen/newspage/language/en/newspage.php
4. Modifiche dei file - Meglio non modificare nulla, basta usare Eventi e auditor
Per quanto riguarda la modifica newspage, l'unica cosa che ora manca di completamento è il link nella sezione di intestazione, in modo da poter iniziare a navigare il newspage.
Per fare questo, ho usato per definire la variabile modello nella
page_header()
-funzione di phpBB e quindi modificare il overall_header.html
. Ma questo è 3.1, quindi non mi piace modificare i file più e ho aggiunto events invece. Con gli events si può collegare in diversi luoghi ed eseguire il codice, senza doverli modificare.4.1 php Eventi
Così, invece di aggiungere
Codice: Seleziona tutto
$template->assign_vars(array(
'U_NEWSPAGE' => append_sid($phpbb_root_path . 'app.' . $phpEx, 'controller=newspage/'),
));
page_header()
, mettiamo che in un listener di eventi, che viene poi chiamato, ogni volta page_header()
si è chiamato.Così aggiungiamo il
event/main_listener.php
file per la nostra estensione, che implementa una classe Symfony:
Codice: Seleziona tutto
<?php
/**
*
* @package NV Newspage Extension
* @copyright (c) 2013 nickvergessen
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
namespace nickvergessen\newspage\event;
/**
* Event listener
*/
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class main_listener implements EventSubscriberInterface
{
/**
* Instead of using "global $user;" in the function, we use dependencies again.
*/
public function __construct(\phpbb\controller\helper $helper, \phpbb\template\template $template, \phpbb\user $user)
{
$this->helper = $helper;
$this->template = $template;
$this->user = $user;
}
}
getSubscribedEvents()
metodo che dire al sistema per il quale gli eventi si vuole ricevere la notifica e che la funzione deve essere eseguito nel caso in cui si chiama. Nel nostro caso vogliamo sottoscrivere il core.page_header
-Event (l'elenco completo degli eventi può essere trovato Qui):
Codice: Seleziona tutto
static public function getSubscribedEvents()
{
return array(
'core.user_setup' => 'load_language_on_setup',
'core.page_header' => 'add_page_header_link',
);
}
Codice: Seleziona tutto
public function load_language_on_setup($event)
{
$lang_set_ext = $event['lang_set_ext'];
$lang_set_ext[] = array(
'ext_name' => 'nickvergessen/newspage',
'lang_set' => 'newspage',
);
$event['lang_set_ext'] = $lang_set_ext;
}
public function add_page_header_link($event)
{
// I use a second language file here, so I only load the strings global which are required globally.
// This includes the name of the link, aswell as the ACP module names.
$this->user->add_lang_ext('nickvergessen/newspage', 'newspage_global');
$this->template->assign_vars(array(
'U_NEWSPAGE' => $this->helper->route('newspage_base_controller'),
));
}
Questo viene fatto usando il
event.listener
tag nella service.yml
(Vedere la Front-facing files Sezione):
Codice: Seleziona tutto
nickvergessen.newspage.listener:
class: nickvergessen\newspage\event\main_listener
arguments:
- @controller.helper
- @template
- @user
tags:
- { name: event.listener }
Gli utenti non otterranno i conflitti sulla ricerca per i file blocchi e le altre cose, perché un altro MOD già modificato il codice. Anche in questo caso, come con i controllori, è possibile avere più auditor della
event/
directory, proprio come iscriversi a più eventi con un auditor.4.2 Eventi Template
Ora l'unica cosa che resta è, aggiungendo il codice per l'output HTML. Per i modelli è necessario un file per ogni evento.
Il nome del file comprende così il nome dell'evento. Per aggiungere il link newspage accanto al collegamento FAQ, abbiamo bisogno di usare la
'overall_header_navigation_prepend'
-evento (l'elenco completo degli eventi può essere trovatoQui).Così aggiungiamo il
styles/prosilver/template/event/overall_header_navigation_prepend_listener.html
alla nostra directory delle estensioni e aggiungere il codice html all'interno di esso.
Codice: Seleziona tutto
<li class="icon-newspage"><a href="{U_NEWSPAGE}">{L_NEWSPAGE}</a></li>
4.3 Aggiunta di eventi
È inoltre possibile aggiungere eventi al estensioni PHP e codice del modello. Se si perde un evento dal nucleo, si prega di inviare un argomento nella [3.x] Event Requests-Forum e includeremo per il prossimo rilascio.
We try to include a huge bunch of events by default, but surely we can not cover every place your MODs need to be covered.
Nozioni di base finiti!
E questo è tutto, la modifica 3.0 è stata convertita con successo in un Estensione 3.1.
5. Compatibilità
In alcuni casi, la compatibilità di funzioni e classi non conta essere mantenuto, aumentando il loro potere. Potete vedere una lista delle cose nel wiki-articolo su PhpBB3.1
5.1 Paginazione
Quando si utilizza il codice vecchio 3.0 si riceverà un errore come il seguente:
Il problema è, che l'impaginazione è ora non è restituito dalla funzione più, ma invece messo automaticamente nel modello. Nello stesso punto, il nome della funzione è stato aggiornato con un phpbb prefisso.Fatal error: Call to undefined function generate_pagination() in ...\phpBB3\ext\nickvergessen\newspage\controller\main.php on line 534
Il vecchio codice impaginazione è stato simile a:
Codice: Seleziona tutto
$pagination = generate_pagination(append_sid("{$phpbb_root_path}app.$phpEx", 'controller=newspage/'), $total_paginated, $config['news_number'], $start);
$this->template->assign_vars(array(
'PAGINATION' => $pagination,
'PAGE_NUMBER' => on_page($total_paginated, $config['news_number'], $start),
'TOTAL_NEWS' => $this->user->lang('VIEW_TOPIC_POSTS', $total_paginated),
));
Codice: Seleziona tutto
$pagination = $phpbb_container->get('pagination');
$pagination->generate_template_pagination(
array(
'routes' => array(
'newspage_base_controller',
'newspage_page_controller',
),
'params' => array(),
), 'pagination', 'page', $total_paginated, $this->config['news_number'], $start);
$this->template->assign_vars(array(
'PAGE_NUMBER' => $pagination->on_page($total_paginated, $this->config['news_number'], $start),
'TOTAL_NEWS' => $this->user->lang('VIEW_TOPIC_POSTS', $total_paginated),
));