Subversion Repositories Applications.annuaire

Rev

Rev 120 | Rev 143 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
/**
* PHP Version 5
*
* @category  PHP
* @package   annuaire
* @author    aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license   http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version   SVN: <svn_id>
* @link      /doc/annuaire/
*
*/

/**
 * Controleur chargé de la vérification des formulaires
 * Remplace aussi les valeurs lors des actions spéciales comme la modification du mail
 * (l'inscription à la lettre d'actu se fait aussi ici même si ça n'est pas totalement sa place)
 */
class VerificationControleur extends AppControleur {

        /**
         * Vérifie que les valeurs des champs de mappage et les valeurs obligatoires d'un annuaire donné
         * sont correctes
         * @param int $id_annuaire l'identifiant de l'annuaire
         * @param Array $valeurs les valeurs à vérifier
         */
        public function verifierErreursChampsSelonType($id_annuaire, $valeurs, $tableau_mappage) {

                $erreurs = array();

                $this->chargerModele('AnnuaireModele');
                $tableau_champs_obligatoire = $this->AnnuaireModele->obtenirChampsObligatoires($id_annuaire);

                foreach($valeurs as $id => $valeur_champ) {

                        $type = $valeur_champ['type'];
                        $valeur = $valeur_champ['valeur'];
                        $condition = $valeur_champ['condition'];

                        switch($type) {

                                case 'text':
                                        if($this->estUnchampObligatoire($id, $tableau_champs_obligatoire) && trim($valeur) == '') {
                                                $erreurs[$id] = 'Ce champ est obligatoire';
                                        }
                                break;

                                case 'mail':
                                        if($this->estUnchampObligatoire($id, $tableau_champs_obligatoire) && trim($valeur) == '') {
                                                $erreurs[$id] = 'Le mail est obligatoire ';
                                        }

                                        if($this->estUnchampObligatoire($id, $tableau_champs_obligatoire) && !$this->mailValide($valeur)) {
                                                $erreurs[$id] = 'Le mail est invalide ';
                                        }

                                        if($this->AnnuaireModele->utilisateurExisteParMail($id_annuaire, $valeur)) {
                                                $erreurs[$id] = 'Cet email est déjà utilisé par quelqu\'un d\'autre ';
                                        }
                                break;

                                case 'password':
                                        if($this->estUnchampObligatoire($id, $tableau_champs_obligatoire) && trim($valeur) == ''
                                        || $valeur != $condition) {
                                                $erreurs[$id] = 'Le mot de passe est invalide';
                                        }
                                break;

                                // cas du champ checkbox
                                case 'checkbox':
                                        if($this->estUnchampObligatoire($id, $tableau_champs_obligatoire) && trim($condition) != 'on') {
                                                $erreurs[$id] = 'N\'oubliez pas de cocher cette case';
                                        }
                                break;

                                default:

                                break;
                        }
                }

                if(count($erreurs) == 0) {
                        $erreurs = false;
                }

                return $erreurs;
        }

        /**
         * Vérifie les valeurs des champs pour la modification d'un formulaire
         */
        public function verifierErreurChampModification($id_annuaire, $id_utilisateur, $type ,$valeur, $confirmation = false) {

                $retour = array(true,false);

                switch($type) {
                        case 'mail':
                                if(!$this->mailValide($valeur)) {
                                        $retour[0] = false;
                                        $retour[1] = 'mail invalide';
                                        break;
                                }

                                $this->chargerModele('AnnuaireModele');
                                $ancien_mail = $this->AnnuaireModele->obtenirMailParId($id_annuaire,$id_utilisateur);

                                if($ancien_mail != $valeur && $this->AnnuaireModele->utilisateurExisteParMail($id_annuaire, $valeur)) {
                                        $retour[0] = false;
                                        $retour[1] = 'cet email est déjà utilisé par quelqu\'un d\'autre';
                                }

                        break;

                        case 'password':

                                if(trim($valeur) != trim($confirmation)) {
                                        $retour[0] = false;
                                        $retour[1] = 'mot de passe invalide';
                                }
                }

                return $retour;
        }

        public function remplacerValeurChampPourInsertion($type, $valeur, $mail_utilisateur) {

                $valeur_modifiee = $valeur;

                switch($type) {

                        // cas du champ texte, à priori, rien de particulier
                        case 'text':
                                $valeur_modifiee = $valeur;
                        break;

                        // cas du champ password : on le crypte
                        case 'password':
                                $valeur_modifiee = $this->encrypterMotDePasse($valeur);
                        break;

                        // cas du champ checkbox
                        case 'checkbox':
                                // Si c'est un groupe checkbox, alors c'est une liste de checkbox liée à une ontologie
                                if(is_array($valeur)) {
                                        // on stocke les valeurs d'ontologies liées au cases cochées
                                        $valeur_modifiee = implode(Config::get('separateur_metadonnee'), array_keys($valeur));

                                } else {
                                        if($valeur == 'on') {
                                                // sinon on stocke 1 pour indique que la case est cochée (cas de la checkbox oui/non)
                                                $valeur_modifiee = 1;
                                        } else {
                                                $valeur_modifiee = 0;
                                        }
                                }

                        break;

                        case 'lettre':
                                        if($valeur == 'on') {
                                                // sinon on stocke 1 pour indique que la case est cochée (cas de la checkbox oui/non)
                                                $valeur_modifiee = 1;
                                                // Si c'est une inscription à la lettre d'actualité, on appelle la fonction d'inscription
                                                $lettre_controleur = new LettreControleur();
                                                $lettre_controleur->inscriptionLettreActualite($mail_utilisateur);
                                        } else {
                                                $valeur_modifiee = 0;
                                        }
                        break;

                        default:
                                $valeur_modifiee = $valeur;
                        break;
                }

                return $valeur_modifiee;
        }

        public function remplacerValeurChampPourModification($id_annuaire, $id_utilisateur, $type, $valeur, $mail_utilisateur) {

                $valeur_modifiee = $valeur;

                switch($type) {

                        // cas du champ texte, à priori, rien de particulier
                        case 'text':
                                $valeur_modifiee = $valeur;
                        break;

                        // cas du champ password : on le crypte
                        case 'password':
                                $valeur_modifiee = $this->encrypterMotDePasse($valeur);
                        break;

                        // cas du champ checkbox
                        case 'checkbox':
                                
                                // Si c'est un groupe checkbox, alors c'est une liste de checkbox liée à une ontologie
                                if(is_array($valeur)) {

                                        // on stocke les valeurs d'ontologies liées au cases cochées
                                        $valeur_modifiee = implode(Config::get('separateur_metadonnee'), array_keys($valeur));

                                } else {
                                        if($valeur == 'on' || $valeur = '1') {
                                                // sinon on stocke 1 pour indique que la case est cochée (cas de la checkbox oui/non)
                                                $valeur_modifiee = 1;
                                        } else {
                                                $valeur_modifiee = 0;
                                        }
                                }

                        break;

                        case 'lettre':

                                // Si c'est une inscription à la lettre d'actualité, on appelle la fonction d'inscription
                                $lettre_controleur = new LettreControleur();

                                $this->chargerModele('AnnuaireModele');
                                $ancien_mail = $this->AnnuaireModele->obtenirMailParId($id_annuaire, $id_utilisateur);

                                $changement_mail = false;

                                if($ancien_mail != $mail_utilisateur) {
                                        $changement_mail = true;
                                }

                                if($valeur == 'on') {
                                        // on stocke 1 pour indique que la case est cochée (comme la checkbox oui/non)
                                        $valeur_modifiee = 1;

                                        // si le mail a changé on désinscrit l'ancien mail et on inscrit le nouveau
                                        if($changement_mail) {
                                                $lettre_controleur->ModificationInscriptionLettreActualite($ancien_mail, $mail_utilisateur);
                                        } else {
                                                $lettre_controleur->inscriptionLettreActualite($mail_utilisateur);
                                        }

                                } else {
                                        // sinon, si la case est vide
                                        $valeur_modifiee = 0;
                                        $mail_a_desinscrire = $mail_utilisateur;
                                        if($changement_mail) {
                                                $mail_a_desinscrire = $ancien_mail;
                                        }
                                        // on desinscrit l'utilisateur
                                        $lettre_controleur->desinscriptionLettreActualite($mail_a_desinscrire);
                                }
                        break;

                        default:
                                $valeur_modifiee = $valeur;
                        break;
                }

                return $valeur_modifiee;
        }

        public function verifierEtRemplacerValeurChampPourAffichage($type, $valeur, $id_annuaire) {

                if(!$type) {
                        $valeur_modifiee = array();

                        $valeur_modifiee['amv_type'] = 'champ_annuaire';
                        $valeur_modifiee['amv_valeur_affichage'] = $valeur;

                } else {
                        
                        if(!isset($valeur['amv_valeur'])) {
                                $valeur['amv_valeur'] = '';
                        }

                        $valeur_modifiee = $valeur;

                        switch($type) {

                                // cas du champ texte, à priori, rien de particulier
                                case 'text':
                                        $valeur_modifiee['amv_valeur_affichage'] = $this->remplacerLienHtml($valeur['amv_valeur']);
                                break;
                                
                                // cas du champ texte long, à priori, rien de particulier
                                case 'textarea':
                                        $valeur_modifiee['amv_valeur_affichage'] = $this->remplacerLienHtml($valeur['amv_valeur']);
                                break;

                                // cas du champ checkbox
                                case 'checkbox':
                                        // si c'est un groupe checkbox, alors c'est une liste de checkbox liée à une ontologie
                                        if(isset($valeur['amo_nom'])) {
                                                if(is_array($valeur['amo_nom']) && count($valeur['amo_nom']) > 0) {
                                                // on stocke les valeurs d'ontologies liées au cases cochées
                                                        $valeur_modifiee['amv_valeur_affichage'] = implode(', ', $valeur['amo_nom']);
                                                } else {
                                                        $valeur_modifiee['amv_valeur_affichage'] = $valeur['amo_nom'];
                                                }
                                        } else {
                                                // sinon on stocke 1 pour indique que la case est cochée (cas de la checkbox oui/non)
                                                if($valeur_modifiee == 1) {
                                                        $valeur_modifiee['amv_valeur_affichage'] = 'oui';
                                                } else {
                                                        $valeur_modifiee['amv_valeur_affichage'] = 'non';
                                                }
                                        }
                                break;

                                case 'select':
                                        // TODO: si ça n'existe pas on va le chercher ?
                                        if(isset($valeur['amo_nom'])) {
                                                $valeur_modifiee['amv_valeur_affichage'] = $valeur['amo_nom'];
                                        } else {
                                                if(isset($valeur['amv_valeur'])) {
                                                        $ontologie_modele = new OntologieModele();
                                                        $infos_onto = $ontologie_modele->chargerInformationsOntologie($valeur['amv_valeur']);
                                                        if(is_array($infos_onto) && !empty($infos_onto)) {
                                                                $valeur_modifiee['amv_valeur_affichage'] = $infos_onto['amo_nom'];
                                                        } else  {
                                                                $valeur_modifiee['amv_valeur_affichage'] = '';
                                                        }
                                                } else  {
                                                        $valeur_modifiee['amv_valeur_affichage'] = '';
                                                }
                                        }
                                        
                                break;

                                case 'radio':
                                        $valeur_modifiee['amv_valeur_affichage'] = $valeur['amo_nom'];
                                break;

                                case 'image':
                                        // si c'est une image, on recherche son url véritable à partir de l'id donnée en paramètre
                                        if(isset($valeur['amv_valeur']) && $valeur['amv_valeur'] != '') {
                                                $this->chargerModele('ImageModele');
                                                $valeur_modifiee['amv_valeur_affichage'] = $this->ImageModele->obtenirEmplacementFichierParId($valeur['amv_valeur'],$id_annuaire, 'S');
                                        }
                                break;

                                // cas du champ lettre
                                case 'lettre':

                                        // on affiche oui ou non
                                        if($valeur_modifiee['amv_valeur'] == 1) {
                                                $valeur_modifiee['amv_valeur_affichage'] = 'oui';
                                        } else {
                                                $valeur_modifiee['amv_valeur_affichage'] = 'non';
                                        }
                                break;
                                
                                // cas de la date, on la formate
                                case 'date':
                                        
                                        //echo '|'.$valeur['amv_valeur'].'|';
                                        
                                        $format = Config::get('date_format_simple');
                                        if(!isset($format)) {
                                                $format = 'd/m/Y';
                                        }
                                        
                                        $time = strtotime($valeur['amv_valeur']);
                                        
                                        if(!$time || $time == '') {
                                                $valeur_modifiee['amv_valeur_affichage'] = $valeur['amv_valeur'];
                                        } else {
                                                $valeur_modifiee['amv_valeur_affichage'] = date($format, $time);
                                        }
                                        
                                        $valeur_modifiee['amv_valeur_affichage'] = date($format, $time);
                                                                
                                break;

                                default:
                                        $valeur_modifiee['amv_valeur_affichage'] = $valeur['amv_valeur'];
                                break;
                        }
                }

                return $valeur_modifiee;
        }
        
        public function collecterValeurInscription($valeurs, $tableau_mappage) {
                
                $valeurs_mappees = array();
                $valeurs_a_inserer = array();
                
                // on itère sur le tableau de valeur pour récupérer les champs de mappage;
                foreach($valeurs as $nom_champ => $valeur) {

                        // pour chaque valeur
                        // on extrait l'id du champ
                        $ids_champ = mb_split("_",$nom_champ, 3);

                        if(count($ids_champ) == 3) {

                                $type = $ids_champ[0];
                                $id_champ = $ids_champ[2];
                                $condition = $ids_champ[1];

                                // cas de la checkbox qui devrait être là mais pas cochée
                                if($condition == 'hidden' && !isset($valeurs[$type.'_'.$id_champ])) {
                                        // dans ce cas là on fabrique une valeur vide
                                        $valeurs[$type.'_'.$id_champ] = 0;
                                }

                        } else {
                                $type = $ids_champ[0];
                                $condition = false;
                                $id_champ = $ids_champ[1];
                        }

                        // Si le champ fait partie des champs mappés
                        $cle_champ = array_search($id_champ, $tableau_mappage[1]);

                        // on ajoute sa clé correspondante dans le tableau des champs mappés
                        // qui sont les champs à vérifier
                        if($condition) {
                                $condition = $valeurs[$type.'_'.$id_champ];
                                $valeurs_mappees[$id_champ] = array('valeur' => $valeur, 'type' => $type, 'condition' => $condition);
                        } else {
                                //$valeurs_mappees[$cle_champ] = $valeur;
                                $valeurs_mappees[$id_champ] = array('valeur' => $valeur, 'type' => $type, 'condition' => false);
                        }

                        if(!$condition) {
                                $valeurs_a_inserer[$nom_champ] = $valeur;
                        }
                }
                
                return array('valeurs_mappees' => $valeurs_mappees, 'valeurs_a_inserer' => $valeurs_a_inserer);
        }

        /**
         * Renvoie vrai ou faux suivant qu'un mail donné en paramètre est syntaxiquement valide (ne vérifie pas l'existence
         * de l'adresse)
         * @param string $mail le mail à tester
         * @return boolean vrai ou faux suivant que le mail est valide ou non
         */
        public function mailValide($mail) {

                $regexp_mail = '/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/';
                return preg_match($regexp_mail, $mail);

        }

        /**
         * Renvoie un mot de passe crypté selon la fonction d'encryptage définie dans le fichier de configuration
         * (si celle-ci n'existe pas on utilise une fonction par défaut)
         * @param string $pass le mot de passe à encrypter
         * @return string le mot de passe encrypté
         */
        public function encrypterMotDePasse($pass) {

                $fonction = Config::get('pass_crypt_fonct');

                if(function_exists($fonction)) {
                        return $fonction($pass);
                } else {
                        return md5($pass);
                }
        }

        //TODO: créer une class util
        static function encrypterMotDepasseStatic($pass) {

                $fonction = Config::get('pass_crypt_fonct');

                if(function_exists($fonction)) {
                        return $fonction($pass);
                } else {
                        return md5($pass);
                }
        }
        
        public function genererMotDePasse() {
                
                $pass = "";
                $chaine = "abcdefghkmnpqrstuvwxyzABCDEFGHKLMNPQRSTUVWXYZ23456789";

                srand((double)microtime()*1000000);
                for($i = 0; $i < 10; $i++){
                        $pass .= $chaine[rand()%strlen($chaine)];
                }
                
                return $pass;
                
        }

        /**
         * Suivant un identifiant de champ et un tableau, renvoie vrai ou faux suivant que le champs est obligatoire ou non
         * @param int $id_champ l'identifiant de champ
         * @param int $champ_obligatoire le tableau des champs obligatoires
         */
        private function estUnchampObligatoire($id_champ, $champs_obligatoire) {

                return in_array($id_champ, $champs_obligatoire) || in_array($id_champ, array_keys($champs_obligatoire));
        }
        
        /**
         * 
         */
        private function remplacerLienHtml($texte) {
                
                $expr = "(http[\S\.\/:]*)";
                
                $matches = array();
                preg_match_all($expr, $texte, $matches);
                                
                foreach($matches as $match) {
                        
                        foreach($match as $element) {
                                $str_lien = '<br /><a class="info_resume" href="'.$element.'" >'.$element.'</a>'; 
                                $texte = str_replace($element, $str_lien, $texte);
                        }
                }
                
                return $texte;
        }
}
?>