Difference between revisions of "Adding custom fields to core components using a plugin/fr"

From Joomla! Documentation

(Updating to match new version of source page)
 
(48 intermediate revisions by 3 users not shown)
Line 1: Line 1:
 
<noinclude><languages /></noinclude>
 
<noinclude><languages /></noinclude>
Avez-vous jamais souhaité ajouter un champ pour un numéro de téléphone supplémentaire dans com_contact ou eu besoin d'un champ supplémentaire pour les articles dans com_content ? Joomla! propose une méthode simple pour intégrer de nouveaux champs aux composants du noyau. Tout ce qu'il faut pour atteindre cet objectif, c'est un simple plugin de contenu et un override de votre template.
+
Avez-vous jamais souhaité ajouter un champ pour un numéro de téléphone supplémentaire dans com_contact ou eu besoin d'un champ supplémentaire pour les articles dans com_content ? Joomla! propose une méthode simple pour intégrer de nouveaux champs aux composants du noyau. Tout ce qu'il faut pour atteindre cet objectif, c'est un simple plug-in de contenu et une substitution de votre template.
  
Cet article montre comment ajouter un champ supplémentaire à un composant natif en utilisant l'exemple de l'ajout aux contacts d'une adresse e-mail supplémentaire dans com_contact.
+
Cet article montre comment ajouter un champ supplémentaire à un composant natif en utilisant l'exemple de l'ajout aux contacts d'une adresse de courriel supplémentaire dans com_contact. Si vous avez besoin d'ajouter des champs personnalisés au com_content pour vos articles Joomla, il vous suffit de modifier les références <tt>contact</tt> par <tt>content</tt> dans le code ci-dessous. Veuillez noter que com_content utilise <tt>attribs</tt> et non pas <tt>params</tt> pour les champs de valeur ainsi que pour les overrides.
  
 
==Ajout d'un champ personnalisé==
 
==Ajout d'un champ personnalisé==
Il est recommandé de lire au préalable [[S:MyLanguage/Creating a Plugin for Joomla|Création d'un plugin pour Joomla!]] pour plus d'informations sur la façon de créer et installer un plugin, ce qui n'est pas abordé ici.
+
Il est recommandé de lire au préalable [[S:MyLanguage/Creating a Plugin for Joomla|Création d'un plug-in pour Joomla!]] pour plus d'informations sur la façon de créer et installer un plug-in, ce qui n'est pas abordé ici.
  
Pour ajouter un champ à un composant du système, vous devez créer un plugin de contenu qui reprend l'événement onContentPrepareForm et insère ses propres champs au JForm donné. Le code suivant est pour Joomla! 3.1 et versions ultérieures. Pour Joomla! 2.5, les fichiers de langue doivent être chargés dans le constructeur (voir [[S:MyLanguage/J2.5:Creating a Plugin for Joomla|J2.5:création d'un plugin pour Joomla]]).
+
Pour ajouter un champ à un composant du système, vous devez créer un plug-in de contenu qui reprend l'événement onContentPrepareForm et insère ses propres champs au JForm donné. Le code suivant est pour Joomla! 3.1 et versions ultérieures.
  
 
<source lang="php">
 
<source lang="php">
 
<?php
 
<?php
 
// no direct access
 
// no direct access
defined ( '_JEXEC' ) or die ( 'Restricted access' );
+
defined ('_JEXEC') or die;
class plgContentExample extends JPlugin {
+
class plgContentExample extends JPlugin
 +
{
 
/**
 
/**
 
* Load the language file on instantiation.
 
* Load the language file on instantiation.
Line 20: Line 21:
 
*
 
*
 
* @var boolean
 
* @var boolean
* @since 3.1
+
* @since <your version>
 
*/
 
*/
 
protected $autoloadLanguage = true;
 
protected $autoloadLanguage = true;
function onContentPrepareForm($form, $data) {
+
 
$app = JFactory::getApplication();
+
/**
 +
* Prepare form and add my field.
 +
*
 +
* @param  JForm  $form  The form to be altered.
 +
* @param  mixed  $data  The associated data for the form.
 +
*
 +
* @return  boolean
 +
*
 +
* @since  <your version>
 +
*/
 +
function onContentPrepareForm($form, $data)
 +
{
 +
$app   = JFactory::getApplication();
 
$option = $app->input->get('option');
 
$option = $app->input->get('option');
switch($option) {
+
 
case 'com_contact':
+
switch($option)
if ($app->isAdmin()) {
+
{
 +
case 'com_contact' :
 +
if ($app->isClient('administrator'))
 +
{
 
JForm::addFormPath(__DIR__ . '/forms');
 
JForm::addFormPath(__DIR__ . '/forms');
 
$form->loadFile('contact', false);
 
$form->loadFile('contact', false);
 
}
 
}
 +
 
return true;
 
return true;
 
}
 
}
 +
 
return true;
 
return true;
 
}
 
}
Line 40: Line 58:
 
</source>
 
</source>
  
The additional fields are loaded from the file forms/contact.xml in the plugin directory. It's important that these fields are in a fields element with the name property set to "params". If you don't set this property name, the fields will appear in the admin site but the values will not be saved.
+
===Activation de l'édition des champs personnalisés en frontend===
 +
 
 +
Activer l'édition en frontend de vos champs personnalisés est assez facile.
 +
Pour ajouter des champs à votre formulaire d'édition de contenu en frontend, il suffit d'ajouter le bloc de code suivant :
 +
 
 +
<source lang="php">
 +
case 'com_contact':
 +
if ($app->isClient('site'))
 +
{
 +
JForm::addFormPath(__DIR__ . '/forms');
 +
$form->loadFile('contact', false);
 +
}
 +
return true;
 +
</source>
 +
 
 +
Ajoutez ceci immédiatement au-dessous de l'instance existante.
 +
 
 +
Une fois que vous avez fait cela, créez une substitution de template pour le fichier formulaire de contenu <tt>edit.php</tt>. Si vous souhaitez la création d'un ensemble de champs personnalisés pour le ''com_contact'', vous devez copier <tt>/components/com_contact/views/form/tmpl/edit.php</tt> vers <tt>/templates/your-template-name/html/com_contact/form/edit.php</tt>.
 +
 
 +
À l'intérieur de votre substitution de rendu, ajoutez les nouveaux champs de formulaire que vous souhaitez à l'emplacement où vous désirez qu'ils s'affichent (par exemple, en dessous du titre ou en dessous de la description), en vous assurant que les noms des champs correspondent bien à ceux du fichier XML de votre plugin fichier que nous allons créer maintenant.
 +
 
 +
<source lang="php">
 +
<?php // Checking if this is an existing item or not ?>
 +
<?php if ($this->item->id) : ?>
 +
  <?php // If it is an existing item, get the attribs part of the existing record ?>
 +
  <?php $attribs = json_decode($this->item->attribs); ?>
 +
  <?php // Set the value of the custom field to what is already saved. ?>
 +
  <?php // Duplicate for the number of fields you need, changing the field_name as needed. ?>
 +
  <?php echo $this->form->setValue('field_name', 'attribs', $attribs->field_name); ?>
 +
<?php endif; ?>
 +
<?php // This line needs added to the file right where you want to display it. So, if you want it to show right after the description field, find the description field and place this right after it. Duplicate for the number of fields you need, changing the field_name as needed. ?>
 +
<?php // Now we display the field. If we are editing an existing item, the previously saved data will be populated already ?>
 +
<?php echo $this->form->renderField('field_name', 'attribs'); ?>
 +
</source>
 +
 
 +
Ceci fait, vos champs apparaîtront et seront stockés via l'interface d'édition en frontend.
  
In this case we are adding a field for a label to describe the email field in the public website and a second field for the value of the email address.
+
Les champs supplémentaires sont chargés à partir du fichier forms/contact.xml dans le répertoire de plug-in. Il est important que ces champs soient dans un élément "fields" avec la propriété "name" définie sur "params". Si vous ne définissez pas cela ainsi, les champs s'afficheront dans l'administration du site mais les valeurs ne seront pas enregistrées.
 +
Remarque : dans com_content, votre champ doit être nommé <tt><fields name="attribs"></tt> sinon les champs apparaitront dans l'admin du site mais les valeurs ne seront pas enregistrées.
 +
 
 +
Dans ce cas, nous ajoutons un champ pour une étiquette afin de décrire le champ courriel sur la partie public du site web et un deuxième champ pour la valeur de l'adresse.
  
 
<source lang="xml">
 
<source lang="xml">
 
<?xml version="1.0" encoding="UTF-8"?>
 
<?xml version="1.0" encoding="UTF-8"?>
 
<form>
 
<form>
<fields name="params" >
+
<fields name="params">
<fieldset name="params" >
+
<fieldset name="params" label="PLG_CONTENT_EXAMPLE_FIELDSET_LABEL">
 
<field
 
<field
 
name="contact_emaillabel2"
 
name="contact_emaillabel2"
 
type="text"
 
type="text"
 
label="PLG_CONTENT_EXAMPLE_CONTACT_EMAILLABEL2"
 
label="PLG_CONTENT_EXAMPLE_CONTACT_EMAILLABEL2"
/>
+
/>
 
<field
 
<field
 
name="contact_email2"
 
name="contact_email2"
Line 65: Line 121:
 
</source>
 
</source>
  
Finally we need a language file so that the parameters are presented nicely in the admin site and are translatable into different languages. This file needs to be called something like <tt>en-GB.plg_content_example.ini</tt>.
+
Enfin, nous avons besoin d'un fichier de langue de sorte que les paramètres soient présentés correctement dans l'administration du site et soient traduisibles dans d'autres langues. Ce fichier doit être nommé quelque chose comme <tt>en-GB.plg_content_example.ini</tt>.
  
<source>
+
<source lang="ini">
COM_CONTACT_PARAMS_FIELDSET_LABEL="Additional Information"
+
PLG_CONTENT_EXAMPLE_FIELDSET_LABEL="Additional Information"
 
PLG_CONTENT_EXAMPLE_CONTACT_EMAIL2="Additional email address"
 
PLG_CONTENT_EXAMPLE_CONTACT_EMAIL2="Additional email address"
 
PLG_CONTENT_EXAMPLE_CONTACT_EMAILLABEL2="Additional email label"
 
PLG_CONTENT_EXAMPLE_CONTACT_EMAILLABEL2="Additional email label"
 
</source>
 
</source>
  
That's it for adding the field to com_contact. If you install this plugin, you'll have an additional tab in the contact editing form called "Additional Information" with the new fields included. If you fill in the new label and email address fields for a contact, you'll see that com_contact will store and retrieve the information for you.
+
Cela permet d'ajouter le champ au com_contact. Si vous installez ce plug-in, vous aurez un onglet supplémentaire dans l'édition du formulaire de contact formulaire nommé "Additional Information" comprenant les nouveaux champs. Si vous remplissez les nouveaux champs d'étiquette et d'adresse de courriel pour un contact, vous verrez que le com_contact va stocker et récupérer les informations pour vous.
  
The same plugin can be used to add more fields to different components; just add the relevant code into the onContentPrepareForm function and create the appropriate XML form files.
+
Le même plug-in peut être utilisé pour ajouter des champs supplémentaires à d'autres composants, il suffit d'ajouter le code à la fonction onContentPrepareForm et de créer les fichiers de formulaire XML appropriés.
  
==Displaying the Custom Field==
+
==Afficher le champ personnalisé==
To display the custom field you need to create a layout override for the relevant component in your template. For more details on creating templates see [[S:MyLanguage/Creating a basic Joomla! template|Creating a basic Joomla! template]]. For details on layout overrides, see [[S:MyLanguage/Understanding Output Overrides|Understanding Output Overrides]].
+
Pour afficher le champ personnalisé, vous devez créer une subsitution de mise en page (layout) dans votre template pour le composant concerné. Pour plus d'informations sur la création de templates, voir [[S:MyLanguage/Creating a basic Joomla! template|création d'un template de base pour Joomla]]. Pour plus d'informations sur les substitutions de mise en page (layout), voir [[S:MyLanguage/Understanding Output Overrides|comprendre les substitutions de sortie]].
  
Copy the file <tt><Joomla>/components/com_contact/views/contact/tmpl/default.php</tt> to <tt><template>/html/com_contact/contact/default.php</tt>, creating the folders in your template as necessary. We're going to edit this file to include the additional information. The com_contact component will automatically load the additional fields for us and load it into a variable called $this->params. All we need to do is check that the data is set and, if so, display it.
+
Copiez le fichier <tt><Joomla>/components/com_contact/views/contact/tmpl/default.php</tt> dans <tt><template>/html/com_contact/contact/default.php</tt>, créez les dossiers dans votre template si nécessaire. Nous allons modifier ce fichier pour inclure les informations supplémentaires. Le composant com_contact va automatiquement charger les champs supplémentaires et ce, dans une variable nommée $this->params. Tout ce que nous avons à faire est de vérifier que les données sont définies et le cas échéant, de les afficher.
  
To display the field, find the location in <template>/html/com_contact/contact/default.php that corresponds to where you'd like the additional email address to be displayed and add the following code:
+
Pour afficher le champ, trouvez dans <tt><template>/html/com_contact/contact/default.php</tt> l'emplacement où vous souhaitez que l'adresse de courriel s'affiche et ajoutez le code suivant :
  
 
<source lang="php">
 
<source lang="php">
 
<?php if ($this->params->get('contact_emaillabel2', false)) : ?>
 
<?php if ($this->params->get('contact_emaillabel2', false)) : ?>
 
<div>
 
<div>
<span class="contact-additionalemail"><?php echo $this->params->get('contact_emaillabel2');?>:&emsp;<a href="mailto:<?php echo $this->params->get('contact_email2'); ?>"><?php echo $this->params->get('contact_email2'); ?></a><br/></span>
+
<span class="contact-additionalemail"><?php echo $this->params->get('contact_emaillabel2'); ?>:&emsp;<a href="mailto:<?php echo $this->params->get('contact_email2'); ?>"><?php echo $this->params->get('contact_email2'); ?></a><br/></span>
 
</div>
 
</div>
 
<?php endif; ?>
 
<?php endif; ?>
 
</source>
 
</source>
  
If you add this code and install your template, you will now have the custom field displaying in your public Website.
+
Si vous ajoutez ce code et installez votre template, alors le champ personnalisé s'affichera sur la partie publique de votre site.
  
 
<noinclude>
 
<noinclude>
[[Category:Plugin Development/fr|Développement plugin]]
+
[[Category:Plugin Development/fr|Développement de plugin]]
[[Category:Template Development/fr|Développement template]]
+
[[Category:Template Development/fr|Développement de template]]
 
[[Category:Tutorials/fr|Didacticiels]]
 
[[Category:Tutorials/fr|Didacticiels]]
 
</noinclude>
 
</noinclude>

Latest revision as of 03:44, 28 May 2019

Other languages:
Deutsch • ‎English • ‎Nederlands • ‎català • ‎español • ‎français • ‎italiano • ‎português do Brasil • ‎русский • ‎فارسی • ‎हिन्दी • ‎বাংলা • ‎中文(台灣)‎

Avez-vous jamais souhaité ajouter un champ pour un numéro de téléphone supplémentaire dans com_contact ou eu besoin d'un champ supplémentaire pour les articles dans com_content ? Joomla! propose une méthode simple pour intégrer de nouveaux champs aux composants du noyau. Tout ce qu'il faut pour atteindre cet objectif, c'est un simple plug-in de contenu et une substitution de votre template.

Cet article montre comment ajouter un champ supplémentaire à un composant natif en utilisant l'exemple de l'ajout aux contacts d'une adresse de courriel supplémentaire dans com_contact. Si vous avez besoin d'ajouter des champs personnalisés au com_content pour vos articles Joomla, il vous suffit de modifier les références contact par content dans le code ci-dessous. Veuillez noter que com_content utilise attribs et non pas params pour les champs de valeur ainsi que pour les overrides.

Ajout d'un champ personnalisé

Il est recommandé de lire au préalable Création d'un plug-in pour Joomla! pour plus d'informations sur la façon de créer et installer un plug-in, ce qui n'est pas abordé ici.

Pour ajouter un champ à un composant du système, vous devez créer un plug-in de contenu qui reprend l'événement onContentPrepareForm et insère ses propres champs au JForm donné. Le code suivant est pour Joomla! 3.1 et versions ultérieures.

<?php
// no direct access
defined ('_JEXEC') or die;
class plgContentExample extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 * Note this is only available in Joomla 3.1 and higher.
	 * If you want to support 3.0 series you must override the constructor
	 *
	 * @var boolean
	 * @since <your version>
	 */
	protected $autoloadLanguage = true;

	/**
	 * Prepare form and add my field.
	 *
	 * @param   JForm  $form  The form to be altered.
	 * @param   mixed  $data  The associated data for the form.
	 *
	 * @return  boolean
	 *
	 * @since   <your version>
	 */
	function onContentPrepareForm($form, $data)
	{
		$app    = JFactory::getApplication();
		$option = $app->input->get('option');

		switch($option)
		{
			case 'com_contact' :
				if ($app->isClient('administrator'))
				{
					JForm::addFormPath(__DIR__ . '/forms');
					$form->loadFile('contact', false);
				}

				return true;
		}

		return true;
	}
}
?>

Activation de l'édition des champs personnalisés en frontend

Activer l'édition en frontend de vos champs personnalisés est assez facile. Pour ajouter des champs à votre formulaire d'édition de contenu en frontend, il suffit d'ajouter le bloc de code suivant :

case 'com_contact':
	if ($app->isClient('site'))
	{
		JForm::addFormPath(__DIR__ . '/forms');
		$form->loadFile('contact', false);
	}
	return true;

Ajoutez ceci immédiatement au-dessous de l'instance existante.

Une fois que vous avez fait cela, créez une substitution de template pour le fichier formulaire de contenu edit.php. Si vous souhaitez la création d'un ensemble de champs personnalisés pour le com_contact, vous devez copier /components/com_contact/views/form/tmpl/edit.php vers /templates/your-template-name/html/com_contact/form/edit.php.

À l'intérieur de votre substitution de rendu, ajoutez les nouveaux champs de formulaire que vous souhaitez à l'emplacement où vous désirez qu'ils s'affichent (par exemple, en dessous du titre ou en dessous de la description), en vous assurant que les noms des champs correspondent bien à ceux du fichier XML de votre plugin fichier que nous allons créer maintenant.

<?php // Checking if this is an existing item or not ?>
<?php if ($this->item->id) : ?>
  <?php // If it is an existing item, get the attribs part of the existing record ?>
  <?php $attribs = json_decode($this->item->attribs); ?>
  <?php // Set the value of the custom field to what is already saved. ?>
  <?php // Duplicate for the number of fields you need, changing the field_name as needed. ?>
  <?php echo $this->form->setValue('field_name', 'attribs', $attribs->field_name); ?>
<?php endif; ?>
<?php // This line needs added to the file right where you want to display it. So, if you want it to show right after the description field, find the description field and place this right after it. Duplicate for the number of fields you need, changing the field_name as needed. ?>
<?php // Now we display the field. If we are editing an existing item, the previously saved data will be populated already ?>
<?php echo $this->form->renderField('field_name', 'attribs'); ?>

Ceci fait, vos champs apparaîtront et seront stockés via l'interface d'édition en frontend.

Les champs supplémentaires sont chargés à partir du fichier forms/contact.xml dans le répertoire de plug-in. Il est important que ces champs soient dans un élément "fields" avec la propriété "name" définie sur "params". Si vous ne définissez pas cela ainsi, les champs s'afficheront dans l'administration du site mais les valeurs ne seront pas enregistrées. Remarque : dans com_content, votre champ doit être nommé <fields name="attribs"> sinon les champs apparaitront dans l'admin du site mais les valeurs ne seront pas enregistrées.

Dans ce cas, nous ajoutons un champ pour une étiquette afin de décrire le champ courriel sur la partie public du site web et un deuxième champ pour la valeur de l'adresse.

<?xml version="1.0" encoding="UTF-8"?>
<form>
	<fields name="params">
		<fieldset name="params" label="PLG_CONTENT_EXAMPLE_FIELDSET_LABEL">
			<field
				name="contact_emaillabel2"
				type="text"
				label="PLG_CONTENT_EXAMPLE_CONTACT_EMAILLABEL2"
			/>
			<field
				name="contact_email2"
				type="text"
				label="PLG_CONTENT_EXAMPLE_CONTACT_EMAIL2"
				filter="email"
			/>
		</fieldset>
	</fields>
</form>

Enfin, nous avons besoin d'un fichier de langue de sorte que les paramètres soient présentés correctement dans l'administration du site et soient traduisibles dans d'autres langues. Ce fichier doit être nommé quelque chose comme en-GB.plg_content_example.ini.

PLG_CONTENT_EXAMPLE_FIELDSET_LABEL="Additional Information"
PLG_CONTENT_EXAMPLE_CONTACT_EMAIL2="Additional email address"
PLG_CONTENT_EXAMPLE_CONTACT_EMAILLABEL2="Additional email label"

Cela permet d'ajouter le champ au com_contact. Si vous installez ce plug-in, vous aurez un onglet supplémentaire dans l'édition du formulaire de contact formulaire nommé "Additional Information" comprenant les nouveaux champs. Si vous remplissez les nouveaux champs d'étiquette et d'adresse de courriel pour un contact, vous verrez que le com_contact va stocker et récupérer les informations pour vous.

Le même plug-in peut être utilisé pour ajouter des champs supplémentaires à d'autres composants, il suffit d'ajouter le code à la fonction onContentPrepareForm et de créer les fichiers de formulaire XML appropriés.

Afficher le champ personnalisé

Pour afficher le champ personnalisé, vous devez créer une subsitution de mise en page (layout) dans votre template pour le composant concerné. Pour plus d'informations sur la création de templates, voir création d'un template de base pour Joomla. Pour plus d'informations sur les substitutions de mise en page (layout), voir comprendre les substitutions de sortie.

Copiez le fichier <Joomla>/components/com_contact/views/contact/tmpl/default.php dans <template>/html/com_contact/contact/default.php, créez les dossiers dans votre template si nécessaire. Nous allons modifier ce fichier pour inclure les informations supplémentaires. Le composant com_contact va automatiquement charger les champs supplémentaires et ce, dans une variable nommée $this->params. Tout ce que nous avons à faire est de vérifier que les données sont définies et le cas échéant, de les afficher.

Pour afficher le champ, trouvez dans <template>/html/com_contact/contact/default.php l'emplacement où vous souhaitez que l'adresse de courriel s'affiche et ajoutez le code suivant :

<?php if ($this->params->get('contact_emaillabel2', false)) : ?>
	<div>
		<span class="contact-additionalemail"><?php echo $this->params->get('contact_emaillabel2'); ?>:&emsp;<a href="mailto:<?php echo $this->params->get('contact_email2'); ?>"><?php echo $this->params->get('contact_email2'); ?></a><br/></span>
	</div>
<?php endif; ?>

Si vous ajoutez ce code et installez votre template, alors le champ personnalisé s'affichera sur la partie publique de votre site.