[CUM SĂ] Conversia MODificărilor 3.0 în Extensii 3.1

Aici sunt anunţate şi prezentate MODificările realizate de comunitatea phpBB internaţională şi românească pentru forumul phpBB 3.1.x.
Reguli forum
Aveti o problema si vreti sa primiti ajutor? Click aici ! Nu uitati si de regulamentul forumului !
Închis
Avatar utilizator
Ivan Petre Paul
Moderator
Moderator
Mesaje: 4046
Membru din: 26-Aug-2009, 01:13:39
Versiune: 3.1.10
MOD: Da
Server: UNIX/Linux
Nivel phpBB: Experimentat
Nivel php: Puţin experimentat
Localitate: Brașov
Contact:

[CUM SĂ] Conversia MODificărilor 3.0 în Extensii 3.1

Mesaj de Ivan Petre Paul » 28-Noi-2013, 00:24:36

Tabelul conținutului
  1. Structura Extensiilor
    1. Director
    2. Fișiere noi importante
    3. Reorintare spre fișiere, rute și servicii
    4. Module din PA
  2. Modificări ale bazei de date - UMIL, înlocuit de Migrații
    1. Modificări schemă
    2. Modificări date
    3. Dependențe
  3. Include fișierele de limbă ale extensiei
  4. Modificări de fișiere - Mai bine nu modificăm nimic, doar utilizăm cazuri și Ascultători
    1. Cazuri php
    2. Cazuri șabloane
    3. Adăugarea cazurilor
  5. Compatibilitate
    1. Paginație

1. Structura Extensiilor
Cea mai evidenta schimbare ar trebui să fie locul în care Extensiile sunt stocate în 3.1. În phpBB 3.0 toate fișierele au fost puse în directorul rădăcină al forumului phpBB. În versiunea 3.1, a fost introdus un director special pentru extensii. Se numește ext/.

1.1 Director
Fiecare extensie își are propriul director. Cu toate acestea, puteți (și ar trebui) să utilizați de asemenea, un director furnizor suplimentar (cu numele autorului sau numele grupului-autorilor). În cazul Extensiei AdCode (creată de către mine) fișierele vor fi localizate în

Cod: Selectaţi tot

phpBB/ext/ivanpetrepaul/adcode/
Nu ar trebui să fie o nevoie de a avea fișiere localizate in afara acestui director. Indiferent ce tip de fișiere ar exista (pot fi de stiluri, de limbă sau fișiere de module PA), toate acestea vor fi mutate în directorul extensiei dumneavoastră.

Cod: Selectaţi tot

            directorul nou          | directorul curent
            ------------------------+----------------
     .../adcode/                    |
            acp/                    | phpBB/includes/acp/
                                    | phpBB/includes/acp/info/
            adm/style/              | phpBB/adm/style/
            config/                 |   ---
            controller/             |   ---
            event/                  |   ---
            language/               | phpBB/language/
            migrations/             |   ---
            styles/                 | phpBB/styles/
Adăugate recent, directoare suplimentare au fost deja enumerate. Utilizarea lor va fi explicată în următoarele paragrafe.

1.2 Fișiere noi importante
There is a new file, your extension needs, in order to be recognized by the system. It's called composer.json:
it specifies the requirements of your extension aswell as some author information. The layout is a simple json array, the keys should really explain enough.
Note: you must not change the type element.
In the require section you can also specify other extensions which are required in order to install this one. (Validation for this is not yet implemented, but will be in 3.1.0)

Există un nou fișier de care extensia dvs. are nevoie, pentru a fi recunoscută de către sistem. Se numește composer.json:
specifică cerințele extensiei dumneavoastră, precum și unele informații despre autor. Schema este o matrice simplă json (json array), iar cheile ar trebui să explice într-adevăr destul.
Notă: nu trebuie să schimbați tipul elementului.
În secțiunea necesară puteți specifica, de asemenea, alte extensii, care sunt necesare pentru a o instala pe aceasta. (Validarea pentru acest lucru nu este încă pusă în aplicare, dar va fi aplicată în 3.1.0)

Cod: Selectaţi tot

{
   "name": "ivanpetrepaul/adcode",
   "type": "phpbb-extension",
   "description": "Oferă posibilitatea de a afișa anunțuri sub o formă scurtă pe prima pagină a forumului-sus și în pagina fiecărei secțiuni. Oferă nenumărate opțiuni ca adăugarea unei imagini, a unui clip video, a unui text, a unui contor de click-uri și multe altele.",
   "homepage": "https://github.com/ivanpetrepaul/phpbb-ext-adcode",
   "version": "2.0.0",
   "time": "2013-04-18",
   "licence": "GPL-2.0",
   "authors": [
      {
         "name": "Ivan Petre Paul",
         "email": "ivanpetrepaul@yahoo.com",
         "homepage": "http://ivanpetrepaul.ro",
         "role": "Autor Extensii"
      }
   ],
   "require": {
      "php": ">=5.3",
      "phpbb/phpbb": "3.1.*@dev"
   },
   "extra": {
      "display-name": "phpBB 3.1 IPP Extensia AdCode"
   }
}
Al doilea fișier nou este numit ext.php. Acesta poate fi folosit pentru a extinde funcționalitatea în timpul instalării (denumită „activare”) și dezinstalării (denumită „dezactivare + șterge datele”) extensiei:

Cod: Selectaţi tot

<?php

// acest fișier nu este într-adevăr necesar, dacă este gol poate fi omis
// totuși puteți suprascrie metodele implicitate și adăuga o
// logică proprie de instalare

namespace ivanpetrepaul\adcode;

class ext extends \phpbb\extension\base
{
}
1.3 Reorintare spre fișiere, rute și servicii
În timp ce în 3.0 trebuia să creați un fișier nou care era pus în directorul rădăcină al phpBB, acum veți renunța la această idee și veți dori cel mai probabil să utilizați noul sistem de control în 3.1. Legăturile dvs. se vor modifica din (de exemplu) phpBB/adcode.php în phpBB/app.php/adcode pentru început, însă cu o simplă regulă .htaccess această adresă poate fi modificată în phpBB/adcode.

În scopul de a lega o regulă de dirijare specifică de extensia dvs., va fi necesar să definiți traseul acesteia în fișierul config/routing.yml al extensiei dumneavoastră.

Pentru un început simplu al adcode, 2 reguli sunt suficiente. Prima regulă va fi definită pentru pagina principală care este în prezent adcode.php, iar ce-a de-a doua va fi definită pentru paginație, ca adcode.php?start=5. Prima regulă setează a pagină implicită (1), în timp ce ce-a de-a doua regulă necesită o a doua parte a unui URL pentru a-l face întreg.

Cod: Selectaţi tot

adcode_base_controller:
    pattern: /adcode
    defaults: { _controller: ivanpetrepaul.adcode.controller:base, page: 1 }
adcode_page_controller:
    pattern: /adcode/{page}
    defaults: { _controller: ivanpetrepaul.adcode.controller:base }
    requirements:
        page:  \d+
Șirul pe care-l definim pentru_controller definește un serviciu (ivanpetrepaul.adcode.controller) și o metodă (de bază) de clasă, care este apoi numită. Serviciile sunt definite în extensiile dvs. de fișierul config/services.yml. Serviciile sunt cazuri de clase. Serviciile sunt utilizate, astfel încât nu există o singură instanță a clasei care este folosită tot timpul. Puteți defini, de asemenea, argumentele pentru constructorul clasei dvs. Exemplul de definire a serviciului de control al adcode ar trebui să fie similar cu:

Cod: Selectaţi tot

services:
    ivanpetrepaul.adcode.controller:
        class: ivanpetrepaul\adcode\controller\main
        arguments:
            - @auth
            - @cache
            - @config
            - @dbal.conn
            - @request
            - @template
            - @user
            - @controller.helper
            - %core.root_path%
            - %core.php_ext%
Orice serviciu care este definit în fișierul dvs., sau în dosarul de bază (core) al phpBB, phpBB/config/services.yml, poate fi de asemenea folosit ca un argument, la fel de bine ca unele string-uri (șiruri)  predefinite (cum ar fi core.root_path aici).

Notă: Clasele din phpBB/ext/ sunt încărcate în mod automat de spațiul de nume (namespace) și de numele clasei (class name), în care backslash-ul (\) reprezintă directoarele. În acest caz, clasa ivanpetrepaul\adcode\controller\principal ar fi situată în phpBB/ext/ivanpetrepaul/adcode/controler/main.php.

Pentru mai multe explicații despre Dirijare/Routing și Servicii/Services vizualizați documentația pentru Symfony 2.1.

În acest exemplu, fișierul meu controller/main.php ar arata astfel:

Cod: Selectaţi tot

<?php
/**
*
* @package IPP AdCode Extension
* @copyright (c) 2013 Ivan Petre Paul
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/

namespace ivanpetrepaul\adcode\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 /adcode/{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('adcode_body.html');
   }
}
Puteți avea, de asemenea, mai multe metode diferite într-un singur controller și la fel de bine puteți avea mai multe controllere, în scopul de a organiza codul un pic mai bine.

Dacă acum am adăuga intrarea pentru extensia noastră în tabela phpbb_ext, și am merge la exemplu.tld/app.php/adcode putem vedea fișierul nostru șablon.
Felicitări! Tocmai ați terminat exemplul de Extensie phpBB „Salutare phpBB România”. ;)

1.4 Module PA
Această secțiune se aplică și la modulele MP și PU.

Așa cum am menționat mai înainte aceste fișiere sunt, de asemenea, mutate în directorul dvs. de extensii. Fișierul cu informații, situat în prezent în phpBB/include/acp/info/acp_adcode.php, va situat în ext/ivanpetrepaul/adcode/acp/main_info.php iar modul în sine este mutat din phpBB/include/ACP/ acp_adcode.php în ext/ivanpetrepaul/adcode/acp/main_module.php. În scopul de a putea fi încărcate în mod automat fișierele în funcție de numele clasei, va trebuie să facem unele ajustări mici la clasele înșăși.

În ceea ce privește fișierul main_info.php trebuie să ajustez numele clasei din acp_adcode_info la main_info și, de asemenea, să modific valoarea 'numelefișierului' în matricea întoarsă (returned array).

Cod: Selectaţi tot

<?php
/**
*
* @package IPP AdCode Extension
* @copyright (c) 2013 Ivan Petre Paul
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/

namespace ivanpetrepaul\adcode\acp;

class main_info
{
   function module()
   {
      return array(
         'filename'   => '\ivanpetrepaul\adcode\acp\main_module',
         'title'      => 'ACP_ADCODE_TITLE',
         'version'   => '1.0.0',
         'modes'      => array(
            'config_adcode'   => array('title' => 'ACP_ADCODE_CONFIG', 'auth' => 'acl_a_board', 'cat' => array('ACP_ADCODE_TITLE')),
         ),
      );
   }
}
În cazul modului, doar voi ajusta numele clasei (class name):

Cod: Selectaţi tot

<?php
/**
*
* @package IPP AdCode Extension
* @copyright (c) 2013 Ivan Petre Paul
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/

namespace ivanpetrepaul\adcode\acp;

class main_module
{
   var $u_action;

   function main($id, $mode)
   {
      // Liniile tale magice aici
   }
}
Și gata. Modului PA al Extensiei dvs. poate fi acum adăugat în PA și tocmai ați terminat un alt pas în conversia cu succes a unei MODificări într-o Extensie.

2.0 Modificări ale bazei de date - UMIL, înlocuit de Migrații
Wiki/Migrații

Practic migrațiile, la fel ca fișierele UMIL din 3.0, efectuează modificările pe baza de date necesare MODificării/Extensiei dumneavoastră. Cea mai mare diferență dintre migrații și UMIL este aceea că în timp ce ați avut un fișier cu un singur element (array) în UMIL pentru toate modificările, acum aveți un fișier per versiune în migrații. Dar haideți să aruncăm o privire la adcode din nou.

Cod: Selectaţi tot

   $versions = array(
      '1.0.0'   => array(
         'config_add' => array(
            array('adcode_number', 5),
            array('adcode_forums', '0'),
            array('adcode_char_limit', 500),
            array('adcode_user_info', 1),
            array('adcode_post_buttons', 1),
         ),
         'module_add' => array(
            array('acp', 'ACP_CAT_DOT_MODS', 'ADCODE'),

            array('acp', 'ADCODE', array(
                  'module_basename'   => 'adcode',
                  'module_langname'   => 'ADCODE_CONFIG',
                  'module_mode'      => 'overview',
                  'module_auth'      => 'acl_a_board',
               ),
            ),
         ),
      ),
      '1.0.1'   => array(
         'config_add' => array(
            array('adcode_pages', 1),
         ),
      ),
      '1.0.2'   => array(),
      '1.0.3' => array(
         'config_add' => array(
            array('adcode_attach_show', 1),
            array('adcode_cat_show', 1),
            array('adcode_archive_per_year', 1),
         ),
      ),
   );
2.1 Modificări schemă
AdCode nu are nici modificări de schemă de baze de date, așa că voi folosi exemplul din Wiki. Practic ai nevoie de două metode în fișierul clasei de migrare:
funcția publică update_schema() și funcția publică revert_schema(), în care ambele metode sa returneze un array cu schimbările:

Cod: Selectaţi tot

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

Cod: Selectaţi tot

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),
         ),
      ),
   );
}
Funcția revert_schema() ar trebui în acest sens să întoarcă și să anuleze toate modificările făcute de funcția update_schema().

2.2 Modificări date
Modificările de date, ca adăugarea modulelor, permisiunilor și configurărilor sunt furnizate prin funcția update_data().

Această funcție întoarce un array după cum urmează. Exemplul pentru versiunea 1.0.0 care actualizează adcode ar trebui să arate așa:

Cod: Selectaţi tot

   public function update_data()
   {
      return array(
         array('config.add', array('adcode_number', 5)),
         array('config.add', array('adcode_forums', '0')),
         array('config.add', array('adcode_char_limit', 500)),
         array('config.add', array('adcode_user_info', 1)),
         array('config.add', array('adcode_post_buttons', 1)),

         array('module.add', array(
            'acp',
            'ACP_CAT_DOT_MODS',
            'ACP_ADCODE_TITLE'
         )),
         array('module.add', array(
            'acp',
            'ACP_ADCODE_TITLE',
            array(
               'module_basename'   => '\ivanpetrepaul\adcode\acp\main_module',
               'modes'            => array('config_adcode'),
            ),
         )),

         array('config.add', array('adcode_mod_version', '1.0.0')),
      );
   }
Mai multe informații despre aceste utilitare de actualizare ale datelor pot fi găsite în pagina Wiki Migrations/Tools.

2.3 Dependențe
Acum, există doar două lucruri rămase, necesare fișierului de migrație. Primul lucru ce trebuie făcut este o verificare, care permite phpBB-ului să vadă dacă migrația este deja instalată, cu toate că nu este rulată încă (de ex. atunci când actualizați o MODificare 3.0 într-o Extensie 3.1).

Cel mai simplu mod pentru a verifica acest lucru, ar putea fi versiunea MODificării, dar atunci când adăugați coloane în tabele, puteți verifica de asemenea, dacă acestea există:

Cod: Selectaţi tot

   public function effectively_installed()
   {
      return isset($this->config['adcode_mod_version']) && version_compare($this->config['adcode_mod_version'], '1.0.0', '>=');
   }
Așa cum fișierele de migrare pot avea aproape orice nume, phpBB ar putea fi în imposibilitatea de a sorta fișierele de migrare corect. Pentru a evita această problemă, puteți defini un set de dependențe care trebuie să fie instalat înainte ca migrarea să poată fi instalată. phpBB va încerca să le instaleze, înainte de a instala migrarea dumneavoastră. În cazul în care acesta nu poate fi găsit sau instalat, instalarea va eșua. Pentru migrarea 1.0.0 voi cere doar migrația 3.1.0-a1:

Cod: Selectaţi tot

   static public function depends_on()
   {
      return array('\phpbb\db\migration\data\v310\alpha1');
   }
Toate actualizările ulterioare pot solicita acum această migrație și astfel necesită, de asemenea, migrația 3.1.0-a1.

Un fișier complet ar putea arăta astfel:

Cod: Selectaţi tot

<?php
/**
*
* @package migration
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License v2
*
*/

namespace ivanpetrepaul\adcode\migrations\v10x;

class release_1_0_0 extends \phpbb\db\migration\migration
{
   public function effectively_installed()
   {
      return isset($this->config['adcode_mod_version']) && version_compare($this->config['adcode_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('adcode_number', 5)),
         array('config.add', array('adcode_forums', '0')),
         array('config.add', array('adcode_char_limit', 500)),
         array('config.add', array('adcode_user_info', 1)),
         array('config.add', array('adcode_post_buttons', 1)),

         array('module.add', array(
            'acp',
            'ACP_CAT_DOT_MODS',
            'ACP_ADCODE_TITLE'
         )),
         array('module.add', array(
            'acp',
            'ACP_ADCODE_TITLE',
            array(
               'module_basename'   => '\ivanpetrepaul\adcode\acp\main_module',
               'modes'            => array('config_adcode'),
            ),
         )),

         array('config.add', array('adcode_mod_version', '1.0.0')),
      );
   }
}
3.0 Include fișierele de limbă ale extensiei
As the language files in your extension are not detected by the $user->add_lang() any more, you need to use the $user->add_lang_ext() method. This method takes two arguments, the first one is the fullname of the extension (including the vendor) and the second one is the file name or array of file names. so in order to load my newspage language file I now call

Așa cum fișierele de limbă din extensia dvs. nu mai sunt detectate de către funcția $user->add_lang(), trebuie să utilizați metoda $user->add_lang_ext(). Această metodă are două argumente, prima fiind numele complet al extensiei (inclusiv vendorul) iar a doua numele fișierului sau matricea (array) numelor fișierelor. Astfel că în scopul de a încărca fișierul meu limbă pentru adcode voi folosi acum

Cod: Selectaţi tot

$user->add_lang_ext('ivanpetrepaul/adcode', 'adcode');
pentru a încărca fișierul de limbă din phpBB/ext/ivanpetrepaul/adcode/language/en/adcode.php.

4.0 Modificări de fișiere - Mai bine nu modificăm nimic, doar utilizăm cazuri și Ascultători
În ceea ce privește modificarea adcode, singurul lucru care lipsește acum de la finalizare este legătura din secțiunea de antet care să vă permită să începeți navigarea pe pagina adcode.

În scopul de a face acest lucru, am definit variabila din șablon în funcția page_header() a phpBB și am modificat fișierul overall_header.html. Dar acesta este phpBB 3.1 și pentru că nu ne place să modificăm fișiere, am adăugat în schimb cazuri. Cu cazuri puteți face modificări automate în mai multe locuri și executa cod, fără a le edita.

4.1 Cazuri php
Deci, în loc să adăugăm

Cod: Selectaţi tot

   $template->assign_vars(array(
      'U_ADCODE'   => append_sid($phpbb_root_path . 'app.' . $phpEx, 'controller=adcode/'),
   ));
în page_header(), am adăugat acestea într-un caz ascultător (event listener) care este solicitat de fiecare dată când funcția page_header() în sine este solicitată.

Astfel adăugăm fișierul event/main_listener.php la extensia noastră, fișier ce implementează câteva clase Symfony (Symfony class):

Cod: Selectaţi tot

<?php
/**
*
* @package IPP AdCode Extension
* @copyright (c) 2013 Ivan Petre Paul
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/

namespace ivanpetrepaul\adcode\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;
   }
}
In the getSubscribedEvents() method we tell the system for which events we want to get notified and which function should be executed in case it's called. In our case we want to subscribe to the core.page_header-Event (a full list of events can be found here):

În metoda getSubscribedEvents() am cerut sistemului ca pentru fiecare caz (event) dorit să fim notificați ți de asemenea i-am spus ce funcție ar trebui executată în caz că este solicitată. În cazul nostru dorim să subscriem cazul core.page_header (o listă completă a cazurilor poate fi găsită aici):

Cod: Selectaţi tot

   static public function getSubscribedEvents()
   {
      return array(
         'core.user_setup'            => 'load_language_on_setup',
         'core.page_header'            => 'add_page_header_link',
      );
   }
Acum adăugăm funcția care va fi ulterior solicitată:

Cod: Selectaţi tot

   public function load_language_on_setup($event)
   {
      $lang_set_ext = $event['lang_set_ext'];
      $lang_set_ext[] = array(
         'ext_name' => 'ivanpetrepaul/adcode',
         'lang_set' => 'adcode',
      );
      $event['lang_set_ext'] = $lang_set_ext;
   }

   public function add_page_header_link($event)
   {
      // Am folosit un al doilea fișier de limbă aici, deci voi încărca doar șirurile (strings) globale care sunt solicitate global.
      // Acesta include numele legăturii, la fel ca numele modulelor din PA.
      $this->user->add_lang_ext('ivanpetrepaul/adcode', 'adcode_global');

      $this->template->assign_vars(array(
         'U_ADCODE'   => $this->helper->url('adcode'),
      ));
   }

Ca și ultim pas va trebui să înregistrăm funcția cazul ascultător în sistem.
Putem face asta utilizând tag-ul event.listener în fișierul service.yml (vedeți secțiunea Reorintare spre fișiere, rute și servicii):

Cod: Selectaţi tot

    ivanpetrepaul.adcode.listener:
        class: ivanpetrepaul\adcode\event\main_listener
        arguments:
            - @controller.helper
            - @template
            - @user
        tags:
            - { name: event.listener }
După ce aceasta este adăugată, ascultătorul (listener)  este solicitat și astfel am terminat cu editarea-php.

Utilizatorii dvs. nu vor întâmpina conflicte la căutarea de blockuri (blocks) de fișiere sau alte lucruri din cauza unei alte MODificări care a editat deja codul. Din nou, ca și cu controllerele, puteți avea mai mulți ascultatori (listeners) în directorul event/, la fel de bine ca și cum vă abonați la mai multe cazuri cu un ascultător.

4.2 Cazuri șabloane
Acum singurul lucru care a rămas de făcut este adăugarea codului în output-ul html. Pentru șabloane aveți nevoie de un singur fișier per caz (event).

Numele fișierului include astfel numele cazului (event name). În vederea adăugării legăturii către pagina adcode lângă legătura FAQ, trebuie să utilizăm cazul (event-ul) 'overall_header_navigation_prepend' (lista completă de evenimente poate fi găsită aici).

Astfel adăugăm fișierul
styles/prosilver/template/event/overall_header_navigation_prepend_listener.html
în directorul extensiei noastre și adăugăm în acesta codul.

Cod: Selectaţi tot

<li class="icon-adcode"><a href="{U_ADCODE}">{L_ADCODE}</a></li>
Și asta este. Nu avem nevoie de alte modificări de fișiere pentru șabloane.

4.3 Adăugarea cauzelor
Puteți adăuga de asemenea cazuri în extensiile dvs. php și în codul șablonului. Dacă lipsește un caz din core, vă rugăm să deschideți un subiect nou în forumul [3.x] Event Requests iar colegii noștri de la phpbb.com îl vor include în următoarea versiune a phpBB.

Noțiuni de bază finalizate!
Asta este. MODificarea 3.0 a fost convertită cu succes într-o Extensie 3.1.

5.0 Compatibilitate
În anumite cazuri compatibilitatea funcțiilor și claselor nu poate fi păstrată. Puteți vedea o listă utilă în articolul Wiki despre phpBB 3.1.

5.1 Paginație
Când utilizați codul vechi din 3.0 veți primi o eroare ca următoarea:
Fatal error: Call to undefined function generate_pagination() in ...\phpBB3\ext\ivanpetrepaul\adcode\controller\main.php on line 534
Problema se datorează faptului că paginația nu este returnată acum de către funcție, dar s-a pus însă automat în șablon. În același pas, numele funcției a fost actualizat cu prefixul-phpbb.

Codul vechi pentru paginație este similar cu:

Cod: Selectaţi tot

   $pagination = generate_pagination(append_sid("{$phpbb_root_path}app.$phpEx", 'controller=adcode/'), $total_paginated, $config['adcode_number'], $start);

   $this->template->assign_vars(array(
      'PAGINATION'      => $pagination,
      'PAGE_NUMBER'      => on_page($total_paginated, $config['adcode_number'], $start),
      'TOTAL_ADCODE'      => $this->user->lang('VIEW_TOPIC_POSTS', $total_paginated),
   ));
Noul cod ar trebui să arate în felul acesta:

Cod: Selectaţi tot

   $base_url = $this->helper->url('adcode');
   phpbb_generate_template_pagination($this->template, $base_url, 'pagination', '/page/%d', $total_paginated, $this->config['adcode_number'], $start);

   $this->template->assign_vars(array(
      'PAGE_NUMBER'      => phpbb_on_page($this->template, $this->user, $base_url, $total_paginated, $this->config['adcode_number'], $start),
      'TOTAL_ADCODE'      => $this->user->lang('VIEW_TOPIC_POSTS', $total_paginated),
   ));
----------------------------------------------------------------------------
Traducerea și adaptarea după [HowTo] Convert 3.0 MOD into 3.1 Extension.
Translation/Traducere: (C) 2013 Ivan Petre Paul
phpBB România will rise again. Soon.. Stay close! @phpbb.ro

Închis

Înapoi la “3.1.x Anunţuri şi prezentări de extensii”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 1 vizitator