<?xml version="1.0" encoding="UTF-8" ?>
<chapter>

<title>Contribution</title>

<para>Comme tout projet libre qui se respecte, les contributions à LdapSaisie sont les bienvenues. Ce chapitre explique les possibilités de contribution.</para>

<sect1 id="contrib-LSaddons">
  <title>LSaddons</title>
  <para>Les &LSaddons; sont utilisés pour implémenter dans &LdapSaisie; des fonctionnalités spécifiques telque le support du famille d'attribut spécifiques (POSIX, Samba, ...) ou encore des tâches communes et génériques (envoi de mails, connexion FTP, ...). Les &LSaddons; vont permettront également d'adapter &LdapSaisie; à vos besoins en écrivrant par exemple les fonctions appelées par les déclencheurs.</para>

<sect2 id="contrib-LSaddons-structure">
  <title>Structure d'écriture</title>

  <para>L'écriture d'un &LSaddon; doit respecter une structure suffisament souple afin de ne pas être un frein à vos contributions, tout en permettant d'assurer la bonne intégration de votre contibution au projet. Le code que vous ecrirez sera répartis dans deux fichiers :</para>
<variablelist>

<varlistentry>
  <term>conf/LSaddons/config.LSaddons.[addon name].php</term>
  <listitem><simpara>Ce fichier contiendra la configuration de votre LSadons. On y retrouvera la déclaration de constances et/ou variables de configuration permettant d'adapter votre LSaddon à une installation et à un environement.</simpara></listitem>
</varlistentry>

<varlistentry>
  <term>includes/addons/LSaddons.[addon name].php</term>
  <listitem><simpara>Ce fichier contiendra le code à proprement dit de votre LSaddons.</simpara></listitem>
</varlistentry>

</variablelist>

<programlisting linenumbering="unnumbered">
<citetitle>Structure du fichier includes/addons/LSaddons.[addon name].php</citetitle>
<![CDATA[<?php

// Messages d'erreur

// Support
LSerror :: defineError('MYADDON_SUPPORT_01',
  _("MYADDON Support : first support error...")
);

LSerror :: defineError('MYADDON_SUPPORT_02',
  _("MYADDON Support : second support error...")
);

// Autres erreurs
LSerror :: defineError('MYADDON_01',
  _("MYADDON_01 : an error : %{msg}.")
);

LSerror :: defineError('MYADDON_02',
  _("MYADDON_02 : an other error : %{msg}")
);

// Constantes

// Un constante
define('LS_MYADDON_CONST01',XXXXXXXX);

/**
 * Verify support of my addon by LdapSaisie
 * 
 * @author My Name <my.email@example.com>
 *
 * @retval boolean true if my addon is totaly supported, false in other cases
 **/
function LSaddon_myaddon_support() {

  $retval=true;

  // Dependance de librairie
  if ( !class_exists('mylib') ) {
    if ( !LSsession::includeFile(LS_LIB_DIR . 'class.mylib.php') ) {
      LSerror :: addErrorCode('MYADDON_SUPPORT_01');
      $retval=false;
    }
  }


  $MUST_DEFINE_CONST= array(
    'LS_MYADDON_CONF_O1',
    'LS_MYADDON_CONF_O2',
    ...
  );

  foreach($MUST_DEFINE_CONST as $const) {
    if ( (!defined($const)) || (constant($const) == "")) {
      LSerror :: addErrorCode('MYADDON_SUPPORT_02',$const);
      $retval=false;
    }
  }

  // Other check ...

  return $retval;
}

/**
 * Ma première fonction.
 * 
 * Ce qu'elle fait.
 * 
 * @author My Name <my.email@example.com>
 * 
 * @retval [type valeur retournée] [Signification de la valeur retournée]
 **/
function myaddon_first_function($arg1,$arg2) {

  ...

}

?>
]]>
</programlisting>

</sect2>

</sect1>
 
</chapter>