Sortie de PluXml 5.3

StéphaneStéphane Member, Former PluXml Project Manager
La version 5.3 de PluXml est disponible.

Toutes les explications sont à lire sur le blog

Télécharger la nouvelle version ici

Le détail dans le changelog

Toute l'équipe vous souhaite une bonne installation ou mise à jour

Consultant PluXml

Ancien responsable du projet (2010 à 2018)

«1

Réponses

  • Yessss !!!! :cool:

    Bon, ben y'a plus qu'à voir si tout fonctionne correctement... :)


    Merci à l'équipe pour tout ce joli travail,

    à plus,

    Gzyg
  • Un grand merci !

    Peut-on faire la mise à jour en conservant un ancien thème sans problème ?
  • StéphaneStéphane Member, Former PluXml Project Manager
    @Lunatic: oui. vérfie juste que ton thème ne s'appelle pas defaut pour ne pas etre écrasé par celui de la 5.3

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • Il y a encore quelques arrangements à faire avec certains plugins et ça serait bien si je pouvais avoir un élément de réponse.
  • Bravo à l'équipe des développeurs !
    Je teste la nouvelle version dans les jours qui viennent ;)
  • JosJos Member
    Bonjour à tous,

    Pour ceux qui veulent conserver leurs thèmes, pensez à les enregistrer et à les renommer avant de faire la mise à jour car il y a un nouveau thème sur PluXml 5.3.
  • Bonne mise à jour à tous ;)
  • DenDen Member
    janvier 2014 modifié
    Bonjour à tous,

    J'ai installé la mise à jour 5.3 pour mon site Web et tout s’est bien déroulé.

    Aucun problème avec les plugins suivants (dernières versions) :
    jquery, plxMyAllArchive, plxMyContact, plxMyPager, plxMyPrivateStatic, plxtoolbar.

    UN GROS MERCI À TOUTE L'ÉQUIPE {)

    Amicalement Den O:)
  • Passage de 5.2 à 5.3 sans souci, merci et bonne année :)
  • StéphaneStéphane Member, Former PluXml Project Manager
    Merci pour vos retours qui rassureront les personnes frileuses pour mettre à jour leur version de PluXml.

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • YacineYacine Member
    janvier 2014 modifié
    Bonjour à tous,

    Est-ce que je peux effectuer une MAJ de la version 5.1.7 vers la 5.3 en utilisant la même procédure ?
    (J'ai eu quelques soucis à vrai dire, heureusement que j'ai fait un backup avant). Est-ce que je dois d'abord passer à la version 5.2 avant de devoir passer à la version 5.3 ?

    Edit: Pour donner un peu plus de détails, la mise à jour se fait, le blog fonctionne, mais l'espace administrateur du blog n'affiche rien du tout. Voici un screen shot de ce que j'ai:

    pluxml.png

    Je suis censé avoir plein d'articles, il en est de même pour tous les autres liens du menu administrateur.

    Merci !
  • Bonjour

    Voilà c'est fait pour mes deux sites. A-priori pas de problèmes. A vérifier pour l'utiliation des divers plugins.
    Juste un petit bug quand meme.
    Sur ma ressource ici, les liens pour télécharger ne fonctionnent plus.

    Cordialement
  • StéphaneStéphane Member, Former PluXml Project Manager
    @Yacine: oui tu peux faire directement la mise à jour d'une 5.1.7 vers la 5.3. Vérifie les droits sur tes fichiers et dossiers

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • @Stephane: Merci pour ta réponse. Bizarre, j'ai pourtant fait un chmod -R 777 sur l'ensemble du dossier Pluxml, et j'ai toujours le même soucis :/
  • StéphaneStéphane Member, Former PluXml Project Manager
    @Yacine: quel est ton hébergeur ?

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • Pas de soucis pour le moment, la MaJ s'est bien déroulée. ;)
  • @Stépahne: Je l’héberge moi même, sur un Raspberry Pi.
  • Si c'est toi qui t'héberges, tu as accès aux logs apache et php. Ils disent quoi ? Est-ce que tu n'aurais pas un plugin qui mettrait le broncks ?
  • Bravo à stéphane et à toute l'équipe.

    Mise à jour ok pour moi. Tous mes plugins semblent fonctionner nickel. Bravo encore !!!
  • Mise à jour OK sur mes deux sites, apparemment aucun problème de compatibilité avec les plugins, un super boulot comme d'habitude ! ! !

    Attention Stéphane, on s'habitue vite à l'excellence, encore merci pour tout le travail effectué :cool:
  • Bonjour
    MAJ faite sans problème en supprimant tous sauf /data et /theme
    Aucun problème avec mes plugins MyPluginDownloader MyContact et plxEditor
  • JosJos Member
    Bonjour,

    Merci pour vos remontées. Si vous rencontrez des erreurs aveec le nouveau thème, n'hésitez pas à les poster sur ce fil.
  • Jerry WhamJerry Wham Member
    janvier 2014 modifié
    [del]Avec la nouvelle version, je ne parviens plus à appeler ni l'objet $plxShow, ni $plxAdmin, ni $plxMotor depuis n'importe quel fichier de plugin, que ce soit par l'appel de la méthode getInstance ou en les rendant globaux (global $plxShow).[/del]

    [del]J'avais précédemment posté un message disant que ça ne fonctionnait pas depuis le constructeur, mais en fait c'est pareil depuis n'importe quelle autre méthode.[/del]

    [del]Pourriez-vous éclairer ma lanterne s'il vous plait ?[/del]

    Bon, je suis un gros boulet et je vous présente toutes mes confuses. Ça marche nickel. J'ai fait une grosse erreur de syntaxe. Encore toutes mes excuses pour le dérangement... :8 :8 :8
  • je-evrardje-evrard Member
    janvier 2014 modifié
    jerry a écrit:
    Avec la nouvelle version, je ne parviens plus à appeler ni l'objet $plxShow, ni $plxAdmin, ni $plxMotor depuis n'importe quel fichier de plugin, que ce soit par l'appel de la méthode getInstance ou en les rendant globaux (global $plxShow).

    Hum. Marche bien chez moi. Tu peux faire un zip de ton soucis qu'on regarde jerry ?
  • Jerry WhamJerry Wham Member
    janvier 2014 modifié
    Pas besoin d'un zip. Je crée une page d'aide dans le dossier lang d'un plugin quelconque (lang/fr-help.php). Je cherche à afficher l'url du site via
    $plxShow->urlRewrite();
    
    et je n'y parviens pas car on me dit que l'objet $plxShow n'existe pas, même si je crée une instance au préalable (via getInstance) ou si je l'appelle de façon globale.

    Autre exemple : dans le plugin adhésion (que je dois revoir je te l'accorde), j'essaie de vérifier que gutuma est activé. Autrefois dans le constructeur, j'appelais une instance de $plxMotor et je vérifiais le tableau des plugins. Et maintenant, plus moyen, même si je déporte le tout dans une autre méthode que le constructeur. Apache me dit que l'objet n'existe pas.

    Edit : pour l'url, je l'ai affichée via plxUtils::getRacine(); mais ça ne résout pas le problème de l'appel de $plxShow...
  • Rectification, c'est pas tout à fait vrai ce que j'ai dit. Je n'y parviens pas toujours pas avec le plugin adhesion.
    Ci-dessous, le fichier en question et la méthode dans laquelle ça ne fonctionne pas (ligne 160) :
    [code]<?php
    /**
    * Plugin adhesion
    *
    * @version 1.5
    * @date 07/10/2013
    * @author Stephane F, Cyril MAGUIRE
    **/
    class adhesion extends plxPlugin {

    public $plxGlob_adherents; # Obj des données concernant les fichiers adhérents
    public $plxRecord_adherents; # Obj des données concernant les adhérents

    public $oldAdherentsList = array(); # Tableau des données des adhérents, extraites de la liste générée par l'ancienne version du plugin
    public $adherentsList = array(); # Tableau des index des adhérents
    public $listsDiff = array(); # Tableau des listes de diffusion
    public $listDiff = array(); # La liste de diffusion des adhérents
    public $msg = FALSE;
    public $ok = FALSE;
    //Paramètres des listes de diffusion Gutuma
    public $isGutumaActivated=false;
    public $GutumaListsDir;
    private $id;
    private $name;
    private $private;
    private $addresses;
    private $size;
    // Paramètres de connexion
    private $ban = array();
    private $session_domain;

    /**
    * Constructeur de la classe
    *
    * @param default_lang langue par défaut
    * @return stdio
    * @author Stephane F, Cyril MAGUIRE
    **/
    public function __construct($default_lang) {

    # appel du constructeur de la classe plxPlugin (obligatoire)
    parent::__construct($default_lang);

    # droits pour accèder à la page config.php du plugin
    $this->setConfigProfil(PROFIL_ADMIN);
    $this->setAdminProfil(PROFIL_ADMIN, PROFIL_MANAGER);

    # déclaration des hooks
    $this->addHook('AdminPrepend', 'AdminPrepend');
    $this->addHook('AdminTopEndHead', 'AdminTopEndHead');
    $this->addHook('AdminTopBottom', 'AdminTopBottom');
    $this->addHook('AdhesionUsersTop', 'AdhesionUsersTop');
    $this->addHook('AdhesionUsersTopV', 'AdhesionUsersTopV');
    $this->addHook('AdhesionUsersFoot', 'AdhesionUsersFoot');
    $this->addHook('plxMotorConstructLoadPlugins', 'plxMotorConstructLoadPlugins');
    $this->addHook('plxMotorConstruct', 'plxMotorConstruct');
    if(plxUtils::checkMail($this->getParam('email'))) {
    $this->addHook('plxMotorPreChauffageBegin', 'plxMotorPreChauffageBegin');
    $this->addHook('plxShowConstruct', 'plxShowConstruct');
    $this->addHook('plxShowStaticListEnd', 'plxShowStaticListEnd');
    $this->addHook('plxShowPageTitle', 'plxShowPageTitle');
    $this->addHook('ThemeEndHead', 'ThemeEndHead');
    $this->addHook('ThemeEndBody', 'ThemeEndBody');
    $this->addHook('SitemapStatics', 'SitemapStatics');

    # Déclarations des hooks pour sécuriser les articles
    $this->addHook('AdminArticleSidebar','AdminArticleSidebar');
    $this->addHook('plxAdminEditArticleXml','plxAdminEditArticleXml');
    $this->addHook('plxMotorParseArticle','plxMotorParseArticle');
    $this->addHook('plxMotorPreChauffageEnd', 'plxMotorPreChauffageEnd');
    $this->addHook('plxMotorDemarrageEnd', 'plxMotorDemarrageEnd');
    $this->addHook('showIconIfLock','showIconIfLock');
    $this->addHook('AdminIndexTop', 'AdminIndexTop');
    $this->addHook('AdminIndexFoot', 'AdminIndexFoot');
    $this->addHook('plxFeedPreChauffageEnd','plxFeedPreChauffageEnd');
    $this->addHook('plxFeedDemarrageEnd','plxFeedDemarrageEnd');
    $this->addHook('AdminCategory','AdminCategory');
    $this->addHook('plxAdminEditCategoriesUpdate','plxAdminEditCategoriesUpdate');
    $this->addHook('plxAdminEditCategoriesXml','plxAdminEditCategoriesXml');
    $this->addHook('plxAdminEditCategorie','plxAdminEditCategorie');
    $this->addHook('plxMotorGetCategories','plxMotorGetCategories');
    $this->addHook('loginLogout','loginLogout');
    $this->addHook('AdminCategoriesTop','AdminCategoriesTop');
    $this->addHook('AdminCategoriesFoot','AdminCategoriesFoot');

    # déclaration des hooks pour sécuriser les pages statiques
    $this->addHook('AdminStatic', 'AdminStatic');
    $this->addHook('plxAdminEditStatique', 'plxAdminEditStatique');
    $this->addHook('plxAdminEditStatiquesXml', 'plxAdminEditStatiquesXml');
    $this->addHook('plxMotorGetStatiques', 'plxMotorGetStatiques');
    $this->addHook('AdminStaticsTop', 'AdminStaticsTop');
    $this->addHook('AdminStaticsFoot', 'AdminStaticsFoot');

    $this->addHook('plxShowConstruct', 'plxShowConstructStat');
    $this->addHook('plxMotorPreChauffageEnd', 'plxMotorPreChauffageEndStat');
    $this->addHook('plxMotorDemarrageEnd', 'plxMotorDemarrageEndStat');
    $this->addHook('plxShowPageTitle', 'plxShowPageTitleStat');
    $this->addHook('ThemeEndHead', 'ThemeEndHeadStat');
    }
    //On vérifie que Gutuma soit activée
    $this->isGutumaActivated = $this->isGutumaActivated();

    # On récupère l'ensemble des adhérents
    $this->plxGlob_adherents = plxGlob::getInstance(PLX_ROOT.$this->getParam('adherents').'adhesions',false,true,'arts');
    $this->adherentsList = array_flip(array_keys($this->plxGlob_adherents->aFiles));

    $htaccess = "Allow from none\n";
    $htaccess .= "Deny from all\n";
    $htaccess .= "<Files *.php>\n";
    $htaccess .= "order allow,deny\n";
    $htaccess .= "deny from all\n";
    $htaccess .= "</Files>\n";
    $htaccess .= "Options -Indexes\n";


    if ($this->isGutumaActivated) {

    # Emplacement des listes de diffusion de Gutuma
    $this->GutumaListsDir = $this->gutumaListDir();

    # Récupération des listes des anciennes versions de Gutuma
    if (is_dir(PLX_PLUGINS.'gutuma/news/lists')) {
    @rename(PLX_PLUGINS.'gutuma/news/lists', $this->GutumaListsDir);
    touch($this->GutumaListsDir.'/.htaccess');
    file_put_contents($this->GutumaListsDir.'/.htaccess', $htaccess);
    }
    # Récupération de la config des anciennes versions de Gutuma
    if (is_file(PLX_PLUGINS.'gutuma/news/inc/config.php')) {
    @mkdir($this->;GutumaListsDir.'/inc');
    @rename(PLX_PLUGINS.'gutuma/news/inc/config.php', $this->GutumaListsDir.'/inc/config.php');
    touch($this->GutumaListsDir.'/inc/.htaccess');
    file_put_contents($this->GutumaListsDir.'/inc/.htaccess', $htaccess);
    }



    # On récupère les paramètres de la liste de diffusion
    $list = $this->getAllGutumaLists(TRUE);

    $k = 0;
    foreach ($list as $key => $value) {
    if ($value == 'adherents') {
    $k = $key;
    }
    }
    if (isset($list[$k])) {
    $this->id = $list[$k];
    $this->name = $list[$k];
    $this->private = $list[$k];
    $this->addresses = $list[$k];
    $this->listDiff = $list[$k];
    }
    }

    if ($this->id != ''){
    $this->ok = TRUE;
    }
    }

    private function isGutumaActivated() {
    $plxMotor = plxMotor::getInstance();echo '<pre style="border: 1px solid #e3af43; background-color: #f8edd5; padding: 10px; overflow: auto;color:#111;">'; print_r($plxMotor);exit('</pre>');
    if (isset($plxMotor->plxPlugins->aPlugins))
    return $plxMotor->plxPlugins->aPlugins;
    else
    return false;
    }

    private function gutumaListDir() {
    $plxMotor = plxMotor::getInstance();
    if ($plxMotor->plxPlugins->aPlugins->listsDir != null)
    return $plxMotor->plxPlugins->aPlugins->listsDir;
    else
    return '';//PLX_ROOT.'data/gutuma';
    }

    ///////////////////////////////////////////////////////////
    //
    // Méthodes permettant la mise en place du plugin
    //
    //////////////////////////////////////////////////////////

    public function plxMotorConstructLoadPlugins() {
    $string = "
    \$this->plxGlob_adherents = plxGlob::getInstance(PLX_ROOT.'".$this->getParam('adherents')."adhesions',false,true,'arts');
    \$this->adherentsList = array_flip(array_keys(\$this->plxGlob_adherents->aFiles));";
    echo "<?php".$string."?>";
    }

    public function plxMotorConstruct() {
    $string = "
    # Récupération des données
    \$this->plxPlugins->aPlugins->getAdherents('/^[0-9]{5}.(.[a-z-]+){2}.[0-9]{10}.xml$/');";
    echo "<?php".$string."?>";
    }

    /**
    * Méthode qui préconfigure le plugin
    *
    * @return stdio
    * @author Cyril MAGUIRE
    **/
    public function onActivate() {
    $plxAdmin = plxAdmin::getInstance();
    #Paramètres par défaut
    if(!is_file($this->plug)) {
    $this->setParam('adherents', 'data/configuration/', 'cdata');
    $this->setParam('mnuName', 'Devenir membre', 'string');
    $this->setParam('domaine_asso', plxUtils::strCheck($plxAdmin->aConf), 'string');
    $this->saveParams();
    }
    if (!is_dir(PLX_ROOT.$this->getParam('adherents').'adhesions')) {
    @mkdir(PLX_ROOT.$this->getParam('adherents').'adhesions');
    }
    # Si le fichier unique des adhérents existe (ancienne version), on le découpe
    if (is_file(PLX_ROOT.$this->getParam('adherents').'plugin.adhesion.adherents.xml')) {
    $this->genNewFilesFormOldData(PLX_ROOT.$this->getParam('adherents').'plugin.adhesion.adherents.xml');
    }
    if (isset($plxAdmin->plxPlugins->aPlugins["gutuma"])) {
    $listeDeDiffusion = plxUtils::strCheck($plxAdmin->aConf);

    if ($listeDeDiffusion == '') {
    $listeDeDiffusion = 'Newsletters';
    }
    # On crée la liste de diffusion si elle n'existe pas
    if ($this->name != $listeDeDiffusion) {
    $this->listDiff = $this->createGutumaList($listeDeDiffusion);
    }
    }
    //Si les plugins lockArticles et plxMyPrivateStatic sont activés, on les désactive
    if (isset($plxAdmin->plxPlugins->aPlugins["lockArticles"])) {
    $content ='deactivate';
    $content = array('lockArticles'=>'on');
    $content = 'on';
    $plxAdmin->plxPlugins->saveConfig($content);
    }
    if (isset($plxAdmin->plxPlugins->aPlugins["plxMyPrivateStatic"])) {
    $content ='deactivate';
    $content = array('plxMyPrivateStatic'=>'on');
    $content = 'on';
    $plxAdmin->plxPlugins->saveConfig($content);
    }
    }

    /**
    * Méthode qui récupère les infos enregistrées dans le fichier data/configuration/plugin.adhesion.adherents.xml
    *
    * @param $filename ressource le chemin vers le fichier des adhérents
    * @return array
    *
    * @author Cyril MAGUIRE
    */
    private function getAdherentsFromOldFile($filename) {

    if(!is_file($filename)) return;

    # Mise en place du parseur XML
    $data = implode('',file($filename));
    $parser = xml_parser_create(PLX_CHARSET);
    xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
    xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,0);
    xml_parse_into_struct($parser,$data,$values,$iTags);
    xml_parser_free($parser);
    if(isset($iTags) AND isset($iTags)) {
    $nb = sizeof($iTags);
    $size=ceil(sizeof($iTags)/$nb);
    for($i=0;$i<$nb;$i++) {
    $attributes = $values[$iTags[$i*$size]];
    $number = $attributes;
    # Recuperation du nom
    $this->oldAdherentsList[$number]=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation du prenom
    $this->oldAdherentsList[$number]=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation de l'adresse 1
    $this->oldAdherentsList[$number]=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation de l'adresse 2
    $this->oldAdherentsList[$number]=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation du code postal
    $this->oldAdherentsList[$number]=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation de la ville
    $this->oldAdherentsList[$number]=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation du téléphone
    $this->oldAdherentsList[$number]=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation du mail
    $this->oldAdherentsList[$number]=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation du choix quant à l'adhésion
    $this->oldAdherentsList[$number]=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation du choix pour le mailing
    $this->oldAdherentsList[$number]=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation du statut de l'adhérent
    $this->oldAdherentsList[$number]=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation de la date de première adhésion
    $this->oldAdherentsList[$number]=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation de la date de validation de l'adhésion
    $this->oldAdherentsList[$number]=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation de la chaine salt de l'adhérent
    $this->oldAdherentsList[$number]=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation du mot de passe cripté de l'adhérent
    $this->oldAdherentsList[$number]=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation de la clé
    $this->oldAdherentsList[$number]=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation des chaines aléatoires
    $this->oldAdherentsList[$number]=plxUtils::getValue($values[$iTags[$i]]);
    $this->oldAdherentsList[$number]=plxUtils::getValue($values[$iTags[$i]]);
    if ($this->getParam('typeAnnuaire') == 'professionnel') {
    # Recuperation de l'activité
    $this->oldAdherentsList[$number]=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation de l'établissement
    $this->oldAdherentsList[$number]=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation du service
    $this->oldAdherentsList[$number]=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation du poste
    $this->oldAdherentsList[$number]=plxUtils::getValue($values[$iTags[$i]]);
    }
    if ($this->getParam('showAnnuaire') == 'on') {
    # Recuperation du choix sur le partage des coordonnées
    $this->oldAdherentsList[$number]=plxUtils::getValue($values[$iTags[$i]]);
    }
    }
    }
    //tri du tableau par ordre alphabétique des noms
    $tmp = array();
    foreach($this->oldAdherentsList as $id=>$v){
    $tmp[$v["nom"]] = array(
    'id'=>$id,
    'details'=>$v
    );}
    ksort($tmp);
    $this->oldAdherentsList = array();
    foreach ($tmp as $nom => $value) {
    $this->oldAdherentsList[$value] = $value;
    }
    return $this->oldAdherentsList;
    }

    private function genNewFilesFormOldData($filename) {
    $this->getAdherentsFromOldFile($filename);

    foreach ($this->oldAdherentsList as $id => $adherent) {
    $fileName = $id.'.'.plxUtils::title2filename($adherent.'.'.$adherent).'.'.(empty($adherent)? time() : $adherent).'.xml';
    # On génére le fichier XML
    $xml = "<?xml version=\"1.0\" encoding=\"".PLX_CHARSET."\"?>\n";
    $xml .= "<document>\n";
    $xml .= "\t<adherent number=\"".$id."\">\n\t\t";
    $xml .= "<nom><![CDATA[".plxUtils::cdataCheck($adherent['nom'])."]]></nom>\n\t\t";
    $xml .= "<prenom><![CDATA[".plxUtils::cdataCheck($adherent['prenom'])."]]></prenom>\n\t\t";
    $xml .= "<adresse1><![CDATA[".plxUtils::cdataCheck($adherent['adresse1'])."]]></adresse1>\n\t\t";
    $xml .= "<adresse2><![CDATA[".plxUtils::cdataCheck($adherent['adresse2'])."]]></adresse2>\n\t\t";
    $xml .= "<cp><![CDATA[".plxUtils::cdataCheck($adherent['cp'])."]]></cp>\n\t\t";
    $xml .= "<ville><![CDATA[".plxUtils::cdataCheck($adherent['ville'])."]]></ville>\n\t\t";
    $xml .= "<tel><![CDATA[".plxUtils::cdataCheck($adherent['tel'])."]]></tel>\n\t\t";
    $xml .= "<mail><![CDATA[".plxUtils::cdataCheck($adherent['mail'])."]]></mail>\n\t\t";
    $xml .= "<choix><![CDATA[".plxUtils::cdataCheck($adherent['choix'])."]]></choix>\n\t\t";
    $xml .= "<mailing><![CDATA[".plxUtils::cdataCheck($adherent['mailing'])."]]></mailing>\n\t\t";
    $xml .= "<salt><![CDATA[".plxUtils::cdataCheck($adherent['salt'])."]]></salt>\n\t\t";
    $xml .= "<password><![CDATA[".plxUtils::cdataCheck($adherent['password'])."]]></password>\n\t\t";
    $xml .= "<rand1><![CDATA[".plxUtils::cdataCheck($adherent['rand1'])."]]></rand1>\n\t\t";
    $xml .= "<rand2><![CDATA[".plxUtils::cdataCheck($adherent['rand2'])."]]></rand2>\n\t\t";
    $xml .= "<cle><![CDATA[".plxUtils::cdataCheck($adherent['cle'])."]]></cle>\n\t\t";
    $xml .= "<validation>".plxUtils::cdataCheck($adherent)."</validation>\n\t\t";
    $xml .= "<firstDate>".plxUtils::cdataCheck($adherent)."</firstDate>\n\t\t";
    $xml .= "<date>".plxUtils::cdataCheck($adherent)."</date>\n\t\t";
    if ($this->getParam('typeAnnuaire') == 'professionnel') {
    $xml .= "<activite><![CDATA[".plxUtils::cdataCheck($adherent['activite'])."]]></activite>\n\t\t";
    $xml .= "<etablissement><![CDATA[".plxUtils::cdataCheck($adherent['etablissement'])."]]></etablissement>\n\t\t";
    $xml .= "<service><![CDATA[".plxUtils::cdataCheck($adherent['service'])."]]></service>\n\t\t";
    $xml .= "<tel_office><![CDATA[".plxUtils::cdataCheck($adherent['tel_office'])."]]></tel_office>\n\t";
    }
    if ($this->getParam('showAnnuaire') == 'on') {
    $xml .= "\t<coordonnees><![CDATA[".plxUtils::cdataCheck($adherent['coordonnees'])."]]></coordonnees>\n\t";
    }
    $xml .= "</adherent>\n";
    $xml .= "</document>";
    # On écrit le fichier
    if(!plxUtils::write($xml, PLX_ROOT.$this->getParam('adherents').'adhesions/'.$fileName)) {
    $_SESSION = $this->getLang('L_ERR_FILE_ADHERENTS').'<br/>' ;
    break;
    }
    }
    }


    /**
    * Méthode de traitement du hook plxShowConstruct
    *
    * @return stdio
    * @author Stephane F, Cyril MAGUIRE
    **/
    public function plxShowConstruct() {

    # infos sur la page statique
    $string = "
    if(\$this->plxMotor->mode=='adhesion') {
    \$array = array();
    \$array[\$this->plxMotor->cible] = array(
    'name' => '".$this->getParam('mnuName')."',
    'menu' => '',
    'url' => 'adhesion.html',
    'readable' => 1,
    'active' => 1,
    'group' => ''
    );
    \$this->plxMotor->aStats = array_merge(\$this->plxMotor->aStats, \$array);
    }
    if(\$this->plxMotor->mode=='adherer') {
    \$array = array();
    \$array[\$this->plxMotor->cible] = array(
    'name' => '".$this->getParam('mnuAdherer')."',
    'menu' => '',
    'url' => 'adherer.html',
    'readable' => 1,
    'active' => 1,
    'group' => ''
    );
    \$this->plxMotor->aStats = array_merge(\$this->plxMotor->aStats, \$array);
    }
    if(\$this->plxMotor->mode=='forgetmypass') {
    \$array = array();
    \$array[\$this->plxMotor->cible] = array(
    'name' => '".$this->getParam('mnuForgetPass')."',
    'menu' => '',
    'url' => 'forgetmypass.html',
    'readable' => 1,
    'active' => 1,
    'group' => ''
    );
    \$this->plxMotor->aStats = array_merge(\$this->plxMotor->aStats, \$array);
    }
    if(\$this->plxMotor->mode=='annuaire') {
    \$array = array();
    \$array[\$this->plxMotor->cible] = array(
    'name' => '".$this->getParam('mnuAnnuaire')."',
    'menu' => '',
    'url' => 'annuaire.html',
    'readable' => 1,
    'active' => 1,
    'group' => ''
    );
    \$this->plxMotor->aStats = array_merge(\$this->plxMotor->aStats, \$array);
    }
    if(\$this->plxMotor->mode=='myaccount') {
    \$array = array();
    \$array[\$this->plxMotor->cible] = array(
    'name' => '".$this->getParam('mnuMyAccount')."',
    'menu' => '',
    'url' => 'myaccount.html',
    'readable' => 1,
    'active' => 1,
    'group' => ''
    );
    \$this->plxMotor->aStats = array_merge(\$this->plxMotor->aStats, \$array);
    }";
    echo "<?php ".$string." ?>";
    }

    /**
    * Méthode de traitement du hook plxMotorPreChauffageBegin
    * 1) On met à jour la liste des adhérents, en fonction de la date de leur inscription, dès qu'une page publique est affichée
    * 2) On utilise une page statique pour afficher le formulaire d'adhésion
    *
    * @return stdio
    * @author Stephane F, Cyril MAGUIRE
    **/
    public function plxMotorPreChauffageBegin() {
    $content = array();//echo strtotime("20 October 2011");exit();
    foreach ($this->plxRecord_adherents->result as $i => $value) {
    if ($value == 1) {
    if ($this->getParam('annee') == 'civile') {
    $datetimeOld = date('Y',$value);
    //(60*60*24*365) = 31536000 secondes soit 1 an
    $datetimeNew = strtotime('01 January '.($datetimeOld+1).' 00:00:01' );
    }
    if ($this->getParam('annee') == 'entiere') {
    $datetimeOld = $value;
    //(60*60*24*365) = 31536000 secondes soit 1 an
    $datetimeNew = $datetimeOld+365*24*60*60;
    }
    if ( $datetimeNew < time() ){
    foreach ($value as $key => $v) {
    $content[$key.'_'.$value['id']] = $v;
    }
    $content] = 0;
    $content = array($value);
    $this->editAdherentslist($content,$value,TRUE);
    }
    }
    }

    $template = $this->getParam('template')==''?'static.php':$this->getParam('template');

    $string = "
    if(\$this->get && preg_match('/^adhesion\/?/',\$this->get)) {
    \$this->mode = 'adhesion';
    \$this->cible = '../../plugins/adhesion/form';
    \$this->template = '".$template."';
    return TRUE;
    }
    if(\$this->get && preg_match('/^adherer\/?/',\$this->get)) {
    \$this->mode = 'adherer';
    \$this->cible = '../../plugins/adhesion/form';
    \$this->template = '".$template."';
    return TRUE;
    }
    if(\$this->get && preg_match('/^myaccount\/?/',\$this->get)) {
    \$this->mode = 'myaccount';
    \$this->cible = '../../plugins/adhesion/form';
    \$this->template = '".$template."';
    return TRUE;
    }
    if(\$this->get && preg_match('/^forgetmypass\/?/',\$this->get)) {
    \$this->mode = 'forgetmypass';
    \$this->cible = '../../plugins/adhesion/form';
    \$this->template = '".$template."';
    return TRUE;
    }
    if(\$this->get && preg_match('/^annuaire\/?/',\$this->get)) {
    \$this->mode = 'annuaire';
    \$this->cible = '../../plugins/adhesion/form';
    \$this->template = '".$template."';
    return TRUE;
    }
    ";

    echo "<?php ".$string." ?>";
    }

    /**
    * Méthode de traitement du hook plxShowStaticListEnd
    *
    * @return stdio
    * @author Stephane F, Cyril MAGUIRE
    **/
    public function plxShowStaticListEnd() {
    $plxMotor = plxMotor::getInstance();
    echo "<?php \$class = (\$this->plxMotor->mode=='adhesion' || \$this->plxMotor->mode=='adherer' || \$this->plxMotor->mode=='annuaire')?'active':'noactive'; ?>";
    echo "<?php \$class1 = \$this->plxMotor->mode=='adhesion'?'active':'noactive'; ?>";
    echo "<?php \$class2 = \$this->plxMotor->mode=='adherer'?'active':'noactive'; ?>";
    echo "<?php \$class3 = \$this->plxMotor->mode=='annuaire'?'active':'noactive'; ?>";
    # ajout du menu pour accèder à la page d'adhesion si l'utilisateur n'est pas connecté
    if($this->getParam('mnuDisplay') && !isset($_SESSION)) {
    echo ($this->getParam('showAnnuaire') == 'on' && $this->getParam('typeAnnuaire') == 'professionnel') ? "<?php \$annuaire = '<li class=\"'.\$class3.'\"><a href=\"'.\$this->plxMotor->urlRewrite('?annuaire.html').'\"><span>".$this->getParam('mnuAnnuaire')."</span></a></li>';?>" : "<?php \$annuaire = '';?>";
    echo "<?php array_splice(\$menus, ".($this->getParam('mnuPos')-1).", 0, '<li class=\"page_item '.\$class.'\"><a href=\"'.\$this->plxMotor->urlRewrite('?adhesion.html').'\">".$this->getParam('mnuName')."</a><ul><li class=\"'.\$class2.'\"><a href=\"'.\$this->plxMotor->urlRewrite('?adherer.html').'\"><span>".$this->getParam('mnuAdherer')."</span></a></li><li class=\"'.\$class1.'\"><a href=\"'.\$this->plxMotor->urlRewrite('?adhesion.html').'\"><span>".$this->getParam('mnuName')."</span></a></li>'.\$annuaire.'</ul></li>'); ?>";
    } elseif ($this->getParam('mnuDisplay') && isset($_SESSION)) {//L'utilisateur est connecté
    echo ($this->getParam('showAnnuaire') == 'on' && $this->getParam('typeAnnuaire') == 'professionnel') ? "<?php \$annuaire = '<li class=\"'.\$class3.'\"><a href=\"'.\$this->plxMotor->urlRewrite('?annuaire.html').'\"><span>".$this->getParam('mnuAnnuaire')."</span></a></li>';?>" : "<?php \$annuaire = '';?>";
    echo "<?php array_splice(\$menus, ".($this->getParam('mnuPos')-1).", 0, \$annuaire); ?>";
    }

    }

    /**
    * Méthode qui ajoute le fichier css dans le fichier header.php du thème
    *
    * @return stdio
    * @author Stephane F, Cyril MAGUIRE
    **/
    public function ThemeEndHead() {
    echo "\t".'<link rel="stylesheet" type="text/css" href="'.PLX_PLUGINS.'adhesion/style.css" media="screen" />'."\n";
    echo '
    <style type="text/css">
    #wall-e {
    position:absolute;
    left:-99999px;
    }
    </style>
    ';
    }

    /**
    * Méthode qui renseigne le titre de la page dans la balise html <title>
    *
    * @return stdio
    * @author Stephane F, Cyril MAGUIRE
    **/
    public function plxShowPageTitle() {
    echo '<?php
    if($this->plxMotor->mode == "adhesion") {
    echo plxUtils::strCheck($this->plxMotor->aConf["title"]." - '.$this->getParam('mnuName').'");
    return TRUE;
    }
    ?>';
    }

    /**
    * Méthode qui référence la page de contact dans le sitemap
    *
    * @return stdio
    * @author Stephane F, Cyril MAGUIRE
    **/
    public function SitemapStatics() {
    echo '<?php
    echo "\n";
    echo "\t<url>\n";
    echo "\t\t<loc>".$plxMotor->urlRewrite("?adhesion")."</loc>\n";
    echo "\t\t<changefreq>monthly</changefreq>\n";
    echo "\t\t<priority>0.8</priority>\n";
    echo "\t</url>\n";
    ?>';
    }

    /**
    * Méthode permettant l'export de la liste des adhérents
    *
    * @return void
    * @author Cyril MAGUIRE
    */
    public function AdminPrepend() {

    # Impression de la liste des adhérents
    if (isset($_GET)) {

    $plxMotor = plxMotor::getInstance();
    $this->getAdherents('/^[0-9]{5}.(.[a-z-]+){2}.[0-9]{10}.xml$/');

    # Inclusion des librairies de TBS
    if (version_compare(PHP_VERSION,'5')<0) {
    include_once 'opentbs/tbs_class.php'; // TinyButStrong template engine
    } else {
    include_once 'opentbs/tbs_class_php5.php'; // TinyButStrong template engine
    }
    if (($_GET == 'xls') ) {
    include_once 'opentbs/tbs_plugin_excel.php'; // Excel plugin
    } else {
    include_once 'opentbs/tbs_plugin_opentbs.php'; // OpenTBS plugin
    }
    include_once 'print.php';
    exit();
    }

    }

    /**
    * Méthode qui affiche la css du plugin dans la partie administration
    *
    * @author Cyril MAGUIRE, Stephane F
    */
    public function AdminTopEndHead() {
    echo '<link rel="stylesheet" type="text/css" href="'.PLX_PLUGINS.'adhesion/style.css" media="screen" />';
    {?>

    <script type="text/javascript">
    /* <![CDATA[ */
    if (typeof jQuery == 'undefined') {
    document.write('<script type="text\/javascript" src="<?php echo PLX_PLUGINS ?>adhesion\/js\/jquery.min.js"><\/script>');
    }
    /* ]]> */
    </script>
    <?php
    }
    }

    /**
    * Méthode de traitement du hook AdhesionUserTop
    *
    * @return stdio
    * @author Stephane F
    **/
    public function AdhesionUsersTop() {?>

    <p style="text-align:right">
    <?php $this->lang('L_LABEL_FIND') ?> : 
    <input type="text" id="txtFilter" name="txtFilter" /> 
    <img style="display:none" id="imgDeleteFilter" src="<?php echo PLX_PLUGINS ?>adhesion/cancel.gif" alt="<?php $this->lang('L_LABEL_DELETE_FILTER') ?>" title="<?php $this->lang('L_LABEL_DELETE_FILTER') ?>" />
    </p>

    <?php
    }
    /**
    * Méthode de traitement du hook AdhesionUserTop
    *
    * @return stdio
    * @author Stephane F
    **/
    public function AdhesionUsersTopV() {?>

    <p style="text-align:right">
    <?php $this->lang('L_LABEL_FIND') ?> : 
    <input type="text" id="txtFilterV" name="txtFilterV" /> 
    <img style="display:none" id="imgDeleteFilterV" src="<?php echo PLX_PLUGINS ?>adhesion/cancel.gif" alt="<?php $this->lang('L_LABEL_DELETE_FILTER') ?>" title="<?php $this->lang('L_LABEL_DELETE_FILTER') ?>" />
    </p>

    <?php
    }


    /**
    * Méthode de traitement du hook AdminUsersFoot
    *
    * @return stdio
    * @author Stephane F
    **/
    public function AdhesionUsersFoot() {?>

    <script type="text/javascript">
    /* <![CDATA[ */
    $(document).ready(function(){
    // reset the search when the cancel image is clicked
    $('#imgDeleteFilter').click(function(){
    $('#txtFilter').val("").keyup();
    $('#imgDeleteFilter').hide();
    });
    $('#txtFilter').keyup(function(){
    $('#imgDeleteFilter').show();
    var s = $(this).val().toLowerCase().split(" ");
    //show all rows.
    $('#table>tbody>tr:hidden').show();
    $.each(s, function(){
    $("#table>tbody>tr:visible>.indexColumn:not(:contains('" + this + "'))").parent().hide();
    });
    });
    $('#imgDeleteFilterV').click(function(){
    $('#txtFilterV').val("").keyup();
    $('#imgDeleteFilterV').hide();
    });
    $('#txtFilterV').keyup(function(){
    $('#imgDeleteFilterV').show();
    var s = $(this).val().toLowerCase().split(" ");
    //show all rows.
    $('#tableV>tbody>tr:hidden').show();
    $.each(s, function(){
    $("#tableV>tbody>tr:visible>.indexColumnV:not(:contains('" + this + "'))").parent().hide();
    });
    });
    $('#table>tbody>tr:has(td)').each(function(){
    // recuperation des valeurs des colonnes
    if ( $(this).find("td:eq(1)").text() !== undefined ) {
    var userid = $(this).find("td:eq(1)").text().substr(0,5);
    }
    if ( $(this).find("td:eq(2)>input[type='text']").val() !== undefined ) {
    var username = $(this).find("td:eq(2)>input[type='text']").val().toLowerCase();
    }

    // ajout index de recherche
    $('<td class="indexColumn"><\/td>').hide().text(userid+username).appendTo(this);
    });
    $('#tableV>tbody>tr:has(td)').each(function(){
    // recuperation des valeurs des colonnes
    if ( $(this).find("td:eq(1)").text() !== undefined ) {
    var useridV = $(this).find("td:eq(1)").text().substr(0,5);
    }
    if ( $(this).find("td:eq(2)>input[type='text']").val() !== undefined ) {
    var usernameV = $(this).find("td:eq(2)>input[type='text']").val().toLowerCase();
    }

    // ajout index de recherche
    $('<td class="indexColumnV"><\/td>').hide().text(useridV+usernameV).appendTo(this);
    });
    });
    /* ]]> */
    </script>

    <?php
    }


    /**
    * Méthode qui affiche un message s'il y a un message à afficher
    *
    * @return stdio
    * @author Stephane F, Cyril MAGUIRE
    **/
    public function AdminTopBottom() {

    $string = '
    $adhesion = $plxAdmin->plxPlugins->aPlugins["adhesion"];
    echo $adhesion->msg;
    if($adhesion->msg=="L_ADMIN_UPDATE_ADH") {
    echo "<p class=\"success\">Plugin adhesion<br />'.$this->getLang("L_ADMIN_UPDATE_ADH").'</p>";
    plxMsg::Display();
    }';
    if ($this->isGutumaActivated) {
    $string .='if(!$adhesion->ok) {
    echo "<p class=\"warning\">Plugin adhesion<br />'.$this->getLang("L_ERR_NO_LIST").'</p>";
    plxMsg::Display();
    }';
    }
    $string .='
    if($adhesion->getParam("email")=="") {
    echo "<p class=\"warning\">Plugin adhesion config<br />'.$this->getLang("L_ERR_EMAIL").'</p>";
    plxMsg::Display();
    }
    if($adhesion->getParam("nom_asso")=="") {
    echo "<p class=\"warning\">Plugin adhesion config<br />'.$this->getLang("L_WARNING_NAME_ASSO").'</p>";
    plxMsg::Display();
    }
    if($adhesion->getParam("adresse_asso")=="") {
    echo "<p class=\"warning\">Plugin adhesion config<br />'.$this->getLang("L_WARNING_ADDRESS_ASSO").'</p>";
    plxMsg::Display();
    }
    if($adhesion->getParam("adherents")=="") {
    echo "<p class=\"warning\">Plugin adhesion<br />'.$this->getLang("L_ERR_FILE_ADHERENTS").'</p>";
    plxMsg::Display();
    }
    if($adhesion->getParam("subject")==str_replace("\'","’",$adhesion->getLang(\'L_DEFAULT_SUBJECT\'))) {
    echo "<p class=\"notice\">Plugin adhesion config<br />'.$this->getLang("L_WARNING_SUBJECT").'</p>";
    plxMsg::Display();
    }
    if(trim(strip_tags(htmlspecialchars_decode($adhesion->getParam("desc_adhesion"))))==str_replace("\'","’",$adhesion->getLang(\'L_DEFAULT_DESC\'))) {
    echo "<p class=\"notice\">Plugin adhesion config<br />'.$this->getLang("L_WARNING_DESC").'</p>";
    plxMsg::Display();
    }
    if($adhesion->getParam("validation_subject")==str_replace("\'","’",$adhesion->getLang(\'L_DEFAULT_VAL_SUB\'))) {
    echo "<p class=\"notice\">Plugin adhesion config<br />'.$this->getLang("L_WARNING_VAL_SUBJECT").'</p>";
    plxMsg::Display();
    }
    if($adhesion->getParam("devalidation_subject")==str_replace("\'","’",$adhesion->getLang(\'L_DEFAULT_DEVAL_SUB\'))) {
    echo "<p class=\"notice\">Plugin adhesion config<br />'.$this->getLang("L_WARNING_DEVAL_SUBJECT").'</p>";
    plxMsg::Display();
    }
    if($adhesion->getParam("thankyou")==str_replace("\'","’",$adhesion->getLang(\'L_DEFAULT_THANKYOU\'))) {
    echo "<p class=\"notice\">Plugin adhesion config<br />'.$this->getLang("L_WARNING_THANKYOU").'</p>";
    plxMsg::Display();
    }
    if($adhesion->getParam("subject_password")==str_replace("\'","’",$adhesion->getLang(\'L_DEFAULT_SUBJECT_PASS\'))) {
    echo "<p class=\"notice\">Plugin adhesion config<br />'.$this->getLang("L_WARNING_PASS").'</p>";
    plxMsg::Display();
    }
    if (!is_dir(PLX_ROOT.$adhesion->getParam("adherents")."adhesions")) {
    echo "<p class=\"warning\">Plugin adhesion config<br />'.$this->getLang("L_WARNING_NO_DIRECTORY").'</p>";
    plxMsg::Display();
    }';
    echo '<?php '.$string.' ?>';
    }


    /**
    * Méthode qui inverse la position des lettres composant un email afin d'éviter les spams
    *
    * @param email string l'email à obfusquer
    * @return string
    *
    * @author Cyril MAGUIRE
    */
    public function badEmail($email) {
    $longueur = strlen(trim($email));
    for ($i=1; $i < $longueur+1 ; $i++) {
    $tmp[$i] = $email[$longueur-$i];
    }
    $email = implode('', $tmp);
    return '<span class="baddirection">'.$email.'</span>';
    }

    /**
    * Méthode d'envoi de mail
    *
    * @param name string Nom de l'expéditeur
    * @param from string Email de l'expéditeur
    * @param to array/string Adresse(s) du(des) destinataires(s)
    * @param subject string Objet du mail
    * @param body string Contenu du mail
    * @param contentType string Format du mail : txt ou html
    * @param cc array Les destinataires en copie
    * @param bcc string Les destinataires en copie
    * @return boolean renvoie FAUX en cas d'erreur d'envoi
    * @author Cyril MAGUIRE
    **/
    public function sendEmail($name, $from, $to, $subject, $body, $contentType="html", $cc=FALSE, $bcc=FALSE) {

    $eBody = "<html><head><title>'.$subject.'</title></head><body style=\"margin:10px;\">".$body;
    $eBody .= "
    <br />";
    $eBody .= $this->getParam('nom_asso')."</body></html>";

    if(is_array($to))
    $to = implode(', ', $to);
    if(is_array($cc))
    $cc = implode(', ', $cc);
    if(is_array($bcc))
    $bcc = implode(', ', $bcc);

    $headers = "From: ".$name." <".$this->getParam('email').">\r\n";
    $headers .= "Reply-To: no-reply@".$this->getParam('domaine_asso')."\r\n";
    $headers .= 'MIME-Version: 1.0'."\r\n";
    // Content-Type
    if($contentType == 'html')
    $headers .= 'Content-type: text/html; charset="'.PLX_CHARSET.'"'."\r\n";
    else
    $headers .= 'Content-type: text/plain; charset="'.PLX_CHARSET.'"'."\r\n";

    $headers .= 'Content-transfer-encoding: 8bit'."\r\n";

    if($cc != "")
    $headers .= 'Cc: '.$cc."\r\n";
    if($bcc != "")
    $headers .= 'Bcc: '.$bcc."\r\n";

    if (mail($to, $subject, $eBody, $headers) ){
    return TRUE;
    } else {
    return FALSE;
    }
    }

    /**
    * Méthode permettant de mettre en forme le mail de notification à l'administrateur
    *
    * @param $nom string nom de l'adhérent
    * @param $prenom string prenom de l'adhérent
    * @param $adresse1 string première partie de l'adhérent
    * @param $adresse2 string deuxième partie de l'adhérent
    * @param $cp numeric code postal de l'adhérent
    * @param $ville string ville de l'adhérent
    * @param $tel numeric téléphone de l'adhérent
    * @param $mail string email de l'adhérent
    * @param $choix string choix de l'adhérent quant à l'adhésion
    * @param $mailing string choix de l'adhérent quant à l'envoi de mail par l'asso
    * @param $pro array ensemble des caractéristiques professionnelles
    *
    * @return string
    * @author Cyril MAGUIRE
    */
    public function notification($nom,$prenom,$adresse1,$adresse2,$cp,$ville,$tel,$mail,$choix,$mailing,$pro=array()) {
    return '
    <table style="border:none;">
    <thead>
    <tr>
    <th style="border:none;text-align:left;">Nom : '.$nom.'</th>
    </tr>
    <tr>
    <th style="border:none;text-align:left;">Prénom : '.$prenom.'</th>
    </tr>
    </thead>
    <tbody>
    '.($this->getParam('typeAnnuaire') == 'professionnel' ?
    '
    <tr>
    <td style="border:none;">Activité : '.$pro.'</td>
    </tr>
    <tr>
    <td style="border:none;">Etablissement : '.$pro.'</td>
    </tr>
    <tr>
    <td style="border:none;">Service : '.$pro.'</td>
    </tr>
    ': '').'
    <tr>
    <td style="border:none;">Adresse : '.$adresse1.'</td>
    </tr>
    <tr>
    <td style="border:none;">'.$adresse2.'</td>
    </tr>
    <tr>
    <td style="border:none;">Code postal : '.$cp.'</td>
    </tr>
    <tr>
    <td style="border:none;">Ville : '.$ville.'</td>
    </tr>
    <tr>
    <td style="border:none;">Téléphone : '.$this->formatFrenchPhoneNumber($tel).'</td>
    </tr>
    '.($this->getParam('typeAnnuaire') == 'professionnel' ?
    '
    <tr>
    <td style="border:none;">Poste : '.$this->formatFrenchPhoneNumber($pro).'</td>
    </tr>
    ': '').'
    <tr>
    <td style="border:none;"> </td>
    </tr>
    <tr>
    <td style="border:none;">Email : '.$mail.'</td>
    </tr>
    <tr>
    <td style="border:none;">'.(($choix == 'adhesion') ? 'Souhaite devenir adhérent de l’Association '.$this->getParam('nom_asso') : ($choix == 'renouveler') ? 'Souhaite renouveler son adhésion' : 'Ne souhaite plus être membre de l’Association').'</td>
    </tr>
    '.($this->getParam('showAnnuaire') == 'on' ?
    '
    <tr>
    <td style="border:none;">'.(($pro == 'rec') ? 'Accepte que ses coordonnées professionnelles figurent sur le site de l’association' : 'Refuse que ses coordonnées professionnelles figurent sur le site de l’association').'</td>
    </tr>
    ': '').'
    <tr>
    <td style="border:none;">'.(($mailing == 'maillist') ? 'Accepte de recevoir par mail toute information concernant le site de '.$this->getParam('nom_asso') : 'Refuse de recevoir par mail toute information concernant le site de '.$this->getParam('nom_asso')).'</td>
    </tr>
    <tr>
    <td style="border:none;">Envoyé à l’association le '.date('d/m/Y').'</td>
    </tr>
    </tbody>
    </table>
    ';
    }

    /**
    * Méthode qui affiche un message contenant les instructions à suivre pour régler son adhésion
    *
    * @return string
    * @author Cyril MAGUIRE
    */
    public function adresse() {
    return '<p>Merci d\'établir votre règlement à l’ordre de : Association '.$this->getParam('nom_asso').' et de le retourner à l\'adresse suivante :</p>
    <div style="padding-left:50px;">'.$this->getParam('adresse_asso').'</div>
    <p>Dès que l’inscription sera enregistrée par le secrétariat de l\'Association, vous recevrez par E-mail votre confirmation d’inscription.</p>
    <p style="font-size:80%"><strong>Si vous ne recevez aucun mail, pensez à vérifier régulièrement votre dossier <em>spam</em>.</strong></p>';
    }
    ///////////////////////////////////////////////////////////
    //
    // Méthodes permettant la modification des listes de Gutuma
    //
    //////////////////////////////////////////////////////////

    /**
    * Checks the ending of the specified string
    * @param string $haystack The string to check
    * @param string $needle The ending to check for
    * @return bool TRUE if the string ends with the given string, else FALSE
    */
    public function strEnds($haystack, $needle) {
    $ending = substr($haystack, strlen($haystack) - strlen($needle));
    return $ending === $needle;
    }

    /**
    * Loads all of the lists
    * @param bool $load_addresses TRUE if lists addresses should be loaded (default is FALSE)
    * @param bool $inc_private TRUE if private lists should included (default is TRUE)
    * @return mixed Array of lists or FALSE if an error occured
    */
    public function getAllGutumaLists($load_addresses = FALSE, $inc_private = TRUE){
    $lists = array();
    if (!$this->isGutumaActivated) return $lists;
    if ($dh = @opendir(realpath(rtrim($this->;GutumaListsDir,'/')))) {
    while (($file = readdir($dh)) !== FALSE) {
    if (!is_dir($file) && $this->strEnds($file, '.php')) {
    $list = $this->getGutumaList(substr($file, 0, strlen($file - 4)), $load_addresses);
    if ($inc_private || !$list->private)
    $lists[] = $list;
    }
    }
    closedir($dh);
    }
    return $lists;
    }

    /**
    * Gets the list with the specified id
    * @param int $id The list id
    * @param bool $load_addresses TRUE is list addresses should be loaded (default FALSE)
    * @return mixed The list or FALSE if an error occured
    */
    public function getGutumaList($id, $load_addresses = FALSE){
    $time_start = microtime();
    $list = array();
    if (!$this->isGutumaActivated) return $list;
    // Open list file
    $lh = @fopen(realpath(rtrim($this->;GutumaListsDir,'/').'/'.$id.'.php'), 'r');
    if ($lh == FALSE)
    return FALSE;

    // Read header from first line
    $header = explode("|", fgetss($lh));

    $list = $header[0];
    $list = $header[1];
    $list = (bool)$header[2];
    $list = (int)$header[3];

    // Read all address lines
    if ($load_addresses) {
    $addresses = array();
    while (!feof($lh)) {
    $address = trim(fgets($lh));
    if (strlen($address) > 0)
    $addresses[] = $address;
    }
    $list = $addresses;
    }

    fclose($lh);
    return $list;
    }

    /**
    * Creates a new address list
    * @param string $name The list name
    * @param bool $private TRUE if the list should be private (default is FALSE)
    * @param array $addresses
    * @return mixed The new list if it was successfully created, else FALSE
    */
    public function createGutumaList($name, $private = FALSE, $addresses = NULL){
    if (!$this->isGutumaActivated) return true;
    if ($name == '' || preg_match('[^a-zA-Z0-9 \-]', $name))
    return FALSE;

    // Demo mode check for number of addresses
    if (isset($addresses) && count($addresses) >= 100)
    return FALSE;

    // Check for duplicate name
    $all_lists = $this->listsDiff;
    foreach ($all_lists as $l) {
    if (strcasecmp($l->name, $name) == 0)
    return FALSE;
    }

    // Demo mode check for number of lists
    if (count($all_lists) >= 100)
    return FALSE;

    $this->id = time();
    $this->name = $name;
    $this->private = $private;
    $this->addresses = isset($addresses) ? $addresses : array();

    // Save the list
    if (!$this->updateGutumaList()){
    return FALSE;
    }
    return $this;
    }

    /**
    * Adds the specified address to this list
    * @param string $address The address to add
    * @param bool $update TRUE if list should be updated, else FALSE
    * @return bool TRUE if the address was successfully added
    */
    public function addAdressInGutumaList($address, $update){
    if (!$this->isGutumaActivated) return true;
    if (in_array($address, $this->addresses))
    return FALSE;

    if (strlen($address) > 320)
    return FALSE;

    if (count($this->addresses) >= 100)
    return FALSE;

    // Add and then sort addresses alphabetically
    $this->addresses[] = $address;
    natcasesort($this->addresses);

    if ($update) {
    if (!$this->updateGutumaList())
    return FALSE;
    }
    return TRUE;
    }

    /**
    * Updates this address list, i.e., saves any changes
    * @return bool TRUE if operation was successful, else FALSE
    */
    public function updateGutumaList() {
    if (!$this->isGutumaActivated) return true;
    $lh = @fopen(realpath(rtrim($this->;GutumaListsDir,'/')).'/'.$this->id.'.php', 'w');
    if ($lh == FALSE)
    return FALSE;

    fwrite($lh, "<?php die(); ?>".$this->id.'|'.$this->name.'|'.($this->private ? '1' : '0').'|'.count($this->addresses)."\n");
    foreach ($this->addresses as $a)
    fwrite($lh, $a."\n");

    fclose($lh);
    return TRUE;
    }

    /**
    * Removes the specified address from this list
    * @param string $address The address to remove
    * @param bool $update TRUE if list should be updated, else FALSE
    * @return bool TRUE if operation was successful, else FALSE
    */
    public function removeAdressFromGutumaList($address, $update){
    if (!$this->isGutumaActivated) return true;
    // Create new address array minus the one being removed
    $found = FALSE;
    $newaddresses = array();

    foreach ($this->addresses as $a) {
    if ($address != $a)
    $newaddresses[] = $a;
    else
    $found = TRUE;
    }

    if (!$found)
    return FALSE;

    $this->addresses = $newaddresses;

    if ($update) {
    if (!$this->updateGutumaList())
    return FALSE;
    }
    return TRUE;
    }

    ///////////////////////////////////////////////////////////
    //
    // Méthodes permettant la gestion des adhérents
    //
    //////////////////////////////////////////////////////////

    /**
    * Méthode qui selon le paramètre tri retourne sort ou rsort (tri PHP)
    *
    * @param tri asc ou desc
    * @return string
    * @author Stéphane F.
    **/
    protected function mapTri($tri) {
    if($tri=='desc')
    return 'rsort';
    elseif($tri=='asc')
    return 'sort';
    elseif($tri=='alpha')
    return 'alpha';
    else
    return 'rsort';
    }

    /**
    * Méthode qui récupere la liste des articles
    *
    * @param publi before, after ou all => on récupère tous les fichiers (date) ?
    * @return boolean vrai si articles trouvés, sinon faux
    * @author Stéphane F
    **/
    public function getAdherents($motif) {

    # On fait notre traitement sur notre tri
    $ordre = $this->mapTri('asc');
    # On recupere nos fichiers (tries) selon le motif, la pagination, la date de publication
    if($aFiles = $this->plxGlob_adherents->query($motif,'',$ordre,0,false,'all')) {
    # on mémorise le nombre total d'articles trouvés
    foreach($aFiles as $k=>$v) # On parcourt tous les fichiers
    $array[$k] = $this->parseAdherent(PLX_ROOT.$this->getParam('adherents').'adhesions/'.$v);
    # On stocke les enregistrements dans un objet plxRecord
    $this->plxRecord_adherents = new plxRecord($array);
    return true;
    }
    else return false;
    }


    /**
    * Méthode qui récupère les infos enregistrées dans le fichier xml d'un adhérent
    *
    * @param $filename ressource le chemin vers le fichier de l'adhérent
    * @return array
    *
    * @author Cyril MAGUIRE
    */
    public function parseAdherent($filename) {

    if(!is_file($filename)) return;

    # Mise en place du parseur XML
    $data = implode('',file($filename));
    $parser = xml_parser_create(PLX_CHARSET);
    xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
    xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,0);
    xml_parse_into_struct($parser,$data,$values,$iTags);
    xml_parser_free($parser);
    if(isset($iTags) AND isset($iTags)) {
    $nb = sizeof($iTags);
    $size=ceil(sizeof($iTags)/$nb);
    for($i=0;$i<$nb;$i++) {
    $attributes = $values[$iTags[$i*$size]];
    $adherent = $attributes;
    # Recuperation du nom
    $adherent=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation du prenom
    $adherent=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation de l'adresse 1
    $adherent=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation de l'adresse 2
    $adherent=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation du code postal
    $adherent=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation de la ville
    $adherent=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation du téléphone
    $adherent=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation du mail
    $adherent=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation du choix quant à l'adhésion
    $adherent=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation du choix pour le mailing
    $adherent=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation du statut de l'adhérent
    $adherent=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation de la date de première adhésion
    $adherent=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation de la date de validation de l'adhésion
    $adherent=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation de la chaine salt de l'adhérent
    $adherent=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation du mot de passe cripté de l'adhérent
    $adherent=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation de la clé
    $adherent=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation des chaines aléatoires
    $adherent=plxUtils::getValue($values[$iTags[$i]]);
    $adherent=plxUtils::getValue($values[$iTags[$i]]);
    if ($this->getParam('typeAnnuaire') == 'professionnel') {
    # Recuperation de l'activité
    $adherent=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation de l'établissement
    $adherent=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation du service
    $adherent=plxUtils::getValue($values[$iTags[$i]]);
    # Recuperation du poste
    $adherent=plxUtils::getValue($values[$iTags[$i]]);
    }
    if ($this->getParam('showAnnuaire') == 'on') {
    # Recuperation du choix sur le partage des coordonnées
    $adherent=plxUtils::getValue($values[$iTags[$i]]);
    }
    }
    }
    return $adherent;
    }

    /**
    * Méthode permettant de formater un numéro de téléphone au format français ou international
    */
    public function formatFrenchPhoneNumber($phoneNumber, $international = FALSE){
    //Supprimer tous les caractères qui ne sont pas des chiffres
    $phoneNumber = preg_replace('/[^0-9]+/', '', $phoneNumber);
    //Garder les 9 derniers chiffres
    $phoneNumber = substr($phoneNumber, -9);
    //On ajoute +33 si la variable $international vaut TRUE et 0 dans tous les autres cas
    $motif = $international ? '+33 (\1) \2 \3 \4 \5' : '0\1 \2 \3 \4 \5';
    $phoneNumber = preg_replace('/(\d{1})(\d{2})(\d{2})(\d{2})(\d{2})/', $motif, $phoneNumber);

    return $phoneNumber;
    }

    /**
    * Méthode qui retourne le prochain id d'un adhérent
    *
    * @return string id d'un nouvel adhérent sous la forme 0001
    * @author Stephane F.
    **/
    public function nextIdAdherent() {
    # On récupère l'ensemble des adhérents
    //$this->adherentsList = $this->getAdherent(PLX_ROOT.$this->getParam('adherents').'plugin.adhesion.adherents.xml');
    # On récupère le dernier identifiant
    if($aKeys = array_keys($this->plxGlob_adherents->aFiles)) {
    rsort($aKeys);
    return str_pad($aKeys+1,5, '0', STR_PAD_LEFT);
    } else {
    return '00001';
    }
    }

    /**
    * Méthode permettant de supprimer les adhérents sélectionnés
    *
    * @param $content array tableau contenant les index des adhérents à supprimer
    * @param $mail array tableau optionnel contenant les paramètres des mails à envoyer pour confirmation
    *
    * @return bool
    * @author Cyril MAGUIRE
    */
    public function deleteAdherentsList ($content,$mail=array(null)) {
    $action = FALSE;
    foreach($content as $k=>$id) {
    # Vérification de l'intégrité de l'identifiant
    if(!preg_match('/^[0-9]{5}$/',$id))
    return false;
    # Variable d'état
    $resDelAd = true;
    # Suppression de l'adhérent
    if($globAd = $this->plxGlob_adherents->query('/^'.$id.'.(.*).xml$/')) {
    unlink(PLX_ROOT.$this->getParam('adherents').'adhesions/'.$globAd);
    $resDelAd = !file_exists(PLX_ROOT.$this->getParam('adherents').'adhesions/'.$globArt);
    }
    $_SESSION = $this->getLang('L_ADMIN_REMOVE_ADH').'<br/>' ;
    $action = TRUE;
    }
    return $action;
    }

    /**
    * Méthode permettant d'ajouter les mentions légales de la cnil aux mails envoyés avec le lien de suppression
    *
    * @param $id string index de l'adhérent
    * @param $mail string mail de l'adhérent
    * @param $text string mail au format texte ou html (html par défaut)
    *
    * @return string
    * @author Cyril MAGUIRE
    *
    */
    public function cnil($id=0,$mail='',$text=FALSE) {
    $plxMotor = plxMotor::getInstance();
    if ($id == 0 && $mail == '') {
    if ($text) {
    return 'Merci de ne pas répondre à cet e-mail. Celui-ci ayant été généré automatiquement, nous ne pourrons traiter votre réponse.'."\n".'
    Conformément à la Loi Informatique et Libertés du 06/01/1978 et à nos mentions légales vous disposez d\'un droit d\'accès et de rectification sur les données vous concernant.';
    } else {
    return '<p style="text-align:center;">Merci de ne pas répondre à cet e-mail. Celui-ci ayant été généré automatiquement, nous ne pourrons traiter votre réponse.<br/><hr/>Conformément à la Loi Informatique et Libertés du 06/01/1978 et à nos mentions légales vous disposez d\'un droit d\'accès et de rectification sur les données vous concernant.</p>';
    }
    } else {
    if ($text) {
    return 'Merci de ne pas répondre à cet e-mail. Celui-ci ayant été généré automatiquement, nous ne pourrons traiter votre réponse.'."\n".'
    Conformément à la Loi Informatique et Libertés du 06/01/1978 et à nos mentions légales vous disposez d\'un droit d\'accès et de rectification sur les données vous concernant.'."\n".'Pour vous désinscrire de la liste de diffusion, recopiez ce lien dans votre navigateur internet : '.$plxMotor->urlRewrite('?adhesion&q='.md5($id.'-'.$mail));
    } else {
    return '<p style="text-align:center;">Merci de ne pas répondre à cet e-mail. Celui-ci ayant été généré automatiquement, nous ne pourrons traiter votre réponse.<br/><hr/>Conformément à la Loi Informatique et Libertés du 06/01/1978 et à nos mentions légales vous disposez d\'un droit d\'accès et de rectification sur les données vous concernant.<br/><a href="'.$plxMotor->urlRewrite('?adhesion&q='.md5($id.'-'.$mail)).'">Se désinscrire de la liste de diffusion</a></p>';
    }
    }
    }

    /**
    * Méthode permettant de comparer les données du lien cnil et le cas échéant de supprimer le compte associé des listes de diffusion
    *
    * @param $value string $value = md5($id-$mail);
    *
    * @return bool
    * @author Cyril MAGUIRE
    */
    public function compare($value) {
    $content = array();
    $mail = array();
    foreach ($this->plxRecord_adherents->result as $id => $array) {
    if ($value == md5($array.'-'.$array) && $array == 1) {
    $content[] = $array;
    foreach ($array as $key => $value) {
    $content[$key.'_'.$array['id']] = $value;
    }
    $content] = 'blacklist';
    $content[0] ='update';
    $addresses = $this->getAllGutumaLists(TRUE);
    $this->listDiff = $addresses[0];
    $this->editAdherentsList($content,$array,TRUE);
    return TRUE;
    }
    }
    return FALSE;
    }

    /**
    * Générateur de chaines de caractères aléatoire
    *
    * @param $nbLettres integer Nombre de caractères que la chaine contiendra
    * @param $nbCaracteres integer Nombre de caracteres exotiques maximum que la chaine contiendra
    * @param $caracteresSup array Caracteres exotiques que la chaine ne contiendra pas
    * @param $voyellesSup array Voyelles que la chaine ne contiendra pas
    * @param $consonnesSupp array Consonnes que la chaine ne contiendra pas
    *
    * @return string la chaine aléatoire
    * @author Cyril MAGUIRE
    */
    public function generateurMot($nbLettres = 8,$nbCaracteres = 4,$caracteresSup = array(),$nombresSup = array(),$voyellesSup = array(),$consonnesSupp = array()) {

    $choix = array('consonnes','voyelles','caracteres','nombres');
    $mot = '';

    $consonnes = array('b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','z');
    $voyelles = array('a','e','i','o','u','y');
    $caracteres = array('@','#','?','!','+','=','-','%','&','*');
    $nombres = array('0','1','2','3','4','5','6','7','8','9');

    if (!empty($consonnesSupp)) {
    $consonnes = array_diff($consonnes,$consonnesSupp);
    }
    if (!empty($voyellesSup)) {
    $voyelles = array_diff($voyelles,$voyellesSup);
    }
    if (!empty($caracteresSup)) {
    $caracteres = array_diff($caracteres,$caracteresSup);
    }
    if (!empty($nombresSup)) {
    $nombres = array_diff($nombres,$nombresSup);
    }

    if (empty($consonnes)) {
    $consonnes = array('b');
    }
    if (empty($voyelles)) {
    $voyelles = $consonnes;
    }
    if (empty($nombres)) {
    $nombres = $consonnes;
    }

    if ($nbCaracteres == 0) {
    $caracteres = $consonnes;
    }


    $j = 0;
    for($i=0;$i<$nbLettres;$i++) {
    //choix aléatoire entre consonnes et voyelles
    $rand = array_rand($choix,1);
    if ($rand == 3) {
    $j++;
    }
    if ($nbCaracteres != 0 && $j == ($nbCaracteres-1)) {
    $caracteres = $consonnes;
    }
    $type = $choix[$rand];
    $tab = $$type;
    //on recherche l'index d'une lettre, au hasard dans le tableau choisi
    $lettre = array_rand($$type,1);
    //on recherche la dernière lettre du mot généré
    if (strlen($mot) > 0) {
    $derniereLettre = $mot[strlen($mot)-1];
    } else {
    $derniereLettre = '';
    }

    //si la lettre choisie est déjà à la fin du mot généré, on relance la boucle
    if ($tab[$lettre] == $derniereLettre || in_array($derniereLettre,$tab)) {
    $i--;
    } else {//sinon on l'ajoute au mot généré
    $maj = mt_rand(0,10);
    if ($maj<2) {
    $mot .= strtoupper($tab[$lettre]);
    } else {
    $mot .= $tab[$lettre];
    }
    }
    }

    return $mot;
    }

    /**
    * Méthode permettant de définir un mot de passe et une clé lors d'une nouvelle inscription validée
    *
    * @param $id string index de l'adhérent
    *
    * @return $password string mot de passe de l'adhérent en clair
    * @author Cyril MAGUIRE
    */
    public function defPassword($id) {
    if (array_key_exists($id, $this->adherentsList)){
    $id = $this->adherentsList[$id];
    }else {
    $id = end($this->adherentsList) + 1;
    }

    if ($this->plxRecord_adherents->result[$id] == '') {
    $this->plxRecord_adherents->result[$id] = time();
    }
    # controle du mot de passe
    $salt = empty($this->plxRecord_adherents->result[$id]) ? plxUtils::charAleatoire(10) : $this->plxRecord_adherents->result[$id];
    $this->plxRecord_adherents->result[$id] = $salt;
    //Définition du mot de passe
    //Définition de la clé
    $cle = plxUtils::charAleatoire($this->getParam('cle'));
    $rand1 = mt_rand(1,9);
    $rand2 = $this->generateurMot(3,1);
    $password = $cle.'-'.substr($this->plxRecord_adherents->result[$id],0,-$rand1).$rand2;
    //Attribution du mot de passe à l'adhérent
    $this->plxRecord_adherents->result[$id] = empty($this->plxRecord_adherents->result[$id]) ? sha1($salt.md5($password)) : $this->plxRecord_adherents->result[$id];
    $this->plxRecord_adherents->result[$id] = $rand1;
    $this->plxRecord_adherents->result[$id] = $rand2;
    $this->plxRecord_adherents->result[$id] = $cle;
    return $password;
    }


    /**
    * Méthode qui retourne les informations $output en analysant
    * le nom du fichier de l'adhérent $filename
    *
    * @param filename fichier de l'adhérent à traiter
    * @return array information à récupérer
    * @author Stephane F
    **/
    public function adInfoFromFilename($filename) {

    # On effectue notre capture d'informations
    if(preg_match('/([0-9]{5}).([a-z-]+).([a-z-]+).([0-9]{10}).xml$/',$filename,$capture)) {
    return array(
    'adId' => $capture[1],
    'nom' => $capture[2],
    'prenom' => $capture[3],
    'firstDate' => $capture[4]
    );
    }
    }

    /**
    * Méthode permettant de mettre à jour un compte adhérent
    *
    * @param $content array tableau contenant les informations des comptes à mettre à jour
    *
    * @return $mail array tableau contenant les paramètres des mails à envoyer aux adhérents
    * @author Cyril MAGUIRE
    */
    public function updateAdherentsList($content) {
    $mail = array();

    foreach($content as $key => $id) {
    $ad = $this->adherentsList[$id];
    //L'adhérent souhaite ne plus faire partie de l'association
    if ($content == 'stop') {
    //On retire l'email de la liste de diffusion
    if (in_array($content,$this->listDiff)) {
    $this->removeAdressFromGutumaList($content,TRUE);
    $_SESSION = $this->getLang('L_ADMIN_REMOVE_ADD').'<br/>' ;
    }
    $this->plxRecord_adherents->result[$ad] = $content;
    $_SESSION = $this->getLang('L_ADMIN_REMOVE_ADH').'<br/>' ;
    $mail[] = array(
    'name'=>$this->getParam('nom_asso'),
    'from'=>$this->getParam('email'),
    'to'=>$content,
    'subject'=>$this->getParam('devalidation_subject'),
    'body'=>'<p>'.$this->getParam('devalidation_msg').'</p>'.$this->cnil(),
    'contentType'=>'html',
    'cc'=>FALSE,
    'bcc'=>FALSE,
    'notification' => array(
    'adherent' => $this->plxRecord_adherents->result[$ad],
    'sujet' => 'Suppression'
    )
    );
    $this->deleteAdherentsList($content,$mail);
    return FALSE;
    }
    elseif($content!='') {

    $this->plxRecord_adherents->result[$ad] = $content;
    $this->plxRecord_adherents->result[$ad] = $content;
    $this->plxRecord_adherents->result[$ad] = $content;
    $this->plxRecord_adherents->result[$ad] = $content;
    $this->plxRecord_adherents->result[$ad] = intval($content);
    $this->plxRecord_adherents->result[$ad] = $content;
    $this->plxRecord_adherents->result[$ad] = $this->formatFrenchPhoneNumber($content);
    $this->plxRecord_adherents->result[$ad] = $content;
    $this->plxRecord_adherents->result[$ad] = $content;
    $this->plxRecord_adherents->result[$ad] = $content;
    if ($this->getParam('typeAnnuaire') == 'professionnel') {
    if ($content == 'autre') {
    $this->plxRecord_adherents->result[$ad] = $content;
    } else {
    $this->plxRecord_adherents->result[$ad] = $content;
    }
    $this->plxRecord_adherents->result[$ad] = $content;
    $this->plxRecord_adherents->result[$ad] = $content;
    $this->plxRecord_adherents->result[$ad] = $this->formatFrenchPhoneNumber($content);
    }
    if ($this->getParam('showAnnuaire') == 'on') {
    $this->plxRecord_adherents->result[$ad] = $content;
    }

    //On retire l'email de la liste de diffusion si c'est le choix de l'adhérent
    if (in_array($content,$this->listDiff) && $content == 'blacklist') {
    $this->removeAdressFromGutumaList($content,TRUE);
    $_SESSION = $this->getLang('L_ADMIN_REMOVE_ADD').'<br/>' ;
    } elseif (!in_array($content,$this->listDiff) && $content != 'blacklist' && ($content[0]=='update' || $content[1]=='update')) {
    $this->addAdressInGutumaList($content,TRUE);
    $_SESSION = $this->getLang('L_ADMIN_ADD_ADD').'<br/>' ;
    }

    $this->plxRecord_adherents->result[$ad] = $content;
    if ($content[0]!='update' && $content[1]!='update') {

    if ($this->plxRecord_adherents->result[$ad] == 1 && $content == 'renouveler') {
    $plxMotor = plxMotor::getInstance();
    $_SESSION = '<p id="password_error">'.$this->getLang('L_ERR_USER_ALREADY_VALID').'</p>';
    header('Location:'.$plxMotor->urlRewrite());
    exit();
    }
    $this->plxRecord_adherents->result[$ad] = intval($content);

    //Si l'inscription n'est pas validée
    //On supprime l'inscription de l'adhérent mais on conserve ses coordonnées
    if ($this->plxRecord_adherents->result[$ad] == 0 && $content != 'renouveler') {
    //On retire l'email de la liste de diffusion
    if (in_array($content,$this->listDiff)) {
    $this->removeAdressFromGutumaList($content['mail_'.$
  • Bonjour
    Parmi les nouveautés, je vois
    Parmi les nouveautés, vous trouverez au niveau de la gestion des thèmes:
    une meilleure gestion de l'affichage des groupes des pages statiques pour permettre de faire des menus déroulants plus facilement (via jquery par exemple) : fonction staticList()
    vu ici
    Ça veut dire quoi? Je ne comprends pas trop :rolleyes:
    Qu'on peut avoir un menu déroulant en "natif"? Si oui, on fait comment, je plane?
    Merci
  • Va sur le site de Stéphane (pluxopolis). Un des derniers articles décrit comment faire...
  • cpalocpalo Member
    janvier 2014 modifié
    Bonjour

    Le nouveau pluxml me plait bien.. et pas de bug pour le moment.

    Juste un tout petit détail dans le theme par défaut ( ce qui ne me pose pas pb puisque dans le mien j'ai corrigé), la balise blockquote n'a pas été définie. Et si on va en bas d ela page statique 1, on verra que la citation d eHal n'est pas en italique.

    Cordialement
  • JosJos Member
    cpalo a écrit:
    Bonjour

    Le nouveau pluxml me plait bien.. et pas de bug pour le moment.

    Juste un tout petit détail dans le theme par défaut ( ce qui ne me pose pas pb puisque dans le mien j'ai corrigé), la balise blockquote n'a pas été définie. Et si on va en bas d ela page statique 1, on verra que la citation d eHal n'est pas en italique.

    Cordialement

    En effet, la balise blockquote est définie dans reset.css, mais elle n'estpas en italique. Un oublie de ma part. Je me le ,ote pour la prochaine version.
Connectez-vous ou Inscrivez-vous pour répondre.