J3.x

Difference between revisions of "Developing an MVC Component/Adding ACL/fr"

From Joomla! Documentation

< J3.x:Developing an MVC Component
(Created page with "=== Description des actions dont vous souhaitez contrôler l'accès ===")
(Updating to match new version of source page)
 
(106 intermediate revisions by 3 users not shown)
Line 1: Line 1:
 
<noinclude><languages /></noinclude>
 
<noinclude><languages /></noinclude>
{{review}}
 
 
{{:J3.1:Developing an MVC Component/fr}}
 
{{:J3.1:Developing an MVC Component/fr}}
 
==Introduction==
 
==Introduction==
Line 8: Line 7:
 
Grâce au contrôle d'accès de Joomla, nous pouvons définir les groupes d'utilisateurs qui sont autorisés ou non à faire des actions dans votre composant. Dans cet exemple, nous utilisons les actions qui sont définies nativement. Pour le composant dans son ensemble : core.admin (accès à la configuration) et core.manage (accès au backend). Et à différents niveaux d'actions tels que créer, supprimer et modifier. Outre ces actions natives, vous pouvez définir vos propres actions, mais cela n'est souvent pas nécessaire et ne figure donc pas dans cet exemple. L'accès Voir/Lire n'est pas géré via ces actions mais par les niveaux d'accès des vues. Consultez la documentation générale sur les ACL de Joomla pour cela.  
 
Grâce au contrôle d'accès de Joomla, nous pouvons définir les groupes d'utilisateurs qui sont autorisés ou non à faire des actions dans votre composant. Dans cet exemple, nous utilisons les actions qui sont définies nativement. Pour le composant dans son ensemble : core.admin (accès à la configuration) et core.manage (accès au backend). Et à différents niveaux d'actions tels que créer, supprimer et modifier. Outre ces actions natives, vous pouvez définir vos propres actions, mais cela n'est souvent pas nécessaire et ne figure donc pas dans cet exemple. L'accès Voir/Lire n'est pas géré via ces actions mais par les niveaux d'accès des vues. Consultez la documentation générale sur les ACL de Joomla pour cela.  
  
La liste actuelle est stockée dans la table  #__assets : quels sont groupes d'utilisateurs autorisés ou non à faire quels types d'actions sur quelles ressources (assets). C'est l'implémentation de  la liste de contrôle d'Accès (ACL).  
+
La liste actuelle est stockée dans la table  #__assets : quels sont les groupes d'utilisateurs autorisés ou non à faire quels types d'actions sur quelles ressources (assets). C'est l'implémentation de  la liste de contrôle d'Accès (ACL).  
  
Dans cet article, nous allons vous montrer comment ajouter et utiliser les droits d'accès sur plusieurs niveaux : pour votre composant dans son ensemble, pour les catégories et pour les éléments individuels.
+
Dans cet article, nous allons vous montrer comment ajouter et utiliser les droits d'accès à plusieurs niveaux : pour votre composant dans son ensemble, pour les catégories et pour les éléments individuels.
  
Remarque : dans cet exemple HelloWorld, nous travaillons en backend, ainsi, les seuls niveaux d'accès disponibles sont ''administrateur'' et ''super-utilisateur''.
+
Afin de tester cette fonctionnalité, créez des utilisateurs et associez les à des groupes d'utilisateurs qui peuvent accéder au fonctionnalités de l'administration du site (ie les groupes d'utilisateurs qui ont les droits "Connexion à l'administration" dans la <tt>Configuration > Droits</tt>). Par défaut, il s'agit de Gestionnaire et Administrateur, mais vous pouvez également définir vos propres groupes d'utilisateur, et par exemple les créer en tant qu'enfant de Gestionnaire ou Administrateur.
Afin de tester ce didacticiel, créez en premier lieu un nouvel utilisateur d'administration, puis définissez ses droits (en tant que super-utilisateur).
+
 
Après vous être connecté en tant qu'administrateur, vous verrez les changements.
+
Si vous n'êtes déjà très familiarisé avec le Contrôle d'Accès Joomla! alors il est recommandé de regarder cette vidéo entre la 2ème minute et la 32ème minute [https://youtu.be/CFqXAc3orkY Explication sur la Liste de Contrôle d'Accès] et lisez le [[S:MyLanguage/J3.x:Access_Control_List_Tutorial|Tutoriel sur la Liste de Contrôle d'Accès]].
 +
 
 +
Trois vidéos sont associées avec les étapes de ce didacticiel pour traiter de l'[https://youtu.be/kOqWcSF-p5Q Infrastructure de contrôle d'accès] Joomla!, une explication de l'étape [https://youtu.be/sljTur6zMOs code du didactiel] et une vidéo supplémentaire sur [https://youtu.be/CS_Ok1t550E la vue des niveaux d'accès].
 +
 
 +
{{#widget:YouTube|id=kOqWcSF-p5Q}}
 +
 
 +
{{#widget:YouTube|id=sljTur6zMOs}}
 +
 
 +
{{#widget:YouTube|id=CS_Ok1t550E}}
  
 
== Pré-requis d'ACL minimum au niveau composant ==
 
== Pré-requis d'ACL minimum au niveau composant ==
 
Pour un composant sous Joomla! 2.5+, deux actions doivent être définies au niveau du composant afin de permettre la mise en oeuvre des ACL :
 
Pour un composant sous Joomla! 2.5+, deux actions doivent être définies au niveau du composant afin de permettre la mise en oeuvre des ACL :
* '''Configuration''' (core.admin): quels sont les groupes autorisés à configurer les droits au niveau du composant via le bouton 'Options' de la barre d'outil ?
+
* '''Configuration''' (core.admin): quels sont les groupes autorisés à configurer les droits au niveau du composant via le bouton 'Options' de la barre d'outils ?
 
* '''Accès au composant''' (core.manage): quels sont les groupes autorisés à accéder au backend du composant ?
 
* '''Accès au composant''' (core.manage): quels sont les groupes autorisés à accéder au backend du composant ?
  
 
La mise en oeuvre de ces ACL de base se fait en 4 étapes simples :
 
La mise en oeuvre de ces ACL de base se fait en 4 étapes simples :
* [[#Ajouter les 2 niveaux d'actions minimales du composant au fichier access.xml|Ajouter les 2 niveaux d'actions minimales du composant au fichier access.xml]]
+
* [[#Ajouter les 2 niveaux d'actions minimales du composant au fichier access.xml|Ajouter les 2 niveaux d'actions minimales du composant au fichier access.xml]],
* [[#Ajouter les droits au fieldset du fichier config.xml|Ajouter les droits au fieldset du fichier config.xml]]
+
* [[#Ajouter les droits au fieldset du fichier config.xml|Ajouter les droits au fieldset du fichier config.xml]],
* [[#Ajouter le bouton .27Options.27 à la barre d'outils lorsque l'utilisateur a les droits nécessaires|Ajouter le bouton 'Options' à la barre d'outils]]
+
* [[#Ajouter le bouton .27Options.27 à la barre d'outils lorsque l'utilisateur a les droits nécessaires|Ajouter le bouton 'Options' à la barre d'outils]],
* [[#Restreindre l.27accès au backend du composant aux seuls groupes d.27utilisateurs autorisés|Restreindre l'accès au backend du composant]]
+
* [[#Restreindre l.27accès au backend du composant aux seuls groupes d.27utilisateurs autorisés|Restreindre l'accès au backend du composant]].
 
 
  
 
=== Ajouter les 2 niveaux d'actions minimales du composant au fichier access.xml ===
 
=== Ajouter les 2 niveaux d'actions minimales du composant au fichier access.xml ===
Un fichier d'ACL minimal </tt>access.xml</tt> devrait contenir seulement ces 2 actions de base :
+
Un fichier d'ACL minimal <tt>access.xml</tt> devrait contenir seulement ces 2 actions de base :
  
 
<tt>Basic admin/access.xml</tt>
 
<tt>Basic admin/access.xml</tt>
Line 79: Line 85:
 
</source>
 
</source>
  
See further downwards for a [[#admin/views/helloworlds/view.html.php|more elaborated example of ''admin/views/helloworlds/view.html.php'']] where this ''JToolBarHelper::preferences('com_helloworld')'' is done in an addToolBar()-method together with the other toolbar buttons and the ''JUser->authorise()''-check is done with JHelperContent, resulting in the $canDo-property.
+
Consultez ci-après un [[#admin/views/helloworlds/view.html.php|exemple plus élaboré de ''admin/views/helloworlds/view.html.php'']] dans lequel ''JToolBarHelper::preferences('com_helloworld')'' se fait dans une méthode addToolBar() conjointement avec les autres boutons de la barre d'outils et la vérification ''JUser->authorise()'' se fait avec JHelperContent, résultant en la propriété ''$canDo''.
  
 
=== Restreindre l'accès au backend du composant aux seuls groupes d'utilisateurs autorisés ===
 
=== Restreindre l'accès au backend du composant aux seuls groupes d'utilisateurs autorisés ===
To control the access to the backend of the component add the following lines to the <tt>admin/helloworld.php</tt> entry-file:
+
Afin de contrôler l'accès au backend du composant, ajoutez les lignes suivantes au fichier d'entrée <tt>admin/helloworld.php</tt> :
  
 
<source lang="php">
 
<source lang="php">
Line 94: Line 100:
 
Consultez ci-dessous le [[#admin/helloworld.php|code complet du fichier ''admin/helloworld.php'']].
 
Consultez ci-dessous le [[#admin/helloworld.php|code complet du fichier ''admin/helloworld.php'']].
  
== Ajout d'actions supplémentaires, notamment aux niveaux des catégories et des éléments ==
+
== Ajouter des actions supplémentaires, notamment aux niveaux des catégories et des éléments ==
 
Lors de l'ajout d'actions et de niveaux supplémentaires, ces quatre étapes sont également réalisées :
 
Lors de l'ajout d'actions et de niveaux supplémentaires, ces quatre étapes sont également réalisées :
* [[#Describing_the_actions_you_want_to_control_the_access_to|Add the actions to access.xml; here we can add more actions and levels]]
+
* [[#Décrire les actions dont vous souhaitez contrôler l'accès|Ajoutez les actions au access.xml ; dans ce fichier, nous pouvons ajouter des actions et niveaux supplémentaires]],
* [[#Adding_the_setting_of_permissions_in_the_component.27s_Preferences|Add the permissions-fieldset to config.xml]]
+
* [[#Ajouter les paramètres des droits dans les préférences du composant|Ajouter les permissions du ''fieldset'' au fichier config.xml]],
* [[#Displaying_only_the_right_toolbar_buttons|Add the 'Options' toolbar button]]
+
* [[#Afficher uniquement les boutons de la barre d'outil de droite|Ajouter le bouton 'Options' dans la barre d'outils]],
* [[#Restricting_access_to_the_component|Restrict the access to the component's backend
+
* [[#Restreindre l'accès au composant|Restreindre l'accès au backend du composant]].
]]
 
  
 
En outre, il nous faut également réaliser les étapes suivantes :
 
En outre, il nous faut également réaliser les étapes suivantes :
* [[#Add_the_asset_id_column_to_the_database_table|Add an asset_id to the item's database table for item level access control]]
+
* [[#Ajouter la colonne asset_id à la table de la base de données|Ajouter un asset_id aux éléments de la table de base de données pour le contrôle d'accès au niveau de l'élément]],
* [[#Setting_the_permission_values_in_the_assets_table|Store the permissions in the assets table. Especially take care of setting the asset_id of the parent-asset]]
+
* [[#Paramétrer les valeurs de droits dans la table des assets|Stocker les droits dans la table des assets. Prêtez attention au réglage de l'asset_id de l'asset parent]],
* [[#Showing_the_setting_of_permissions_on_the_item_level|Make the settings of the permissions at the item level editable]]
+
* [[#Afficher le réglage des droits au niveau de l'élément|Rendre modifiable les paramètres des droits au niveau de l'élément]],
* [[#Adding_language_strings|Add some language strings]]
+
* [[#Ajouter des chaînes de langue|Ajouter des chaînes de langue]].
  
=== Description des actions dont vous souhaitez contrôler l'accès ===
+
=== Décrire les actions dont vous souhaitez contrôler l'accès ===
Each component (or part of it) has its own set of permissions that can be controlled. They are described in an <tt>access.xml</tt> file located at the root of the ''admin'' folder. In this helloworld-example the actions to which access is controlled are divided in three sections: at the component level, the category level and the item level. An 'item' is called a 'message' in our example component, hence the name of the third section.
+
Chaque composant (ou une partie) a son propre ensemble de droits pouvant être contrôlés. Ils sont décrits dans un fichier <tt>access.xml</tt> situé à la racine du dossier ''admin''. Dans cet exemple helloworld, les actions dont l'accès est contrôlé sont divisées en trois sections : au niveau du composant, au niveau de la catégorie et au niveau de l'élément. Un 'élément' est appelé un 'message' dans notre exemple de composant, d'où le nom de la troisième section.
  
 
<span id="admin/access.xml">
 
<span id="admin/access.xml">
 
<tt>admin/access.xml</tt>
 
<tt>admin/access.xml</tt>
<source lang="xml" highlight="10-16">
+
<source lang="xml" highlight="9-10,12-18">
 
<?xml version="1.0" encoding="utf-8" ?>
 
<?xml version="1.0" encoding="utf-8" ?>
 
<access component="com_helloworld">
 
<access component="com_helloworld">
Line 122: Line 127:
 
<action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC" />
 
<action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC" />
 
<action name="core.edit" title="JACTION_EDIT" description="JACTION_EDIT_COMPONENT_DESC" />
 
<action name="core.edit" title="JACTION_EDIT" description="JACTION_EDIT_COMPONENT_DESC" />
 +
<action name="core.edit.state" title="JACTION_EDITSTATE" description="JACTION_EDITSTATE_COMPONENT_DESC" />
 +
<action name="core.edit.own" title="JACTION_EDITOWN" description="JACTION_EDITOWN_COMPONENT_DESC" />
 
</section>
 
</section>
 
<section name="category">
 
<section name="category">
Line 138: Line 145:
 
</span>
 
</span>
  
=== Adding the setting of permissions in the component's Preferences ===
+
=== Ajouter les paramètres des droits dans les préférences du composant ===
Since we now use Access Control permissions in our component, we need to be able to set them at the component level. That is done in the Preferences of this component: the screen you see after clicking the 'Options' button. The config.xml-file is a form-definition for those Preferences. We could define the component level actions here too, as a child of the "rules" field-tag, but it is now preferred to also put those actions in <tt>access.xml</tt> in that way all access rules for this component are on one spot.
+
Nous utilisons désormais les droits de contrôle d'accès dans notre composant, de ce fait, nous devons être en mesure de les définir au niveau du composant. Cela se fait via les préférences du composant : l'écran qui s'affiche après avoir cliqué sur le bouton 'Options'. Le fichier ''config.xml'' est un formulaire des définitions pour ces préférences. Nous pourrions également y définir les actions au niveau du composant, comme étant un enfant des ''règles'' de la balise ''field'', mais il est préférable d'indiquer ces actions dans le fichier <tt>access.xml</tt>, ainsi, toutes les règles d'accès du composant seront en un seul et même endroit.
  
 
<span id="admin/config.xml">
 
<span id="admin/config.xml">
Line 183: Line 190:
 
</span>
 
</span>
  
=== Displaying only the right toolbar buttons ===
+
=== Afficher uniquement les boutons de la barre d'outil de droite ===
 +
 
 +
Les boutons de la barre d'outils à afficher dépendent des droits d'accès de l'utilisateur.
  
Which toolbar buttons to display depends on the Access Control permissions for the user. We put all permissions for this user in the $canDo property of the view; so we can eventually refer to it in layouts (in the edit-form for example).
+
En même temps que les composants de base de Joomla!, nous utilisons JHelperContent::getActions() pour trouver les droits. Nous passons à cette fonction le nom du composant, et elle retourne un objet contenant toutes les Actions associées au composant helloworld, ainsi que (pour chaque Action) le fait que l'utilisateur actuellement connecté a ou non ce droit. Si ensuite nous appelons <tt>get('une.action')</tt> sur cet objet, il retourne 'true' ou 'false', selon que l'utilisateur a ou non ce droit.  
  
In the <tt>admin/views/helloworlds/view.html.php</tt>, put this code:
+
Dans le fichier <tt>admin/views/helloworlds/view.html.php</tt>, ajoutez ce code :
  
 
<span id="admin/views/helloworlds/view.html.php">
 
<span id="admin/views/helloworlds/view.html.php">
 
<tt>admin/views/helloworlds/view.html.php</tt>
 
<tt>admin/views/helloworlds/view.html.php</tt>
<source lang="php" highlight="42-44,83-85,87-89,91-93,95-98,100" >
+
<source lang="php" highlight="42-44,48,81-83,85-87,89-91,93-96,98" >
 
<?php
 
<?php
 
/**
 
/**
Line 197: Line 206:
 
  * @subpackage  com_helloworld
 
  * @subpackage  com_helloworld
 
  *
 
  *
  * @copyright  Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
+
  * @copyright  Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 
  * @license    GNU General Public License version 2 or later; see LICENSE.txt
 
  * @license    GNU General Public License version 2 or later; see LICENSE.txt
 
  */
 
  */
Line 234: Line 243:
  
 
// What Access Permissions does this user have? What can (s)he do?
 
// What Access Permissions does this user have? What can (s)he do?
$this->canDo = JHelperContent::getActions();
+
$this->canDo = JHelperContent::getActions('com_helloworld');
  
 
// Check for errors.
 
// Check for errors.
Line 305: Line 314:
 
<span>
 
<span>
  
In the ''admin/views/helloworld/view.html.php'', put this code
+
Dans le fichier <tt>admin/views/helloworld/view.html.php</tt>, ajoutez ce code :
  
 
<span id="admin/views/helloworld/view.html.php">
 
<span id="admin/views/helloworld/view.html.php">
''admin/views/helloworld/view.html.php''
+
<tt>admin/views/helloworld/view.html.php</tt>
<source lang="php" highlight="23,39-41,76-78,81-89,93-112">
+
<source lang="php" highlight="23,39-41,45,79-111">
 
<?php
 
<?php
 
/**
 
/**
Line 315: Line 324:
 
  * @subpackage  com_helloworld
 
  * @subpackage  com_helloworld
 
  *
 
  *
  * @copyright  Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
+
  * @copyright  Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 
  * @license    GNU General Public License version 2 or later; see LICENSE.txt
 
  * @license    GNU General Public License version 2 or later; see LICENSE.txt
 
  */
 
  */
Line 349: Line 358:
  
 
// What Access Permissions does this user have? What can (s)he do?
 
// What Access Permissions does this user have? What can (s)he do?
$this->canDo = JHelperContent::getActions($this->item->id);
+
$this->canDo = JHelperContent::getActions('com_helloworld', 'helloworld', $this->item->id);
  
 
// Check for errors.
 
// Check for errors.
Line 437: Line 446:
 
                                  . "/views/helloworld/submitbutton.js");
 
                                  . "/views/helloworld/submitbutton.js");
 
JText::script('COM_HELLOWORLD_HELLOWORLD_ERROR_UNACCEPTABLE');
 
JText::script('COM_HELLOWORLD_HELLOWORLD_ERROR_UNACCEPTABLE');
}
 
}
 
 
</source>
 
</span>
 
 
These two files use the ''getActions'' method defined in the <tt>admin/helpers/helloworld.php</tt> file.
 
 
In the helper-file, put this code:
 
 
<span id="admin/helpers/helloworld.php">
 
<tt>admin/helpers/helloworld.php</tt>
 
<source lang="php" highlight="50-72">
 
<?php
 
/**
 
* @package    Joomla.Administrator
 
* @subpackage  com_helloworld
 
*
 
* @copyright  Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
 
* @license    GNU General Public License version 2 or later; see LICENSE.txt
 
*/
 
 
// No direct access to this file
 
defined('_JEXEC') or die('Restricted access');
 
 
/**
 
* HelloWorld component helper.
 
*
 
* @param  string  $submenu  The name of the active view.
 
*
 
* @return  void
 
*
 
* @since  1.6
 
*/
 
abstract class HelloWorldHelper
 
{
 
/**
 
* Configure the Linkbar.
 
*/
 
public static function addSubmenu($submenu)
 
{
 
JSubMenuHelper::addEntry(
 
JText::_('COM_HELLOWORLD_SUBMENU_MESSAGES'),
 
'index.php?option=com_helloworld',
 
$submenu == 'messages'
 
);
 
 
JSubMenuHelper::addEntry(
 
JText::_('COM_HELLOWORLD_SUBMENU_CATEGORIES'),
 
'index.php?option=com_categories&view=categories&extension=com_helloworld',
 
$submenu == 'categories'
 
);
 
 
// set some global property
 
$document = JFactory::getDocument();
 
$document->addStyleDeclaration('.icon-48-helloworld ' .
 
                              '{background-image: url(../media/com_helloworld/images/tux-48x48.png);}');
 
if ($submenu == 'categories')
 
{
 
$document->setTitle(JText::_('COM_HELLOWORLD_ADMINISTRATION_CATEGORIES'));
 
}
 
}
 
 
/**
 
* Get the actions
 
*/
 
public static function getActions($messageId = 0)
 
{
 
$result = new JObject;
 
 
if (empty($messageId)) {
 
$assetName = 'com_helloworld';
 
}
 
else {
 
$assetName = 'com_helloworld.message.'.(int) $messageId;
 
}
 
 
$actions = JAccess::getActions('com_helloworld', 'component');
 
 
foreach ($actions as $action) {
 
$result->set($action->name, JFactory::getUser()->authorise($action->name, $assetName));
 
}
 
 
return $result;
 
 
}
 
}
 
}
 
}
Line 529: Line 454:
 
=== Restreindre l'accès au composant ===
 
=== Restreindre l'accès au composant ===
  
The main idea in ACL is to restrict actions to groups of users. The first action to be restricted is access to the administrative backend of the component itself. With your favorite file editor, edit the <tt>admin/helloworld.php</tt> file and add the lines with the access check.
+
L'idée principale des ACL est de restreindre les actions à des groupes d'utilisateurs. La première action de restriction est l'accès au backend d'administration du composant lui-même. A l'aide de votre éditeur de fichier préféré, modifiez le fichier <tt>admin/helloworld.php</tt> et ajoutez ces lignes, contenant le contrôle d'accès.
  
 
<span id="admin/helloworld.php">
 
<span id="admin/helloworld.php">
Line 539: Line 464:
 
  * @subpackage  com_helloworld
 
  * @subpackage  com_helloworld
 
  *
 
  *
  * @copyright  Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
+
  * @copyright  Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 
  * @license    GNU General Public License version 2 or later; see LICENSE.txt
 
  * @license    GNU General Public License version 2 or later; see LICENSE.txt
 
  */
 
  */
Line 571: Line 496:
 
<span>
 
<span>
  
=== Add the asset_id column to the database table ===
+
=== Ajouter la colonne asset_id à la table de la base de données ===
  
In order to be able to work with JTable an asset_id column has to be added to the database #__helloworld table.
+
Afin d'être en mesure de travailler avec JTable, une colonne asset_id doit être ajoutée à la table #__helloworld de la base de données.
  
So, <tt>admin/sql/install.mysql.utf8.sql</tt> becomes:
+
Ainsi, le fichier <tt>admin/sql/install.mysql.utf8.sql</tt> devient :
  
 
<span id="admin/sql/install.mysql.utf8.sql">
 
<span id="admin/sql/install.mysql.utf8.sql">
Line 602: Line 527:
 
</span>
 
</span>
  
For updates we add a sql-update-file:
+
Pour les mises à jour, nous ajoutons un fichier de mise à jour sql :
  
 
<span id="admin/sql/updates/mysql/0.0.14.sql">
 
<span id="admin/sql/updates/mysql/0.0.14.sql">
 
<tt>admin/sql/updates/mysql/0.0.14.sql</tt>
 
<tt>admin/sql/updates/mysql/0.0.14.sql</tt>
 
<source lang="mysql">
 
<source lang="mysql">
ALTER TABLE`#__helloworld` ADD COLUMN `asset_id` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `id`;
+
ALTER TABLE `#__helloworld` ADD COLUMN `asset_id` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `id`;
 
</source>
 
</source>
 
</span>
 
</span>
Line 613: Line 538:
 
=== Restreindre l'accès aux messages ===
 
=== Restreindre l'accès aux messages ===
  
So far we have restricted access to the component itself, but we also need to do that at ''message'' level.
+
Jusqu'ici, nous avons restreint l'accès au composant lui-même, mais il nous faut également le faire au niveau du  ''message''.
  
To check the '''"core.delete"''' permission you need to modify the model class: <tt>admin/models/helloworld.php</tt> by adding these lines:
+
Afin de vérifier les droits de '''"core.delete"''', il nous faut modifier la classe du modèle <tt>admin/models/helloworld.php</tt> en ajoutant ces lignes :
  
 
<span id="admin/models/helloworld.php">
 
<span id="admin/models/helloworld.php">
Line 625: Line 550:
 
  * @subpackage  com_helloworld
 
  * @subpackage  com_helloworld
 
  *
 
  *
  * @copyright  Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
+
  * @copyright  Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 
  * @license    GNU General Public License version 2 or later; see LICENSE.txt
 
  * @license    GNU General Public License version 2 or later; see LICENSE.txt
 
  */
 
  */
Line 716: Line 641:
 
}
 
}
 
/**
 
/**
* Method to check if it's OK to delete a message. Overwrites JModelAdmin::canDelete
+
* Method to check if it's OK to delete a message. Overrides JModelAdmin::canDelete
 
*/
 
*/
 
protected function canDelete($record)
 
protected function canDelete($record)
Line 722: Line 647:
 
if( !empty( $record->id ) )
 
if( !empty( $record->id ) )
 
{
 
{
return JFactory::getUser()->authorise( "core.delete", "com_helloworld.message." . $record->id );
+
return JFactory::getUser()->authorise( "core.delete", "com_helloworld.helloworld." . $record->id );
 
}
 
}
 
}
 
}
Line 730: Line 655:
 
</span>
 
</span>
  
To check '''"core.edit"''' (and '''core.add''' if you wish) you need to update the sub-controller (''not'' the model). I am not sure why this is so, but that's how other standard Joomla components do it. You need to add the following lines in the file: <tt>admin/controllers/helloworld.php</tt>
+
Afin de pouvoir contrôler '''"core.edit"''' (et, si vous le souhaitez, '''core.add'''),  vous devez mettre à jour le sous-contrôleur (''pas'' le modèle). Je ne suis pas sûr de savoir pourquoi il en est ainsi, mais c'est ainsi que procède les autres composants standards de Joomla. Ajoutez les lignes suivantes au fichier <tt>admin/controllers/helloworld.php</tt> :
  
 
<span id="admin/controllers/helloworld.php">
 
<span id="admin/controllers/helloworld.php">
Line 740: Line 665:
 
  * @subpackage  com_helloworld
 
  * @subpackage  com_helloworld
 
  *
 
  *
  * @copyright  Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
+
  * @copyright  Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 
  * @license    GNU General Public License version 2 or later; see LICENSE.txt
 
  * @license    GNU General Public License version 2 or later; see LICENSE.txt
 
  */
 
  */
Line 781: Line 706:
 
if( !empty( $id ) )
 
if( !empty( $id ) )
 
{
 
{
return JFactory::getUser()->authorise( "core.edit", "com_helloworld.message." . $id );
+
return JFactory::getUser()->authorise( "core.edit", "com_helloworld.helloworld." . $id );
 
}
 
}
 
}
 
}
Line 789: Line 714:
 
</span>
 
</span>
  
Please note that ''allowAdd'' simply calls its parent. I've put it here in case you want to actually use it in your component. If you look at your <tt>admin/access.xml</tt> file, you will notice there is no ''core.add'' action defined for "messages", so you will need to add it there as well if you want to be able to configure it in the interface.
+
Vous remarquerez que ''allowAdd'' appelle simplement son parent. Je l'ai ajouté ici dans le cas où vous souhaiteriez l'utiliser dans votre composant. Si vous jetez un oeil à votre fichier <tt>admin/access.xml</tt>, vous remarquerez qu'aucune action ''core.add'' n'est définie pour les ''messages'', il vous faudra donc, si besoin, l'ajouter, de même si vous souhaitez être en mesure de la configurer dans l'interface.
  
 
=== Paramétrer les valeurs de droits dans la table des assets ===
 
=== Paramétrer les valeurs de droits dans la table des assets ===
  
In order to store permissions for each message in the assets database table, we have to instruct the table class associated with the model to save those permissions in the assets table.
+
Afin de stocker les droits pour chaque message dans la table des assets de la base de données, in nous faut instruire la classe de la table associée au modèle afin d'enregistrer ces droits dans la table des assets.
  
JTable not only provides an interface for storing the data of the record itself in the item's database table, but also for storing the permissions for that record in the assets database table. Therefore we must add information to the bind()-method about the permission-values. We also  have to provide the asset name, asset title and the id of the asset parent via the helloworld JTable. Therefore we override 3 methods:
+
JTable fournit non seulement une interface pour stocker les données de l'enregistrement lui-même dans l'élément de la table de base de données, mais aussi pour stocker les autorisations de cet enregistrement dans la table d'assets de la base de données. Par conséquent, nous devons ajouter des informations à la méthode ''bind()'' concernant les valeurs des droits. Nous devons également indiquer le nom de l'asset, son titre et l'id de l'asset parent via la JTable helloworld. Nous remplaçons donc 3 méthodes :
* _getAssetName(): a unique name for this asset, by which it can be retrieved
+
* _getAssetName(): un nom unique pour cet asset, par lequel il peut être récupéré,
* _getAssetTitle(): a more human-friendly way to identify the asset (not necessary unique)
+
* _getAssetTitle(): une façon plus conviviale d'identifier l'asset (n'a pas besoin d'être unique),
* _getAssetParentId(): the asset_id of the parent in the asset database table (from whom permissions are inherited)
+
* _getAssetParentId(): l'id d'asset du parent dans la table d'asset de la base de données (à partir duquel les droits sont hérités).
  
 
<span id="admin/tables/helloworld.php">
 
<span id="admin/tables/helloworld.php">
 
<tt>admin/tables/helloworld.php</tt>
 
<tt>admin/tables/helloworld.php</tt>
<source lang="php" highlight="45-52,80-133">
+
<source lang="php" highlight="45-52,56-109">
 
<?php
 
<?php
 
/**
 
/**
Line 808: Line 733:
 
  * @subpackage  com_helloworld
 
  * @subpackage  com_helloworld
 
  *
 
  *
  * @copyright  Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
+
  * @copyright  Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 
  * @license    GNU General Public License version 2 or later; see LICENSE.txt
 
  * @license    GNU General Public License version 2 or later; see LICENSE.txt
 
  */
 
  */
Line 858: Line 783:
 
}
 
}
  
/**
 
* Overloaded load function
 
*
 
* @param      int $pk primary key
 
* @param      boolean $reset reset data
 
* @return      boolean
 
* @see JTable:load
 
*/
 
public function load($pk = null, $reset = true)
 
{
 
if (parent::load($pk, $reset))
 
{
 
// Convert the params field to a registry.
 
$params = new JRegistry;
 
$params->loadString($this->params, 'JSON');
 
 
$this->params = $params;
 
return true;
 
}
 
else
 
{
 
return false;
 
}
 
}
 
 
/**
 
/**
 
* Method to compute the default name of the asset.
 
* Method to compute the default name of the asset.
Line 893: Line 794:
 
{
 
{
 
$k = $this->_tbl_key;
 
$k = $this->_tbl_key;
return 'com_helloworld.message.'.(int) $this->$k;
+
return 'com_helloworld.helloworld.'.(int) $this->$k;
 
}
 
}
 
/**
 
/**
Line 941: Line 842:
 
</span>
 
</span>
  
This code for _getAssetParentId() above uses JTableAsset to retrieve the asset_id of the asset-parent. This is different from the code in the current version of com_content, where the asset_id of the category is retrieved from the #__categories database table. That is another possibility; many ways leading to Rome. In com_content however, if an item would not be under a category, then the asset_id of the global asset is returned. That would of course not be right, but is fixed there by providing a default category "uncategorised", so that an article is ''always'' under a category. That is why you cannot just copy the code of _getAssetParentId() in com_content to your own component. The code above is more general.
+
Le code pour _getAssetParentId() ci-dessus utilise JTableAsset pour récupérer l'id d'asset de l'asset parent. Ce qui diffère du code de la version actuelle du com_content, où l'id d'asset de la catégorie est récupéré à partir de la table #__categories de la base de données. Ceci est donc une autre possibilité, plusieurs chemins mènent à Rome. Toutefois, dans com_content, si un élément n'est pas catégorisé, alors l'id d'asset de l'asset général est retourné. Bien sur, ce ne serait pas bon, cela est corrigé ici en indiquant une catégorie par défaut ''uncategorised'', de sorte qu'un article soit ''toujours'' catégorisé.
  
 
=== Afficher le réglage des droits au niveau de l'élément ===
 
=== Afficher le réglage des droits au niveau de l'élément ===
  
Adding the rules field to the form-definition of the edit-form.  
+
Ajoutez le ''field'' ''rules'' au formulaire de définition du formulaire d'édition.  
  
 
<span id="admin/models/forms/helloworld.xml">
 
<span id="admin/models/forms/helloworld.xml">
Line 1,029: Line 930:
 
</span>
 
</span>
  
Now the ACL interface is displayed at the bottom of the Helloworld editform too (the ''edit.php'' file automatically get the fieldsets from the above xml).
+
La version précédente du fichier de layout edit.php va afficher le champ des droits automatiquement ; cependant, nous avons modifié le layout pour réaliser un affichage sous forme d'onglets, comme c'est le cas des autres composants Joomla!. Lorsqu'un utilisateur change un droit, un appel Ajax recalcule le Paramètre Calculé (Calculated Setting), et nous avons besoin d'un peu de javascript afin que cela fonctionne.
 +
 
 +
<span id="admin/views/helloworld/tmpl/edit.php">
 +
<tt>admin/views/helloworld/tmpl/edit.php</tt>
 +
<source lang='php'  highlight="14-23,29,33-67">
 +
<?php
 +
/**
 +
* @package    Joomla.Administrator
 +
* @subpackage  com_helloworld
 +
*
 +
* @copyright  Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 +
* @license    GNU General Public License version 2 or later; see LICENSE.txt
 +
*/
 +
 
 +
// No direct access
 +
defined('_JEXEC') or die('Restricted access');
 +
JHtml::_('behavior.formvalidator');
 +
 
 +
// The following is to enable setting the permission's Calculated Setting
 +
// when you change the permission's Setting.
 +
// The core javascript code for initiating the Ajax request looks for a field
 +
// with id="jform_title" and sets its value as the 'title' parameter to send in the Ajax request
 +
JFactory::getDocument()->addScriptDeclaration('
 +
jQuery(document).ready(function() {
 +
        greeting = jQuery("#jform_greeting").val();
 +
jQuery("#jform_title").val(greeting);
 +
});
 +
');
 +
 
 +
?>
 +
<form action="<?php echo JRoute::_('index.php?option=com_helloworld&layout=edit&id=' . (int) $this->item->id); ?>"
 +
    method="post" name="adminForm" id="adminForm" class="form-validate">
 +
   
 +
    <input id="jform_title" type="hidden" name="helloworld-message-title"/>
 +
   
 +
    <div class="form-horizontal">
 +
 
 +
    <?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'details')); ?>
 +
    <?php echo JHtml::_('bootstrap.addTab', 'myTab', 'details',
 +
        empty($this->item->id) ? JText::_('COM_HELLOWORLD_TAB_NEW_MESSAGE') : JText::_('COM_HELLOWORLD_TAB_EDIT_MESSAGE')); ?>
 +
        <fieldset class="adminform">
 +
            <legend><?php echo JText::_('COM_HELLOWORLD_LEGEND_DETAILS') ?></legend>
 +
            <div class="row-fluid">
 +
                <div class="span6">
 +
                    <?php echo $this->form->renderFieldset('details');  ?>
 +
                </div>
 +
            </div>
 +
        </fieldset>
 +
    <?php echo JHtml::_('bootstrap.endTab'); ?>
 +
 
 +
    <?php echo JHtml::_('bootstrap.addTab', 'myTab', 'params', JText::_('COM_HELLOWORLD_TAB_PARAMS')); ?>
 +
        <fieldset class="adminform">
 +
            <legend><?php echo JText::_('COM_HELLOWORLD_LEGEND_PARAMS') ?></legend>
 +
            <div class="row-fluid">
 +
                <div class="span6">
 +
                    <?php echo $this->form->renderFieldset('params');  ?>
 +
                </div>
 +
            </div>
 +
        </fieldset>
 +
    <?php echo JHtml::_('bootstrap.endTab'); ?>
 +
 
 +
    <?php echo JHtml::_('bootstrap.addTab', 'myTab', 'permissions', JText::_('COM_HELLOWORLD_TAB_PERMISSIONS')); ?>
 +
        <fieldset class="adminform">
 +
            <legend><?php echo JText::_('COM_HELLOWORLD_LEGEND_PERMISSIONS') ?></legend>
 +
            <div class="row-fluid">
 +
                <div class="span12">
 +
                    <?php echo $this->form->renderFieldset('accesscontrol');  ?>
 +
                </div>
 +
            </div>
 +
        </fieldset>
 +
    <?php echo JHtml::_('bootstrap.endTab'); ?>
 +
    <?php echo JHtml::_('bootstrap.endTabSet'); ?>
 +
 
 +
    </div>
 +
    <input type="hidden" name="task" value="helloworld.edit" />
 +
    <?php echo JHtml::_('form.token'); ?>
 +
</form>
 +
 
 +
</source>
 +
</span>
  
 
=== Ajouter des chaînes de langue ===
 
=== Ajouter des chaînes de langue ===
We used 4 language strings that have to be added to the backend language-file.
+
Nous avons utilisé plusieurs chaînes de caractères de langues qui doivent être ajoutées au fichier de langues du backend.
  
 
<span id="admin/language/en-GB/en-GB.com_helloworld.ini">
 
<span id="admin/language/en-GB/en-GB.com_helloworld.ini">
 
<tt>admin/language/en-GB/en-GB.com_helloworld.ini</tt>
 
<tt>admin/language/en-GB/en-GB.com_helloworld.ini</tt>
<source lang="text" highlight="41-44">
+
<source lang="text" highlight="41-51">
 
; Joomla! Project
 
; Joomla! Project
; Copyright (C) 2005 - 2015 Open Source Matters. All rights reserved.
+
; Copyright (C) 2005 - 2018 Open Source Matters. All rights reserved.
 
; License GNU General Public License version 2 or later; see LICENSE.txt, see LICENSE.php
 
; License GNU General Public License version 2 or later; see LICENSE.txt, see LICENSE.php
 
; Note : All ini files need to be saved as UTF-8
 
; Note : All ini files need to be saved as UTF-8
Line 1,079: Line 1,059:
 
COM_HELLOWORLD_FIELDSET_RULES="Message Permissions"
 
COM_HELLOWORLD_FIELDSET_RULES="Message Permissions"
 
COM_HELLOWORLD_FIELD_RULES_LABEL="Permissions"
 
COM_HELLOWORLD_FIELD_RULES_LABEL="Permissions"
COM_HELLOWORLD_ACCESS_DELETE_DESC="Is this group allowed to edit this message?"
+
COM_HELLOWORLD_ACCESS_EDIT_DESC="Is this group allowed to edit this message?"
 
COM_HELLOWORLD_ACCESS_DELETE_DESC="Is this group allowed to delete this message?"
 
COM_HELLOWORLD_ACCESS_DELETE_DESC="Is this group allowed to delete this message?"
 +
COM_HELLOWORLD_TAB_NEW_MESSAGE="New Message"
 +
COM_HELLOWORLD_TAB_EDIT_MESSAGE="Edit Message"
 +
COM_HELLOWORLD_TAB_PARAMS="Parameters"
 +
COM_HELLOWORLD_TAB_PERMISSIONS="Permissions"
 +
COM_HELLOWORLD_LEGEND_DETAILS="Message Details"
 +
COM_HELLOWORLD_LEGEND_PARAMS="Message Parameters"
 +
COM_HELLOWORLD_LEGEND_PERMISSIONS="Message Permissions"
  
 
</source>
 
</source>
Line 1,086: Line 1,073:
  
 
== A lire ==
 
== A lire ==
More information on actions, assets and ACL can be found on the following pages:
+
Pour plus d'informations sur les actions, les assets et les ACL, veuillez consulter les sur les pages suivantes :
* Informations générales et utilisation : [[S:MyLanguage/Access Control List/1.6-2.5/Tutorial|Liste des contrôles d'accès (ACL)/1.6-2.5/Didacticiel]]
+
* Informations générales et utilisation : [[S:MyLanguage/J3.x:Access_Control_List_Tutorial|Liste des contrôles d'accès (ACL) - Didacticiel]]
* Informations techniques (en construction) : [[S:MyLanguage/ACL Technique in Joomla!|Technique des ACL dans Joomla!]]
 
 
* [[S:MyLanguage/How to implement actions in your code|Comment implémenter des actions dans votre code]]
 
* [[S:MyLanguage/How to implement actions in your code|Comment implémenter des actions dans votre code]]
 
* [[S:MyLanguage/Adding ACL rules to your component|Ajouter des règles d'ACL à votre composant]]
 
* [[S:MyLanguage/Adding ACL rules to your component|Ajouter des règles d'ACL à votre composant]]
 
== Classes obsolètes ==
 
For the moment we leave the '''deprecated JError'''-references as they are. They will probably still be available in Joomla! 3.x. We cannot just change them to JLog::add() statements because in Joomla! 2.5 the messages will then not be enqueued (as there is no messagequeue-logger added as is in /libraries/cms.php in Joomla! 3.0). Other solutions, like using $app->enqueueMessage() or directly throwing PHP-exceptions as showstopper are also possible, but then there would still be numerous references to JError throughout the application. For instance in the view, we now check for errors raised in the model with: <span style="color:#900">count($errors = $this->get('Errors'))</span>, which uses JError from the JOBject that was the base for JModel. To get the same functionality without using JError at all, we would have to change the way the Model raises those errors and warnings now. If we want to make an application that would work in Joomla! 2.5 and 3.x we can continue using JError. The moment we want to use our 3.x extensions also in 4.x we will have to change this (and probably a lot more too). This tutorial is now primarily focused on Joomla! 3.x. So: we notice the upcoming change, but leave it there for the moment.
 
 
Since Joomla! 2.5.5 the MVC-base-classes JController, JModel and JView got proxies JControllerLegacy, JModelLegacy and JViewLegacy. You are recommended to use those proxies instead of the original classes to be forward compatibility with Joomla! CMS 3.x legacy classes.
 
  
 
== Empaqueter le composant ==
 
== Empaqueter le composant ==
  
Contenu de votre répertoire de code
+
Contenu de votre répertoire de code. Chaque lien ci-dessous vous emmène vers l'étape du didacticiel qui contient la dernière version du code source de ce fichier.
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#helloworld.xml|helloworld.xml]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_ACL#helloworld.xml|helloworld.xml]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_a_view_to_the_site_part#site/helloworld.php|site/helloworld.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_a_view_to_the_site_part#site/helloworld.php|site/helloworld.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|site/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|site/index.html]]''
Line 1,106: Line 1,087:
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|site/views/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|site/views/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|site/views/helloworld/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|site/views/helloworld/index.html]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_a_view_to_the_site_part#site/views/helloworld/view.html.php|site/views/helloworld/view.html.php]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_configuration#site/views/helloworld/view.html.php|site/views/helloworld/view.html.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|site/views/helloworld/tmpl/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|site/views/helloworld/tmpl/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Using_the_database#site/views/helloworld/tmpl/default.xml|site/views/helloworld/tmpl/default.xml]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Using_the_database#site/views/helloworld/tmpl/default.xml|site/views/helloworld/tmpl/default.xml]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_a_view_to_the_site_part#site/views/helloworld/tmpl/default.php|site/views/helloworld/tmpl/default.php]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_configuration#site/views/helloworld/tmpl/default.php|site/views/helloworld/tmpl/default.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|site/models/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|site/models/index.html]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Using_the_database#site/models/helloworld.php|site/models/helloworld.php]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_configuration#site/models/helloworld.php|site/models/helloworld.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|site/language/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|site/language/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|site/language/en-GB/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|site/language/en-GB/index.html]]''
 
* ''[[S:MyLanguage/J3.x:Developing an MVC Component/Adding language management#site.2Flanguage.2Fen-GB.2Fen-GB.com_helloworld.ini|site/language/en-GB/en-GB.com_helloworld.ini]]''
 
* ''[[S:MyLanguage/J3.x:Developing an MVC Component/Adding language management#site.2Flanguage.2Fen-GB.2Fen-GB.com_helloworld.ini|site/language/en-GB/en-GB.com_helloworld.ini]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/index.html]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Basic_backend#admin/helloworld.php|admin/helloworld.php]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_ACL#admin/helloworld.php|admin/helloworld.php]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_configuration#admin/config.xml|admin/config.xml]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_ACL#admin/config.xml|admin/config.xml]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Basic_backend#admin/controller.php|admin/controller.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Basic_backend#admin/controller.php|admin/controller.php]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_categories#admin/access.xml|admin/access.xml]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_ACL#admin/access.xml|admin/access.xml]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_categories#admin/helpers/helloworld.php|admin/helpers/helloworld.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_categories#admin/helpers/helloworld.php|admin/helpers/helloworld.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/helpers/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/helpers/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/sql/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/sql/index.html]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Using_the_database#admin/sql/install.mysql.utf8.sql|admin/sql/install.mysql.utf8.sql]]''
+
* ''[[J3.2:Developing_an_MVC_Component/Adding_ACL#admin/sql/install.mysql.utf8.sql|admin/sql/install.mysql.utf8.sql]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Using_the_database#admin/sql/uninstall.mysql.utf8.sql|admin/sql/uninstall.mysql.utf8.sql]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Using_the_database#admin/sql/uninstall.mysql.utf8.sql|admin/sql/uninstall.mysql.utf8.sql]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/sql/updates/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/sql/updates/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/sql/updates/mysql/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/sql/updates/mysql/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#admin/sql/updates/mysql/0.0.1.sql|admin/sql/updates/mysql/0.0.1.sql]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#admin/sql/updates/mysql/0.0.1.sql|admin/sql/updates/mysql/0.0.1.sql]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Using_the_database#admin/sql/install.mysql.utf8.sql|admin/sql/updates/mysql/0.0.6.sql]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_ACL#admin/sql/install.mysql.utf8.sql|admin/sql/updates/mysql/0.0.6.sql]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_categories#admin/sql/updates/mysql/0.0.12.sql|admin/sql/updates/mysql/0.0.12.sql]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_categories#admin/sql/updates/mysql/0.0.12.sql|admin/sql/updates/mysql/0.0.12.sql]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_configuration#admin/sql/updates/mysql/0.0.13.sql|admin/sql/updates/mysql/0.0.13.sql]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_configuration#admin/sql/updates/mysql/0.0.13.sql|admin/sql/updates/mysql/0.0.13.sql]]''
Line 1,134: Line 1,115:
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/models/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/models/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/models/fields/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/models/fields/index.html]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Using_the_database#admin/models/fields/helloworld.php|admin/models/fields/helloworld.php]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_categories#admin/models/fields/helloworld.php|admin/models/fields/helloworld.php]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Basic_backend#admin/models/helloworlds.php|admin/models/helloworlds.php]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_categories#admin/models/helloworlds.php|admin/models/helloworlds.php]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_backend_actions#admin/models/helloworlds.php|admin/models/helloworld.php]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_ACL#admin/models/helloworld.php|admin/models/helloworld.php]]''
 +
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding decorations to the backend#admin/models/forms/filter_helloworlds.xml|admin/models/forms/filter_helloworlds.xml]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/models/forms/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/models/forms/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_verifications#admin/models/forms/helloworld.js|admin/models/forms/helloworld.js]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_verifications#admin/models/forms/helloworld.js|admin/models/forms/helloworld.js]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_backend_actions#admin/models/forms/helloworld.xml|admin/models/forms/helloworld.xml]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_ACL#admin/models/forms/helloworld.xml|admin/models/forms/helloworld.xml]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_verifications#admin/models/rules/greeting.php|admin/models/rules/greeting.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_verifications#admin/models/rules/greeting.php|admin/models/rules/greeting.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/models/rules/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/models/rules/index.html]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_backend_actions#admin/controllers/helloworld.php|admin/controllers/helloworld.php]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_ACL#admin/controllers/helloworld.php|admin/controllers/helloworld.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_backend_actions#admin/controllers/helloworlds.php|admin/controllers/helloworlds.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_backend_actions#admin/controllers/helloworlds.php|admin/controllers/helloworlds.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/controllers/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/controllers/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/views/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/views/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/views/helloworld/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/views/helloworld/index.html]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_backend_actions#admin/views/helloworld/view.html.php|admin/views/helloworld/view.html.php]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_ACL#admin/views/helloworld/view.html.php|admin/views/helloworld/view.html.php]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_backend_actions#admin/views/helloworld/tmpl/edit.php|admin/views/helloworld/tmpl/edit.php]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/views/helloworld/tmpl/index.html]]''
 +
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_ACL#admin/views/helloworld/tmpl/edit.php|admin/views/helloworld/tmpl/edit.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_verifications#admin/views/helloworld/submitbutton.js|admin/views/helloworld/submitbutton.js]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_verifications#admin/views/helloworld/submitbutton.js|admin/views/helloworld/submitbutton.js]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/views/helloworlds/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/views/helloworlds/index.html]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Basic_backend#admin/views/helloworlds/view.html.php|admin/views/helloworlds/view.html.php]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_ACL#admin/views/helloworlds/view.html.php|admin/views/helloworlds/view.html.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/views/helloworlds/tmpl/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/views/helloworlds/tmpl/index.html]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Basic_backend#admin/views/helloworlds/tmpl/default.php|admin/views/helloworlds/tmpl/default.php]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_categories#admin/views/helloworlds/tmpl/default.php|admin/views/helloworlds/tmpl/default.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/tables/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/tables/index.html]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Using_the_database#admin/tables/helloworld.php|admin/tables/helloworld.php]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_ACL#admin/tables/helloworld.php|admin/tables/helloworld.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/language/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/language/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/language/en-GB/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/language/en-GB/index.html]]''
* ''[[S:MyLanguage/J3.x:Developing an MVC Component/Adding language management#admin.2Flanguage.2Fen-GB.2Fen-GB.com_helloworld.ini|admin/language/en-GB/en-GB.com_helloworld.ini]]''
+
* ''[[S:MyLanguage/J3.x:Developing an MVC Component/Adding_ACL#admin.2Flanguage.2Fen-GB.2Fen-GB.com_helloworld.ini|admin/language/en-GB/en-GB.com_helloworld.ini]]''
* ''[[S:MyLanguage/J3.x:Developing an MVC Component/Adding language management#admin.2Flanguage.2Fen-GB.2Fen-GB.com_helloworld.sys.ini|admin/language/en-GB/en-GB.com_helloworld.sys.ini]]''
+
* ''[[S:MyLanguage/J3.x:Developing an MVC Component/Adding_decorations_to_the_backend#admin.2Flanguage.2Fen-GB.2Fen-GB.com_helloworld.sys.ini|admin/language/en-GB/en-GB.com_helloworld.sys.ini]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|media/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|media/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|media/images/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|media/images/index.html]]''
Line 1,169: Line 1,152:
 
<span id="helloworld.xml">
 
<span id="helloworld.xml">
 
<tt>helloworld.xml</tt>
 
<tt>helloworld.xml</tt>
<source lang="xml">
+
<source lang="xml" highlight="13">
 
<?xml version="1.0" encoding="utf-8"?>
 
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.2.0" method="upgrade">
+
<extension type="component" version="3.0" method="upgrade">
  
 
<name>COM_HELLOWORLD</name>
 
<name>COM_HELLOWORLD</name>
 
<!-- The following elements are optional and free of formatting constraints -->
 
<!-- The following elements are optional and free of formatting constraints -->
<creationDate>February 2015</creationDate>
+
<creationDate>January 2018</creationDate>
 
<author>John Doe</author>
 
<author>John Doe</author>
 
<authorEmail>john.doe@example.org</authorEmail>
 
<authorEmail>john.doe@example.org</authorEmail>
Line 1,268: Line 1,251:
 
* TDZweb (Ståle Rolf Sæbøe), Elin Waring, Neil via https://groups.google.com/forum/#!topic/joomla-dev-general/aCH3GNA91m4
 
* TDZweb (Ståle Rolf Sæbøe), Elin Waring, Neil via https://groups.google.com/forum/#!topic/joomla-dev-general/aCH3GNA91m4
 
*[[User:Scionescire|Scionescire]]
 
*[[User:Scionescire|Scionescire]]
 +
*[[User:Robbiej|Robbie Jackson]]
  
 
<div class="row">  
 
<div class="row">  
Line 1,275: Line 1,259:
 
__NOTOC__
 
__NOTOC__
 
<noinclude>
 
<noinclude>
[[Category:Joomla! 3.x/fr|Joomla! 3.x]]
+
[[Category:Joomla! 3.x{{#translation:}}]]
[[Category:Joomla! 3.0/fr|Joomla! 3.0]]
+
[[Category:Joomla! 3.0{{#translation:}}]]
[[Category:Joomla! 3.1/fr|Joomla! 3.1]]
+
[[Category:Joomla! 3.1{{#translation:}}]]
[[Category:Joomla! 3.2/fr|Joomla! 3.2]]
+
[[Category:Joomla! 3.2{{#translation:}}]]
[[Category:Joomla! 3.3/fr|Joomla! 3.3]]
+
[[Category:Joomla! 3.3{{#translation:}}]]
[[Category:Joomla! 3.4/fr|Joomla! 3.4]]
+
[[Category:Joomla! 3.4{{#translation:}}]]
[[Category:Beginner Development/fr|Développement pour débutants]]
+
[[Category:Beginner Development{{#translation:}}]]
[[Category:Component Development/fr|Développement de composants]]
+
[[Category:Component Development{{#translation:}}]]
[[Category:Tutorials/fr|Didacticiels]]
+
[[Category:Tutorials{{#translation:}}]]
[[Category:Tutorials in a Series/fr|Didacticiels en série]]
+
[[Category:Tutorials in a Series{{#translation:}}]]
 
</noinclude>
 
</noinclude>

Latest revision as of 23:52, 1 April 2019

Other languages:
English • ‎español • ‎français • ‎italiano • ‎العربية • ‎中文(台灣)‎
Joomla! 
3.x
Didacticiel
Développement d'un composant MVC

Ajout d'une requête de variable dans le type de menu

Utilisation de la base de données

Backend de base

Ajout de la gestion des langues

Ajout d'actions en backend

Ajout de décorations pour le backend

Ajout de vérifications

Ajout de catégories

Ajout de configuration

  1. Ajout d'ACL

Ajout d'un fichier script installation/désinstallation/mise à jour

Ajout d'un formulaire de frontend

  1. Ajout d'une image
  2. Ajout d'un plan
  3. Ajout d'AJAX
  4. Ajout d'un alias

Utilisation du filtre de langues

  1. Ajouter une fenêtre modale
  2. Ajout d'associations
  3. Ajout de Checkout
  4. Ajout d'un filtre
  5. Ajout de niveaux
  6. Ajout de versions
  7. Ajout de tags
  8. Ajout d'accès
  9. Ajout d'un processus de traitement
  10. Ajout d'un cache
  11. Ajout d'un fil d'actualité

Ajout d'un serveur de mise à jour

  1. Adding Custom Fields
  2. Upgrading to Joomla4



Ceci est une série qui regroupe plusieurs articles pour devenir un didacticiel sur la façon de développer un Composant pour Joomla! Joomla 3.x suivant le principe Modèle-Vue-Contrôleur.

Commencez avec l'introduction, et naviguez dans les articles de cette série soit à l'aide des boutons de navigation en bas des articles, soit grâce au menu de droite : Les articles de cette série.



Introduction

Ce didacticiel fait partie de la série de didacticiels sur le Développement d'un Composant MVC pour Joomla! 3.x. Vous êtes invité à lire les articles précédents de cette série avant de lire celui-ci.

Ajouter des contrôles d'accès

Grâce au contrôle d'accès de Joomla, nous pouvons définir les groupes d'utilisateurs qui sont autorisés ou non à faire des actions dans votre composant. Dans cet exemple, nous utilisons les actions qui sont définies nativement. Pour le composant dans son ensemble : core.admin (accès à la configuration) et core.manage (accès au backend). Et à différents niveaux d'actions tels que créer, supprimer et modifier. Outre ces actions natives, vous pouvez définir vos propres actions, mais cela n'est souvent pas nécessaire et ne figure donc pas dans cet exemple. L'accès Voir/Lire n'est pas géré via ces actions mais par les niveaux d'accès des vues. Consultez la documentation générale sur les ACL de Joomla pour cela.

La liste actuelle est stockée dans la table #__assets : quels sont les groupes d'utilisateurs autorisés ou non à faire quels types d'actions sur quelles ressources (assets). C'est l'implémentation de la liste de contrôle d'Accès (ACL).

Dans cet article, nous allons vous montrer comment ajouter et utiliser les droits d'accès à plusieurs niveaux : pour votre composant dans son ensemble, pour les catégories et pour les éléments individuels.

Afin de tester cette fonctionnalité, créez des utilisateurs et associez les à des groupes d'utilisateurs qui peuvent accéder au fonctionnalités de l'administration du site (ie les groupes d'utilisateurs qui ont les droits "Connexion à l'administration" dans la Configuration > Droits). Par défaut, il s'agit de Gestionnaire et Administrateur, mais vous pouvez également définir vos propres groupes d'utilisateur, et par exemple les créer en tant qu'enfant de Gestionnaire ou Administrateur.

Si vous n'êtes déjà très familiarisé avec le Contrôle d'Accès Joomla! alors il est recommandé de regarder cette vidéo entre la 2ème minute et la 32ème minute Explication sur la Liste de Contrôle d'Accès et lisez le Tutoriel sur la Liste de Contrôle d'Accès.

Trois vidéos sont associées avec les étapes de ce didacticiel pour traiter de l'Infrastructure de contrôle d'accès Joomla!, une explication de l'étape code du didactiel et une vidéo supplémentaire sur la vue des niveaux d'accès.

Pré-requis d'ACL minimum au niveau composant

Pour un composant sous Joomla! 2.5+, deux actions doivent être définies au niveau du composant afin de permettre la mise en oeuvre des ACL :

  • Configuration (core.admin): quels sont les groupes autorisés à configurer les droits au niveau du composant via le bouton 'Options' de la barre d'outils ?
  • Accès au composant (core.manage): quels sont les groupes autorisés à accéder au backend du composant ?

La mise en oeuvre de ces ACL de base se fait en 4 étapes simples :

Ajouter les 2 niveaux d'actions minimales du composant au fichier access.xml

Un fichier d'ACL minimal access.xml devrait contenir seulement ces 2 actions de base :

Basic admin/access.xml

<?xml version="1.0" encoding="utf-8" ?>
<access component="com_helloworld">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
	</section>
</access>

Consultez admin/access.xml pour voir la version actuelle et une version plus élaborée.

Ajouter les droits au fieldset du fichier config.xml

Ajoutez les droits de fieldset suivants au fichier admin/config.xml afin d'être en mesure de définir les niveaux de droits de notre composant.

	<fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC"
	>
		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			class="inputbox"
			validate="rules"
			filter="rules"
			component="com_helloworld"
			section="component"
		/>
	</fieldset>

Consultez ci-dessous un exemple plus élaboré d'un fichier config.xml pour voir où insérer exactement ce code.

Ajouter le bouton 'Options' à la barre d'outils lorsque l'utilisateur a les droits nécessaires

Dans le fichier admin/views/helloworlds/view.html.php, vous pouvez ajouter le code suivant afin de vérifier si l'utilisateur est en mesure de modifier les préférences :

    // Options button.
    if (JFactory::getUser()->authorise('core.admin', 'com_helloworld')) 
    {
	JToolBarHelper::preferences('com_helloworld');
    }

Consultez ci-après un exemple plus élaboré de admin/views/helloworlds/view.html.php dans lequel JToolBarHelper::preferences('com_helloworld') se fait dans une méthode addToolBar() conjointement avec les autres boutons de la barre d'outils et la vérification JUser->authorise() se fait avec JHelperContent, résultant en la propriété $canDo.

Restreindre l'accès au backend du composant aux seuls groupes d'utilisateurs autorisés

Afin de contrôler l'accès au backend du composant, ajoutez les lignes suivantes au fichier d'entrée admin/helloworld.php :

// Access check: is this user allowed to access the backend of this component?
if (!JFactory::getUser()->authorise('core.manage', 'com_helloworld')) 
{
	throw new Exception(JText::_('JERROR_ALERTNOAUTHOR'));
}

Consultez ci-dessous le code complet du fichier admin/helloworld.php.

Ajouter des actions supplémentaires, notamment aux niveaux des catégories et des éléments

Lors de l'ajout d'actions et de niveaux supplémentaires, ces quatre étapes sont également réalisées :

En outre, il nous faut également réaliser les étapes suivantes :

Décrire les actions dont vous souhaitez contrôler l'accès

Chaque composant (ou une partie) a son propre ensemble de droits pouvant être contrôlés. Ils sont décrits dans un fichier access.xml situé à la racine du dossier admin. Dans cet exemple helloworld, les actions dont l'accès est contrôlé sont divisées en trois sections : au niveau du composant, au niveau de la catégorie et au niveau de l'élément. Un 'élément' est appelé un 'message' dans notre exemple de composant, d'où le nom de la troisième section.

admin/access.xml

<?xml version="1.0" encoding="utf-8" ?>
<access component="com_helloworld">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="core.create" title="JACTION_CREATE" description="JACTION_CREATE_COMPONENT_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="JACTION_EDIT_COMPONENT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="JACTION_EDITSTATE_COMPONENT_DESC" />
		<action name="core.edit.own" title="JACTION_EDITOWN" description="JACTION_EDITOWN_COMPONENT_DESC" />
	</section>
	<section name="category">
		<action name="core.create" title="JACTION_CREATE" description="COM_CATEGORIES_ACCESS_CREATE_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="COM_CATEGORIES_ACCESS_DELETE_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="COM_CATEGORIES_ACCESS_EDIT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="COM_CATEGORIES_ACCESS_EDITSTATE_DESC" />
		<action name="core.edit.own" title="JACTION_EDITOWN" description="COM_CATEGORIES_ACCESS_EDITOWN_DESC" />
	</section>
	<section name="message">
		<action name="core.delete" title="JACTION_DELETE" description="COM_HELLOWORLD_ACCESS_DELETE_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="COM_HELLOWORLD_ACCESS_EDIT_DESC" />
	</section>
</access>

Ajouter les paramètres des droits dans les préférences du composant

Nous utilisons désormais les droits de contrôle d'accès dans notre composant, de ce fait, nous devons être en mesure de les définir au niveau du composant. Cela se fait via les préférences du composant : l'écran qui s'affiche après avoir cliqué sur le bouton 'Options'. Le fichier config.xml est un formulaire des définitions pour ces préférences. Nous pourrions également y définir les actions au niveau du composant, comme étant un enfant des règles de la balise field, mais il est préférable d'indiquer ces actions dans le fichier access.xml, ainsi, toutes les règles d'accès du composant seront en un seul et même endroit.

admin/config.xml

<?xml version="1.0" encoding="utf-8"?>
<config>
	<fieldset
		name="greetings"
		label="COM_HELLOWORLD_CONFIG_GREETING_SETTINGS_LABEL"
		description="COM_HELLOWORLD_CONFIG_GREETING_SETTINGS_DESC"
	>
		<field
			name="show_category"
			type="radio"
			label="COM_HELLOWORLD_HELLOWORLD_FIELD_SHOW_CATEGORY_LABEL"
			description="COM_HELLOWORLD_HELLOWORLD_FIELD_SHOW_CATEGORY_DESC"
			default="0"
		>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
	</fieldset>
	<fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC"
	>
		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			class="inputbox"
			validate="rules"
			filter="rules"
			component="com_helloworld"
			section="component"
		/>
	</fieldset>
</config>

Afficher uniquement les boutons de la barre d'outil de droite

Les boutons de la barre d'outils à afficher dépendent des droits d'accès de l'utilisateur.

En même temps que les composants de base de Joomla!, nous utilisons JHelperContent::getActions() pour trouver les droits. Nous passons à cette fonction le nom du composant, et elle retourne un objet contenant toutes les Actions associées au composant helloworld, ainsi que (pour chaque Action) le fait que l'utilisateur actuellement connecté a ou non ce droit. Si ensuite nous appelons get('une.action') sur cet objet, il retourne 'true' ou 'false', selon que l'utilisateur a ou non ce droit.

Dans le fichier admin/views/helloworlds/view.html.php, ajoutez ce code :

admin/views/helloworlds/view.html.php

<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_helloworld
 *
 * @copyright   Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * HelloWorlds View
 *
 * @since  0.0.1
 */
class HelloWorldViewHelloWorlds extends JViewLegacy
{
	/**
	 * Display the Hello World view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 */
	function display($tpl = null)
	{
		
		// Get application
		$app = JFactory::getApplication();
		$context = "helloworld.list.admin.helloworld";
		// Get data from the model
		$this->items		= $this->get('Items');
		$this->pagination	= $this->get('Pagination');
		$this->state		= $this->get('State');
		$this->filter_order	= $app->getUserStateFromRequest($context.'filter_order', 'filter_order', 'greeting', 'cmd');
		$this->filter_order_Dir = $app->getUserStateFromRequest($context.'filter_order_Dir', 'filter_order_Dir', 'asc', 'cmd');
		$this->filterForm    	= $this->get('FilterForm');
		$this->activeFilters 	= $this->get('ActiveFilters');

		// What Access Permissions does this user have? What can (s)he do?
		$this->canDo = JHelperContent::getActions('com_helloworld');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Set the submenu
		HelloWorldHelper::addSubmenu('helloworlds');

		// Set the toolbar and number of found items
		$this->addToolBar();

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolBar()
	{
		$title = JText::_('COM_HELLOWORLD_MANAGER_HELLOWORLDS');

		if ($this->pagination->total)
		{
			$title .= "<span style='font-size: 0.5em; vertical-align: middle;'>(" . $this->pagination->total . ")</span>";
		}

		JToolBarHelper::title($title, 'helloworld');

		if ($this->canDo->get('core.create')) 
		{
			JToolBarHelper::addNew('helloworld.add', 'JTOOLBAR_NEW');
		}
		if ($this->canDo->get('core.edit')) 
		{
			JToolBarHelper::editList('helloworld.edit', 'JTOOLBAR_EDIT');
		}
		if ($this->canDo->get('core.delete')) 
		{
			JToolBarHelper::deleteList('', 'helloworlds.delete', 'JTOOLBAR_DELETE');
		}
		if ($this->canDo->get('core.admin')) 
		{
			JToolBarHelper::divider();
			JToolBarHelper::preferences('com_helloworld');
		}
	}
	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument() 
	{
		$document = JFactory::getDocument();
		$document->setTitle(JText::_('COM_HELLOWORLD_ADMINISTRATION'));
	}
}

Dans le fichier admin/views/helloworld/view.html.php, ajoutez ce code :

admin/views/helloworld/view.html.php

<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_helloworld
 *
 * @copyright   Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * HelloWorld View
 *
 * @since  0.0.1
 */
class HelloWorldViewHelloWorld extends JViewLegacy
{
	protected $form;
	protected $item;
	protected $script;
	protected $canDo;

	/**
	 * Display the Hello World view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		// Get the Data
		$this->form = $this->get('Form');
		$this->item = $this->get('Item');
		$this->script = $this->get('Script');

		// What Access Permissions does this user have? What can (s)he do?
		$this->canDo = JHelperContent::getActions('com_helloworld', 'helloworld', $this->item->id);

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Set the toolbar
		$this->addToolBar();

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolBar()
	{
		$input = JFactory::getApplication()->input;

		// Hide Joomla Administrator Main menu
		$input->set('hidemainmenu', true);

		$isNew = ($this->item->id == 0);

		JToolBarHelper::title($isNew ? JText::_('COM_HELLOWORLD_MANAGER_HELLOWORLD_NEW')
		                             : JText::_('COM_HELLOWORLD_MANAGER_HELLOWORLD_EDIT'), 'helloworld');
		// Build the actions for new and existing records.
		if ($isNew)
		{
			// For new records, check the create permission.
			if ($this->canDo->get('core.create')) 
			{
				JToolBarHelper::apply('helloworld.apply', 'JTOOLBAR_APPLY');
				JToolBarHelper::save('helloworld.save', 'JTOOLBAR_SAVE');
				JToolBarHelper::custom('helloworld.save2new', 'save-new.png', 'save-new_f2.png',
				                       'JTOOLBAR_SAVE_AND_NEW', false);
			}
			JToolBarHelper::cancel('helloworld.cancel', 'JTOOLBAR_CANCEL');
		}
		else
		{
			if ($this->canDo->get('core.edit'))
			{
				// We can save the new record
				JToolBarHelper::apply('helloworld.apply', 'JTOOLBAR_APPLY');
				JToolBarHelper::save('helloworld.save', 'JTOOLBAR_SAVE');
 
				// We can save this record, but check the create permission to see
				// if we can return to make a new one.
				if ($this->canDo->get('core.create')) 
				{
					JToolBarHelper::custom('helloworld.save2new', 'save-new.png', 'save-new_f2.png',
					                       'JTOOLBAR_SAVE_AND_NEW', false);
				}
			}
			if ($this->canDo->get('core.create')) 
			{
				JToolBarHelper::custom('helloworld.save2copy', 'save-copy.png', 'save-copy_f2.png',
				                       'JTOOLBAR_SAVE_AS_COPY', false);
			}
			JToolBarHelper::cancel('helloworld.cancel', 'JTOOLBAR_CLOSE');
		}
	}
	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument() 
	{
		$isNew = ($this->item->id == 0);
		$document = JFactory::getDocument();
		$document->setTitle($isNew ? JText::_('COM_HELLOWORLD_HELLOWORLD_CREATING')
		                           : JText::_('COM_HELLOWORLD_HELLOWORLD_EDITING'));
		$document->addScript(JURI::root() . $this->script);
		$document->addScript(JURI::root() . "/administrator/components/com_helloworld"
		                                  . "/views/helloworld/submitbutton.js");
		JText::script('COM_HELLOWORLD_HELLOWORLD_ERROR_UNACCEPTABLE');
	}
}

Restreindre l'accès au composant

L'idée principale des ACL est de restreindre les actions à des groupes d'utilisateurs. La première action de restriction est l'accès au backend d'administration du composant lui-même. A l'aide de votre éditeur de fichier préféré, modifiez le fichier admin/helloworld.php et ajoutez ces lignes, contenant le contrôle d'accès.

admin/helloworld.php

<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_helloworld
 *
 * @copyright   Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// Set some global property
$document = JFactory::getDocument();
$document->addStyleDeclaration('.icon-helloworld {background-image: url(../media/com_helloworld/images/tux-16x16.png);}');

// Access check: is this user allowed to access the backend of this component?
if (!JFactory::getUser()->authorise('core.manage', 'com_helloworld'))
{
	throw new Exception(JText::_('JERROR_ALERTNOAUTHOR'));
}

// Require helper file
JLoader::register('HelloWorldHelper', JPATH_COMPONENT . '/helpers/helloworld.php');

// Get an instance of the controller prefixed by HelloWorld
$controller = JControllerLegacy::getInstance('HelloWorld');

// Perform the Request task
$controller->execute(JFactory::getApplication()->input->get('task'));;

// Redirect if set by the controller
$controller->redirect();

Ajouter la colonne asset_id à la table de la base de données

Afin d'être en mesure de travailler avec JTable, une colonne asset_id doit être ajoutée à la table #__helloworld de la base de données.

Ainsi, le fichier admin/sql/install.mysql.utf8.sql devient :

admin/sql/install.mysql.utf8.sql

DROP TABLE IF EXISTS `#__helloworld`;

CREATE TABLE `#__helloworld` (
	`id`       INT(11)     NOT NULL AUTO_INCREMENT,
	`asset_id` INT(10)     NOT NULL DEFAULT '0',
	`greeting` VARCHAR(25) NOT NULL,
	`published` tinyint(4) NOT NULL,
	`catid`	    int(11)    NOT NULL DEFAULT '0',
	`params`   VARCHAR(1024) NOT NULL DEFAULT '',
	PRIMARY KEY (`id`)
)
	ENGINE =MyISAM
	AUTO_INCREMENT =0
	DEFAULT CHARSET =utf8;

INSERT INTO `#__helloworld` (`greeting`) VALUES
('Hello World!'),
('Good bye World!');

Pour les mises à jour, nous ajoutons un fichier de mise à jour sql :

admin/sql/updates/mysql/0.0.14.sql

ALTER TABLE `#__helloworld` ADD COLUMN `asset_id` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `id`;

Restreindre l'accès aux messages

Jusqu'ici, nous avons restreint l'accès au composant lui-même, mais il nous faut également le faire au niveau du message.

Afin de vérifier les droits de "core.delete", il nous faut modifier la classe du modèle admin/models/helloworld.php en ajoutant ces lignes :

admin/models/helloworld.php

<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_helloworld
 *
 * @copyright   Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * HelloWorld Model
 *
 * @since  0.0.1
 */
class HelloWorldModelHelloWorld extends JModelAdmin
{
	/**
	 * Method to get a table object, load it if necessary.
	 *
	 * @param   string  $type    The table name. Optional.
	 * @param   string  $prefix  The class prefix. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JTable  A JTable object
	 *
	 * @since   1.6
	 */
	public function getTable($type = 'HelloWorld', $prefix = 'HelloWorldTable', $config = array())
	{
		return JTable::getInstance($type, $prefix, $config);
	}

	/**
	 * Method to get the record form.
	 *
	 * @param   array    $data      Data for the form.
	 * @param   boolean  $loadData  True if the form is to load its own data (default case), false if not.
	 *
	 * @return  mixed    A JForm object on success, false on failure
	 *
	 * @since   1.6
	 */
	public function getForm($data = array(), $loadData = true)
	{
		// Get the form.
		$form = $this->loadForm(
			'com_helloworld.helloworld',
			'helloworld',
			array(
				'control' => 'jform',
				'load_data' => $loadData
			)
		);

		if (empty($form))
		{
			return false;
		}

		return $form;
	}
	/**
	 * Method to get the script that have to be included on the form
	 *
	 * @return string	Script files
	 */
	public function getScript() 
	{
		return 'administrator/components/com_helloworld/models/forms/helloworld.js';
	}
	/**
	 * Method to get the data that should be injected in the form.
	 *
	 * @return  mixed  The data for the form.
	 *
	 * @since   1.6
	 */
	protected function loadFormData()
	{
		// Check the session for previously entered form data.
		$data = JFactory::getApplication()->getUserState(
			'com_helloworld.edit.helloworld.data',
			array()
		);

		if (empty($data))
		{
			$data = $this->getItem();
		}

		return $data;
	}
	/**
	 * Method to check if it's OK to delete a message. Overrides JModelAdmin::canDelete
	 */
	protected function canDelete($record)
	{
		if( !empty( $record->id ) )
		{
			return JFactory::getUser()->authorise( "core.delete", "com_helloworld.helloworld." . $record->id );
		}
	}
}

Afin de pouvoir contrôler "core.edit" (et, si vous le souhaitez, core.add), vous devez mettre à jour le sous-contrôleur (pas le modèle). Je ne suis pas sûr de savoir pourquoi il en est ainsi, mais c'est ainsi que procède les autres composants standards de Joomla. Ajoutez les lignes suivantes au fichier admin/controllers/helloworld.php :

admin/controllers/helloworld.php

<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_helloworld
 *
 * @copyright   Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * HelloWorld Controller
 *
 * @package     Joomla.Administrator
 * @subpackage  com_helloworld
 * @since       0.0.9
 */
class HelloWorldControllerHelloWorld extends JControllerForm
{
	/**
	* Implement to allowAdd or not
	*
	* Not used at this time (but you can look at how other components use it....)
	* Overwrites: JControllerForm::allowAdd
	*
	* @param array $data
	* @return bool
	*/
	protected function allowAdd($data = array())
	{
		return parent::allowAdd($data);
	}
	/**
	* Implement to allow edit or not
	* Overwrites: JControllerForm::allowEdit
	*
	* @param array $data
	* @param string $key
	* @return bool
	*/
	protected function allowEdit($data = array(), $key = 'id')
	{
		$id = isset( $data[ $key ] ) ? $data[ $key ] : 0;
		if( !empty( $id ) )
		{
			return JFactory::getUser()->authorise( "core.edit", "com_helloworld.helloworld." . $id );
		}
	}
}

Vous remarquerez que allowAdd appelle simplement son parent. Je l'ai ajouté ici dans le cas où vous souhaiteriez l'utiliser dans votre composant. Si vous jetez un oeil à votre fichier admin/access.xml, vous remarquerez qu'aucune action core.add n'est définie pour les messages, il vous faudra donc, si besoin, l'ajouter, de même si vous souhaitez être en mesure de la configurer dans l'interface.

Paramétrer les valeurs de droits dans la table des assets

Afin de stocker les droits pour chaque message dans la table des assets de la base de données, in nous faut instruire la classe de la table associée au modèle afin d'enregistrer ces droits dans la table des assets.

JTable fournit non seulement une interface pour stocker les données de l'enregistrement lui-même dans l'élément de la table de base de données, mais aussi pour stocker les autorisations de cet enregistrement dans la table d'assets de la base de données. Par conséquent, nous devons ajouter des informations à la méthode bind() concernant les valeurs des droits. Nous devons également indiquer le nom de l'asset, son titre et l'id de l'asset parent via la JTable helloworld. Nous remplaçons donc 3 méthodes :

  • _getAssetName(): un nom unique pour cet asset, par lequel il peut être récupéré,
  • _getAssetTitle(): une façon plus conviviale d'identifier l'asset (n'a pas besoin d'être unique),
  • _getAssetParentId(): l'id d'asset du parent dans la table d'asset de la base de données (à partir duquel les droits sont hérités).

admin/tables/helloworld.php

<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_helloworld
 *
 * @copyright   Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
// No direct access
defined('_JEXEC') or die('Restricted access');

/**
 * Hello Table class
 *
 * @since  0.0.1
 */
class HelloWorldTableHelloWorld extends JTable
{
	/**
	 * Constructor
	 *
	 * @param   JDatabaseDriver  &$db  A database connector object
	 */
	function __construct(&$db)
	{
		parent::__construct('#__helloworld', 'id', $db);
	}
	/**
	 * Overloaded bind function
	 *
	 * @param       array           named array
	 * @return      null|string     null is operation was satisfactory, otherwise returns an error
	 * @see JTable:bind
	 * @since 1.5
	 */
	public function bind($array, $ignore = '')
	{
		if (isset($array['params']) && is_array($array['params']))
		{
			// Convert the params field to a string.
			$parameter = new JRegistry;
			$parameter->loadArray($array['params']);
			$array['params'] = (string)$parameter;
		}

		// Bind the rules.
		if (isset($array['rules']) && is_array($array['rules']))
		{
			$rules = new JAccessRules($array['rules']);
			$this->setRules($rules);
		}

		return parent::bind($array, $ignore);
	}

	/**
	 * Method to compute the default name of the asset.
	 * The default name is in the form `table_name.id`
	 * where id is the value of the primary key of the table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetName()
	{
		$k = $this->_tbl_key;
		return 'com_helloworld.helloworld.'.(int) $this->$k;
	}
	/**
	 * Method to return the title to use for the asset table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetTitle()
	{
		return $this->greeting;
	}
	/**
	 * Method to get the asset-parent-id of the item
	 *
	 * @return	int
	 */
	protected function _getAssetParentId(JTable $table = NULL, $id = NULL)
	{
		// We will retrieve the parent-asset from the Asset-table
		$assetParent = JTable::getInstance('Asset');
		// Default: if no asset-parent can be found we take the global asset
		$assetParentId = $assetParent->getRootId();

		// Find the parent-asset
		if (($this->catid)&& !empty($this->catid))
		{
			// The item has a category as asset-parent
			$assetParent->loadByName('com_helloworld.category.' . (int) $this->catid);
		}
		else
		{
			// The item has the component as asset-parent
			$assetParent->loadByName('com_helloworld');
		}

		// Return the found asset-parent-id
		if ($assetParent->id)
		{
			$assetParentId=$assetParent->id;
		}
		return $assetParentId;
	}
}

Le code pour _getAssetParentId() ci-dessus utilise JTableAsset pour récupérer l'id d'asset de l'asset parent. Ce qui diffère du code de la version actuelle du com_content, où l'id d'asset de la catégorie est récupéré à partir de la table #__categories de la base de données. Ceci est donc une autre possibilité, plusieurs chemins mènent à Rome. Toutefois, dans com_content, si un élément n'est pas catégorisé, alors l'id d'asset de l'asset général est retourné. Bien sur, ce ne serait pas bon, cela est corrigé ici en indiquant une catégorie par défaut uncategorised, de sorte qu'un article soit toujours catégorisé.

Afficher le réglage des droits au niveau de l'élément

Ajoutez le field rules au formulaire de définition du formulaire d'édition.

admin/models/forms/helloworld.xml

<?xml version="1.0" encoding="utf-8"?>
<form
				addrulepath="/administrator/components/com_helloworld/models/rules"
>
	<fieldset
				name="details"
				label="COM_HELLOWORLD_HELLOWORLD_DETAILS"
	>
		<field
				name="id"
				type="hidden"
				/>
		<field
				name="greeting"
				type="text"
				label="COM_HELLOWORLD_HELLOWORLD_GREETING_LABEL"
				description="COM_HELLOWORLD_HELLOWORLD_GREETING_DESC"
				size="40"
				class="inputbox validate-greeting"
				validate="greeting"
				required="true"
				default=""
				/>
		<field
				name="catid"
				type="category"
				extension="com_helloworld"
				class="inputbox"
				default=""
				label="COM_HELLOWORLD_HELLOWORLD_FIELD_CATID_LABEL"
				description="COM_HELLOWORLD_HELLOWORLD_FIELD_CATID_DESC"
				required="true"
		>
			<option value="0">JOPTION_SELECT_CATEGORY</option>
		</field>
	</fieldset>
	<fields name="params">
		<fieldset
				name="params"
				label="JGLOBAL_FIELDSET_DISPLAY_OPTIONS"
		>
			<field
					name="show_category"
					type="list"
					label="COM_HELLOWORLD_HELLOWORLD_FIELD_SHOW_CATEGORY_LABEL"
					description="COM_HELLOWORLD_HELLOWORLD_FIELD_SHOW_CATEGORY_DESC"
					default=""
			>
				<option value="">JGLOBAL_USE_GLOBAL</option>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>
		</fieldset>
	</fields>
	<fieldset
			name="accesscontrol"
			label="COM_HELLOWORLD_FIELDSET_RULES"
	>
    	<field
				name="asset_id"
				type="hidden"
				filter="unset"
				/>
    	<field
				name="rules"
				type="rules"
				label="COM_HELLOWORLD_FIELD_RULES_LABEL"
				filter="rules"
				validate="rules"
				class="inputbox"
				component="com_helloworld"
				section="message"
				/>
    </fieldset>
</form>

La version précédente du fichier de layout edit.php va afficher le champ des droits automatiquement ; cependant, nous avons modifié le layout pour réaliser un affichage sous forme d'onglets, comme c'est le cas des autres composants Joomla!. Lorsqu'un utilisateur change un droit, un appel Ajax recalcule le Paramètre Calculé (Calculated Setting), et nous avons besoin d'un peu de javascript afin que cela fonctionne.

admin/views/helloworld/tmpl/edit.php

<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_helloworld
 *
 * @copyright   Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

// No direct access
defined('_JEXEC') or die('Restricted access');
JHtml::_('behavior.formvalidator');

// The following is to enable setting the permission's Calculated Setting 
// when you change the permission's Setting. 
// The core javascript code for initiating the Ajax request looks for a field
// with id="jform_title" and sets its value as the 'title' parameter to send in the Ajax request
JFactory::getDocument()->addScriptDeclaration('
	jQuery(document).ready(function() {
        greeting = jQuery("#jform_greeting").val();
		jQuery("#jform_title").val(greeting);
	});
');

?>
<form action="<?php echo JRoute::_('index.php?option=com_helloworld&layout=edit&id=' . (int) $this->item->id); ?>"
    method="post" name="adminForm" id="adminForm" class="form-validate">
    
    <input id="jform_title" type="hidden" name="helloworld-message-title"/>
    
    <div class="form-horizontal">

    <?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'details')); ?>
    <?php echo JHtml::_('bootstrap.addTab', 'myTab', 'details', 
        empty($this->item->id) ? JText::_('COM_HELLOWORLD_TAB_NEW_MESSAGE') : JText::_('COM_HELLOWORLD_TAB_EDIT_MESSAGE')); ?>
        <fieldset class="adminform">
            <legend><?php echo JText::_('COM_HELLOWORLD_LEGEND_DETAILS') ?></legend>
            <div class="row-fluid">
                <div class="span6">
                    <?php echo $this->form->renderFieldset('details');  ?>
                </div>
            </div>
        </fieldset>
    <?php echo JHtml::_('bootstrap.endTab'); ?>

    <?php echo JHtml::_('bootstrap.addTab', 'myTab', 'params', JText::_('COM_HELLOWORLD_TAB_PARAMS')); ?>
        <fieldset class="adminform">
            <legend><?php echo JText::_('COM_HELLOWORLD_LEGEND_PARAMS') ?></legend>
            <div class="row-fluid">
                <div class="span6">
                    <?php echo $this->form->renderFieldset('params');  ?>
                </div>
            </div>
        </fieldset>
    <?php echo JHtml::_('bootstrap.endTab'); ?>

    <?php echo JHtml::_('bootstrap.addTab', 'myTab', 'permissions', JText::_('COM_HELLOWORLD_TAB_PERMISSIONS')); ?>
        <fieldset class="adminform">
            <legend><?php echo JText::_('COM_HELLOWORLD_LEGEND_PERMISSIONS') ?></legend>
            <div class="row-fluid">
                <div class="span12">
                    <?php echo $this->form->renderFieldset('accesscontrol');  ?>
                </div>
            </div>
        </fieldset>
    <?php echo JHtml::_('bootstrap.endTab'); ?>
    <?php echo JHtml::_('bootstrap.endTabSet'); ?>

    </div>
    <input type="hidden" name="task" value="helloworld.edit" />
    <?php echo JHtml::_('form.token'); ?>
</form>

Ajouter des chaînes de langue

Nous avons utilisé plusieurs chaînes de caractères de langues qui doivent être ajoutées au fichier de langues du backend.

admin/language/en-GB/en-GB.com_helloworld.ini

; Joomla! Project
; Copyright (C) 2005 - 2018 Open Source Matters. All rights reserved.
; License GNU General Public License version 2 or later; see LICENSE.txt, see LICENSE.php
; Note : All ini files need to be saved as UTF-8

COM_HELLOWORLD_ADMINISTRATION="HelloWorld - Administration"
COM_HELLOWORLD_ADMINISTRATION_CATEGORIES="HelloWorld - Categories"
COM_HELLOWORLD_NUM="#"
COM_HELLOWORLD_HELLOWORLDS_FILTER="Filters"
COM_HELLOWORLD_PUBLISHED="Published"
COM_HELLOWORLD_HELLOWORLDS_NAME="Name"
COM_HELLOWORLD_ID="Id"

COM_HELLOWORLD_HELLOWORLD_CREATING="HelloWorld - Creating"
COM_HELLOWORLD_HELLOWORLD_DETAILS="Details"
COM_HELLOWORLD_HELLOWORLD_EDITING="HelloWorld - Editing"
COM_HELLOWORLD_HELLOWORLD_ERROR_UNACCEPTABLE="Some values are unacceptable"
COM_HELLOWORLD_HELLOWORLD_FIELD_CATID_DESC="The category the messages belongs to"
COM_HELLOWORLD_HELLOWORLD_FIELD_CATID_LABEL="Category"
COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_DESC="This message will be displayed"
COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_LABEL="Message"
COM_HELLOWORLD_HELLOWORLD_FIELD_SHOW_CATEGORY_LABEL="Show category"
COM_HELLOWORLD_HELLOWORLD_FIELD_SHOW_CATEGORY_DESC="If set to Show, the title of the message&rsquo;s category will show."
COM_HELLOWORLD_HELLOWORLD_HEADING_GREETING="Greeting"
COM_HELLOWORLD_HELLOWORLD_HEADING_ID="Id"
COM_HELLOWORLD_MANAGER_HELLOWORLD_EDIT="HelloWorld manager: Edit Message"
COM_HELLOWORLD_MANAGER_HELLOWORLD_NEW="HelloWorld manager: New Message"
COM_HELLOWORLD_MANAGER_HELLOWORLDS="HelloWorld manager"
COM_HELLOWORLD_EDIT_HELLOWORLD="Edit message"
COM_HELLOWORLD_N_ITEMS_DELETED_1="One message deleted"
COM_HELLOWORLD_N_ITEMS_DELETED_MORE="%d messages deleted"
COM_HELLOWORLD_N_ITEMS_PUBLISHED="%d message(s) published"
COM_HELLOWORLD_N_ITEMS_UNPUBLISHED="%d message(s) unpublished"
COM_HELLOWORLD_HELLOWORLD_GREETING_LABEL="Greeting"
COM_HELLOWORLD_HELLOWORLD_GREETING_DESC="Add Hello World Greeting"
COM_HELLOWORLD_SUBMENU_MESSAGES="Messages"
COM_HELLOWORLD_SUBMENU_CATEGORIES="Categories"
COM_HELLOWORLD_CONFIGURATION="HelloWorld Configuration"
COM_HELLOWORLD_CONFIG_GREETING_SETTINGS_LABEL="Messages settings"
COM_HELLOWORLD_CONFIG_GREETING_SETTINGS_DESC="Settings that will be applied to all messages by default"
COM_HELLOWORLD_FIELDSET_RULES="Message Permissions"
COM_HELLOWORLD_FIELD_RULES_LABEL="Permissions"
COM_HELLOWORLD_ACCESS_EDIT_DESC="Is this group allowed to edit this message?"
COM_HELLOWORLD_ACCESS_DELETE_DESC="Is this group allowed to delete this message?"
COM_HELLOWORLD_TAB_NEW_MESSAGE="New Message"
COM_HELLOWORLD_TAB_EDIT_MESSAGE="Edit Message"
COM_HELLOWORLD_TAB_PARAMS="Parameters"
COM_HELLOWORLD_TAB_PERMISSIONS="Permissions"
COM_HELLOWORLD_LEGEND_DETAILS="Message Details"
COM_HELLOWORLD_LEGEND_PARAMS="Message Parameters"
COM_HELLOWORLD_LEGEND_PERMISSIONS="Message Permissions"

A lire

Pour plus d'informations sur les actions, les assets et les ACL, veuillez consulter les sur les pages suivantes :

Empaqueter le composant

Contenu de votre répertoire de code. Chaque lien ci-dessous vous emmène vers l'étape du didacticiel qui contient la dernière version du code source de ce fichier.

Créez un fichier compressé de ce répertoire ou téléchargez directement l'archive et installez-le en utilisant le gestionnaire des extensions Joomla. Vous pouvez ajouter un élément de menu pour ce composant à l'aide du gestionnaire de menus dans le backend.

helloworld.xml

<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.0" method="upgrade">

	<name>COM_HELLOWORLD</name>
	<!-- The following elements are optional and free of formatting constraints -->
	<creationDate>January 2018</creationDate>
	<author>John Doe</author>
	<authorEmail>john.doe@example.org</authorEmail>
	<authorUrl>http://www.example.org</authorUrl>
	<copyright>Copyright Info</copyright>
	<license>License Info</license>
	<!--  The version string is recorded in the components table -->
	<version>0.0.14</version>
	<!-- The description is optional and defaults to the name -->
	<description>COM_HELLOWORLD_DESCRIPTION</description>

	<install> <!-- Runs on install -->
		<sql>
			<file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
		</sql>
	</install>
	<uninstall> <!-- Runs on uninstall -->
		<sql>
			<file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
		</sql>
	</uninstall>
	<update> <!-- Runs on update; New since J2.5 -->
		<schemas>
			<schemapath type="mysql">sql/updates/mysql</schemapath>
		</schemas>
	</update>

	<!-- Site Main File Copy Section -->
	<!-- Note the folder attribute: This attribute describes the folder
		to copy FROM in the package to install therefore files copied
		in this section are copied from /site/ in the package -->
	<files folder="site">
		<filename>index.html</filename>
		<filename>helloworld.php</filename>
		<filename>controller.php</filename>
		<folder>views</folder>
		<folder>models</folder>
	</files>

        <languages folder="site/language">
		<language tag="en-GB">en-GB/en-GB.com_helloworld.ini</language>
        </languages>

	<media destination="com_helloworld" folder="media">
		<filename>index.html</filename>
		<folder>images</folder>
	</media>

	<administration>
		<!-- Administration Menu Section -->
		<menu link='index.php?option=com_helloworld' img="../media/com_helloworld/images/tux-16x16.png">COM_HELLOWORLD_MENU</menu>
		<!-- Administration Main File Copy Section -->
		<!-- Note the folder attribute: This attribute describes the folder
			to copy FROM in the package to install therefore files copied
			in this section are copied from /admin/ in the package -->
		<files folder="admin">
			<!-- Admin Main File Copy Section -->
			<filename>index.html</filename>
			<filename>config.xml</filename>
			<filename>helloworld.php</filename>
			<filename>controller.php</filename>
			<filename>access.xml</filename>
			<!-- SQL files section -->
			<folder>sql</folder>
			<!-- tables files section -->
			<folder>tables</folder>
			<!-- models files section -->
			<folder>models</folder>
			<!-- views files section -->
			<folder>views</folder>
			<!-- controllers files section -->
			<folder>controllers</folder>
			<!-- helpers files section -->
			<folder>helpers</folder>
		</files>
		<languages folder="admin/language">
        		<language tag="en-GB">en-GB/en-GB.com_helloworld.ini</language>
                        <language tag="en-GB">en-GB/en-GB.com_helloworld.sys.ini</language>
		</languages>
	</administration>

</extension>

Contributeurs