[Come] Convertire 3.0 MOD in 3.1 Estensione

Discutere sulle estensioni 3.1.x di phpBB qui, e visualizzare le estensioni che sono disponibili per il download.
Bloccato
Avatar utente
frans
Staff phpBB3World
Staff phpBB3World
Messaggi: 139
Iscritto il: 11 nov 2012, 11:08

[Come] Convertire 3.0 MOD in 3.1 Estensione

Messaggio da frans » 2 lug 2015, 15:24

Contenuto Tabelle
  1. Struttura Estensione
    1. Directory
    2. Nuovi file Importante
    3. Front-facing file, percorsi e servizi
    4. Moduli ACP
  2. Modifiche database - UMIL sostituito da Migrazioni
    1. Cambiamenti schema
    2. Cambiamenti Dati
    3. Dipendenze
  3. Includi estensioni file di lingua
  4. File edits - Meglio non modificare nulla, basta usare Eventi e auditor
    1. php Eventi
    2. Eventi Template
    3. Aggiunta di eventi
  5. Compatibilità
    1. Paginatura
1. Struttura Estensione
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/
Non ci dovrebbe essere bisogno di avere file che si trovano al di fuori di tale directory. Non importa quali file, può essere stili, lingua o nelle file di modulo ACP. Tutti loro saranno spostati nella directory di estensioni.

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/
Appena aggiunto, sono già stati elencati directory aggiuntive. Il loro utilizzo verrà spiegato nei paragrafi seguenti.

1.2 Importante nuovi file
C'è un nuovo file, le vostre esigenze di estensione, in modo da essere riconosciuto dal sistema. È chiamatocomposer.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"
		}
	}
}
Il secondo nuovo file si chiama 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
{
}
1.3 Front-facing file, percorsi e servizi
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+
The string we define for _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%
Qualsiasi servizio che è definito nel file, o nel file del nucleo phpBB 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');
	}
}
Si può anche avere più metodi diversi in un controllore, così come da più controller, al fine di organizzare il codice un po 'meglio.

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. ;)

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')),
			),
		);
	}
}
Nel caso del modulo, devi solo regolare il nome della classe:

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
	}
}
E andiamo. Il tuo Estensioni modulo ACP ora può essere aggiunto tramite l'ACP ai appena finito un altro passo per convertire con successo un MOD in un Estensione.

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),
			),
		),
	);
2.1 Modifiche schema
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),
			),
		),
	);
}
Il 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')),
		);
	}
Maggiori informazioni su questi strumenti di aggiornamento dei dati può essere trovato sul Wiki Migrations/Tools.

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', '>=');
	}
Poiché i file di migrazione possono avere quasi qualsiasi nome, phpBB potrebbe non essere in grado di risolvere correttamente i file di migrazione. Per evitare questo problema, è possibile definire un insieme di dipendenze che devono essere installati prima la migrazione può essere installato. phpBB proverà a installarli, prima di installare la migrazione. Se non possono essere trovati o installati, l'installazione non riuscirà pure. Per la migrazione 1.0.0 mi limito a chiedere al 3.1.0-a1 Migrazione:

Codice: Seleziona tutto

	static public function depends_on()
	{
		return array('\phpbb\db\migration\data\v310\alpha1');
	}
Tutte gli ulteriori aggiornamenti possono richiedere questa migrazione e lo richiedono anche la migrazione 3.1.0-a1.

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');
per caricare la mia lingua da 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/'),
	));
Al 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;
	}
}
Nel 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',
		);
	}
Ora si aggiunge la funzione che viene poi chiamato:

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'),
		));
	}
Come ultimo passo è necessario per registrare il listener di eventi al sistema.
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 }
Dopo questo si aggiunge, il listener viene chiamato e abbiamo finito con il php-editing.

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>
E questo è tutto. Nessun file le modifiche necessarie per i file di modello pure.

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:
Fatal error: Call to undefined function generate_pagination() in ...\phpBB3\ext\nickvergessen\newspage\controller\main.php on line 534
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.

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),
	));
Il nuovo codice dovrebbe essere simile:

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),
	));

Bloccato

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite