Subversion Repositories eFlore/Applications.cel

Rev

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

 <?php
// declare(encoding='UTF-8');
/**
 * Service affichant les dernières photo publiques du CEL ouvrable sous forme de diaporama.
 * Encodage en entrée : utf8
 * Encodage en sortie : utf8
 *
 * Cas d'utilisation et documentation :
 * @link http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=AideCELWidgetPhoto
 *
 * Paramètres :
 * ===> extra = booléen (1 ou 0)  [par défaut : 1]
 * Affiche / Cache la vignette en taille plus importante au bas du widget.
 * ===> vignette = [0-9]+,[0-9]+  [par défaut : 4,3]
 * Indique le nombre de vignette par ligne et le nombre de ligne.
 *
 * @author              Jean-Pascal MILCENT <jpm@tela-botanica.org>
 * @license     GPL v3 <http://www.gnu.org/licenses/gpl.txt>
 * @license     CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
 * @version     $Id$
 * @copyright   Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org)
 */
class Manager extends WidgetCommun {

  const DS = DIRECTORY_SEPARATOR;
  const SERVICE_DEFAUT = 'manager';
  private $cel_url_tpl = null;
  /** Si spécifié, on ajoute une barre de navigation inter-applications */
  private $bar;
  //private $parametres_autorises = array('projet', 'type', 'langue', 'order');
  private $parametres_autorises = array(
    'projet' => 'projet',
    'type' => 'type',
    'langue' => 'langue',
    'order' => 'order'
  );
  /**
   * Méthode appelée par défaut pour charger ce widget.
   */
  public function executer() {
    $retour = null;

    // Pour la création de l'id du cache nous ne tenons pas compte du paramètre de l'url callback
    unset( $this->parametres['callback'] );
    extract( $this->parametres );
    $this->bar = ( isset( $bar ) ) ? $bar : false;

    $framework = dirname( __FILE__ ) . '/framework.php';

    if ( !file_exists( $framework ) ) {

      $e = 'Veuillez paramêtrer l\'emplacement et la version du Framework dans le fichier $framework';
      trigger_error( $e, E_USER_ERROR );
    } else {

      // Inclusion du Framework
      require_once $framework;
      // Ajout d'information concernant cette application
      Framework::setCheminAppli( __FILE__ );// Obligatoire
      Framework::setInfoAppli( Config::get( 'info' ) );// Optionnel
    }

    if ( !isset( $mode ) ) {

      $mode = self::SERVICE_DEFAUT;
    }

    $this->cel_url_tpl = $this->config['manager']['celUrlTpl'];

    if ( $_POST !== array() ) { //print_r($_POST);

      $this->parametres['projet'] = $_POST['projet'];
      $this->parametres['langue'] = $_POST['langue'];

      if ( $mode === 'modification' ) {

        $parametres = $this->traiterParametresModif();
        $json       = $this->getDao()->modifier( $this->cel_url_tpl, $parametres );
      } else {

        $donnees = array_merge( $_POST, $this->traiterDonneesFiles() );
        $json  = $this->getDao()->ajouter( $this->cel_url_tpl, $donnees );
        $mode  = $this->parametres['mode'] = 'modification';
      }
    }




    $methode = $this->traiterNomMethodeExecuter( $mode );
    if ( method_exists( $this, $methode ) ) {

      $retour = $this->$methode();
    } else {

      $this->messages[] = "Ce type de service '$methode' n'est pas disponible.";
    }

    $contenu = '';
    if ( is_null( $retour ) ) {
      $this->messages[] = 'La ressource demandée a retourné une valeur nulle.';

    } else {

      if ( isset( $retour['donnees'] ) ) {

        $retour['donnees']['params']   = '&projet=' . $_POST['projet'] . '&langue=' . $_POST['langue'];
        $retour['donnees']['prod']     = ( $this->config['parametres']['modeServeur'] === 'prod' );
        $retour['donnees']['bar']      = $this->bar;
        $retour['donnees']['url_base'] = sprintf( $this->config['chemins']['baseURLAbsoluDyn'], '' );

        $retour['donnees']['mode']     = $mode; //print_r($retour);
        $squelette = dirname( __FILE__ ) . self::DS . 'squelettes' . self::DS . $retour['squelette'] . '.tpl.html';
        $contenu   = $this->traiterSquelettePhp( $squelette, $retour['donnees'] );
      } else {

        $this->messages[] = 'Les données à transmettre au squelette sont nulles.';
      }
    }
    $this->envoyer($contenu);
  }

  private function executerManager() {
    $params = array();
    $retour['squelette'] = 'manager';

    foreach ( $this->parametres_autorises as $id => $pa ) {
      if ( isset( $this->parametres[$pa] ) ) {

        $params[] = $pa . '=' . $this->parametres[$pa];
      }
    }

    $param = implode( $params, '&' );
    $url   = $this->cel_url_tpl;

    if ( $param !== '' ) {

      $url .= '?' . $param;
    }

    $json = $this->getDao()->consulter( $url );
    $retour['donnees']['widget']       = (array) json_decode( $json, true );
    $retour['donnees']['widgetUrlTpl'] = $this->config['manager']['widgetUrlTpl'];

    return $retour;
  }

  private function executerCreation() {
    //https://api.tela-botanica.org/service:cel:NomsChampsEtendus/cle
    $jsonlangue    = $this->getDao()->consulter( $this->config['manager']['languesUrl'] );
    $tableaulangue = (array) json_decode( $jsonlangue, true );
    $retour['squelette']          = 'creation';
    $retour['donnees']['langues'] = $tableaulangue['resultat'] ;
    $retour['donnees']['widget']  = array();

    if ( isset( $this->parametres['projet'] ) ) {

      $url     = $this->cel_url_tpl . '?projet=' . $this->parametres['projet'];
      $json    = $this->getDao()->consulter( $url );
      $tableau = (array) json_decode( $json, true );
      $retour['donnees']['widget'] = $tableau[0];
    }

    $urltype     = $this->cel_url_tpl . '?esttype=1';
    $jsontype    = $this->getDao()->consulter( $urltype );
    $tableautype = (array) json_decode( $jsontype, true );
    $retour['donnees']['type'] = $tableautype;

    return $retour;
  }



  private function executerModification() {
    $retour = array();
    if ( isset( $this->parametres['projet'] ) ) {

      $url     = $this->cel_url_tpl . '?projet=' . $this->parametres['projet'] . '&langue=' . $this->parametres['langue'];
      $json    = $this->getDao()->consulter( $url );
      $tableau = (array) json_decode( $json, true );
      $retour['squelette']         = 'creation';
      $retour['donnees']['widget'] = $tableau[0];

      $urltype     = $this->cel_url_tpl .'?esttype=1';
      $jsontype    = $this->getDao()->consulter( $urltype );
      $tableautype = (array) json_decode( $jsontype, true );
      $retour['donnees']['type'] = $tableautype;
    }//print_r($retour['donnees']);

    return $retour;
  }
  private function traiterParametres() {
    $parametres_flux = '?';
    $criteres        = array( 'utilisateur', 'commune', 'dept', 'taxon', 'commentaire', 'date', 'tag', 'motcle', 'projet', 'num_taxon', 'num_nom', 'referentiel', 'groupe_zones_geo' );

    foreach( $this->parametres as $nom_critere => $valeur_critere ) {
      if ( in_array( $nom_critere, $criteres ) ) {

        $valeur_critere   = str_replace( ' ', '%20', $valeur_critere );
        $parametres_flux .= $nom_critere . '=' . $valeur_critere . '&';
      }
    }

    $parametres_flux = ( $parametres_flux === '?' ) ? '' : rtrim( $parametres_flux, '&' );

    return $parametres_flux;
  }

  private function traiterParametresModif() {
    $parametres_modif = array();

    foreach ( $_POST as $id => $parametres ) {
      if ($parametres !== '' ) {

        $parametres_modif[$id] = $parametres;
      }
    }

    return $parametres_modif;
  }

  private function traiterDonneesFiles() {
    $files_descriptions = array(
      'info',
      'logo',
      'fond'
    );
    $return = array();
    $dossier_url = dirname(__FILE__) . '/squelettes/img/images_projets/' . $_POST['projet'] . '/';
    $transmettre_donnees = false;

    foreach ( array_keys( $_FILES ) as $file ) {
      if ( $_FILES[$file]['name'] !== '' ) {

        $transmettre_donnees = true;
        $is_help_file = strstr( $file, 'help-');

        if ( $file === 'especes' ) {

          $return['especes']['name'] = 'especes.csv';
          $return['especes']['type'] = $_FILES['especes']['type'];
        } elseif ( in_array( $file, $files_descriptions ) ) {

          $return['images_description'][$file]['type'] = $_FILES[$file]['type'];
          $return['images_description'][$file]['name'] = $file . strrchr( $_FILES[$file]['name'], '.' );

        } elseif ( $is_help_file ) {

          $real_file_key = str_replace( 'help-', '', $file );
          $return['images_aide'][$real_file_key]['type'] = $_FILES[$file]['type'];
          $return['images_aide'][$real_file_key]['name'] = $real_file_key . strrchr( $_FILES[$file]['name'], '.' );
        }
      }
    }
    if ( $transmettre_donnees ) {
      if( !is_dir( $dossier_url ) ) {

        mkdir( $dossier_url, 0755 );
      }

      if ( count( $return['especes'] ) > 0 ) {
        $this->televerser( 'especes', $return['especes']['name'], $dossier_url );
      }

      foreach ( array_keys( $return['images_description'] ) as $file ) {
        $this->televerser( $file, $return['images_description'][ $file ]['name'], $dossier_url );
      }

      foreach ( array_keys( $return['images_aide'] ) as $file ) {
        $this->televerser( 'help-' . $file, $return['images_aide'][ $file ]['name'], $dossier_url );
      }


    }

    return $return;
  }

  private function televerser( $file, $new_file_name, $dossier_url ) {

    $fichier = $new_file_name;
    $taille_maxi = 5242880;
    $taille = filesize( $_FILES[$file]['tmp_name'] );
    $extension = strrchr( $_FILES[$file]['name'], '.' );
    $extensions = array( '.png', '.gif', '.jpg', '.jpeg', '.csv' );

    //Début des vérifications de sécurité...
    if ( file_exists( $dossier_url . $new_file_name ) ) {
      if ( $_POST['mode'] === 'modification' ) {

        // Le fichier existe déjà, c'est normal si on est en mode modification
        unlink ( $dossier_url . $new_file_name );
      } else {

        $erreur =
          "<p class=\"message\" style=\"background-color: #f9e2d7;border-color: #eca27e;color: #9c4217;fill: #9c4217;border: 0.1rem solid;border-radius: 0.4rem;padding: 0.5rem; display: inline-block;margin: 1rem\"> Echec du téléchargement : ".
          "Un fichier image pour \"" . str_replace( $extension, '', $new_file_name ) . "\", dans un projet \"" . $_POST['projet'] . "\".</p>";
      }
    }

    if ( !in_array( $extension, $extensions ) ) {

      //Si le format n'est pas bon
      $erreur = '<p class="message" style="background-color: #f9e2d7;border-color: #eca27e;color: #9c4217;fill: #9c4217;border: 0.1rem solid;border-radius: 0.4rem;padding: 0.5rem; display: inline-block;margin: 1rem"> Echec du téléchargement, formats acceptés : png, gif, jpg, jpeg, ou csv</p>';
    }

    if ( $taille > $taille_maxi ) {

      $erreur = '<p class="message" style="background-color: #f9e2d7;border-color: #eca27e;color: #9c4217;fill: #9c4217;border: 0.1rem solid;border-radius: 0.4rem;padding: 0.5rem; display: inline-block;margin: 1rem"> Echec du téléchargement : Max 5Mo</p>';
    }

    if ( !isset( $erreur ) ) {

      // Formatage du nom du fichier
      $fichier = $this->remove_accents( $fichier );
      $fichier = preg_replace( '/([^.a-z0-9]+)/i', '-', $fichier );

//////////// C'est ici que ça merde à priori ///////////////////////////////////////////////////
var_dump($dossier_url . $fichier);
      if ( move_uploaded_file( $_FILES[$file]['tmp_name'], $dossier_url . $fichier ) ) {
      // move_uploaded_file() renvoie false si l'upload a échoué

        echo 'Téléchargement effectué avec succès';
      } else {

        echo '<p class="message" style="background-color: #f9e2d7;border-color: #eca27e;color: #9c4217;fill: #9c4217;border: 0.1rem solid;border-radius: 0.4rem;padding: 0.5rem; display: inline-block;margin: 1rem"> Echec du téléchargement</p>';
      }
    } else {

      echo $erreur;
    }
  }

  private function remove_accents( $string ) {
    if ( !preg_match( '/[\x80-\xff]/' , $string ) ) {

      return $string;
    }

    $chars = array(
      // Decompositions for Latin-1 Supplement
      chr(195).chr(128) => 'A', chr(195).chr(129) => 'A',
      chr(195).chr(130) => 'A', chr(195).chr(131) => 'A',
      chr(195).chr(132) => 'A', chr(195).chr(133) => 'A',
      chr(195).chr(135) => 'C', chr(195).chr(136) => 'E',
      chr(195).chr(137) => 'E', chr(195).chr(138) => 'E',
      chr(195).chr(139) => 'E', chr(195).chr(140) => 'I',
      chr(195).chr(141) => 'I', chr(195).chr(142) => 'I',
      chr(195).chr(143) => 'I', chr(195).chr(145) => 'N',
      chr(195).chr(146) => 'O', chr(195).chr(147) => 'O',
      chr(195).chr(148) => 'O', chr(195).chr(149) => 'O',
      chr(195).chr(150) => 'O', chr(195).chr(153) => 'U',
      chr(195).chr(154) => 'U', chr(195).chr(155) => 'U',
      chr(195).chr(156) => 'U', chr(195).chr(157) => 'Y',
      chr(195).chr(159) => 's', chr(195).chr(160) => 'a',
      chr(195).chr(161) => 'a', chr(195).chr(162) => 'a',
      chr(195).chr(163) => 'a', chr(195).chr(164) => 'a',
      chr(195).chr(165) => 'a', chr(195).chr(167) => 'c',
      chr(195).chr(168) => 'e', chr(195).chr(169) => 'e',
      chr(195).chr(170) => 'e', chr(195).chr(171) => 'e',
      chr(195).chr(172) => 'i', chr(195).chr(173) => 'i',
      chr(195).chr(174) => 'i', chr(195).chr(175) => 'i',
      chr(195).chr(177) => 'n', chr(195).chr(178) => 'o',
      chr(195).chr(179) => 'o', chr(195).chr(180) => 'o',
      chr(195).chr(181) => 'o', chr(195).chr(182) => 'o',
      chr(195).chr(182) => 'o', chr(195).chr(185) => 'u',
      chr(195).chr(186) => 'u', chr(195).chr(187) => 'u',
      chr(195).chr(188) => 'u', chr(195).chr(189) => 'y',
      chr(195).chr(191) => 'y',
      // Decompositions for Latin Extended-A
      chr(196).chr(128) => 'A', chr(196).chr(129) => 'a',
      chr(196).chr(130) => 'A', chr(196).chr(131) => 'a',
      chr(196).chr(132) => 'A', chr(196).chr(133) => 'a',
      chr(196).chr(134) => 'C', chr(196).chr(135) => 'c',
      chr(196).chr(136) => 'C', chr(196).chr(137) => 'c',
      chr(196).chr(138) => 'C', chr(196).chr(139) => 'c',
      chr(196).chr(140) => 'C', chr(196).chr(141) => 'c',
      chr(196).chr(142) => 'D', chr(196).chr(143) => 'd',
      chr(196).chr(144) => 'D', chr(196).chr(145) => 'd',
      chr(196).chr(146) => 'E', chr(196).chr(147) => 'e',
      chr(196).chr(148) => 'E', chr(196).chr(149) => 'e',
      chr(196).chr(150) => 'E', chr(196).chr(151) => 'e',
      chr(196).chr(152) => 'E', chr(196).chr(153) => 'e',
      chr(196).chr(154) => 'E', chr(196).chr(155) => 'e',
      chr(196).chr(156) => 'G', chr(196).chr(157) => 'g',
      chr(196).chr(158) => 'G', chr(196).chr(159) => 'g',
      chr(196).chr(160) => 'G', chr(196).chr(161) => 'g',
      chr(196).chr(162) => 'G', chr(196).chr(163) => 'g',
      chr(196).chr(164) => 'H', chr(196).chr(165) => 'h',
      chr(196).chr(166) => 'H', chr(196).chr(167) => 'h',
      chr(196).chr(168) => 'I', chr(196).chr(169) => 'i',
      chr(196).chr(170) => 'I', chr(196).chr(171) => 'i',
      chr(196).chr(172) => 'I', chr(196).chr(173) => 'i',
      chr(196).chr(174) => 'I', chr(196).chr(175) => 'i',
      chr(196).chr(176) => 'I', chr(196).chr(177) => 'i',
      chr(196).chr(178) => 'IJ',chr(196).chr(179) => 'ij',
      chr(196).chr(180) => 'J', chr(196).chr(181) => 'j',
      chr(196).chr(182) => 'K', chr(196).chr(183) => 'k',
      chr(196).chr(184) => 'k', chr(196).chr(185) => 'L',
      chr(196).chr(186) => 'l', chr(196).chr(187) => 'L',
      chr(196).chr(188) => 'l', chr(196).chr(189) => 'L',
      chr(196).chr(190) => 'l', chr(196).chr(191) => 'L',
      chr(197).chr(128) => 'l', chr(197).chr(129) => 'L',
      chr(197).chr(130) => 'l', chr(197).chr(131) => 'N',
      chr(197).chr(132) => 'n', chr(197).chr(133) => 'N',
      chr(197).chr(134) => 'n', chr(197).chr(135) => 'N',
      chr(197).chr(136) => 'n', chr(197).chr(137) => 'N',
      chr(197).chr(138) => 'n', chr(197).chr(139) => 'N',
      chr(197).chr(140) => 'O', chr(197).chr(141) => 'o',
      chr(197).chr(142) => 'O', chr(197).chr(143) => 'o',
      chr(197).chr(144) => 'O', chr(197).chr(145) => 'o',
      chr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe',
      chr(197).chr(148) => 'R',chr(197).chr(149) => 'r',
      chr(197).chr(150) => 'R',chr(197).chr(151) => 'r',
      chr(197).chr(152) => 'R',chr(197).chr(153) => 'r',
      chr(197).chr(154) => 'S',chr(197).chr(155) => 's',
      chr(197).chr(156) => 'S',chr(197).chr(157) => 's',
      chr(197).chr(158) => 'S',chr(197).chr(159) => 's',
      chr(197).chr(160) => 'S', chr(197).chr(161) => 's',
      chr(197).chr(162) => 'T', chr(197).chr(163) => 't',
      chr(197).chr(164) => 'T', chr(197).chr(165) => 't',
      chr(197).chr(166) => 'T', chr(197).chr(167) => 't',
      chr(197).chr(168) => 'U', chr(197).chr(169) => 'u',
      chr(197).chr(170) => 'U', chr(197).chr(171) => 'u',
      chr(197).chr(172) => 'U', chr(197).chr(173) => 'u',
      chr(197).chr(174) => 'U', chr(197).chr(175) => 'u',
      chr(197).chr(176) => 'U', chr(197).chr(177) => 'u',
      chr(197).chr(178) => 'U', chr(197).chr(179) => 'u',
      chr(197).chr(180) => 'W', chr(197).chr(181) => 'w',
      chr(197).chr(182) => 'Y', chr(197).chr(183) => 'y',
      chr(197).chr(184) => 'Y', chr(197).chr(185) => 'Z',
      chr(197).chr(186) => 'z', chr(197).chr(187) => 'Z',
      chr(197).chr(188) => 'z', chr(197).chr(189) => 'Z',
      chr(197).chr(190) => 'z', chr(197).chr(191) => 's'
    );

    $string = strtr( $string, $chars );

    return $string;
  }

}