Subversion Repositories eFlore/Applications.cel

Compare Revisions

No changes between revisions

Regard whitespace Rev 3223 → Rev 3226

/trunk/widget/modules/manager/config.defaut.ini
3,4 → 3,7
autoload = "bibliotheque/;bibliotheque/xml_feed_parser/1.0.4/;bibliotheque/xml_feed_parser/1.0.4/parsers/"
; Squelette d'url pour accéder à la fiche eFlore
celUrlTpl = "http://localhost/service:cel:CelWidgetManager/Widget"
languesUrl = "http://localhost/service:eflore:0.1/iso-639-1/langues"
languesUrl = "http://api-test.tela-botanica.org/service:eflore:0.1/iso-639-1/langues"
widgetUrlTpl = "http://localhost/widget:cel:manager"
; Chemin de base des fichiers liés (images, pdf, csv, etc.)
dossierTmp = "https://beta.tela-botanica.org/tmp/widget_saisie/"
/trunk/widget/modules/manager/squelettes/creation.tpl.html
1,7 → 1,7
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><?php echo $mode; ?> de widget de saisie du CeL</title>
<title><?= $mode; ?> de widget de saisie du CeL</title>
 
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<meta http-equiv="Content-style-type" content="text/css" />
28,25 → 28,11
<!-- Favicones -->
<link rel="shortcut icon" type="image/x-icon" href="https://resources.tela-botanica.org/tb/img/16x16/favicon.ico" />
 
<!-- Jquery -->
<script type="text/javascript" src="https://www.tela-botanica.org/commun/jquery/1.7.1/jquery-1.7.1.min.js"></script>
<script type="text/javascript" src="https://www.tela-botanica.org/commun/jquery/jquery-ui/1.8.17/js/jquery-ui-1.8.17.custom.min.js"></script>
<script type="text/javascript" src="https://www.tela-botanica.org/commun/jquery/jquery-ui/1.8.17/js/jquery.ui.datepicker-fr.js"></script>
<script type="text/javascript" src="https://www.tela-botanica.org/commun/jquery/validate/1.9.0/jquery.validate.js"></script>
<script type="text/javascript" src="https://www.tela-botanica.org/commun/jquery/validate/1.9.0/messages_fr.js"></script>
<script type="text/javascript" src="https://www.tela-botanica.org/commun/jquery/form/2.95/jquery.form.min.js"></script>
<script type="text/javascript" src="https://resources.tela-botanica.org/bootstrap/3.1.0/js/bootstrap.min.js"></script>
 
<!-- Barre de navigation -->
<?php if ($bar !== false): ?>
<script src="<?php echo $url_script_navigation; ?>"></script>
<?php endif; ?>
 
<!-- CSS -->
<link href="https://www.tela-botanica.org/commun/jquery/jquery-ui/1.8.18/css/smoothness/jquery-ui-1.8.18.custom.css" rel="stylesheet" type="text/css" media="screen">
<link rel="stylesheet" type="text/css" href="https://resources.tela-botanica.org/bootstrap/3.1.0/css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="<?php echo $url_base; ?>modules/manager/squelettes/css/manager.css" media="screen">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.1/css/all.css" integrity="sha384-O8whS3fhG2OnA5Kas0Y9l3cfpmYjapjI0E4theH4iuMD+pLhbf6JI0jIMfYcK3yZ" crossorigin="anonymous">
<link rel="stylesheet" type="text/css" href="https://resources.tela-botanica.org/bootstrap/3.1.0/css/bootstrap.min.css" />
<link rel="stylesheet" type="text/css" href="<?= $url_base; ?>modules/manager/squelettes/css/manager.css" media="screen" />
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.1/css/all.css" integrity="sha384-O8whS3fhG2OnA5Kas0Y9l3cfpmYjapjI0E4theH4iuMD+pLhbf6JI0jIMfYcK3yZ" crossorigin="anonymous" />
 
<!-- Google Analytics -->
<?php if($prod): ?>
76,7 → 62,7
<?php endif; ?>
</p>
 
<form action="<?php echo $url_base; ?>manager?mode=<?php echo $mode.$params; ?>" id="basic-widget-form" class="standard-form component component-text" method="post" enctype="multipart/form-data">
<form action="<?= $url_base; ?>manager?mode=<?= $mode.$params; ?>" id="basic-widget-form" class="standard-form component component-text" method="post" enctype="multipart/form-data">
<div class="register-section" id="basic-details-section">
 
<h2>Meta-données</h2>
83,7 → 69,7
 
<?php //var_dump($widget); ?>
<label for="projet">Projet *</label>
<input type="text" name="projet" id="projet" pattern="[a-z]+" <?php echo ($mode === 'modification') ? 'value="'.$widget['projet'].'" readonly' : 'required'; ?> title="Champ obligatoire : pas d'espace">
<input type="text" name="projet" id="projet" pattern="[a-z]+" <?= ( $mode === 'modification' ) ? 'value="' . $widget['projet'] . '" readonly' : 'required'; ?> title="Champ obligatoire : pas d'espace">
 
<label for="motscles">Autres mots-clés</label>
<input type="text" name="motscles" id="motscles" value="" />
93,7 → 79,7
<select id="type" name="type">
<option value=""> ----</option>
<?php foreach ($type as $id => $projet) : ?>
<option <?php echo (isset($widget['projet']) && $projet['projet']== $widget['projet']) ? 'selected="selected"' : ''; ?> value="<?php echo $projet['projet']; ?>"><?php echo $projet['projet']; ?></option>
<option <?php echo ( isset( $widget['projet'] ) && $projet['projet'] === $widget['projet'] ) ? 'selected="selected"' : ''; ?> value="<?= $projet['projet']; ?>"><?= $projet['projet']; ?></option>
<?php endforeach; ?>
</select>
</div>
103,12 → 89,12
 
<label for="langue">Langue</label>
<?php if ($mode === 'modification') : ?>
<input id="langue" name="langue" readonly value="<?php echo $widget['langue']; ?>">
<input id="langue" name="langue" readonly value="<?= $widget['langue']; ?>">
<?php else : ?>
<div class="select-wrapper">
<select id="langue" name="langue">
<?php foreach ($langues as $code => $langue) : ?>
<option value="<?php echo $code; ?>" <?php echo $code === 'fr' ? 'selected' : '';?>><?php echo $langue['nom']; ?></option>
<option value="<?= $code; ?>" <?= ( $code === 'fr' ) ? 'selected' : '';?>><?= $langue['nom']; ?></option>
<?php endforeach; ?>
</select>
</div>
121,6 → 107,13
<label for="titre">Titre</label>
<input type="text" name="titre" id="titre" value="<?php echo isset($widget['titre']) ? $widget['titre'] : ''; ?>">
 
<div class="input-file-container">
<input type="file" class="input-file" name="info" id="info" value="<?= $widget['titre']; ?>" accept="image/*">
<label for="info" class="label-file"><i class="fas fa-download"></i> Image d'aide dans le titre (.jpg)</label>
</div>
<div class="remove-file button" name="remove-file" title="Supprimer le fichier"><i class="fas fa-times" aria-hidden="true"></i></div>
<div class="file-return info hidden"></div>
 
<label for="description">Description</label>
<textarea name="description" id="description"><?php echo isset($widget['description']) ? $widget['description'] : ''; ?></textarea>
 
141,24 → 134,25
endif;
?>
 
<input type="file" class="input-file" name="logo" id="logo" accept="image" value="<?php echo $logo_src; ?>">
<input type="file" class="input-file" name="logo" id="logo" accept="image/*" value="">
<label for="logo" class="label-file"><i class="fas fa-download"></i> Logo</label>
</div>
<div class="remove-file button" name="remove-file" title="Supprimer le fichier">
<i class="fas fa-times" aria-hidden="true"></i>
</div>
<div class="file-return logo<?php echo $logo_hidden; ?>">
<?php echo $logo_file_name[0]; ?>
<?php echo $logo_img; ?>
<div class="file-return logo<?= $logo_hidden; ?>">
<?= $logo_file_name[0]; ?>
<?= $logo_img; ?>
</div>
 
 
<div class="input-file-container">
<input type="file" class="input-file" name="fond" id="fond" value="<?php echo $widget['titre']; ?>">
<input type="file" class="input-file" name="fond" id="fond" value="<?= $widget['titre']; ?>" accept="image/*">
<label for="fond" class="label-file"><i class="fas fa-download"></i> Image de fond</label>
</div>
<div class="remove-file button" name="remove-file" title="Supprimer le fichier"><i class="fas fa-times" aria-hidden="true"></i></div>
<div class="file-return fond hidden"></div>
 
</div><!-- end #profile-details-description-section -->
 
<div class="register-section" id="profile-details-fields-section">
167,7 → 161,7
<div class="select-wrapper">
<select id="type_localisation" name="type_localisation" >
<option value="<?php echo (isset($widget['type_localisation'])) ? $widget['type_localisation'] : 'point'; ?>"><?php echo (isset($widget['type_localisation'])) ? $widget['type_localisation'] : 'point'; ?></option>
<option value="<?php echo (isset($widget['type_localisation']) && $widget['type_localisation'] == 'rue') ? 'point' : 'rue'; ?>"><?php echo (isset($widget['type_localisation']) && $widget['type_localisation'] == 'rue') ? 'point' : 'rue'; ?></option>
<option value="<?php echo ( isset( $widget['type_localisation'] ) && $widget['type_localisation'] === 'rue' ) ? 'point' : 'rue'; ?>"><?php echo ( isset( $widget['type_localisation'] ) && $widget['type_localisation'] === 'rue') ? 'point' : 'rue'; ?></option>
</select>
</div>
 
249,7 → 243,6
<div id="preview-title" class="col-md-8">
<h1></h1>
</div>
 
</div>
 
<div id="preview-messages" class="row">
262,6 → 255,7
</h3>
<p class="preview-description"></p>
</div>
 
</div><!-- end #preview-description -->
 
<div id="preview-aide" class="col-md-5">
279,8 → 273,7
</p>
<p class="discretion">
Pour toute question ou remarque,
<a href="https://www.tela-botanica.org/widget:reseau:remarques?service=cel&pageSource=<?php echo $url_base; ?>manager?mode=<?php echo $mode.$params; ?>" target="_blank" onclick=
"
<a href="https://www.tela-botanica.org/widget:reseau:remarques?service=cel&pageSource=<?= $url_base; ?>manager?mode=<?php echo $mode . $params; ?>" target="_blank" onclick="
javascript:window.open(
this.getAttribute('href'),
'Tela Botanica - Remarques',
376,7 → 369,7
<label for="certitude" class="" title="">
<i class="fa fa-question"></i> Certitude *
</label>
<div class="date select-wrapper add-field-select" id="datetimepicker">
<div class="select-wrapper add-field-select">
<select id="certitude" name="certitude" required>
<option value="">-</option>
</select>
394,8 → 387,6
</div>
</form>
 
<div id="image" class="row align-items-center"></div>
 
</div><!-- end #preview-formulaire -->
 
</div><!-- end #widget-renderer-->
421,6 → 412,25
</div>
</div>
</div>
<script type="text/javascript" src="<?php echo $url_base; ?>modules/manager/squelettes/js/manager.js"></script>
<!-- Jquery -->
<script type="text/javascript" src="https://resources.tela-botanica.org/jquery/1.11.1/jquery-1.11.1.min.js"></script>
 
<!-- Jquery UI : nécessaire pour le minicalendrier et l'auto-complétion -->
<script type="text/javascript" src="https://resources.tela-botanica.org/jquery/jquery-ui/1.11.0/js/jquery-ui.min.js"></script>
<!-- <script type="text/javascript" src="https://resources.tela-botanica.org/jquery/jquery-ui/1.11.0/js/datepicker-fr.js"></script> -->
<!-- Jquery Plugins -->
<!-- Jquery Validate : nécessaire pour la validation des formulaires -->
<script type="text/javascript" src="https://resources.tela-botanica.org/jquery/validate/1.11.1/jquery.validate.min.js"></script>
<script type="text/javascript" src="https://resources.tela-botanica.org/jquery/validate/1.11.1/additional-methods.min.js"></script>
<script type="text/javascript" src="https://resources.tela-botanica.org/jquery/validate/1.11.1/messages_fr.js"></script>
<!-- Jquery Form :nécessaire pour l'upload des images -->
<script type="text/javascript" src="https://resources.tela-botanica.org/jquery/form/3.51/jquery.form.min.js"></script>
<!-- Bootstrap -->
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
<script type="text/javascript" src="<?= $url_base; ?>modules/manager/squelettes/js/manager.js"></script>
<!-- Barre de navigation -->
<?php if ( $bar !== false ) : ?>
<script src="<?= $url_script_navigation; ?>"></script>
<?php endif; ?>
</body>
</html>
/trunk/widget/modules/manager/squelettes/img/images_projets/testimages/logo.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/widget/modules/manager/squelettes/img/images_projets/testimages/logo.png
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/widget/modules/manager/squelettes/js/manager.js
25,7 → 25,7
// Affiche un retour visuel dès que input:file change
$fileInput.change( function( event ) {
// Il est possible de supprimer un fichier
// donc on vérifie que le 'change' est un ajout ou modification
// donc on vérifie que le 'change' est un ajout ou modificationis-defaut-value
if( !$.isEmptyObject( event.target.files[0] ) ) {
var file = event.target.files[0],
$theReturn = $( '.' + $( this ).attr( 'id' ) );
32,10 → 32,15
// Affichage du nom du fichier
$theReturn.text( file.name );
// Si le fichier est une image on l'affiche
if( file.type.match( 'image' ) ) {
if( file.type.match( 'image/*' ) ) {
// Chemin temporaire de l'image et affichage
var tmppath = URL.createObjectURL( file );
$theReturn.removeClass( 'hidden' ).append( '<img src="' + tmppath + '" width="50%">' );
} else {
$theReturn.removeClass( 'hidden' ).append( '<p>Le fichier doit être au format image (jpg, png, etc.)</p>' );
// lib : https://resources.tela-botanica.org/jquery/form/3.51/jquery.form.min.js
$( this ).clearInputs();
console.log(file);
}
}
});
42,9 → 47,10
// Annuler le téléchargement
$( '.remove-file' ).click( function() {
var $thisFileInput = $( this ).prev( '.input-file-container' ).find( '.input-file' );
$thisFileInput.wrap( '<form>' ).closest( 'form' ).get(0).reset();
// lib : https://resources.tela-botanica.org/jquery/form/3.51/jquery.form.min.js
$thisFileInput.clearInputs();
$thisFileInput.triggerHandler( 'change' );
$thisFileInput.unwrap();
// $thisFileInput.unwrap();
$( this ).next( '.file-return' ).addClass( 'hidden' ).empty();
});
}
54,7 → 60,7
// On écoute le click sur une list-checkbox ('.selectBox')
// à tout moment de son insertion dans le dom
$( '#zone-appli' ).on( 'click' , '.selectBox' , function() {
$( '.checkboxes[data-id="' + $(this).attr( 'data-id' ) + '"]' ).toggleClass( 'hidden' );
$( '.checkboxes[data-id="' + $(this).data( 'id' ) + '"]' ).toggleClass( 'hidden' );
});
}
 
106,12 → 112,13
'<label for="field-key" title="Nom du champ dans la base de données">'+
'Clé du champ *'+
'</label>'+
'<input type="text" name="field-key" data-id="' + fieldIndex + '" class="field-key" placeholder="Clé du champ" Pattern="[A-Z][A-Za-z]+" title="Clé Unique en Camelcase, pas d\'accents pas de caractères spéciaux." required>'+
'<input type="text" name="field-key" data-id="' + fieldIndex + '" class="field-key" placeholder="Clé du champ" Pattern="^(?:[a-z]+(?:(?:[A-Z][a-z]+)+)?|[a-z]+(?:(?:-[a-z]+)+)?)$" title="Clé Unique en Camelcase ou minuscule séparés par tirets, pas d\'accents pas de caractères spéciaux." required>'+
'<p class="message">' +
'<i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i> '+
'Une clé doit être unique<br>' +
'En camelCase (ecriture chameau)<br>'+
'Pas d\'accents ou de cédille, pas de caractères spéciaux.' +
'En "camelCase" (ecriture chameau)<br>'+
'Ou en minuscule avec tirets ("-") si nécessaire<br>'+
'Pas d\'espaces, aucuns caractères spéciaux (accents, cédilles, etc.).' +
'</p>' +
// Type de champ
'<label for="field-element" title="Quel type de champ">Type de champ *</label>'+
125,7 → 132,6
'<option value="list-checkbox">Liste de cases à cocher</option>'+
'<option value="radio">Boutons radio</option>'+
'<option value="date">Calendrier</option>'+
'<option value="file">Téléchargement</option>'+
'<option value="range">Curseur (entre 2 bornes)</option>'+
'<option value="number">Nombre</option>'+
'</select>'+
139,10 → 145,10
// Tooltip
'<label for="field-description" title="Ajoutez une info-bulle">Info-bulle</label>'+
'<input type="text" name="field-description" data-id="' + fieldIndex + '" class="field-description" placeholder="Quelques mots">'+
// Import d'une image ou d'un pdf d'aide à afficher en popup
// Import d'une image d'aide à afficher en popup
'<div class="input-file-container">'+
'<input type="file" class="input-file field-help" name="field-help" data-id="' + fieldIndex + '" id="help-doc-' + fieldIndex + '" accept="application/pdf, image/*, video/*">'+
'<label for="field-help" class="label-file"><i class="fas fa-download"></i> Popup aide image/pdf</label>'+
'<input type="file" class="input-file field-help" name="field-help' + fieldIndex + '" data-id="' + fieldIndex + '" id="help-doc-' + fieldIndex + '" accept="image/*">'+
'<label for="field-help' + fieldIndex + '" class="label-file"><i class="fas fa-download"></i> Popup aide image (.jpg)</label>'+
'</div>'+
'<div class="remove-file button" name="remove-file" data-id="' + fieldIndex + '" title="Supprimer le fichier"><i class="fas fa-times" aria-hidden="true"></i></div>'+
'<div class="file-return help-doc-' + fieldIndex + ' hidden"></div>'+
163,7 → 169,7
}
 
// Supprimer un nouveau champ
function onClickRemoveField ( keyFlag , nameFlag ) {
function onClickRemoveField () {
$( '.remove-field' ).click( function() {
$(this).closest('fieldset').hide( 200 , function () {
$(this).remove();
195,9 → 201,6
 
// Html de recueil de données en fonction de l'élément choisi
switch( $( this ).val() ) {
case 'file':
break;
 
case 'number':
case 'range':
displayFieldDetailsCollect(
314,8 → 317,6
'</div>'+
'</div>'
).hide().show( 200);
// Activer la checkbox de valeur par default uniquement si une valeur est entrée
onInputListValueLabelEnableDefaultCheckbox( valueIndex );
// Une seule valeur par défaut pour select et radio
onClickDefaultValueRemoveOthers( fieldIndex );
// Supprimer une valeur
324,12 → 325,13
}
 
// Activer la checkbox de valeur par default uniquement si une valeur est entrée
function onInputListValueLabelEnableDefaultCheckbox( valueIndex ) {
$( '.new-value[data-list-value-id="' + valueIndex + '"] .list-value' ).on( 'input' , function() {
if( $(this).val() !== '' ) {
$( '.is-defaut-value[data-list-value-id="' + valueIndex + '"]' ).removeAttr( 'disabled');
function onInputListValueLabelEnableDefaultCheckbox() {
$( '#new-fields' ).on( 'input' , '.list-value' , function() {
var thisValue = $( this ).parent( '.new-value' );
if( '' !== $( this ).val() ) {
$( '.is-defaut-value', thisValue ).removeAttr( 'disabled' );
} else {
$( '.is-defaut-value[data-list-value-id="' + valueIndex + '"]' ).attr( 'disabled', true ).removeAttr( 'checked' );
$( '.is-defaut-value', thisValue ).attr( 'disabled', true ).removeAttr( 'checked' );
}
});
}
351,7 → 353,7
// Bouton supprimer une valeur
function onClickRemoveListValue( fieldIndex ) {
$( '.remove-value.button[data-id="' + fieldIndex + '"]' ).click( function() {
$( '.new-value[data-list-value-id="' + $( this ).attr( 'data-list-value-id' ) + '"]' ).hide( 200 , function () {
$( '.new-value[data-list-value-id="' + $( this ).data( 'list-value-id' ) + '"]' ).hide( 200 , function () {
$(this).remove();
});
});
532,7 → 534,7
function onClickStoreNewFields() {
// Lorsqu'on valide
var resultArrayIndex = 0;
var count = $( 'fieldset' ).last().attr('data-id');
var count = $( 'fieldset' ).last().data( 'id' );
var helpFileExists = false;
// Savoir si au moins un fichier "aide" est enregistré
$( '.field-help' ).each( function () {
543,10 → 545,10
// dans ce cas intégrer dans le formulaire à soumettre un bloc
// qui contiendra une copie de chacun de ces input[type="file"]
if( helpFileExists ){
$('#submit-button').before( '<div id="help-doc-submit" class="hidden"></div>' );
$( '#submit-button' ).before( '<div id="help-doc-submit" style="position:fixed;visibility:hidden;"></div>' );
}
// On déroule les blocs de champs supplémentaires
for( var index = $( 'fieldset' ).first().attr('data-id') ; index <= count ; index++ ) {
for( var index = $( 'fieldset' ).first().data( 'id' ) ; index <= count ; index++ ) {
var thisFieldset = $( 'fieldset[data-id="' + index + '"]');
// Certains indices peuvent correspondre à un champ supprimé
if( 0 < $( thisFieldset ).length ) {
569,6 → 571,7
// Collecte les des données dépendantes de l'élément choisi
// sous forme d'un tableau de resultats
onSelectCollectDataValuesToSubmit( datasToSubmit[ resultArrayIndex ] , thisFieldset );
 
if( $.isEmptyObject(datasToSubmit[ resultArrayIndex ].fieldValues) ){
delete datasToSubmit[ resultArrayIndex ].fieldValues;
}
575,8 → 578,7
// Copie d'un champ de fichier d'aide dans le bloc d'envoi
if( '' !== $( '.field-help' , thisFieldset ).val() ) {
$( '.field-help' , thisFieldset ).clone()
.attr( 'id' , datasToSubmit[ resultArrayIndex ].key )// l'id prend la valeur de la clé
.css( 'position' , 'static' )// Retrouver facilement le bloc dans la page
.attr( 'name' , 'help-' + datasToSubmit[ resultArrayIndex ].key )// l'attribut name prend la valeur de la clé
.appendTo( '#help-doc-submit' );
}
resultArrayIndex++;
583,6 → 585,7
}
}
var resultsArrayJson = JSON.stringify( datasToSubmit );
console.log(resultsArrayJson);
// Désactivation de tous les champs et boutons (nouveaux champs)
$( '#new-fields, #new-fields .button , #add-fields , #preview-field' ).addClass( 'disabled' );
$( '#validate-new-fields' ).addClass( 'validated' );
589,7 → 592,7
$( '.validate-new-fields' ).text( 'Champs validés' );
// Mise à disposition des données pour le bouron submit
$('#submit-button').before(
'<input type="hidden" name="champs-supp" id="champs-supp" value=\'' + resultsArrayJson + '\'>'
'<input type="hidden" name="champs-supp" id="champs-supp" value="' + resultsArrayJson + '">'
);
}
 
597,8 → 600,6
// pour les données dépendant de l'élément choisi
function onSelectCollectDataValuesToSubmit( datasToSubmitObject , thisFieldset ) {
switch( datasToSubmitObject.element ) {
// case 'file' :
// Rien à faire, pas de détails à transmettre
case 'select':
case 'checkbox':
case 'list-checkbox':
607,7 → 608,7
// Ajout des valeurs de liste
onChangeStoreListValueLabel( datasToSubmitObject , thisFieldset );
// S'il y a une valeur 'autre' on l'indique à la fin de la liste
if( $('.option-other-value' , thisFieldset ).attr( 'checked' ) && datasToSubmitObject.fieldValues.listValue.indexOf( 'other' ) === -1 ) {
if( $( '.option-other-value' , thisFieldset ).attr( 'checked' ) && -1 === datasToSubmitObject.fieldValues.listValue.indexOf( 'other' ) ) {
datasToSubmitObject.fieldValues.listValue.push( 'other' );
}
break;
652,7 → 653,7
 
if( $( this ).val() ){
// Is-default-value non cochée
if( !$( '.is-defaut-value[data-list-value-id="' + $( this ).attr( 'data-list-value-id' ) + '"]' , thisFieldset ).attr( 'checked' ) ) {
if( !$( '.is-defaut-value[data-list-value-id="' + $( this ).data( 'list-value-id' ) + '"]' , thisFieldset ).attr( 'checked' ) ) {
datasToSubmitObject.fieldValues.listValue.push( $( this ).val() );
// Is-default-value cochée pour select/radio
} else if( 'select' === selectedFieldElement || 'radio' === selectedFieldElement ) {
1079,54 → 1080,6
commonFieldsHtml.helpButton;
break;
 
case 'file' :
// Ouvrir l'attribut class (suppression de '"')
commonFieldsHtml.fieldInput.classAttr = commonFieldsHtml.fieldInput.classAttr.slice(0, -1);
commonFieldsHtml.fieldInput.classAttr += ' input-file"';
// Class du label
commonFieldsHtml.fieldLabel.classAttr = ' class="label-file"';
// Type de fichiers acceptés
commonFieldsHtml.fieldInput.otherAttr += ' accept="application/pdf, image/*, video/*"';
 
fieldHtml =
// Classe 'and-help'
'<div class="input-file-container' + commonFieldsHtml.helpClass + '">' +
'<input' +
// Type
commonFieldsHtml.fieldInput.typeAttr +
// Name
commonFieldsHtml.fieldInput.nameAttr +
// DataId
commonFieldsHtml.dataIdAttr +
// Class
commonFieldsHtml.fieldInput.classAttr +
// Info-bulle
commonFieldsHtml.titleAttr +
// Placeholder
commonFieldsHtml.fieldInput.placeholderAttr +
// Required
commonFieldsHtml.fieldInput.mandatoryAttr +
// Autres attributs
commonFieldsHtml.fieldInput.otherAttr +
'>' +
'<label' +
// For
commonFieldsHtml.fieldLabel.forAttr +
// Class
commonFieldsHtml.fieldLabel.classAttr +
// Info-bulle
commonFieldsHtml.titleAttr +
'><i class="fas fa-download"></i> ' +
// Nom du champ
commonFieldsHtml.fieldLabel.labelContent +
'</label>' +
'</div>' +
// Bouton supprimer le fichier
'<div class="remove-file button" name="remove-file" title="Supprimer le fichier"><i class="fas fa-times" aria-hidden="true"></i></div>' +
// Bouton 'help'
commonFieldsHtml.helpButton;
break;
 
case 'textarea':
// Classe 'and-help'
commonFieldsHtml.fieldLabel.classAttr = ' class="' + commonFieldsHtml.helpClass + '"';
1356,7 → 1309,7
// Booléen "default"
isDefault : $( this ).find( '.is-defaut-value').is( ':checked' ),
// Indice de l'option
optionIndex : $( this ).attr('data-list-value-id')
optionIndex : $( this ).data( 'list-value-id')
});
});
return options;
1428,7 → 1381,7
 
// Prévisualisation des nouveaux champs
function newFieldsPreview() {
var count = $( 'fieldset' ).last().attr('data-id');
var count = $( 'fieldset' ).last().data( 'id' );
// Si on a déjà prévisualisé on efface tout pour recommencer
if( 0 < $( '.preview-fields' ).length ) {
$( '.preview-fields' ).each( function () {
1443,7 → 1396,7
);
}
// Parcourir tous les blocs d'infos de champs supplémentaires
for( var index = $( 'fieldset' ).first().attr('data-id') ; index <= count ; index++ ) {
for( var index = $( 'fieldset' ).first().data( 'id' ) ; index <= count ; index++ ) {
var thisFieldset = $( 'fieldset[data-id="' + index + '"]');
// Certains indices peuvent correspondre à un champ supprimé
if( 0 < $( thisFieldset ).length ) {
1467,7 → 1420,7
// https://getbootstrap.com/docs/3.3/javascript/#modals
function previewFieldHelpModal() {
$( '#zone-supp' ).on( 'click' , '.help-button' , function ( event ) {
var index = $( this ).closest( '.preview-fields' ).attr( 'data-id' ),
var index = $( this ).closest( '.preview-fields' ).data( 'id' ),
thisFieldset = $( '.new-field[data-id="' + index + '"]' ),
file = $( '.field-help' , thisFieldset )[0].files[0],
tmppath = URL.createObjectURL( file );
1474,10 → 1427,10
// Titre
$( '#help-modal-label' ).text( 'Aide pour : ' + $( '.field-name' , thisFieldset ).val() );
// Contenu
if( file.type.match( 'image' ) ) {
if( file.type.match( 'image/*' ) ) {
$( '#print_content' ).append( '<img src="' + tmppath + '" style="max-width:100%">' );
} else if( file.type.match( 'pdf' ) ) {
$( '#print_content' ).append( '<iframe src="' + tmppath + '" width="100%" height="650" align="middle" scrolling="no" frameborder="0"></iframe>' );
} else {
$( '#print_content' ).append( '<p>Erreur : le fichier n\'est pas une image</p>' );
}
// Sortie avec la touche escape
$( '#help-modal' ).modal( { keyboard : true } );
1522,8 → 1475,10
inputFile();
// Affichage des List-checkbox
inputListCheckbox();
// Activer la checkbox de valeur par default uniquement si une valeur est entrée
onInputListValueLabelEnableDefaultCheckbox();
// Affichage des Range
inputRangeDisplayNumber()
inputRangeDisplayNumber();
// Modale "aide"
previewFieldHelpModal();
});
/trunk/widget/modules/manager/Manager.php
39,27 → 39,48
*/
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);
if ($_POST != array()) { //print_r($_POST);
$this->parametres['projet'] = $_POST['projet'];
$this->parametres['langue'] = $_POST['langue'];
if ($mode == 'modification') {
 
if ( $mode === 'modification' ) {
 
$parametres = $this->traiterParametresModif();
$json = $this->getDao()->modifier($this->cel_url_tpl, $parametres);
} else {
$json = $this->getDao()->ajouter($this->cel_url_tpl, $_POST);
$this->parametres['mode'] = $mode = 'modification';
 
$donnees = array_merge( $_POST, $this->traiterDonneesFiles() );
$json = $this->getDao()->ajouter( $this->cel_url_tpl, $donnees );
$mode = $this->parametres['mode'] = 'modification';
}
}
 
68,8 → 89,10
 
$methode = $this->traiterNomMethodeExecuter($mode);
if (method_exists($this, $methode)) {
 
$retour = $this->$methode();
} else {
 
$this->messages[] = "Ce type de service '$methode' n'est pas disponible.";
}
76,17 → 99,21
$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']['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.';
}
}
96,38 → 123,50
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];
 
$params[] = $pa . '=' . $this->parametres[$pa];
}
}
 
$param = implode($params, '&');
$url = $this->cel_url_tpl;
if ($param != "") $url .= '?'.$param;
 
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
$retour['squelette'] ='creation';
$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;
}
 
136,44 → 175,270
private function executerModification() {
$retour = array();
if (isset($this->parametres['projet'])) {
$retour['squelette'] = 'creation';
 
$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.'&';
}
}
 
if ($parametres_flux == '?') {
$parametres_flux = '';
} else {
$parametres_flux = rtrim($parametres_flux, '&');
}
$parametres_flux = ( $parametres_flux === '?' ) ? '' : rtrim( $parametres_flux, '&' );
 
return $parametres_flux;
}
 
private function traiterParametresModif() {
$parametres_modif = array();
 
foreach ($_POST as $id => $parametres) {
if ($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;
}
 
}