Portage MOD Introduciator + tutoriel

Aide aux auteurs d'extensions pour phpBB

Modérateur : Équipe

Règles du forum
A lire impérativement : Règlement de phpBB-fr.com
Verrouillé
Feneck91
Maître-posteur
Maître-posteur
Messages : 447
Enregistré le : 31 déc. 2007 à 12:02
Localisation : Essonne (91)
Contact :

Portage MOD Introduciator + tutoriel

Message par Feneck91 »

Bonjour à tous et à toutes.

Je suis l'auteur du MOD Introduciator présent ici en version 1.0 et validée par l'équipe de phpBB-fr.
Il est aussi présent ici en version 1.1 validé par l'équipe de pbpBB anglaise (la version 1.0 a été refusée à cause de bug mineurs).
  1. Aller lire ce tutoriel et celui-ci (merci à Dakin Quelia).
    Ça donne déjà les grandes lignes.
Je donnerais ici truc et astuce trouvée pour démarrer le portage qui ne devrait pas être trop difficile.
Le but ? Aider les gens qui, comme moi cherchent à porter leur MOD.
La structure du MOD sera /feneck91/introduciator/... à copier dans le répertoire ext de phpBB.
  1. Première chose à faire : créer le fichier /feneck91/introduciator/composer.json :

    Code : Tout sélectionner

    {
    	"name": "feneck91/introduciator",
    	"type": "phpbb-extension",
    	"description": "Used to force users to create post to introduce himself into a specific forum before being allowed to post into other forums. An explanation page can be displayed to the user when trying to post a message in another forum to explain to him what he should do.",
    	"homepage": "http://feneck91.free.fr/forum/index.php",
    	"version": "2.1.0",
    	"time": "2015-03-12",
    	"keywords": ["phpbb", "extension", "feneck91", "introduciator"],
    	"license": "GPL-2.0",
    	"authors": [
    		{
    			"name": "Stéphane Château",
    			"email": "feneck91@free.fr",
    			"homepage": "http://feneck91.free.fr/forum",
    			"role": "Extension Developer"
    		}
    	],
    	"require": {
    		"php": ">=5.3.3",
    		"composer/installers": "~1.0"
    	},
    	"extra": {
    		"display-name": "Introduciator",
    		"soft-require": {
    			"phpbb/phpbb": ">=3.1.0,<3.2.*@dev"
    		},
    		"version-check": {
    			"host": "feneck91.free.fr",
    			"directory": "/feneck91",
    			"filename": "introduciator_versions.json"
    		}
    	}
    }
    Pour le moment, je fais comme pour les autres tutoriel.
    Les Premières questions qui se posent : Mon MOD est en français ET en anglais et en certainement arabe prochainement, or, on voit que la description du MOD n'est que dans une seule lanque. J'ai préféré l'anglais, langue internationale.
    Comment faire pour le mettre en plusieurs langue ?
    Comment fonctionne le version-check qui permet de savoir quelle est la dernière version du MOD ?
    Rien que ce fichier suffit à faire reconnaître le MOD. Copiez-le dans ext et allez dans l'onglet Personnalisation de phpBB, vous devriez le voir. Merci à Cabot pour son expertise : ne pas mettre de retour chariot dans le champ description et attention où vous placez les ',' il est sensible ce truc là !
  2. Ajouter au même endroit le fichier de licence puisque le MOD est en GPL-2.0 : ajout du fichier feneck91/introduciator/license.txt
  3. Le fichier ext.php à la racine n'est pas nécessaire, il est utile pour des cas très particulier : Extend base Class.
  4. L'étape suivante, étant donné que l'extension est maintenant reconnue, c'est d'ajouter les éléments nécessaires en base de données. Ceci est finalement assez ressemblant à ce qu'on faisait avant dans le fichier d'installation avec UMIL :
    1. Modification du schéma de la base si nécessaire.
    2. Ajout de nouvelle entrées dans la table config (configuration de l'extension)
    3. Ajout des modules
    4. Ajout des nouveaux droits
    Sauf qu'ici, il y a plusieurs fichiers différents par version. J'ai vu des choses différentes d'une extension à l'autre.
    Ces fichiers viennent dans le répertoire feneck91/introduciator/migrations, j'ai fais le choix de mettre un sous répertoire par version contenant les fichiers nécessaires :
    1. feneck91/introduciator/migrations/2_1_0/introduciator_schema.php
    2. feneck91/introduciator/migrations/2_1_0/introduciator_module.php
    Mais en fait non. Tout d'abord le répertoire 2_1_0/ n'est pas accepté, il faut mettre v2_1_0/ visiblement il n'aime pas les nombres.
    J'ai finalement choisi de tout mettre dans un fichier, un fichier par version : introduciator_migration_2_1_0.php

    Code : Tout sélectionner

    <?php
    
    /**
    *
    * @package phpBB Extension - Introduciator Extension
    * @author Feneck91 (Stéphane Château) feneck91@free.fr
    * @copyright (c) 2013 @copyright (c) 2014 Feneck91
    * @license http://opensource.org/licenses/gpl-license.php GNU Public License
    */
    
    namespace feneck91\introduciator\migrations;
    
    class introduciator_migration_2_1_0 extends \phpbb\db\migration\migration
    {
    	/**
    	 * Add the table schema to the database.
    	 *
    	 * Only add the introduciator group table is added
    	 *
    	 * @return array Array of table schema to create / update
    	 * @access public
    	 */
    	public function update_schema()
    	{
    		return array(
    			// Add Groups list table
    			'add_tables' => array(
    				$this->table_prefix . 'introduciator_groups' => array(
    					'COLUMNS' => array(
    						'fk_group'			=> array('UINT', NULL),
    					),
    				),
    			),
    		);
    	}
    	
    	/**
    	 * Drop the Introduciator groups table schema from the database.
    	 *
    	 * @return array Array of table schema to revert
    	 * @access public
    	 */
    	public function revert_schema()
    	{
    		return array(
    			// Remove table
    			'drop_tables' => array($this->table_prefix . 'introduciator_groups',
    			),
    		);
    	}
    
    	/**
    	 * Update data of the databse.
    	 *
    	 * @return Array of elements to update.
    	 * @access public
    	 */
    	public function update_data()
    	{
    		return array(
    			// Introduciator Settings
    			array('config.add', array('introduciator_explanation_message_title_uid',					'')),
    			array('config.add', array('introduciator_explanation_message_title_bitfield',				'')),
    			array('config.add', array('introduciator_explanation_message_title_bbcode_options',			'')),
    			array('config.add', array('introduciator_explanation_message_text_uid',						'')),
    			array('config.add', array('introduciator_explanation_message_text_bitfield',				'')),
    			array('config.add', array('introduciator_explanation_message_text_bbcode_options',			'')),
    			array('config.add', array('introduciator_explanation_message_rules_title_uid',				'')),
    			array('config.add', array('introduciator_explanation_message_rules_title_bitfield',			'')),
    			array('config.add', array('introduciator_explanation_message_rules_title_bbcode_options',	'')),
    			array('config.add', array('introduciator_explanation_message_rules_text_uid',				'')),
    			array('config.add', array('introduciator_explanation_message_rules_text_bitfield',			'')),
    			array('config.add', array('introduciator_explanation_message_rules_text_bbcode_options',	'')),
    			array('config.add', array('introduciator_posting_approval_level',							0)),
    			array('config.add', array('introduciator_allow', 											'0')),
    			array('config.add', array('introduciator_fk_forum_id', 										0)),
    			array('config.add', array('introduciator_is_check_delete_first_post', 						true)),
    			array('config.add', array('introduciator_is_explanation_enabled', 							false)),
    			array('config.add', array('introduciator_is_use_permissions', 								true)),
    			array('config.add', array('introduciator_is_include_groups', 								true)),
    			array('config.add', array('introduciator_ignored_users', 									'')),
    			array('config.add', array('introduciator_explanation_message_title', 						'%explanation_title%')),
    			array('config.add', array('introduciator_explanation_message_text', 						'%explanation_text%')),
    			array('config.add', array('introduciator_is_explanation_display_rules', 					true)),
    			array('config.add', array('introduciator_explanation_message_rules_title', 					'%rules_title%')),
    			array('config.add', array('introduciator_explanation_message_rules_text', 					'%rules_text%')),
    
    			// Misc Settings
    			array('config.add', array('introduciator_install_date', 									time())),
    			
    			// Permissions Add
    			array('permission.add', array('a_introduciator_manage',										true)),
    			array('permission.add', array('u_must_introduce', 											true)),
    
    			// Global Role permissions for user mask : Yes to All
    			array('permission.permission_set', array('ROLE_USER_STANDARD', 								'u_must_introduce')),
    			array('permission.permission_set', array('ROLE_USER_LIMITED', 								'u_must_introduce')),
    			array('permission.permission_set', array('ROLE_USER_NEW_MEMBER', 							'u_must_introduce')),
    		);
    	}
    }
    
    Pas besoin de mettre la fonction revert_data, c'est vraiment utilisé dans des cas spécifique. La suppression des données retire bien tous les rôles et les données.
  5. Un lien intéressant : Tutorial Migration
  6. Pour les modules, j'ajoute dans migration, les lignes :

    Code : Tout sélectionner

    			//===============================================================================
    			// Add the module in ACP under the .MOD tab
    
    			// Add a new category named ACP_INTRODUCIATOR_MOD to ACP_CAT_DOT_MODS (under tab .MOD in ACP)
    			array('module.add', array('acp', 'ACP_CAT_DOT_MODS', 'ACP_INTRODUCIATOR_MOD')),
    
    			array('module.add', array(
    					'acp',
    					'ACP_INTRODUCIATOR_MOD',
    					array(
    						'module_basename'	=> '\feneck91\introduciator\acp\introduciator_module', 
    						'modes'	  			=> array('settings'),
    					),
    				)),
    
    			//---------------------------------------------------------------------
    			// Creation of ACP sub caterories under Introduciator mod into .MOD tab
    
    			// Creation of ACP sub caterories under Introduciator mod into .MOD tab
    			//---------------------------------------------------------------------
    
    			// Add the module in ACP under the .MOD tab
    			//=============================================================================== */
    Puis dans acp :
    • acp/introduciator_info.php

      Code : Tout sélectionner

      <?php
      /**
       *
       * @package phpBB Extension - Introduciator Extension
       * @author Feneck91 (Stéphane Château) feneck91@free.fr
       * @copyright (c) 2013 @copyright (c) 2014 Feneck91
       * @license http://opensource.org/licenses/gpl-license.php GNU Public License
       */
      
      namespace feneck91\introduciator\acp;
      
      class introduciator_info
      {
          function module()
          {
               return array(
      			'filename'	=> '\feneck91\introduciator\acp\introduciator_module',
      			'title'		=> 'ACP_INTRODUCIATOR_MOD',
      			'version'	=> "2.1.0",
      			'modes'		=> array(
      				'settings'	=> array(
      					'title' => 'INTRODUCIATOR_GENERAL',
      					'auth' => 'ext_feneck91/introduciator && acl_a_board',
      					'cat' => array('ACP_INTRODUCIATOR_MOD'),
      				),
      			),
      		);
      	}
      }
    • acp/introduciator_module.php:

      Code : Tout sélectionner

      <?php
      /**
       *
       * @package phpBB Extension - Introduciator Extension
       * @author Feneck91 (Stéphane Château) feneck91@free.fr
       * @copyright (c) 2013 @copyright (c) 2014 Feneck91
       * @license http://opensource.org/licenses/gpl-license.php GNU Public License
       */
      
      namespace feneck91\introduciator\acp;
      
      /**
       * Module to manage ACP extension configuration.
       */
      class introduciator_module
      {
      	// URL of web site where download the latest version file info
      	var $url_version_check		= 'feneck91.free.fr';
      	// Folder in web site where download the latest version file info
      	var $folder_version_check	= '/phpbb';
      	// File name to download the latest version file info
      	var $file_version_check		= 'introduciator_version.txt';
      
      	// Action
      	var $u_action;
      
      	public function main($id, $mode)
      	{
      /*
      		global $template, $user, $phpEx, $config;
      
      		$user->add_lang('mods/info_acp_introduciator');
      		$this->tpl_name = 'acp_introduciator'; // Template file : adm/style/introduciator/acp_introduciator.htm
      		$this->page_title = $user->lang['ACP_INTRODUCIATOR_MOD']; // Page Title
      
      		// Add a secret token to the form
      		// This functions adds a secret token to any form, a token which should be checked after
      		// submission with the check_form_key function to ensure that the received data is the same as the submitted.
      		$form_key = 'acp_introduciator';
      		add_form_key($form_key);
      
      		$action	= request_var('action', '');
      
      		switch ($mode)
      		{
      			case 'general':
      				global $phpbb_admin_path;
      
      				$this->page_title = 'INTRODUCIATOR_GENERAL';
      				// Check if a new version of this MOD is available
      				$latest_version_info = $this->obtain_latest_version_info(request_var('introduciator_versioncheck_force', false));
      
      				if ($latest_version_info === false || !function_exists('phpbb_version_compare'))
      				{
      					$template->assign_var('S_INTRODUCIATOR_VERSIONCHECK_FAIL', true);
      				}
      				else
      				{
      					$latest_version_info = explode("\n", $latest_version_info);
      					$version_check = $this->get_update_information('url-', $latest_version_info);
      					$infos = $this->get_update_information('info-', $latest_version_info);
      
      					$template->assign_vars(array(
      						'S_INTRODUCIATOR_VERSION_UP_TO_DATE'	=> phpbb_version_compare(trim($latest_version_info[0]), $config['introduciator_mod_version'], '<='),
      						'S_INTRODUCIATOR_VERSIONCHECK_URL_FOUND'=> $version_check[1],
      						'U_INTRODUCIATOR_VERSIONCHECK'			=> $version_check[0],
      						'L_INTRODUCIATOR_UPDATE_VERSION'		=> trim($latest_version_info[0]),
      						'L_INTRODUCIATOR_UPDATE_FILENAME'		=> trim(sizeof($latest_version_info) < 3 ? '' : $latest_version_info[2]),
      						'U_INTRODUCIATOR_UPDATE_URL'			=> trim(sizeof($latest_version_info) < 4 ? '' : $latest_version_info[3]),
      						'L_INTRODUCIATOR_UPDATE_INFORMATION'	=> $infos[0],
      					));
      				}
      
      				$template->assign_vars(array(
      					// Display general page content into ACP .MOD tab
      					'S_INTRODUCIATOR_GENERAL_PAGES'			=> true,
      
      					// Current version of this MOD
      					'INTRODUCIATOR_VERSION'					=> $config['introduciator_mod_version'],
      					// Install date of this MOD
      					'INTRODUCIATOR_INSTALL_DATE'			=> $user->format_date($config['introduciator_install_date']),
      
      					// Check force URL
      					// i is the ID of this MOD (introduciator) / mode is the sub item
      					'U_INTRODUCIATOR_VERSIONCHECK_FORCE'	=> append_sid("{$phpbb_admin_path}index.$phpEx", 'i=introduciator&mode=' . $mode . '&introduciator_versioncheck_force=1'),
      					'U_ACTION'								=> $this->u_action,
      				));
      			break;
      
      			case 'configuration':
      				global $db, $phpbb_root_path; // Database, Root path
      				$this->page_title = 'INTRODUCIATOR_CONFIGURATION';
      
      				// Display configuration page content into ACP .MOD tab
      				$template->assign_var('S_CONFIGURATION_PAGES', true);
      
      				// If no action, display configuration
      				if (empty($action))
      				{	// no action or update current
      					$dp_data = array();
      	
      					$params = introduciator_getparams(true);
      					$template->assign_vars(array(
      						'INTRODUCIATOR_MOD_ACTIVATED'											=> $params['introduciator_allow'],
      						'INTRODUCIATOR_CHECK_DELETE_FIRST_POST_ACTIVATED'						=> $params['is_check_delete_first_post'],
      						'INTRODUCIATOR_POSTING_APPROVAL_LEVEL_NO_APPROVAL_ENABLED'				=> $params['posting_approval_level'] == INTRODUCIATOR_POSTING_APPROVAL_LEVEL_NO_APPROVAL,
      						'INTRODUCIATOR_POSTING_APPROVAL_LEVEL_APPROVAL_ENABLED'					=> $params['posting_approval_level'] == INTRODUCIATOR_POSTING_APPROVAL_LEVEL_APPROVAL,
      						'INTRODUCIATOR_POSTING_APPROVAL_LEVEL_NO_APPROVAL_WITH_EDIT_ENABLED'	=> $params['posting_approval_level'] == INTRODUCIATOR_POSTING_APPROVAL_LEVEL_APPROVAL_WITH_EDIT,
      						'INTRODUCIATOR_DISPLAY_EXPLANATION_ENABLED'								=> $params['is_explanation_enabled'],
      						'INTRODUCIATOR_USE_PERMISSIONS'											=> $params['is_use_permissions'],
      						'INTRODUCIATOR_INCLUDE_GROUPS_SELECTED'									=> $params['is_include_groups'],
      						'INTRODUCIATOR_ITEM_IGNORED_USERS'										=> $params['ignored_users'],
      						'INTRODUCIATOR_EXPLANATION_MESSAGE_TITLE'								=> $params['explanation_message_title'],
      						'INTRODUCIATOR_EXPLANATION_MESSAGE_TEXT'								=> $params['explanation_message_text'],
      						'INTRODUCIATOR_EXPLANATION_IS_DISPLAY_RULES_ENABLED'					=> $params['is_explanation_display_rules'],
      						'INTRODUCIATOR_EXPLANATION_MESSAGE_RULES_TITLE'							=> $params['explanation_message_rules_title'],
      						'INTRODUCIATOR_EXPLANATION_MESSAGE_RULES_TEXT'							=> $params['explanation_message_rules_text'],
      						'U_ACTION'																=> $this->u_action,
      					));
      
      					// Add all forums
      					$this->add_all_forums($params['fk_forum_id'], 0, 0);
      
      					// Add all groups
      					$this->add_all_groups();
      
      					$s_hidden_fields = build_hidden_fields(array(
      							'action'				=> 'update',					// Action
      						));
      
      					$template->assign_var('S_HIDDEN_FIELDS', $s_hidden_fields);
      				}
      				else
      				{	// Action !
      					switch ($action)
      					{
      						case 'update' :
      							// User has request an update : write it into database
      							// Update Database
      							$is_enabled								= request_var('mod_activated', false);
      							$is_check_delete_first_post_activated	= request_var('check_delete_first_post_activated', false);
      							$fk_forum_id							= request_var('forum_choice', 0);
      							$posting_approval_level					= request_var('posting_approval_level', INTRODUCIATOR_POSTING_APPROVAL_LEVEL_NO_APPROVAL);
      							$is_explanation_enabled					= request_var('display_explanation', false);
      							$is_use_permissions						= request_var('is_use_permissions', true);
      							$is_include_groups						= request_var('include_groups', true);
      							$groups									= request_var('groups_choices', array('' => 0)); // Array of IDs of selected groups
      							$ignored_users							= substr(utf8_normalize_nfc(request_var('ignored_users', '')), 0, 255);
      							$explanation_message_title				= utf8_normalize_nfc(request_var('explanation_message_title', '', true));
      							$explanation_message_text				= utf8_normalize_nfc(request_var('explanation_message_text', '', true));
      							$explanation_display_rules_enabled		= request_var('explanation_display_rules_enabled', false);
      							$explanation_message_rules_title		= utf8_normalize_nfc(request_var('explanation_message_rules_title', '', true));
      							$explanation_message_rules_text			= utf8_normalize_nfc(request_var('explanation_message_rules_text', '', true));
      
      							if ($is_enabled && $fk_forum_id === 0)
      							{
      								trigger_error($user->lang['INTRODUCIATOR_ERROR_MUST_SELECT_FORUM'] . adm_back_link($this->u_action), E_USER_WARNING);
      							}
      
      							// Verify message rules texts and convert with BBCode
      							$explanation_message_rules_text_new_uid = $explanation_message_rules_text_new_bitfield = $explanation_message_rules_text_bbcode_options = '';
      
      							// Replace all url by real fake urls
      							replace_all_by(
      								array(
      									&$explanation_message_title,
      									&$explanation_message_text,
      									&$explanation_message_rules_title,
      									&$explanation_message_rules_text,
      								),
      								array(
      									'%forum_url%'	=> 'http://aghxkfps.com', // Make link work if placed into [url]
      									'%forum_post%'	=> 'http://dqsdfzef.com', // Make link work if placed into [url]
      								)
      							);
      
      							$explanation_message_array = array(
      								'introduciator_explanation_message_title'			=> $explanation_message_title,
      								'introduciator_explanation_message_text'			=> $explanation_message_text,
      								'introduciator_explanation_message_rules_title'		=> $explanation_message_rules_title,
      								'introduciator_explanation_message_rules_text'		=> $explanation_message_rules_text,
      							);
      
      							// Verify all user inputs
      							$explanation_message_array_result = array();
      							foreach ($explanation_message_array as $key => $value)
      							{
      								$new_uid = $bitfield = $bbcode_options = '';
      								$texts_errors = generate_text_for_storage($value, $new_uid, $bitfield, $bbcode_options, true, true, true);
      								if (sizeof($texts_errors))
      								{	// Errors occured, show them to the user (split br else MPV found an error because /> is not written
      									trigger_error(implode('<b' . 'r>', $errors) . adm_back_link($this->u_action), E_USER_WARNING);
      								}
      								// Merge results into array
      								$explanation_message_array_result = array_merge($explanation_message_array_result, array(
      									$key						=> $value,
      									$key . '_uid'				=> $new_uid,
      									$key . '_bitfield'			=> $bitfield,
      									$key . '_bbcode_options'	=> $bbcode_options,
      								));
      								
      								if (strlen($value) > 255)
      								{	// Errors occured, show them to the user.
      									trigger_error($user->lang['INTRODUCIATOR_ERROR_TOO_LONG_TEXT'] . adm_back_link($this->u_action), E_USER_WARNING);
      								}
      							}
      
      							if ($posting_approval_level != INTRODUCIATOR_POSTING_APPROVAL_LEVEL_NO_APPROVAL && $posting_approval_level != INTRODUCIATOR_POSTING_APPROVAL_LEVEL_APPROVAL && $posting_approval_level != INTRODUCIATOR_POSTING_APPROVAL_LEVEL_APPROVAL_WITH_EDIT)
      							{	// Verify the level approval values => No correct value ? Set to INTRODUCIATOR_POSTING_APPROVAL_LEVEL_NO_APPROVAL
      								$posting_approval_level = INTRODUCIATOR_POSTING_APPROVAL_LEVEL_NO_APPROVAL;
      							}
      									
      							set_config('introduciator_allow', $is_enabled ? '1' : '0'); // Set the activation MOD config
      							set_config('introduciator_is_check_delete_first_post', $is_check_delete_first_post_activated ? '1' : '0');
      							set_config('introduciator_fk_forum_id', $fk_forum_id);
      							set_config('introduciator_posting_approval_level', $posting_approval_level);
      							set_config('introduciator_is_explanation_enabled', $is_explanation_enabled ? '1' : '0');
      							set_config('introduciator_is_use_permissions', $is_use_permissions ? '1' : '0');
      							set_config('introduciator_is_include_groups', $is_include_groups ? '1' : '0');
      							set_config('introduciator_ignored_users', $ignored_users);
      							set_config('introduciator_is_explanation_display_rules', $explanation_display_rules_enabled ? '1' : '0');
      
      							// Set results into config
      							foreach ($explanation_message_array_result as $key => $value)
      							{
      								set_config($key, $value);
      							}
      
      							// Update INTRODUCIATOR_GROUPS_TABLE
      							// 1> Remove all entries
      							$sql = 'DELETE FROM ' . INTRODUCIATOR_GROUPS_TABLE;
      							$db->sql_query($sql);
      
      							// 2> Add all entries
      							$values = array();
      							foreach ($groups as &$group)
      							{	// Create elements to add by row
      								$values[] = array('fk_group' => (int) $group);
      							}
      							// Create and execute SQL request
      							$db->sql_multi_insert(INTRODUCIATOR_GROUPS_TABLE, $values);
      
      							add_log('admin', 'LOG_INTRODUCIATOR_UPDATED' , 'INTRODUCIATOR_CONFIGURATION');
      							trigger_error($user->lang['INTRODUCIATOR_CP_UPDATED'] . adm_back_link($this->u_action));
      							break;
      
      						default:
      							trigger_error($user->lang['NO_MODE'] . adm_back_link($this->u_action));
      							break;
      				} // End of switch Action
      			}
      		}
      */
      	}
      
      	function add_all_forums($fk_selected_forum_id, $id_parent, $level)
      	{
      		global $db, $template, $user;
      
      		if ($id_parent === 0)
      		{	// Add deactivation item
      			$template->assign_block_vars('forums', array(
      				'FORUM_NAME'	=> $user->lang['INTRODUCIATOR_NO_FORUM_CHOICE'],
      				'FORUM_ID'		=> (int) 0,
      				'SELECTED'		=> ($fk_selected_forum_id === 0),
      				'CAN_SELECT'	=> true,
      				'TOOLTIP'		=> $user->lang['INTRODUCIATOR_NO_FORUM_CHOICE_TOOLTIP'],
      			));
      		}
      
      		// Add all forums
      		$sql = 'SELECT forum_name, forum_id, forum_desc, forum_type
      				FROM ' . FORUMS_TABLE . '
      				WHERE parent_id = ' . (int) $id_parent;
      
      		$result = $db->sql_query($sql);
      		while ($row = $db->sql_fetchrow($result))
      		{
      			$template->assign_block_vars('forums', array(
      				'FORUM_NAME'	=> str_repeat("&nbsp;", 4 * $level) . $row['forum_name'],
      				'FORUM_ID'		=> (int) $row['forum_id'],
      				'SELECTED'		=> ($fk_selected_forum_id == $row['forum_id']),
      				'CAN_SELECT'	=> ((int) $row['forum_type']) == FORUM_POST,
      				'TOOLTIP'		=> $row['forum_desc'],
      			));
      			$this->add_all_forums($fk_selected_forum_id, $row['forum_id'], $level + 1);
      		}
      		$db->sql_freeresult($result);
      	}
      
      	/**
      	 * Find all groups to propose it to the user.
      	 *
      	 * Add all elements into the template.
      	 */
      	function add_all_groups()
      	{
      		global $db, $template;
      
      		$sql = 'SELECT group_id, group_desc
      			FROM ' . GROUPS_TABLE;
      
      		$result = $db->sql_query($sql);
      		while ($row = $db->sql_fetchrow($result))
      		{
      			$template->assign_block_vars('group', array(
      				'NAME'		=> get_group_name($row['group_id']),
      				'ID'		=> (int) $row['group_id'],
      				'SELECTED'	=> is_group_selected($row['group_id']),
      				'TOOLTIP'	=> $row['group_desc'],
      			));
      		}
      		$db->sql_freeresult($result);
      	}
      
      	/**
      	 * Obtains the latest version information.
      	 *
      	 * @param bool $force_update Ignores cached data. Defaults to false.
      	 * @param int $ttl Cache version information for $ttl seconds. Defaults to 86400 (24 hours).
      	 *
      	 * @return string | false Version info on success, false on failure.
      	 */
      	function obtain_latest_version_info($force_update = false, $ttl = 86400)
      	{
      		global $cache;
      
      		$info = $cache->get('introduciator_version_check');
      
      		if ($info === false || $force_update)
      		{
      			$errstr = '';
      			$errno = 0;
      
      			$info = get_remote_file($this->url_version_check, $this->folder_version_check, $this->file_version_check, $errstr, $errno);
      
      			if ($info === false)
      			{
      				$cache->destroy('introduciator_version_check');
      				return false;
      			}
      
      			$cache->put('introduciator_version_check', $info, $ttl);
      		}
      
      		return $info;
      	}
      
      	/**
      	 * Get the update information string from text loaded from update web site.
      	 *
      	 * The language is written at the beginning of each lines, like [en] ou [fr].
      	 *
      	 * @param string $tag the tag to found. Searching [$tag{language name}] at the beginning of the line.
      	 * @param array $latest_version_info Array of string, the informations begins at line 2.
      	 * @return An array with:
      	 *   [0] The string into the correct language. English if the current language is not found. Error message if default language was not found
      	 *   [1] Indicate if the string (default or not) was found or not (true / false).
      	 */
      	function get_update_information($tag, $latest_version_info)
      	{
      		global $tag_and_lang, $tag_and_lang_en, $user, $tag_len;
      
      		$information = $user->lang['INTRODUCIATOR_NO_UPDATE_INFO_FOUND'];
      		$found = false;
      
      		$tag_and_lang = '[' . $tag . $user->lang['USER_LANG'] . ']';
      		$tag_and_lang_en =  '[' . $tag . 'en]';
      		$tag_len = strlen($tag_and_lang_en);
      
      		for ($index = 4;$index < sizeof($latest_version_info);++$index)
      		{
      			if (strlen($latest_version_info[$index]) > $tag_len)
      			{
      				$line_lang = substr($latest_version_info[$index], 0, $tag_len);
      				if ($line_lang === $tag_and_lang)
      				{
      					$information = substr($latest_version_info[$index], $tag_len, strlen($latest_version_info[$index]) - $tag_len);
      					$found = true;
      					break; // Found, quit the for
      				}
      				else if ($line_lang === $tag_and_lang_en)
      				{	// English by default if found
      					$information = substr($latest_version_info[$index], $tag_len, strlen($latest_version_info[$index]) - $tag_len);
      					$found = true;
      				}
      			}
      		}
      
      		return array(
      			str_replace('\\n', '<br/>', $information),
      			$found,
      		);
      	}
      }
      ?>
J'avais une erreur
Something went wrong during the request and an exception was thrown. The changes made before the error occurred were reversed to the best of our abilities, but you should check the board for errors.
MIGRATION_INVALID_DATA_UNKNOWN_TYPE
C'est résolu, c'est du à module_add au lieu de module.add, copié collé : différence entre UMIL et les extensions !
Pour le moment, ça crée le module mais le code de la page est en erreur, ça progresse !
Modifié en dernier par Feneck91 le 05 janv. 2016 à 15:31, modifié 12 fois.
Avatar du membre
galixte
Floodeur universel
Floodeur universel
Messages : 10595
Enregistré le : 08 mars 2004 à 01:40
Localisation : Sud de la France.
Contact :

Re: Portage MOD Introduciator

Message par galixte »

Salut,

une bonne idée ton MOD, encore mieux si tu le transformes en extension comme cela je l'utiliserai :)

Je ne pense pas qu'il te soit demandé d'attendre la validation de ta version pour phpBB 3.0.x avant de soumettre une version pour la branche 3.1.x.

Pour la conversion en extension, la version pourrait démarrer en 2.0.0 sans problème je l'ai vu à plusieurs reprise. Mais j'ai vu aussi des MODs en version 2.0.2 passer en extension en version 2.1.0.

Voilà bon travail à toi !
Communau EzCom
📖
« Traductions d’extensions & styles pour phpBB 3.2.x & 3.3.x ».
📋 Listes de toutes les extensions recensées pour phpBB 3.1.x & 3.2.x.
📋 Listes de tous les styles recensés pour phpBB 3.1.x & 3.2.x.

Image Tu as un forum et tu veux aussi un site web ? Regarde par ici.
Skouat
Resp. Traducteurs
Resp. Traducteurs
Messages : 15959
Enregistré le : 02 avr. 2008 à 20:47
Contact :

Re: Portage MOD Introduciator

Message par Skouat »

Salut,
Feneck91 a écrit :D'ailleurs.... quand un MOD est en cours de validation pour phpBB 3.0.x, on ne peut pas en même temps faire une demande de validation du même MOD en version 3.1.x ?
Je ne sais pas si tu y a prêté attention, mais les MOD et les extensions ne sont pas dans la même catégorie :wink:
Donc tu peux soumettre un MOD et une extension.
Feneck91 a écrit :Quid du n° de version du MOD ? Je suis en 1.1.0 pour pbpBB 3.0.13-pl1 => Quelle devrait être la version pour phpBB 3.1.x ?
Tu peux recommencer à 1.0.0 si tu veux.
Là c'est toi qui décide.
Bon après si ton extension et ton MOD on le même non, il est vrai qu'il est préférable de distinguer les numéros de version histoire de ne pas perdre les utilisateurs.

A+
Feneck91
Maître-posteur
Maître-posteur
Messages : 447
Enregistré le : 31 déc. 2007 à 12:02
Localisation : Essonne (91)
Contact :

Re: Portage MOD Introduciator

Message par Feneck91 »

Je pense que le MOD version phpBB 3.0.x va être en 1.x alors que la portage en phpBB 3.1.x sera en 2.x en gardant si possible les mêmes sous-versions.
Actuellement la version du MOD est en 1.1.0 => Le MOD porté en extension sera en 2.1.0.

Je ne pense pas que ça sera long, mais là il va falloir comprendre comment ça marche tout ce toutim... Et j'ai pas trouvé de MOD en 3.1.x téléchageable. Je vais aller jeter un coup d’œil sur phpBB anglais...

Si vous avez des infos....

Edit : Merci Skouat pour tes infos. Eh... non j'ai pas vu que c'était à des endroits différents, j'en suis pas encore à le faire valider.... vu comment cela a été dur la version 1.0 de la faire valider ! C'est qu'ils sont tatillons sur phpBB, le prix de la qualité certainement... :wink:

Déjà j'ai branché les versions au niveau de mon SVN...
FoFa
Resp. des supporters
Resp. des supporters
Messages : 10515
Enregistré le : 15 nov. 2008 à 18:04
Localisation : Auxonne
Contact :

Re: Portage MOD Introduciator

Message par FoFa »

Et j'ai pas trouvé de MOD en 3.1.x téléchageable.
Et tu n'en trouveras pas. Car sur 3.1.x ce sont des extensions :mrgreen:
De retour parmi vous :wink:
Feneck91
Maître-posteur
Maître-posteur
Messages : 447
Enregistré le : 31 déc. 2007 à 12:02
Localisation : Essonne (91)
Contact :

Re: Portage MOD Introduciator

Message par Feneck91 »

Oui, merci... j'ai vu après ce post. J'en ai téléchargé deux sur phpBB... Le tout c'est de commencer à comprendre, le portage ne devrait pas être compliqué...
Avatar du membre
galixte
Floodeur universel
Floodeur universel
Messages : 10595
Enregistré le : 08 mars 2004 à 01:40
Localisation : Sud de la France.
Contact :

Re: Portage MOD Introduciator

Message par galixte »

Un membre du forum est d'ailleurs en train de réaliser de la documentation sur comment créer son extension : Dakin Quelia :mrgreen:
Communau EzCom
📖
« Traductions d’extensions & styles pour phpBB 3.2.x & 3.3.x ».
📋 Listes de toutes les extensions recensées pour phpBB 3.1.x & 3.2.x.
📋 Listes de tous les styles recensés pour phpBB 3.1.x & 3.2.x.

Image Tu as un forum et tu veux aussi un site web ? Regarde par ici.
Feneck91
Maître-posteur
Maître-posteur
Messages : 447
Enregistré le : 31 déc. 2007 à 12:02
Localisation : Essonne (91)
Contact :

Re: Portage MOD Introduciator

Message par Feneck91 »

Bon, j'ai démarré... Mais déjà, je met dans le répertoire ext un mod (genre googleanalytics) et bien rien.
Je ne vois même pas comment l'installer !
C'est pas gagné !

EDIT : Bon, je n'avais pas mis dans le répertoire ext/phpBB
Modifié en dernier par Feneck91 le 22 mars 2015 à 18:11, modifié 1 fois.
FoFa
Resp. des supporters
Resp. des supporters
Messages : 10515
Enregistré le : 15 nov. 2008 à 18:04
Localisation : Auxonne
Contact :

Re: Portage MOD Introduciator

Message par FoFa »

Hello,

Quel est le chemin vers le fichier composer.json de l'extension GoogleAnalytics ?
De retour parmi vous :wink:
Feneck91
Maître-posteur
Maître-posteur
Messages : 447
Enregistré le : 31 déc. 2007 à 12:02
Localisation : Essonne (91)
Contact :

Re: Portage MOD Introduciator

Message par Feneck91 »

Bon, je n'avais pas mis dans le répertoire ext/phpBB
Je croyais qu'il fallait le mettre à la racine. Bizarre d'être obligé de créer un répertoire phpbb
Dakin Quelia
Floodeur universel
Floodeur universel
Messages : 21030
Enregistré le : 31 oct. 2006 à 18:33
Localisation : Belgique
Contact :

Re: Portage MOD Introduciator

Message par Dakin Quelia »

Attention que la structure d'une Extension est la suivante: ext/Feneck91/nom_extension.

Tu ne peux pas utiliser "phpBB"... enfin surtout si tu comptes le faire valider par phpbb.com. :)
Aucun support par mail, MP ou msn.
Mes MODs: ici | Mon Github | Mon blogue: Mon blogue | DeviantArt: cliquez ici
FoFa
Resp. des supporters
Resp. des supporters
Messages : 10515
Enregistré le : 15 nov. 2008 à 18:04
Localisation : Auxonne
Contact :

Re: Portage MOD Introduciator

Message par FoFa »

@Dakin Quelia: il parle de l'extension GoogleAnalytics qui, développé par phpBB, doit donc se trouver dans ext/phpbb/*

@Feneck91: si tu as un doute quant à l'endroit où déposer une extension, ouvres composer.json et trouves ceci: "name": "XXX/YYY",

Où XXX est le nom de l'auteur et YYY le nom de l'extension.
De retour parmi vous :wink:
Dakin Quelia
Floodeur universel
Floodeur universel
Messages : 21030
Enregistré le : 31 oct. 2006 à 18:33
Localisation : Belgique
Contact :

Re: Portage MOD Introduciator

Message par Dakin Quelia »

Il donnait un exemple. Puis ici on parle du portage de son MOD. ;)
Aucun support par mail, MP ou msn.
Mes MODs: ici | Mon Github | Mon blogue: Mon blogue | DeviantArt: cliquez ici
Skouat
Resp. Traducteurs
Resp. Traducteurs
Messages : 15959
Enregistré le : 02 avr. 2008 à 20:47
Contact :

Re: Portage MOD Introduciator

Message par Skouat »

Salut,
Feneck91 a écrit :Bizarre d'être obligé de créer un répertoire phpbb
C'est tout simplement parce que l'auteur de l'extension est "phpBB". Ca aurait été un autre auteur, le répertoire aurait porté le nom de cet autre auteur.
Feneck91
Maître-posteur
Maître-posteur
Messages : 447
Enregistré le : 31 déc. 2007 à 12:02
Localisation : Essonne (91)
Contact :

Re: Portage MOD Introduciator

Message par Feneck91 »

Ceci explique celà. J'ai commencé à remplir tous ces fameux fichiers. Et en effet, j'ai créé dans ext/feneck91/introduciator.
Je pense d'ailleurs que les majuscules sont déconseillées ?
Verrouillé

Retourner vers « Aide au développement »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités