From 05d105dba84e7b39ef6f4c18063b5b7d8a788f31 Mon Sep 17 00:00:00 2001
From: Julian Maurice <julian.maurice@biblibre.com>
Date: Fri, 20 Feb 2015 16:38:44 +0100
Subject: [PATCH] dev #21646 Allow to define type of variables for better
 display/edition

For now, only 'on-off' type is available.
It displays a checkbox on edit form, and text "Enabled/Disabled" on
variables list.
---
 .../admin/controllers/IndexController.php     |   1 +
 .../admin/views/scripts/index/adminvar.phtml  |  14 +-
 .../views/scripts/index/adminvaredit.phtml    |  16 +-
 library/Class/AdminVar.php                    | 421 +++++++++++++-----
 .../controllers/AdminIndexControllerTest.php  |  16 +
 tests/library/Class/AdminVarTest.php          |  38 +-
 6 files changed, 380 insertions(+), 126 deletions(-)

diff --git a/application/modules/admin/controllers/IndexController.php b/application/modules/admin/controllers/IndexController.php
index c105f1a0f96..7d6667bfd5f 100644
--- a/application/modules/admin/controllers/IndexController.php
+++ b/application/modules/admin/controllers/IndexController.php
@@ -104,6 +104,7 @@ class Admin_IndexController extends ZendAfi_Controller_Action {
 			: $var->getValeur();
 
 		$this->view->var_cle		= $var->getId();
+		$this->view->var = $var;
 		$this->view->tuto				= Class_AdminVar::helpFor($var->getId());
 		$this->view->titre			= 'Modifier la variable: ' . $var->getId();
 	}
diff --git a/application/modules/admin/views/scripts/index/adminvar.phtml b/application/modules/admin/views/scripts/index/adminvar.phtml
index e75ab095141..827edf8fd6c 100644
--- a/application/modules/admin/views/scripts/index/adminvar.phtml
+++ b/application/modules/admin/views/scripts/index/adminvar.phtml
@@ -47,7 +47,19 @@ hide: {duration: 1000}
 						<?php echo Class_AdminVar::helpFor($var->getId());?>
 					</span>
 				</td>
-				<td><?php echo wordwrap($value, 40, "<br />", 1);?></td>
+				<td>
+					<?php if ($var->isOnOff()): ?>
+						<?php if ($value): ?>
+							<img alt="✓" src="<?php echo URL_ADMIN_IMG . '/ico/coche_verte.gif'; ?>">
+							<?php echo $this->_('Activé'); ?>
+						<?php else: ?>
+							<img alt="✗" src="<?php echo URL_ADMIN_IMG . '/ico/del.gif'; ?>">
+							<?php echo $this->_('Désactivé'); ?>
+						<?php endif; ?>
+					<?php else: ?>
+						<?php echo wordwrap($value, 35, "<br />", 1);?>
+					<?php endif; ?>
+				</td>
 				<td style="width:2%;text-align:center">
 					<a data-popup="true" href="<?php echo $this->url(['action' => 'adminvaredit', 'cle' => $var->getId()])?>"><?php echo $this->boutonIco("type=edit");?></a>
 				</td>
diff --git a/application/modules/admin/views/scripts/index/adminvaredit.phtml b/application/modules/admin/views/scripts/index/adminvaredit.phtml
index 86ee5b79a2d..75d1cffe71e 100644
--- a/application/modules/admin/views/scripts/index/adminvaredit.phtml
+++ b/application/modules/admin/views/scripts/index/adminvaredit.phtml
@@ -11,8 +11,20 @@
     <td class="gauche"><?php echo $this->tuto;?></td>
   </tr>
    <tr>
-    <td class="droite">Nouvelle valeur</td>
-    <td class="gauche"><textarea rows="10" cols="60" name="valeur"><?php echo $this->var_valeur; ?></textarea></td>
+    <td class="droite">
+      <?php if ($this->var->isOnOff()): ?>
+        <?php echo $this->_('Activé ?'); ?>
+      <?php else: ?>
+        Nouvelle valeur
+      <?php endif; ?>
+    </td>
+    <td class="gauche">
+      <?php if ($this->var->isOnOff()): ?>
+        <?php echo $this->formCheckbox('valeur', null, array('checked' => $this->var_valeur)); ?>
+      <?php else: ?>
+        <textarea rows="10" cols="60" name="valeur"><?php echo $this->var_valeur; ?></textarea>
+      <?php endif; ?>
+    </td>
   </tr>
 </table><br />
 </div>
diff --git a/library/Class/AdminVar.php b/library/Class/AdminVar.php
index 5e1efb8b937..299d8ca055c 100644
--- a/library/Class/AdminVar.php
+++ b/library/Class/AdminVar.php
@@ -20,6 +20,8 @@
 	*/
 
 class Class_AdminVar extends Storm_Model_Abstract {
+	 const TYPE_ON_OFF = 'on-off';
+
 	 protected $_table_name = 'bib_admin_var';
 	 protected $_table_primary = 'CLEF';
 
@@ -48,15 +50,15 @@ class Class_AdminVar extends Storm_Model_Abstract {
 			 $instance = self::getLoader()->newInstance()->setClef($name);
 		 }
 
-		 $instance
-			 ->setValeur($value)
-			 ->save();
-
 		 // très particulier à cette table qui n'a pas de primary autoincrément
 		 // si on vient de la créer, last insertid est vide
 		 // donc ici on reprend le champ clef
 		 $instance->setId($instance->getClef());
 
+		 $instance
+			 ->setValeur($value)
+			 ->save();
+
 		 return $instance;
 	 }
 
@@ -290,106 +292,299 @@ class Class_AdminVar extends Storm_Model_Abstract {
 		*/
 	 public static function getKnownVars() {
 		 if (null === self::$_knownVars)
-			 self::$_knownVars =
-				 ['AVIS_MAX_SAISIE' => 'Nombre de caractères maximum autorisé à saisir dans les avis.',
-					'AVIS_MIN_SAISIE' => 'Nombre de caractères minimum autorisé à saisir dans les avis.',
-					'BLOG_MAX_NB_CARAC' => 'Nombre de caractères maximum à afficher dans le bloc critiques.',
-					'NB_AFFICH_AVIS_PAR_AUTEUR'  => 'Nombre d\'avis maximum à afficher par utilisateur.',
-					'CLEF_GOOGLE_MAP' => 'Clef d\'activation pour le plan d\'accès google map. <a target="_blank" href="http://code.google.com/apis/maps/signup.html">Obtenir la clé google map</a>',
-					'MODO_AVIS' => 'Modération des avis des lecteurs.<br /> 0 = Affichage sans attente de validation<br /> 1 = Affichage seulement après validation.',
-					'MODO_AVIS_BIBLIO' => 'Modération des avis des bibliothèquaires.<br />  0 = Affichage sans attente de validation<br /> 1 = Affichage seulement après validation.',
-					'AVIS_BIB_SEULEMENT' => '0 = Les lecteurs peuvent donner leur avis. <br /> 1 = Seuls les bibliothèquaires peuvent donner leur avis',
-					'MODO_BLOG' => '0 = Ne requiert pas d\'identification pour saisir des  commentaires. <br /> 1 = Requiert l\'identification pour saisir des commentaires.',
-					'REGISTER_OK' => 'Texte visible par l\'internaute après son inscription.',
-					'RESA_CONDITION' => 'Texte visible après l\'envoi d\'e-mail de demande de réservation.',
-					'SITE_OK' => '0 = Site en maintenance. <br /> 1 = Site ouvert.',
-					'ID_BIBLIOSURF' => 'Nom de la bibliothèque chez bibliosurf (en minuscules)',
-					'JS_STAT' => 'Javascript code for statistics',
-					'ID_READ_SPEAKER' => 'Numéro de client Read Speaker <a target="_blank" href="http://webreader.readspeaker.com">http://webreader.readspeaker.com</a>',
-					'BLUGA_API_KEY' => 'Clé API Bluga Webthumb <a target="_blank" href="http://webthumb.bluga.net/home">http://webthumb.bluga.net/home</a>',
-					'AIDE_FICHE_ABONNE' => 'Texte d\'aide affiché dans la fiche abonné',
-					'INTERDIRE_ENREG_UTIL' => 'Supprime l\'affichage du lien d\'enregistrement dans les différents formulaires de connexion et interdit l\'enregistrement d\'utilisateurs',
-					'LANGUES' => 'Liste des codes langue utilisées en plus du français séparées par des ;. Exemple: en;ro;es',
-					'CACHE_ACTIF' => implode('<br/>',
-																	 ['Activer le cache des boîtes (meilleure performance mais mise à jour toutes les ' . CACHE_LIFETIME / 60 . 'mn)',
-																		'0 = inactif',
-																		'1 = actif',
-																		sprintf('<a href="%s" >Vider le cache</a>',
-																						Class_Url::assemble(['module' => 'admin',
-																																 'action' => 'clearcache']))]),
-					'WORKFLOW' => implode('<br/>',
-																['Activer ou désactiver la gestion des validations des articles',
-																 'Vide ou 0 = Désactivé, 1 = Activé avec les statuts par défaut, JSON = Activé avec des statuts de validation supplémentaire',
-																 'Exemple JSON :',
-																 '[{"id":10, "label":"À valider niveau 2"}, {"id":11, "label":"À valider niveau 3"}]',
-																 'Les identifiants 1 à 5 sont réservés']),
-					'WORKFLOW_TEXT_MAIL_ARTICLE_PENDING' => 'Contenu de l\'email de notification d\'article en attente de validation',
-					'WORKFLOW_TEXT_MAIL_ARTICLE_REFUSED' => 'Contenu de l\'email de notification de refus d\'un article à valider',
-					'WORKFLOW_TEXT_MAIL_ARTICLE_VALIDATED' => 'Contenu de l\'email de notification de validation d\'un article',
-					'BIBNUM' => 'Activer ou désactiver la bibliothèque numérique<br />1 = Activé, Autre valeur = désactivé',
-					'FORMATIONS' => 'Activer ou désactiver le module formation<br />1 = Activé, Autre valeur = désactivé',
-					'VODECLIC_KEY' => 'Clé de sécurité Vodeclic',
-					'VODECLIC_ID' => 'Identifiant partenaire Vodeclic',
-					'VODECLIC_BIB_ID' => 'Identifiant code bibliothèque Vodeclic',
-					'CVS_BMKEY' => 'Paramétrage CVS',
-					'CVS_BMID' => 'Paramétrage CVS',
-					'CVS_SOURCENAME' => 'Paramétrage CVS',
-					'CVS_SOURCEID' => 'Paramétrage CVS',
-					'CVS_SOURCEKEY' => 'Paramétrage CVS',
-					'CVS_SOURCEPASSWORD' => 'Paramétrage CVS',
-					'CVS_LOGINTEST' => 'Paramétrage CVS',
-					'NUMILOG_URL' => 'Paramétrage <a href="http://forge.afi-sa.fr/projects/opac3/wiki/Ressources_externes_enrichissements#Numilog">Numilog</a>',
-					'NUMILOG_OAI_URL' => 'Paramétrage <a href="http://forge.afi-sa.fr/projects/opac3/wiki/Ressources_externes_enrichissements#Numilog">Numilog</a>',
-					'NUMILOG_OAI_IDBIB' => 'Paramétrage <a href="http://forge.afi-sa.fr/projects/opac3/wiki/Ressources_externes_enrichissements#Numilog">Numilog</a>',
-					'CYBERLIBRIS_URL' => 'Adresse du serveur OAI Cyberlibris',
-					'CYBERLIBRIS_ID' => 'Identifiant SSO Cyberlibris',
-					'OAI_SERVER' => 'Activation du serveur OAI. 0 = inactif, 1 = actif',
-					'PACK_MOBILE' => 'Activation des fonctions avancées du téléphone.  0 = inactif, 1 = actif',
-					'ARTE_VOD_LOGIN' => 'Login ARTE VOD',
-					'ARTE_VOD_KEY' => 'Clé ARTE VOD',
-					'ARTE_VOD_SSO_KEY' => 'Clé ARTE VOD Single Sign-On',
-					'BABELTHEQUE_JS' => 'URL du javascript Babelthèque à insérer dans l\'OPAC',
-					'MULTIMEDIA_KEY' => 'Clé publique pour le cryptage des données AFI-Multimédia',
-					'WEBKIOSK_KEY' => 'Clé publique pour le cryptage des données Aesis Webkiosk',
-					'WEBKIOSK_RESERVATION_URL' => 'URL d\'accès à l\'interface de réservation des postes Aesis Webkiosk',
-					'CSS_EDITOR' => '',
-					'CMS_FORMULAIRES' => 'Activation des formulaires.  0 = inactif, 1 = actif',
-					'MENU_BOITE' => 'Activation des boîtes dans les menus.  0 = inactif, 1 = actif',
-					'INTERDIRE_MODIF_FICHE_ABONNE' => 'Interdire la modification de la fiche abonne 0 = inactif, 1 = actif',
-					'ROOT_URL_ECOUTE' => '',
-					'URL_TYPO3' => 'Url d\'import d\'un agenda TYPO3',
-					'CHAMPS_FICHE_UTILISATEUR' => 'Liste des champs que l\'utilisateur peux modifier. <br/>Ex: nom;prenom;pseudo;adresse;<br/>code_postal;ville;mail;is_contact_mail;<br/>telephone;is_contact_telephone;',
-					'FACETTE_PCDM4_LIBELLE' => 'Libellé pour la PCDM4',
-					'FACETTE_DEWEY_LIBELLE' => 'Libellé pour la Dewey',
-					'FACETTE_TYPE_DOC_LIBELLE' => '',
-					'FACETTE_LANGUE_LIBELLE' => '',
-					'FACETTE_GENRE_LIBELLE' => '',
-					'FACETTE_SITE_LIBELLE' => '',
-					'FACETTE_SECTION_LIBELLE' => '',
-					'FACETTE_BIBLIOTHEQUE_LIBELLE' => '',
-					'FACETTE_AUTEUR_LIBELLE' => '',
-					'FACETTE_INTERET_LIBELLE' => '',
-					'FACETTE_MATIERE_LIBELLE' => '',
-					'FACETTE_TAG_LIBELLE' => '',
-					'AFFICHER_DISPONIBILITE_SUR_RECHERCHE' => 'Activation de la disponibilite dans le resultat de recherche.  0 = inactif, 1 = actif',
-					'NOM_DOMAINE' => 'Nom de domaine principal de l\'OPAC, ex: monopac.macommune.fr',
-					'TOUTAPPRENDRE_BIB_ID' => 'Paramétrage <a href="http://forge.afi-sa.fr/projects/opac3/wiki/Ressources_externes_enrichissements#Tout-Apprendre">ToutApprendre</a>',
-					'TOUTAPPRENDRE_KEY' => 'Paramétrage <a href="http://forge.afi-sa.fr/projects/opac3/wiki/Ressources_externes_enrichissements#Tout-Apprendre">ToutApprendre</a>',
-					'NUMERIQUE_PREMIUM_URL' => '',
-					'MUSICME_URL' => '',
-					'MUSICME_BIB_ID' => '',
-					'DATE_LAST_FULL_INTEGRATION_USERS' => 'Date du dernier import total des abonnés (modifié par cosmogramme)',
-					'BOITE_PANIER_AUTO' => 'Ajouter automatiquement une boîte panier dans la division flottante.  0 = inactif, 1 = actif',
-					'EXTRA_SKIN_PATH' => 'Chemin vers les skins personnalisées, relatif à ' . Class_Profil_Skin::EXTRA_PATH,
-					'ENABLE_COLLABORATIVE_BROWSING' => 'Activation de la navigation collaborative. 0 = inactif, 1 = actif',
-					'KOHA_MULTI_SITES' => 'WS KOHA : Reservation d\'exemplaires pour les multi sites. 0 = inactif, 1 = actif',
-					'LECTURA_DOMAIN' => 'Domaine utilisée par le serveur lectura pour authentification',
-					'LEKIOSK_ID' => 'Identifiant fournit par lekiosk.com',
-					'TEXT_REPLACEMENTS' => 'Remplacement de textes à la volée. <br/>Ex:<br/>Panier;Sélection<br/>Vous avez %d paniers;Vous avez %d sélections',
-					'ARTICLES_LIST_MODE' => 'Le gestionnaire de contenu affiche les articles sous forme de liste paginée au lieu de d\'une arborescence. Cet affichage est adapté lorsque le nombre d\'article devient trop important.<br /> 1 = Affichage en liste<br /> Autre valeur = Affichage en arborescence.',
-					'DILICOM_PNB' => 'Activation du PNB Dilicom. 0 = inactif, 1 = actif',
-					'MYCOW_EID' => 'Clé d\'identification MyCOW.EU pour le portail. Cette clé doit être fournie par MyCOW.EU. Elle active la ressource numérique dans le portail.'
-				 ];
+			 self::$_knownVars = [
+				'AVIS_MAX_SAISIE' => [
+					'description' => 'Nombre de caractères maximum autorisé à saisir dans les avis.',
+				],
+				'AVIS_MIN_SAISIE' => [
+					'description' => 'Nombre de caractères minimum autorisé à saisir dans les avis.',
+				],
+				'BLOG_MAX_NB_CARAC' => [
+					'description' => 'Nombre de caractères maximum à afficher dans le bloc critiques.',
+				],
+				'NB_AFFICH_AVIS_PAR_AUTEUR'  => [
+					'description' => 'Nombre d\'avis maximum à afficher par utilisateur.',
+				],
+				'CLEF_GOOGLE_MAP' => [
+					'description' => 'Clef d\'activation pour le plan d\'accès google map. <a target="_blank" href="http://code.google.com/apis/maps/signup.html">Obtenir la clé google map</a>',
+				],
+				'MODO_AVIS' => [
+					'description' => 'Modération des avis des lecteurs.<br /> Désactivé : affichage sans attente de validation<br /> Activé : affichage seulement après validation.',
+					'type' => self::TYPE_ON_OFF,
+				],
+				'MODO_AVIS_BIBLIO' => [
+					'description' => 'Modération des avis des bibliothèquaires.<br />  Désactivé: affichage sans attente de validation<br /> Activé: affichage seulement après validation',
+					'type' => self::TYPE_ON_OFF,
+				],
+				'AVIS_BIB_SEULEMENT' => [
+					'description' => 'Désactivé: les lecteurs peuvent donner leur avis. <br /> Activé: seuls les bibliothèquaires peuvent donner leur avis',
+					'type' => self::TYPE_ON_OFF,
+				],
+				'MODO_BLOG' => [
+					'description' => 'Désactivé: ne requiert pas d\'identification pour saisir des  commentaires. <br /> Activé: requiert l\'identification pour saisir des commentaires.',
+					'type' => self::TYPE_ON_OFF,
+				],
+				'REGISTER_OK' => [
+					'description' => 'Texte visible par l\'internaute après son inscription.',
+				],
+				'RESA_CONDITION' => [
+					'description' => 'Texte visible après l\'envoi d\'e-mail de demande de réservation.',
+				],
+				'SITE_OK' => [
+					'description' => 'Désactiver pour passer le site en maintenance',
+					'type' => self::TYPE_ON_OFF,
+				],
+				'ID_BIBLIOSURF' => [
+					'description' => 'Nom de la bibliothèque chez bibliosurf (en minuscules)',
+				],
+				'JS_STAT' => [
+					'description' => 'Javascript code for statistics',
+				],
+				'ID_READ_SPEAKER' => [
+					'description' => 'Numéro de client Read Speaker <a target="_blank" href="http://webreader.readspeaker.com">http://webreader.readspeaker.com</a>',
+				],
+				'BLUGA_API_KEY' => [
+					'description' => 'Clé API Bluga Webthumb <a target="_blank" href="http://webthumb.bluga.net/home">http://webthumb.bluga.net/home</a>',
+				],
+				'AIDE_FICHE_ABONNE' => [
+					'description' => 'Texte d\'aide affiché dans la fiche abonné',
+				],
+				'INTERDIRE_ENREG_UTIL' => [
+					'description' => 'Supprime l\'affichage du lien d\'enregistrement dans les différents formulaires de connexion et interdit l\'enregistrement d\'utilisateurs',
+				],
+				'LANGUES' => [
+					'description' => 'Liste des codes langue utilisées en plus du français séparées par des ;. Exemple: en;ro;es',
+				],
+				'CACHE_ACTIF' => [
+					'description' => implode('<br/>', [
+						'Activer le cache des boîtes (meilleure performance mais mise à jour toutes les ' . CACHE_LIFETIME / 60 . 'mn)',
+						sprintf('<a href="%s" >Vider le cache</a>',
+										Class_Url::assemble(['module' => 'admin',
+																				 'action' => 'clearcache']))
+					]),
+					'type' => self::TYPE_ON_OFF,
+				],
+				'WORKFLOW' => [
+					'description' => implode('<br/>', [
+						'Activer ou désactiver la gestion des validations des articles',
+						'Vide ou 0 = Désactivé, 1 = Activé avec les statuts par défaut, JSON = Activé avec des statuts de validation supplémentaire',
+						'Exemple JSON :',
+						'[{"id":10, "label":"À valider niveau 2"}, {"id":11, "label":"À valider niveau 3"}]',
+						'Les identifiants 1 à 5 sont réservés'
+					]),
+				],
+				'WORKFLOW_TEXT_MAIL_ARTICLE_PENDING' => [
+					'description' => 'Contenu de l\'email de notification d\'article en attente de validation',
+				],
+				'WORKFLOW_TEXT_MAIL_ARTICLE_REFUSED' => [
+					'description' => 'Contenu de l\'email de notification de refus d\'un article à valider',
+				],
+				'WORKFLOW_TEXT_MAIL_ARTICLE_VALIDATED' => [
+					'description' => 'Contenu de l\'email de notification de validation d\'un article',
+				],
+				'BIBNUM' => [
+					'description' => 'Activer ou désactiver la bibliothèque numérique',
+					'type' => self::TYPE_ON_OFF,
+				],
+				'FORMATIONS' => [
+					'description' => 'Activer ou désactiver le module formation',
+					'type' => self::TYPE_ON_OFF,
+				],
+				'VODECLIC_KEY' => [
+					'description' => 'Clé de sécurité Vodeclic',
+				],
+				'VODECLIC_ID' => [
+					'description' => 'Identifiant partenaire Vodeclic',
+				],
+				'VODECLIC_BIB_ID' => [
+					'description' => 'Identifiant code bibliothèque Vodeclic',
+				],
+				'CVS_BMKEY' => [
+					'description' => 'Paramétrage CVS',
+				],
+				'CVS_BMID' => [
+					'description' => 'Paramétrage CVS',
+				],
+				'CVS_SOURCENAME' => [
+					'description' => 'Paramétrage CVS',
+				],
+				'CVS_SOURCEID' => [
+					'description' => 'Paramétrage CVS',
+				],
+				'CVS_SOURCEKEY' => [
+					'description' => 'Paramétrage CVS',
+				],
+				'CVS_SOURCEPASSWORD' => [
+					'description' => 'Paramétrage CVS',
+				],
+				'CVS_LOGINTEST' => [
+					'description' => 'Paramétrage CVS',
+				],
+				'NUMILOG_URL' => [
+					'description' => 'Paramétrage <a href="http://forge.afi-sa.fr/projects/opac3/wiki/Ressources_externes_enrichissements#Numilog">Numilog</a>',
+				],
+				'NUMILOG_OAI_URL' => [
+					'description' => 'Paramétrage <a href="http://forge.afi-sa.fr/projects/opac3/wiki/Ressources_externes_enrichissements#Numilog">Numilog</a>',
+				],
+				'NUMILOG_OAI_IDBIB' => [
+					'description' => 'Paramétrage <a href="http://forge.afi-sa.fr/projects/opac3/wiki/Ressources_externes_enrichissements#Numilog">Numilog</a>',
+				],
+				'CYBERLIBRIS_URL' => [
+					'description' => 'Adresse du serveur OAI Cyberlibris',
+				],
+				'CYBERLIBRIS_ID' => [
+					'description' => 'Identifiant SSO Cyberlibris',
+				],
+				'OAI_SERVER' => [
+					'description' => 'Activation du serveur OAI',
+					'type' => self::TYPE_ON_OFF,
+				],
+				'PACK_MOBILE' => [
+					'description' => 'Activation des fonctions avancées du téléphone',
+					'type' => self::TYPE_ON_OFF,
+				],
+				'ARTE_VOD_LOGIN' => [
+					'description' => 'Login ARTE VOD',
+				],
+				'ARTE_VOD_KEY' => [
+					'description' => 'Clé ARTE VOD',
+				],
+				'ARTE_VOD_SSO_KEY' => [
+					'description' => 'Clé ARTE VOD Single Sign-On',
+				],
+				'BABELTHEQUE_JS' => [
+					'description' => 'URL du javascript Babelthèque à insérer dans l\'OPAC',
+				],
+				'MULTIMEDIA_KEY' => [
+					'description' => 'Clé publique pour le cryptage des données AFI-Multimédia',
+				],
+				'WEBKIOSK_KEY' => [
+					'description' => 'Clé publique pour le cryptage des données Aesis Webkiosk',
+				],
+				'WEBKIOSK_RESERVATION_URL' => [
+					'description' => 'URL d\'accès à l\'interface de réservation des postes Aesis Webkiosk',
+				],
+				'CSS_EDITOR' => [
+					'description' => '',
+				],
+				'CMS_FORMULAIRES' => [
+					'description' => 'Activation des formulaires',
+					'type' => self::TYPE_ON_OFF,
+				],
+				'MENU_BOITE' => [
+					'description' => 'Activation des boîtes dans les menus',
+					'type' => self::TYPE_ON_OFF,
+				],
+				'INTERDIRE_MODIF_FICHE_ABONNE' => [
+					'description' => 'Interdire la modification de la fiche abonne',
+					'type' => self::TYPE_ON_OFF,
+				],
+				'ROOT_URL_ECOUTE' => [
+					'description' => '',
+				],
+				'URL_TYPO3' => [
+					'description' => 'Url d\'import d\'un agenda TYPO3',
+				],
+				'CHAMPS_FICHE_UTILISATEUR' => [
+					'description' => 'Liste des champs que l\'utilisateur peux modifier. <br/>Ex: nom;prenom;pseudo;adresse;<br/>code_postal;ville;mail;is_contact_mail;<br/>telephone;is_contact_telephone;',
+				],
+				'FACETTE_PCDM4_LIBELLE' => [
+					'description' => 'Libellé pour la PCDM4',
+				],
+				'FACETTE_DEWEY_LIBELLE' => [
+					'description' => 'Libellé pour la Dewey',
+				],
+				'FACETTE_TYPE_DOC_LIBELLE' => [
+					'description' => '',
+				],
+				'FACETTE_LANGUE_LIBELLE' => [
+					'description' => '',
+				],
+				'FACETTE_GENRE_LIBELLE' => [
+					'description' => '',
+				],
+				'FACETTE_SITE_LIBELLE' => [
+					'description' => '',
+				],
+				'FACETTE_SECTION_LIBELLE' => [
+					'description' => '',
+				],
+				'FACETTE_BIBLIOTHEQUE_LIBELLE' => [
+					'description' => '',
+				],
+				'FACETTE_AUTEUR_LIBELLE' => [
+					'description' => '',
+				],
+				'FACETTE_INTERET_LIBELLE' => [
+					'description' => '',
+				],
+				'FACETTE_MATIERE_LIBELLE' => [
+					'description' => '',
+				],
+				'FACETTE_TAG_LIBELLE' => [
+					'description' => '',
+				],
+				'AFFICHER_DISPONIBILITE_SUR_RECHERCHE' => [
+					'description' => 'Activation de la disponibilite dans le resultat de recherche.',
+					'type' => self::TYPE_ON_OFF,
+				],
+				'NOM_DOMAINE' => [
+					'description' => 'Nom de domaine principal de l\'OPAC, ex: monopac.macommune.fr',
+				],
+				'TOUTAPPRENDRE_BIB_ID' => [
+					'description' => 'Paramétrage <a href="http://forge.afi-sa.fr/projects/opac3/wiki/Ressources_externes_enrichissements#Tout-Apprendre">ToutApprendre</a>',
+				],
+				'TOUTAPPRENDRE_KEY' => [
+					'description' => 'Paramétrage <a href="http://forge.afi-sa.fr/projects/opac3/wiki/Ressources_externes_enrichissements#Tout-Apprendre">ToutApprendre</a>',
+				],
+				'NUMERIQUE_PREMIUM_URL' => [
+					'description' => '',
+				],
+				'MUSICME_URL' => [
+					'description' => '',
+				],
+				'MUSICME_BIB_ID' => [
+					'description' => '',
+				],
+				'DATE_LAST_FULL_INTEGRATION_USERS' => [
+					'description' => 'Date du dernier import total des abonnés (modifié par cosmogramme)',
+				],
+				'BOITE_PANIER_AUTO' => [
+					'description' => 'Ajouter automatiquement une boîte panier dans la division flottante',
+					'type' => self::TYPE_ON_OFF,
+				],
+				'EXTRA_SKIN_PATH' => [
+					'description' => 'Chemin vers les skins personnalisées, relatif à ' . Class_Profil_Skin::EXTRA_PATH,
+				],
+				'ENABLE_COLLABORATIVE_BROWSING' => [
+					'description' => 'Activation de la navigation collaborative',
+					'type' => self::TYPE_ON_OFF,
+				],
+				'KOHA_MULTI_SITES' => [
+					'description' => 'WS KOHA : Reservation d\'exemplaires pour les multi sites',
+					'type' => self::TYPE_ON_OFF,
+				],
+				'LECTURA_DOMAIN' => [
+					'description' => 'Domaine utilisée par le serveur lectura pour authentification',
+				],
+				'LEKIOSK_ID' => [
+					'description' => 'Identifiant fournit par lekiosk.com',
+				],
+				'TEXT_REPLACEMENTS' => [
+					'description' => 'Remplacement de textes à la volée. <br/>Ex:<br/>Panier;Sélection<br/>Vous avez %d paniers;Vous avez %d sélections',
+				],
+				'ARTICLES_LIST_MODE' => [
+					'description' => 'Le gestionnaire de contenu affiche les articles sous forme de liste paginée au lieu de d\'une arborescence. Cet affichage est adapté lorsque le nombre d\'article devient trop important',
+					'type' => self::TYPE_ON_OFF,
+				],
+				'DILICOM_PNB' => [
+					'description' => 'Activation du PNB Dilicom',
+					'type' => self::TYPE_ON_OFF,
+				],
+				'MYCOW_EID' => [
+					'description' => 'Clé d\'identification MyCOW.EU pour le portail. Cette clé doit être fournie par MyCOW.EU. Elle active la ressource numérique dans le portail.',
+				],
+			];
 
 		return self::$_knownVars;
 	}
@@ -400,9 +595,10 @@ class Class_AdminVar extends Storm_Model_Abstract {
 	 * @return string
 	 */
 	public static function helpFor($name) {
-		if (!array_key_exists($name, static::getKnownVars()))
+		$known_vars = static::getKnownVars();
+		if (!isset($known_vars[$name]['description']))
 			return '';
-		return static::getKnownVars()[$name];
+		return $known_vars[$name]['description'];
 	}
 
 
@@ -465,6 +661,19 @@ class Class_AdminVar extends Storm_Model_Abstract {
 	}
 
 
+	public function getType() {
+		$known_vars = static::getKnownVars();
+		$name = $this->getId();
+		if (!isset($known_vars[$name]['type']))
+			return '';
+		return $known_vars[$name]['type'];
+	}
+
+	public function isOnOff() {
+		return $this->getType() == self::TYPE_ON_OFF;
+	}
+
+
 	public static function getBabelthequeId() {
 		$mathes = [];
 		if (preg_match('/bw_([^\.]+)\.js/', (string)self::get('BABELTHEQUE_JS'), $matches))
diff --git a/tests/application/modules/admin/controllers/AdminIndexControllerTest.php b/tests/application/modules/admin/controllers/AdminIndexControllerTest.php
index 1b63e02eac7..6e91d1f3a66 100644
--- a/tests/application/modules/admin/controllers/AdminIndexControllerTest.php
+++ b/tests/application/modules/admin/controllers/AdminIndexControllerTest.php
@@ -153,6 +153,8 @@ class AdminIndexControllerIndexActionTest extends AdminIndexControllerTestCase {
 class AdminIndexControllerAdminVarActionTest extends Admin_AbstractControllerTestCase {
 	public function setUp() {
 		parent::setUp();
+		$this->fixture('Class_AdminVar', ['id' => 'BIBNUM', 'valeur' => '0']);
+		$this->fixture('Class_AdminVar', ['id' => 'CACHE_ACTIF', 'valeur' => '1']);
 		$this->dispatch('/admin/index/adminvar');
 	}
 
@@ -201,6 +203,20 @@ class AdminIndexControllerAdminVarActionTest extends Admin_AbstractControllerTes
 		$this->assertXpathContentContains('//td', 'TEXT_REPLACEMENTS');
 	}
 
+	/** @test */
+	public function bibnumShouldDisplayDelImageAndDisabledLabel() {
+		$base_xpath = '//table[@id="adminvars"]//td[contains(text(), "BIBNUM")]/../td[2]';
+		$this->assertXPath($base_xpath . '/img[contains(@src, "del.gif")]');
+		$this->assertXPathContentContains($base_xpath, 'Désactivé');
+	}
+
+	/** @test */
+	public function cacheActifShouldDisplayCocheVerteImageAndEnabledLabel() {
+		$base_xpath = '//table[@id="adminvars"]//td[contains(text(), "CACHE_ACTIF")]/../td[2]';
+		$this->assertXPathContentContains($base_xpath, 'Activé');
+		$this->assertXPath($base_xpath . '/img[contains(@src, "coche_verte.gif")]');
+	}
+
 
 	/** @test */
 	public function dilicomPNBShouldBePresent() {
diff --git a/tests/library/Class/AdminVarTest.php b/tests/library/Class/AdminVarTest.php
index 2f005e87a91..51853ab042d 100644
--- a/tests/library/Class/AdminVarTest.php
+++ b/tests/library/Class/AdminVarTest.php
@@ -33,11 +33,6 @@ abstract class AdminVarTestCase extends ModelTestCase {
 
 class AdminVarTestGet extends AdminVarTestCase {
 
-	public function setup() {
-		Class_AdminVar::set('WORKFLOW_TEXT_MAIL_ARTICLE_PENDING','');
-		Class_AdminVar::set('WORKFLOW_TEXT_MAIL_ARTICLE_REFUSED','');
-	}
-
 	public function testGetReturnsValeur() {
 		$my_var = Class_AdminVar::getLoader()
 			->newInstance()
@@ -139,18 +134,6 @@ class AdminVarTestGet extends AdminVarTestCase {
 	}
 
 
-	/** @test */
-	public function workflowTextMailArticlePendingShouldHaveDefaultTextNouvelArticleAValider() {
-		$this->assertEquals('Un nouvel article est à valider. TITRE_ARTICLE URL_ARTICLE',Class_AdminVar::getWorkflowTextMailArticlePending());
-	}
-
-
-	/** @test */
-	public function workflowTextMailArticleRefusedShouldHaveDefaultTextArticleRefuse() {
-		$this->assertEquals('L\'article a été refusé.',Class_AdminVar::getWorkflowTextMailArticleRefused());
-	}
-
-
 
 	/** @test */
 	public function getVarShouldStripSlashes() {
@@ -214,4 +197,25 @@ class AdminVarBabelthequeTest extends Storm_Test_ModelTestCase {
 	}
 }
 
+
+
+class AdminVarWorkflowTest extends Storm_Test_ModelTestCase {
+	public function setup() {
+		Class_AdminVar::beVolatile();
+		Class_AdminVar::set('WORKFLOW_TEXT_MAIL_ARTICLE_PENDING','');
+		Class_AdminVar::set('WORKFLOW_TEXT_MAIL_ARTICLE_REFUSED','');
+	}
+
+	/** @test */
+	public function workflowTextMailArticlePendingShouldHaveDefaultTextNouvelArticleAValider() {
+		$this->assertEquals('Un nouvel article est à valider. TITRE_ARTICLE URL_ARTICLE',Class_AdminVar::getWorkflowTextMailArticlePending());
+	}
+
+
+	/** @test */
+	public function workflowTextMailArticleRefusedShouldHaveDefaultTextArticleRefuse() {
+		$this->assertEquals('L\'article a été refusé.',Class_AdminVar::getWorkflowTextMailArticleRefused());
+	}
+}
+
 ?>
\ No newline at end of file
-- 
GitLab