[3.0.x] Ajouter et vérifier les permissions

Rédigé le: 05 Mar 2009 à 08:17
TRADUCTION de l'article de phpbbmodders : Permissions
Un article qui explique comment ajouter et vérifier des permissions.
Soumis par harmlessgoat22 le 19 avril 2008 à 14h39

Permissions
Les permissions vous permettent de contrôler totalement qui peut faire quoi sur votre forum. Il est facile d'ajouter de nouvelles permissions de forum, d'utilisateur, de modérateur ou d'administrateur.

Ajouter des permissions
Phpbb3 permet très facilement d'ajouter de nouvelles permissions. Comme vous pouvez le voir ci-dessous, quelques lignes de code suffisent à ajouter des permissions. Il suffit d'inclure "includes/acp/auth.php", puis d'initialiser la classe, et enfin d'appeler la méthode "acl_add_option ()". Dans cet appel, vous déclarez un tableau, vous disposez de deux clefs (si vous n'avez besoin que d'une, n'en utilisez qu'une) : "global" est pour, vous l'aurez deviné, des permissions globales, qui seront utilisées dans tous les forums. "local" est pour des permissions limitées à un forum donné. Ainsi, dans le cas de permissions avec la clef "global", vous pouvez ajouter des permissions de type administrateur (ACP), de type utilisateur (UCP), de type modérateur (MCP) ; dans le cas de permissions avec la clef "local", vous pouvez décider si un utilisateur effectuer telle action dans tel forum, ou si un modérateur peut faire des actions de modération dans un tel forum.

Code: Tout sélectionner
// Setup $auth_admin class so we can add permission options
include($phpbb_root_path . 'includes/acp/auth.' . $phpEx);
$auth_admin = new auth_admin();

// Add permissions
$auth_admin->acl_add_option(array(
    'global'   => array('u_permission1', 'm_permission2', 'a_permission3'),
    'local'     => array('f_permission1', 'm_permission2'),
)); 


Comme vous l'avez certainement deviné, vous commencez avec une permission par "u_" pour une permission utilisateur dans tout le forum, par "f_" pour des permissions pour les utilisateur du forum, par "m_" pour des permissions de modérateur, et par "a_" pour celles d'administrateur.

Cependant, vous devez faire une chose, c'est ajouter un fichier de langue pour votre permission. Ce fichier doit être placé dans "language/{LANG_NAME}/mods/", et son nom doit suivre le format suivant : "permissions_*. php". Par exemple : "language/en/mods/permissions_arcade.php", si vous avez un MOD "arcade". Voici un exemple de ce qui pourrait être trouvé dans le fichier "language/en/acp/permissions_phpbb.php" :

Code: Tout sélectionner
/**
*   MODDERS PLEASE NOTE
*
*   You are able to put your permission sets into a separate file too by
*   prefixing the new file with permissions_ and putting it into the acp
*   language folder.
*
*   An example of how the file could look like:
*
*   <code>
*
*   if (empty($lang) || !is_array($lang))
*   {
*      $lang = array();
*   }
*
*   // Adding new category
*   $lang['permission_cat']['bugs'] = 'Bugs';
*
*   // Adding new permission set
*   $lang['permission_type']['bug_'] = 'Bug Permissions';
*
*   // Adding the permissions
*   $lang = array_merge($lang, array(
*      'acl_bug_view'      => array('lang' => 'Can view bug reports', 'cat' => 'bugs'),
*      'acl_bug_post'      => array('lang' => 'Can post bugs', 'cat' => 'post'), // Using a phpBB category here
*   ));
*
*   </code>
*/ 


Voici un exemple de fichier langue des permissions.
Attention : il ne crée absolument pas un nouveau type de permission

Code: Tout sélectionner
<?php
/**
* permissions_pastebin [English]
*
* @package language
* @version $Id$
* @copyright (c) 2008 yourname
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*/

/**
* DO NOT CHANGE
*/
if (!defined('IN_PHPBB'))
{
   exit;
}

if (empty($lang) || !is_array($lang))
{
   $lang = array();
}

// Adding new category
$lang['permission_cat']['pastebin']   = 'Pastebin';

// Adding the permissions
$lang = array_merge($lang, array(
   // User perms
   'acl_u_pastebin_view'      => array('lang' => 'Can view snippets', 'cat' => 'pastebin'),
   'acl_u_pastebin_post'      => array('lang' => 'Can post snippets', 'cat' => 'pastebin'),
   'acl_u_pastebin_post_novc'   => array('lang' => 'Can post snippets without visual confirmation', 'cat' => 'pastebin'),
   
   
// Moderator perms
   'acl_m_pastebin_edit'      => array('lang' => 'Can edit snippets', 'cat' => 'pastebin'),
   'acl_m_pastebin_delete'      => array('lang' => 'Can delete snippets', 'cat' => 'pastebin'),
));

?>


La catégorie "permissions" correspond à l'onglet qui est affiché dans l'écran de gestion des permissions.

Vérifier des permissions
Vérifier des permissions est une chose vraiment très facile. Pour le code source fourni ci-dessous, assurez-vous que, si le code est dans une fonction ou une classe, "$auth" a été déclaré "global".

acl_get()
Code: Tout sélectionner
if ($auth->acl_get('m_cool_permission') 
|| $auth->acl_get('f_another_cool_permission', 2))
{
// code to do if they do have the permissions
}
else
{
//code to do when they don't have the permissions


Dans l'exemple ci-dessus, vous pouvez dire que la permission "m_cool_permission" est globale, car aucun id de forum est précisé. Alors que l'autre permission, "f_another_cool_permission", étant suivie d'une virgule puis d'un id de forum, elle est locale au forum dont l'id est passé en paramètre.

acl_gets()
Une autre fonction très facile, travaille un peu différentes.

Code: Tout sélectionner
if ($auth->acl_gets('m_cool_permission', 'u_another_cool_permission') || $auth->acl_gets('f_another_cool_permission', 
'f_another_crazy_permission', 
'f_a_name_for_a_permission_that_is_probably_getting_really_old_now', $forum_id


Comme vous pouvez le voir, "acl_gets()" contrôle plusieurs permissions à la fois, ce qui s'avère utile si vous avez besoin de vérifier une palanquée de permissions. Il n'existe aucune limite au nombre de permissions que vous pouvez vérifier. Toutefois, si vous contrôlez des permissions locales, il suffit de terminer la série par un ", $id", où "$id" est l'id du forum dans lequel les permissions sont à vérifier.
Noter cependant que "acl_gets()" renvoie la valeur "vrai" seulement si toutes les permissions énumérées le sont. Donc, si vous avez besoin qu'une seule de ces permissions soit vraie, utilisez des "acl_get()" combinés par des "ou" ("||") dans la déclaration de test d'un "if".

acl_getf()
La méthode "acl_getf ()" fournit la liste des forums pour lesquels l'utilisateur à la permission citée.

Code: Tout sélectionner
$auth->acl_getf('f_read'); 


Le code ci-dessus doit fournir tous les forums dans lesquels l'utilisateur à la permission "read", donc qu'il peut lire... simple, non ? Vous pouvez également ajouter un second paramètre "option". Par défaut, "acl_getf ()" retournera quelque chose comme ça ...

Code: Tout sélectionner
array(
    forum_id => array('option' => 1),
    forum_id => array('option2' => 0),


Si vous mettez "vrai" dans la deuxième option, il ne retournera que les éléments pour lesquels la valeur est "vrai", ce qui ressemblera à ceci ...

Code: Tout sélectionner
array(
    forum_id => array('option' => 1),


acl_getf_global ()
Cette méthode vérifie si un utilisateur dispose d'une permission soit dans au moins l'un des forums, soit de manière globale. Par exemple, si vous vérifiez la permission "f_read" et qu'un utilisateur ne peut pas lire tous les forums, alors la valeur retournée sera "faux", mais si il a la permission de lire ne serait-ce qu'un seul forum, alors la valeur retournée sera "vrai".

Code: Tout sélectionner
$auth->acl_getf_global($permission); 


Conclusion
J'espère que vous avez beaucoup appris à la lecture de cet article (comme je l'ai fait moi-même en l'écrivant). Si une chose n'est pas claire, n'hésitez pas à poster dans les forums de phpBBmodders.net, et vous obtiendrez rapidement une réponse soit par moi, soit par un autre utilisateur. Si quelque chose vous semble pas très claire, n'hésitez pas à m'envoyer un message privé, et j'essayerai de faire une mise à jour dans l'article au plus tôt.
Merci.