/trunk/interfaces/squelettes/form_version.tpl.html |
---|
1,7 → 1,7 |
<!-- REF - DEBUT VERSIONNAGE --> |
<script type="text/javascript"> |
$(document).ready(function() { |
$('#ref-dem-ok').click(function(e) { |
$('#ref-versionnage-ok').click(function(e) { |
var ok = false; |
if (confirm('Êtes vous sûr de vouloir versionner le référentiel actuellement en cours de travail ?')) { |
ok = true; |
19,12 → 19,8 |
<?php endforeach; ?> |
<?php endif; ?> |
<div id="zone-form-version"> |
<form id="ref-demande-versionnage" name="ref-demande-versionnage" action="<?=$url_form?>" method="get"> |
<input name="module" type="hidden" value="<?=$url_module?>" /> |
<input name="action" type="hidden" value="<?=$url_action_demande?>" /> |
<input name="ref" type="hidden" value="<?=$ref?>" /> |
<div id="zone-form"> |
<form id="ref-demande-versionnage" name="ref-demande-versionnage" action="<?=$url_form?>" method="post"> |
<fieldset> |
<legend>Général</legend> |
<ul class="liste-champs"> |
135,8 → 131,14 |
</ul> |
</fieldset> |
<input id="ref-versionnage-ok" type="submit" value="Versionner" /> |
<input id="ref-versionnage-ok" type="submit" value="1. Versionner" /> |
</form> |
<form id="ref-rafraichir" name="ref-rafraichir" action="<?=$url_form;?>" method="get"> |
<input name="module" type="hidden" value="<?=$url_module;?>" /> |
<input name="action" type="hidden" value="<?=$url_action_rafraichir;?>" /> |
<input name="ref" type="hidden" value="<?=$ref;?>" /> |
<input id="ref-raf-ok" type="submit" value="2. Rafraichir" /> |
</form> |
</div> |
<h2>Versions</h2> |
/trunk/interfaces/squelettes/css/referentiel/initialisation.css |
---|
New file |
0,0 → 1,224 |
/* |
style.css contains a reset, font normalization and some base styles. |
credit is left where credit is due. |
additionally, much inspiration was taken from these projects: |
yui.yahooapis.com/2.8.1/build/base/base.css |
camendesign.com/design/ |
praegnanz.de/weblog/htmlcssjs-kickstart |
*/ |
/* |
html5doctor.com Reset Stylesheet (Eric Meyer's Reset Reloaded + HTML5 baseline) |
v1.4 2009-07-27 | Authors: Eric Meyer & Richard Clark |
html5doctor.com/html-5-reset-stylesheet/ |
*/ |
html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, address, cite, code,del, dfn, em, img, |
ins, kbd, q, samp, small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, |
tbody, tfoot, thead, tr, th, td, article, aside, figure, footer, header, hgroup, menu, nav, section, menu, time, mark, audio, |
video { |
margin:0; |
padding:0; |
border:0; |
outline:0; |
font-size:100%; |
vertical-align:baseline; |
background:transparent;} |
article, aside, figure, footer, header, hgroup, nav, section{ |
display:block;} |
nav ul{ |
list-style:none;} |
blockquote, q { quotes:none; } |
blockquote:before, blockquote:after, |
q:before, q:after { content:''; content:none; } |
a { margin:0; padding:0; border:0; font-size:100%; vertical-align:baseline; background:transparent; } |
ins { background-color:#ff9; color:#000; text-decoration:none; } |
mark { background-color:#ff9; color:#000; font-style:italic; font-weight:bold; } |
del { text-decoration: line-through; } |
abbr[title], dfn[title] { border-bottom:1px dotted #000; cursor:help; } |
/* tables still need cellspacing="0" in the markup */ |
table { border-collapse:collapse; border-spacing:0; } |
hr { display:block; height:1px; border:0; border-top:1px solid #ccc; margin:1em 0; padding:0; } |
input, select { vertical-align:middle; } |
/* END RESET CSS */ |
/* |
fonts.css from the YUI Library: developer.yahoo.com/yui/ |
Please refer to developer.yahoo.com/yui/fonts/ for font sizing percentages |
There are two custom edits: |
* make the line-height relative and unit-less |
* remove the pre,code styles as we use a recommendation from Eric Meyer instead |
*/ |
body { font:13px arial,helvetica,"Nimbus Sans L", "Bitstream Vera Sans", sans-serif; *font-size:small; *font:x-small; line-height:1.22; } |
table { font-size:inherit; font:100%; } |
select, input, textarea { font:99% arial,helvetica,"Nimbus Sans L", "Bitstream Vera Sans", sans-serif; } |
/* normalize monospace sizing |
* meyerweb.com/eric/thoughts/2010/02/12/fixed-monospace-sizing/ |
*/ |
code, pre { font-family: "Courier New", monospace, serif; font-size: 1em; } |
/*+-----------------------------------------------------------------------------------------------------------------+*/ |
/* minimal base styles */ |
/* #444 looks better than black: twitter.com/H_FJ/statuses/11800719859 */ |
body, select, input, textarea { color:#444; } |
/* Headers (h1,h2,etc) have no default font-size or margin, |
you'll want to define those yourself. */ |
/* www.aestheticallyloyal.com/public/optimize-legibility/ */ |
h1,h2,h3,h4,h5,h6 { font-weight: bold; text-rendering: optimizeLegibility; } |
/* maxvoltar.com/archive/-webkit-font-smoothing */ |
html { -webkit-font-smoothing: antialiased; } |
/* Accessible focus treatment: people.opera.com/patrickl/experiments/keyboard/test */ |
a:active { outline: none; } |
a:focus { outline: thin dotted; } |
a, a:active, a:visited { color:#607890; } |
a:hover { color:#036; } |
ul { margin-left:30px; } |
ol { margin-left:30px; list-style-type: decimal; } |
small { font-size:85%; } |
strong, th { font-weight: bold; } |
td, td img { vertical-align:top; } |
sub { vertical-align: sub; font-size: smaller; } |
sup { vertical-align: super; font-size: smaller; } |
pre { |
padding: 15px; |
/* www.pathf.com/blogs/2008/05/formatting-quoted-code-in-blog-posts-css21-white-space-pre-wrap/ */ |
white-space: pre; /* CSS2 */ |
white-space: pre-wrap; /* CSS 2.1 */ |
white-space: pre-line; /* CSS 3 (and 2.1 as well, actually) */ |
word-wrap: break-word; /* IE */} |
/* align checkboxes, radios, text inputs with their label |
by: Thierry Koblentz tjkdesign.com/ez-css/css/base.css */ |
input[type="radio"] { vertical-align: text-bottom; } |
input[type="checkbox"] { vertical-align: bottom; *vertical-align: baseline; } |
.ie6 input { vertical-align: text-bottom; } |
/* hand cursor on clickable input elements */ |
label, input[type=button], input[type=submit], button { cursor: pointer; } |
/* These selection declarations have to be separate. |
No text-shadow: twitter.com/miketaylr/status/12228805301 |
Also: hot pink. */ |
::-moz-selection{ background: #FF5E99; color:#fff; text-shadow: none; } |
::selection { background:#FF5E99; color:#fff; text-shadow: none; } |
/* j.mp/webkit-tap-highlight-color */ |
a:link { -webkit-tap-highlight-color: #FF5E99; } |
/* always force a scrollbar in non-IE */ |
html { overflow-y: scroll; } |
/* make buttons play nice in IE: |
www.viget.com/inspire/styling-the-button-element-in-internet-explorer/ */ |
button { width: auto; overflow: visible; } |
/* bicubic resizing for non-native sized IMG: |
code.flickr.com/blog/2008/11/12/on-ui-quality-the-little-things-client-side-image-resizing/ */ |
.ie7 img { -ms-interpolation-mode: bicubic; } |
/*+-----------------------------------------------------------------------------------------------------------------+*/ |
/* Non-semantic helper classes */ |
/* for image replacement */ |
.ir { display:block; text-indent:-999px; overflow:hidden; background-repeat: none; } |
/* Hide for both screenreaders and browsers |
css-discuss.incutio.com/wiki/Screenreader_Visibility */ |
.hidden { display:none; visibility:hidden; } |
/* Hide only visually, but have it available for screenreaders |
www.webaim.org/techniques/css/invisiblecontent/ |
Solution from: j.mp/visuallyhidden - Thanks Jonathan Neal! */ |
.visuallyhidden { position:absolute !important; |
clip: rect(1px 1px 1px 1px); /* IE6, IE7 */ |
clip: rect(1px, 1px, 1px, 1px); } |
/* Hide visually and from screenreaders, but maintain layout */ |
.invisible { visibility: hidden; } |
/* >> The Magnificent CLEARFIX << */ |
.clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } |
.clearfix { display: inline-block; } |
* html .clearfix { height: 1%; } /* Hides from IE-mac \*/ |
.clearfix { display: block; } |
/*+-----------------------------------------------------------------------------------------------------------------+*/ |
/* Primary Styles |
Author: |
*/ |
/*+-----------------------------------------------------------------------------------------------------------------+*/ |
/* Print styles : inlined to avoid required HTTP connection www.phpied.com/delay-loading-your-print-css/ */ |
@media print { |
* { background: transparent !important; color: #444 !important; text-shadow: none; } |
a, a:visited { color: #444 !important; text-decoration: underline; } |
a:after { content: " (" attr(href) ")"; } |
abbr:after { content: " (" attr(title) ")"; } |
.ir a:after { content: ""; } /* Don't show links for images */ |
pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } |
img { page-break-inside: avoid; } |
@page { margin: 0.5cm; } |
p, h2, h3 { orphans: 3; widows: 3; } |
h2, h3{ page-break-after: avoid; } |
} |
/*+-----------------------------------------------------------------------------------------------------------------+*/ |
/* Media queries for responsive design */ |
@media all and (orientation:portrait) { |
/* Style adjustments for portrait mode goes here */ |
} |
@media all and (orientation:landscape) { |
/* Style adjustments for landscape mode goes here */ |
} |
/* Grade-A Mobile Browsers (Opera Mobile, iPhone Safari, Android Chrome) |
Consider this: www.cloudfour.com/css-media-query-for-mobile-is-fools-gold/ */ |
@media screen and (max-device-width: 480px) { |
/* Prevent iOS, WinMobile from adjusting font size */ |
html { |
-webkit-text-size-adjust:none; |
-ms-text-size-adjust:none;} |
} |
/trunk/interfaces/squelettes/css/referentiel/referentiel.css |
---|
35,18 → 35,15 |
background-color:transparent; |
font-size:28px; |
font-weight:bold;} |
#zone-corps{ |
margin:0; |
text-align:left;} |
#zone-navigation{ |
position:relative; |
float:left; |
z-index:2; |
text-align:left; |
font-weight:bold;} |
#zone-corps{ |
position:relative; |
margin:0; |
text-align:left;} |
#zone-corps-contenu{ |
position:relative; |
clear:both; |
min-height:300px; |
padding:0 2px; |
/trunk/interfaces/controleurs/Versionnage.php |
---|
16,7 → 16,6 |
const SCRIPT_A_LANCER = 'versionnage'; |
private $manuel = null; |
private $referentiel = null; |
private $traitementDao = null; |
27,8 → 26,6 |
if (isset($_GET['ref'])) { // code du projet courrant |
$this->referentiel = strtolower($_GET['ref']); |
} |
// Chargement des infos du manuel technique des référentiels |
$this->manuel = parse_ini_file(Config::get('chemin_appli').DS.'..'.DS.'configurations'.DS.'referentiel_v2.1.ini'); |
// Chargement des DAO nécessaires |
$this->traitementDao = new TraitementDao(); |
52,9 → 49,8 |
// Paramêtres pour l'url du formulaire |
$this->url->unsetVariablesRequete(array('module', 'action', 'ref')); |
$donnees['url_form'] = $this->url->getUrl(); |
$donnees['url_form'] = $this->obtenirUrlDemandeVersionnage($this->referentiel); |
$donnees['url_module'] = 'Versionnage'; |
$donnees['url_action_demande'] = 'demanderTraitement'; |
$donnees['url_action_rafraichir'] = 'afficherInterface'; |
// Date de production de la version |
98,6 → 94,7 |
$this->addMessage("Aucun code de projet de référentiel n'est indiqué (Ex. bdnff)."); |
} |
$donnees['messages'] = $this->getMessages(); |
$this->setSortie(self::RENDU_CORPS, $this->getVue('form_version', $donnees), false); |
$this->construireMenu($this->referentiel); |
$this->construireFilAriane($this->referentiel); |
/trunk/interfaces/controleurs/AppliControleur.php |
---|
22,6 → 22,7 |
// FIXME : voir s'il est plus intéressant d'utiliser une méthode dans les classes filles |
protected $url = null; |
private $parametres = array(); |
protected $manuel = null; |
private $sortie = array(); |
private $messages = null; |
32,6 → 33,8 |
$registre = Registre::getInstance(); |
$this->parametres = $registre->get('parametres'); |
$this->url = $this->parametres['url']; |
// Chargement des infos du manuel technique des référentiels |
$this->manuel = parse_ini_file(Config::get('chemin_appli').DS.'..'.DS.'configurations'.DS.'referentiel_v2.1.ini'); |
parent::__construct(); |
} |
238,6 → 241,16 |
return $this->obtenirUrlMenu('Versionnage', $referentiel); |
} |
protected function obtenirUrlDemandeVersionnage($referentiel) { |
$this->url->setRequete(false); |
$this->url->setVariableRequete('module', 'Versionnage'); |
$this->url->setVariableRequete('action', 'demanderTraitement'); |
$this->url->setVariableRequete('ref', $referentiel); |
$url = $this->url->getURL(); |
$this->url->unsetVariablesRequete(array('module', 'action', 'ref')); |
return $url; |
} |
protected function obtenirUrlMenuConsultation($referentiel) { |
return $this->obtenirUrlMenu('Consultation', $referentiel); |
} |
280,14 → 293,33 |
if (is_null($referentiel_code)) { |
$this->addMessage("Aucun code de projet de référentiel n'est indiqué (Ex. bdnff)."); |
} else { |
$traitements_a_supprimer = null; |
$traitementDao = new TraitementDao(); |
$resultat_traitement_en_attente = $traitementDao->getTraitementsEnAttente($referentiel_code, $script_nom); |
if ($resultat_traitement_en_attente) { |
$this->addMessage("Un traitement est déjà en attente..."); |
foreach ($resultat_traitement_en_attente as $traitement) { |
$difference = $this->differenceEnSecondeEntreDeuxDates($traitement['meta_date_creation'], date ("Y-m-d H:i:s")); |
Debug::printr("Différence attente : $difference > ".Config::get('ddv_traitement_attente')); |
if ($difference > Config::get('ddv_traitement_attente')) { |
$traitements_a_supprimer[] = $traitement['id_traitement']; |
$this->addMessage("Le traitement #{$traitement['id_traitement']} était en attente depuis plus de 5mn, il a été supprimé."); |
} else { |
$this->addMessage("Un traitement est déjà en attente..."); |
} |
} |
} else { |
$resultat_traitement_en_cours = $traitementDao->getTraitementsEnCours($referentiel_code, $script_nom); |
if ($resultat_traitement_en_cours) { |
$this->addMessage("Un traitement est déjà en cours..."); |
foreach ($resultat_traitement_en_cours as $traitement) { |
$difference = $this->differenceEnSecondeEntreDeuxDates($traitement['date_debut'], date ("Y-m-d H:i:s")); |
Debug::printr("Différence en cours : $difference > ".Config::get('ddv_traitement_en_cours')); |
if ($difference > Config::get('ddv_traitement_en_cours')) { |
$traitements_a_supprimer[] = $traitement['id_traitement']; |
$this->addMessage("Le traitement #{$traitement['id_traitement']} était en cours depuis plus de 5mn, il a été supprimé."); |
} else { |
$this->addMessage("Un traitement est déjà en cours..."); |
} |
} |
} else { |
$resultat = $traitementDao->ajouterTraitement($referentiel_code, $script_nom); |
if ($resultat != false) { |
298,9 → 330,26 |
} |
} |
} |
// Suppression des traitements posant problème |
if (count($traitements_a_supprimer) > 0) { |
$traitementDao->supprimer($traitements_a_supprimer); |
} |
} |
} |
private function differenceEnSecondeEntreDeuxDates($date_01, $date_02) { |
if (floatval(phpversion()) >= 5.3 ) { |
$d1 = new DateTime($date_01); |
$d2 = new DateTime($date_02); |
$difference_absolue = true; |
$diff = $d1->diff($d2, $difference_absolue); |
$nbre_secondes = $diff->format('s'); |
} else { |
$nbre_secondes = abs(round((strtotime($date_01) - strtotime($date_02)))); |
} |
return $nbre_secondes; |
} |
/** |
* Lance le script d'execution des traitements |
*/ |
309,7 → 358,8 |
$exe = Config::get('chemin_script'); |
$action = 'tout'; |
$log = Config::get('chemin_script_log'); |
$commande = "$php -d memory_limit=1073741824 -f $exe $script_nom -p $referentiel_code -a $action > $log &"; |
$limite_memoire = Config::get('script_limite_memoire'); |
$commande = "$php -d memory_limit=$limite_memoire -f $exe $script_nom -p $referentiel_code -a $action > $log &"; |
if ($this->verifierSafeModeOff() === false) { |
$e = "Le safe_mode est actif sur ce serveur."; |
/trunk/interfaces/configurations/config.default.ini |
---|
51,7 → 51,12 |
chemin_script_log = "{ref:chemin_appli}../log.txt" |
; Doit on afficher les messages de paramêtrage du serveur pour les scripts |
script_message = "php:true"; |
; Durée de vie en seconde d'un traitement en attente |
ddv_traitement_attente = 300 |
; Durée de vie en seconde d'un traitement en cours |
ddv_traitement_en_cours = 300 |
; +------------------------------------------------------------------------------------------------------+ |
; Url du Jrest utilisé pour les services web fournissant les données à l'application |
url_jrest = "{ref:url_base}services/" |
; Nom du fichier contenant les infos sur la version courante du manuel technique |
/trunk/scripts/modules/versionnage/squelettes/bdnt.tpl.tsv |
---|
New file |
0,0 → 1,6 |
<?=implode(' ', $champs)?> |
<?php foreach ($noms as $nom_infos) : ?> |
<?=implode(' ', $nom_infos)?> |
<?php endforeach; ?> |
/trunk/scripts/modules/versionnage/Versionnage.php |
---|
New file |
0,0 → 1,146 |
<?php |
// Encodage : UTF-8 |
// +-------------------------------------------------------------------------------------------------------------------+ |
/** |
* Versionnage de référentiels de nomenclature et taxonomie |
* |
* Description : classe permettant de versionner les référentiels selon le manuel technique |
* Utilisation : php script.php versionnage -p bdnff -a tout |
* |
//Auteur original : |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @copyright Tela-Botanica 1999-2010 |
* @link http://www.tela-botanica.org/wikini/RTaxMethodo/wakka.php?wiki=MaNuel |
* @licence GPL v3 & CeCILL v2 |
* @version $Id$ |
*/ |
// +-------------------------------------------------------------------------------------------------------------------+ |
// TODO : supprimer l'utilisation du paramêtres 'p' et chercher les infos depuis la bdd |
class Versionnage extends ScriptCommande { |
const SCRIPT_NOM = 'versionnage'; |
private $projet = null; |
private $traitement = null; |
private $erreurs = null; |
private $manuel = null; |
private $resultatDao = null; |
private $traitementDao = null; |
private $tableStructureDao = null; |
private $referentielDao = null; |
public function executer() { |
// Récupération de paramêtres |
$this->projet = $this->getParam('p'); |
// Récupération du dernier traitement demandé |
$this->traitementDao = new TraitementDao(); |
$this->traitement = $this->traitementDao->getDernierTraitement($this->projet, self::SCRIPT_NOM); |
if (isset($this->traitement)) { |
Debug::printr($this->traitement); |
// Écriture de la date de début du traitement |
Debug::printr('Debute:'.$this->traitementDao->debuterTraitement($this->traitement['id_traitement'])); |
// Nettoyage des traitements obsolètes |
$traitements_obsoletes = $this->traitementDao->getTraitementsObsoletes($this->projet, self::SCRIPT_NOM); |
if (isset($traitements_obsoletes)) { |
Debug::printr('Supp. obsoletes:'.$this->traitementDao->supprimer($traitements_obsoletes)); |
} |
// Lancement du test demandé |
$cmd = $this->getParam('a'); |
switch ($cmd) { |
case 'tout' : |
$this->resultatDao = new ResultatDao(); |
$this->referentielDao = new ReferentielDao(); |
$this->manuel = parse_ini_file(Config::get('chemin_appli').DS.'..'.DS.'configurations'.DS.'referentiel_v2.1.ini'); |
Debug::printr('Départ lancement test:'); |
$this->lancerVersionnage(); |
break; |
default : |
$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd)); |
} |
// Écriture de la date de fin du traitement |
Debug::printr('Termine:'.$this->traitementDao->terminerTraitement($this->traitement['id_traitement'])); |
} |
} |
public function lancerVersionnage() { |
// Récupération des données à tester |
$noms = $this->referentielDao->getTout($this->projet); |
Debug::printr('Nbre noms :'.count($noms)); |
$noms = $this->classerNomsParNumNom($noms); |
$this->versionnerBdnt($noms); |
$this->traiterMessagesErreur(); |
} |
private function classerNomsParNumNom($noms) { |
$noms_classes = array(); |
foreach ($noms as $nom) { |
$noms_classes[$nom['num_nom']] = $nom; |
} |
return $noms_classes; |
} |
private function versionnerBdnt($noms) { |
Debug::printr("Element courrant du tableau des noms : ".print_r(current($noms),true)); |
//Debug::printr("Taille mémoire du tableau des noms : ".Debug::tailleMemoireVar($noms)); |
$champs_ordre = $this->determinerOrdreDesChamps(current($noms)); |
Debug::printr("Tableau ordre des champs : ".print_r($champs_ordre, true)); |
$donnees = array(); |
$donnees['champs'] = array_flip($champs_ordre); |
$donnees['noms'] = $noms; |
/* |
foreach ($noms as $nom) { |
$infos = array(); |
foreach ($nom as $champ => $valeur) { |
if (isset($champs_ordre[$champ])) { |
$ordre = $champs_ordre[$champ]; |
$infos[$ordre] = $valeur; |
} else { |
$e = "Le champ '$champ' n'a pas été pris en compte dans l'attribution de l'ordre des champs."; |
$this->ajouterMessageErreur($e); |
} |
$donnees['noms'][] = $infos; |
} |
}*/ |
$bdtn_tsv = $this->getVue('versionnage/squelettes/bdnt', $donnees, '.tpl.tsv'); |
if (file_put_contents('/home/jpm/web/referentiel/zip/bdnt.txt', $bdtn_tsv) == false) { |
Debug::printr("une erreur est survenu lors de l'écriture du fichier"); |
} |
} |
private function determinerOrdreDesChamps($nom) { |
$champs_ordre = explode(',', $this->manuel['champs']); |
$champs_ordre = array_flip($champs_ordre); |
$champs_ordre = $this->attribuerOrdreChampsSupplémentaires($champs_ordre, $nom); |
asort($champs_ordre); |
return $champs_ordre; |
} |
private function attribuerOrdreChampsSupplémentaires($champs_ordre, $nom) { |
foreach ($nom as $champ => $info) { |
if (!isset($champs_ordre[$champ])) { |
$champs_ordre[$champ] = count($champs_ordre); |
} |
} |
return $champs_ordre; |
} |
private function ajouterMessageErreur($message) { |
$titre = self::SCRIPT_NOM.' #'.$this->traitement['id_traitement']; |
$this->erreurs[] = array($titre, $message); |
} |
private function traiterMessagesErreur() { |
if (isset($this->erreurs)) { |
$this->resultatDao->ajouter($this->traitement['id_traitement'], $this->erreurs); |
} |
} |
} |
?> |
/trunk/. |
---|
Property changes: |
Modified: svn:ignore |
framework.php |
.project |
log.txt |
+zip |