LSaddon :: supann : redesign and improve this addon

This commit is contained in:
Benjamin Renard 2014-11-20 00:44:41 +01:00
parent 391018e492
commit 53ef8436d4
28 changed files with 4366 additions and 2874 deletions

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,41 @@
ul.LSformElement_supannCompositeAttribute li {
border: 1px dotted #CCC;
padding: 2px;
}
ul.LSformElement_supannCompositeAttribute li.noValue {
border: none;
}
ul.LSformElement_supannCompositeAttribute p {
margin: 0;
}
ul.LSformElement_supannCompositeAttribute p label {
font-weight: bold;
}
input.LSformElement_supannCompositeAttribute_search {
border: 1px solid #CCC;
width: 200px;
background: url('../../images/default/find.png') no-repeat scroll 0% 0% #FFF !important;
padding-left: 18px;
}
div.supannCompositeAttribute_possibleValues ul {
list-style-type: none;
padding: 0;
margin: 0;
border: 1px solid #CCC;
border-collapse: collapse;
}
div.supannCompositeAttribute_possibleValues li {
border-bottom: 1px solid #CCC;
margin-bottom: 2px;
}
div.supannCompositeAttribute_possibleValues li:hover {
background-color: #CCC;
cursor: pointer;
}

View file

@ -1 +0,0 @@
LSformElement_supannRoleEntite_label_SUPANN.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 678 B

View file

@ -0,0 +1 @@
supann_label_BCN.png

View file

@ -0,0 +1 @@
supann_label_BCN.png

View file

Before

Width:  |  Height:  |  Size: 851 B

After

Width:  |  Height:  |  Size: 851 B

View file

Before

Width:  |  Height:  |  Size: 901 B

After

Width:  |  Height:  |  Size: 901 B

View file

@ -40,17 +40,17 @@ LSerror :: defineError('SUPANN_01',
LSerror :: defineError('SUPANN_02',
_("SUPANN Support : Can't get the basedn of entities. Unable to forge the attribute %{attr}.")
);
/**
* Verification du support SUPANN par ldapSaisie
*
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @retval boolean true si SUPANN est pleinement supporté, false sinon
*/
function LSaddon_supann_support() {
$retval = true;
$MUST_DEFINE_CONST= array(
'LS_SUPANN_LASTNAME_ATTR',
'LS_SUPANN_FIRSTNAME_ATTR',
@ -68,16 +68,11 @@ LSerror :: defineError('SUPANN_02',
}
$MUST_DEFINE_ARRAY= array(
'supannRoleGenerique',
'supannTypeEntite',
'supannTranslateRoleEntiteValueDirectory',
'supannTranslateFunctionDirectory',
'tableCodeUAI',
'supannTranslateEtablissementDirectory',
'supannNomenclatures',
);
foreach($MUST_DEFINE_ARRAY as $array) {
if ( !isset($GLOBALS[$array]) || !is_array($GLOBALS[$array])) {
LSerror :: addErrorCode('SUPANN_SUPPORT_01',$array);
LSerror :: addErrorCode('SUPANN_SUPPORT_03',$array);
$retval=false;
}
}
@ -87,13 +82,17 @@ LSerror :: defineError('SUPANN_02',
LSerror :: addErrorCode('SUPANN_SUPPORT_02', LS_SUPANN_LSOBJECT_ENTITE_TYPE);
}
}
return $retval;
}
/***********************************************************************
* Fonctions de génération de valeurs d'attributs
**********************************************************************/
/**
* Generation du displayName
*
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @param[in] $ldapObject L'objet ldap
@ -115,10 +114,10 @@ LSerror :: defineError('SUPANN_02',
return ($prenoms[0].' '.$noms[0]);
}
/**
* Generation du CN
*
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @param[in] $ldapObject L'objet ldap
@ -144,14 +143,14 @@ LSerror :: defineError('SUPANN_02',
/**
* Generation des valeurs de l'attribut eduPersonOrgUnitDN à partir des
* valeurs de l'attribut supannEntiteAffectation.
*
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @param[in] $ldapObject L'objet ldap
*
* @retval array Les valeurs de l'attribut eduPersonOrgUnitDN ou false
* si il y a un problème durant la génération
*/
*/
function generate_eduPersonOrgUnitDN($ldapObject) {
if ( get_class($ldapObject -> attrs[ 'supannEntiteAffectation' ]) != 'LSattribute' ) {
LSerror :: addErrorCode('SUPANN_01',array('dependency' => 'supannEntiteAffectation', 'attr' => 'eduPersonOrgUnitDN'));
@ -175,16 +174,16 @@ LSerror :: defineError('SUPANN_02',
}
/**
* Generation de la valeur de l'attribut eduPersonPrimaryOrgUnitDN
* Generation de la valeur de l'attribut eduPersonPrimaryOrgUnitDN
* à partir de la valeur de l'attribut supannEntiteAffectationPrincipale.
*
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @param[in] $ldapObject L'objet ldap
*
* @retval array La valeur de l'attribut eduPersonPrimaryOrgUnitDN
* ou false si il y a un problème durant la génération
*/
*/
function generate_eduPersonPrimaryOrgUnitDN($ldapObject) {
if ( get_class($ldapObject -> attrs[ 'supannEntiteAffectationPrincipale' ]) != 'LSattribute' ) {
LSerror :: addErrorCode('SUPANN_01',array('dependency' => 'supannEntiteAffectationPrincipale', 'attr' => 'eduPersonPrimaryOrgUnitDN'));
@ -208,19 +207,19 @@ LSerror :: defineError('SUPANN_02',
}
/**
* Generation de la valeur de l'attribut eduPersonOrgDN
* Generation de la valeur de l'attribut eduPersonOrgDN
* à partir de la valeur de l'attribut supannEtablissement.
*
* La valeur sera LS_SUPANN_ETABLISSEMENT_DN si l'attribut supannEtablissement
* vaut {UAI}LS_SUPANN_ETABLISSEMENT_UAI.
*
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @param[in] $ldapObject L'objet ldap
*
* @retval array La valeur de l'attribut eduPersonOrgDN ou false
* si il y a un problème durant la génération
*/
*/
function generate_eduPersonOrgDN($ldapObject) {
if ( get_class($ldapObject -> attrs[ 'supannEtablissement' ]) != 'LSattribute' ) {
LSerror :: addErrorCode('SUPANN_01',array('dependency' => 'supannEtablissement', 'attr' => 'eduPersonOrgDN'));
@ -237,6 +236,31 @@ LSerror :: defineError('SUPANN_02',
return $retval;
}
/***********************************************************************
* Fonction de parsing des valeurs spécifiques SUPANN
**********************************************************************/
/**
* Parse une valeur a etiquette SUPANN
*
* Exemple de valeur :
*
* {SUPANN}S410
*
* @param[in] $val La valeur
*
* @retval array Un tableau cle->valeur contenant label et value ou False
**/
function supannParseLabeledValue($value) {
if (preg_match('/^\{([^\}]*)\}(.*)$/',$value,$m)) {
return array(
'label'=>$m[1],
'value'=>$m[2]
);
}
return;
}
/**
* Parse une valeur composite SUPANN
*
@ -261,175 +285,139 @@ LSerror :: defineError('SUPANN_02',
return;
}
/**
* Retourne une eventuelle fonction de traduction d'une valeur
* en fonction de son label et de sa cle.
*
* Utilise la table $GLOBALS['supannTranslateFunctionDirectory']
*
* @param[in] $label Le label de la valeur
* @param[in] $key La cle de la valeur
*
* @retval string|false Le nom de la fonction de traduction ou false
**/
function supannTranslateRoleEntiteFunction($label,$key) {
if (isset($GLOBALS['supannTranslateFunctionDirectory'][$label][$key])) {
return $GLOBALS['supannTranslateFunctionDirectory'][$label][$key];
}
return;
}
/***********************************************************************
* Fonctions relatives aux entités
**********************************************************************/
/**
* Retourne le nom court d'une entite en fonction de son identifiant
*
* Fonction utilise comme fonction de traduction dans la fonction
* supannTranslateRoleEntiteValue()
*
* @param[in] $label Le label de la valeur
* @param[in] $key La cle de la valeur
* @param[in] $value La valeur : l'identifiant de l'entite (supannCodeEntite)
* @param[in] $id L'identifiant de l'entite (supannCodeEntite)
*
* @retval string Le nom de l'entite
**/
function supanGetEntiteNameById($label,$key,$value) {
function supanGetEntiteNameById($id) {
if (LSsession::loadLSobject(LS_SUPANN_LSOBJECT_ENTITE_TYPE)) {
$type=LS_SUPANN_LSOBJECT_ENTITE_TYPE;
$e = new $type();
$list=$e -> listObjectsName("(supannCodeEntite=$value)",NULL,array(),LS_SUPANN_LSOBJECT_ENTITE_FORMAT_SHORTNAME);
$list=$e -> listObjectsName("(supannCodeEntite=$id)",NULL,array(),LS_SUPANN_LSOBJECT_ENTITE_FORMAT_SHORTNAME);
if (count($list)==1) {
return array(
'translated' => array_pop($list),
'label' => $label
);
return array_pop($list);
}
}
return array(
'translated' => getFData(__("%{value} (unrecognized value)"),$value),
'label' => $label
);
return getFData(__("Entity %{id} (unrecognized)"),$id);
}
/**
* Parse une valeur a etiquette SUPANN
* Valide l'ID d'une entite
*
* Exemple de valeur :
* @param[in] $id L'identifiant de l'entite (supannCodeEntite)
*
* {SUPANN}S410
*
* @param[in] $val La valeur
*
* @retval array Un tableau cle->valeur contenant label et value ou False
* @retval boolean True si une entité avec cet ID existe, False sinon
**/
function supannParseLabeledValue($value) {
if (preg_match('/^\{([^\}]*)\}(.*)$/',$value,$m)) {
return array(
'label'=>$m[1],
'value'=>$m[2]
);
}
return;
}
/**
* Simple découpage label/valeur sans traduction réel
*
* @param[in] $key La cle
* @param[in] $value La valeur
*
* @retval array Un tableau cle->valeur contenant label et translated
**/
function supannTranslateLabeledValue($value) {
$label='no';
$pl=supannParseLabeledValue($value);
if ($pl) {
$label=$pl['label'];
$value=$pl['value'];
}
return array(
'label' => $label,
'translated' => $value
);
}
/**
* Traduit une valeur en fonction de sa cle extrait d'un attribut
* supannRoleEntite.
*
* @param[in] $key La cle
* @param[in] $value La valeur
*
* @retval array Un tableau cle->valeur contenant label et translated ou False
**/
function supannTranslateRoleEntiteValue($key,$value) {
$label='no';
$pl=supannParseLabeledValue($value);
if ($pl) {
$label=$pl['label'];
$value=$pl['value'];
}
// Translate by method
if (supannTranslateRoleEntiteFunction($label,$key)) {
$func = supannTranslateRoleEntiteFunction($label,$key);
if (function_exists($func)) {
try {
return $func($label,$key,$value);
}
catch (Exception $e) {
return;
}
}
else {
return;
function supannValidateEntityId($id) {
if (LSsession::loadLSobject(LS_SUPANN_LSOBJECT_ENTITE_TYPE)) {
$type=LS_SUPANN_LSOBJECT_ENTITE_TYPE;
$e = new $type();
$list=$e -> listObjectsName("(supannCodeEntite=$id)");
if (count($list)==1) {
return true;
}
}
// Translate by directory
elseif (isset($GLOBALS['supannTranslateRoleEntiteValueDirectory'][$label][$key][$value])) {
return array(
'translated' => $GLOBALS['supannTranslateRoleEntiteValueDirectory'][$label][$key][$value],
'label' => $label
);
}
else {
return array(
'label' => $label,
'translated' => $value
);
}
return false;
}
/**
* Traduit une valeur en fonction de sa cle extrait d'un attribut
* supannEtablissement
* Cherche des entités répond au pattern de recherche passé en paramètres
* et retourne un tableau mettant en relation leur identifiant et leur nom
* d'affichage.
*
* @param[in] $key La cle
* @param[in] $value La valeur
* @param[in] $pattern string Le pattern de recherche
*
* @retval array Un tableau cle->valeur contenant label et translated
* @retval array Tableau du résultat de la recherche mettant en relation
* l'identifiant des entités trouvés avec leur nom d'affichage.
**/
function supannTranslateEtablissement($value) {
$label='no';
$pl=supannParseLabeledValue($value);
if ($pl) {
$label=$pl['label'];
$value=$pl['value'];
}
if (isset($GLOBALS['supannTranslateEtablissementDirectory'][$label][$value])) {
return array(
'translated' => $GLOBALS['supannTranslateEtablissementDirectory'][$label][$value],
'label' => $label
);
}
else {
return array(
'label' => $label,
'translated' => $value
);
}
function supannSearchEntityByPattern($pattern) {
$retval=array();
if (LSsession::loadLSclass('LSsearch')) {
$search=new LSsearch(
LS_SUPANN_LSOBJECT_ENTITE_TYPE,
'SUPANN:supannSearchEntityByPattern',
array(
'pattern' => $pattern,
'attributes' => array('supannCodeEntite'),
'sizelimit' => 10,
)
);
$search -> run();
foreach($search -> getSearchEntries() as $e) {
$code=$e->get('supannCodeEntite');
if (is_array($code)) $code=$code[0];
$retval[$code]=$e->displayName;
}
}
return $retval;
}
?>
/***********************************************************************
* Fonctions relatives aux nomenclatures
**********************************************************************/
/**
* Vérifie si une valeur et son étiquette sont valide pour une table donnée
*
* @param[in] $table La table de nomenclature
* @param[in] $label L'étiquette de la valeur
* @param[in] $value La valeur
*
* @retval booleab True si valide, False sinon
**/
function supannValidateNomenclatureValue($table,$label,$value) {
$label=strtoupper($label);
if (isset($GLOBALS['supannNomenclatures'][$label]) &&
isset($GLOBALS['supannNomenclatures'][$label][$table]) &&
isset($GLOBALS['supannNomenclatures'][$label][$table][$value])) {
return true;
}
return false;
}
/**
* Retourne le label d'une valeur en fonction de la table de nomenclature
* et de l'étiquette de la valeur.
*
* @param[in] $table La table de nomenclature
* @param[in] $label L'étiquette de la valeur
* @param[in] $value La valeur
*
* @retval array Le label de la valeur. En cas de valeur nor-reconnue, retourne
* la valeur en spécifiant qu'elle n'est pas reconnue.
**/
function supannGetNomenclatureLabel($table,$label,$value) {
if (supannValidateNomenclatureValue($table,$label,$value)) {
$label=strtoupper($label);
return $GLOBALS['supannNomenclatures'][$label][$table][$value];
}
return getFData(__("%{value} (unrecognized value)"),$value);
}
/**
* Retourne les valeurs possibles d'une table de nomenclature
*
* @param[in] $table La table de nomenclature
*
* @retval array Tableau contenant les valeurs possibles de la table
* de nomenclature
**/
function supannGetNomenclatureTable($table) {
$retval=array();
foreach($GLOBALS['supannNomenclatures'] as $label => $tables) {
if (isset($GLOBALS['supannNomenclatures'][$label][$table])) {
$retval[$label]=$GLOBALS['supannNomenclatures'][$label][$table];
}
}
return $retval;
}

View file

@ -30,5 +30,3 @@ class LSattr_html_supannRoleEntite extends LSattr_html {
var $LSformElement_type = 'supannRoleEntite';
}
?>

View file

@ -0,0 +1,312 @@
<?php
/*******************************************************************************
* Copyright (C) 2007 Easter-eggs
* http://ldapsaisie.labs.libre-entreprise.org
*
* Author: See AUTHORS file in top-level directory.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
******************************************************************************/
LSsession :: loadLSclass('LSformElement');
LSsession :: loadLSaddon('supann');
/**
* Element supannCompositeAttribute d'un formulaire pour LdapSaisie
*
* Cette classe permet de gérer les attributs composite supann en la déclinant.
* Elle étant la classe basic LSformElement.
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*/
class LSformElement_supannCompositeAttribute extends LSformElement {
var $template = 'LSformElement_supannCompositeAttribute.tpl';
var $fieldTemplate = 'LSformElement_supannCompositeAttribute_field.tpl';
/*
* Composants des valeurs composites :
*
* Format :
* array (
* '[clé composant1]' => array (
* 'label' => '[label composant]',
* 'type' => '[type de composant]',
* 'table' => '[table de nomenclature correspondante]',
* 'required' => '[booléen obligatoire]'
* ),
* '[clé composant 2]' => array (
* [...]
* ),
* [...]
* )
* Types :
* - 'table' => Composant alimenté à partir d'une table issu de la
* nomenclature SUPANN. Le paramètre 'table' permet alors
* de spécifier quel table SUPANN intéroger.
* - 'codeEntite' => Composant stockant le code d'une entite SUPANN de
* l'annuaire.
* - 'text' => saisie manuelle
*
*/
var $components = array ();
var $_postParsedData=null;
/**
* Retourne les infos d'affichage de l'élément
*
* Cette méthode retourne les informations d'affichage de l'élement
*
* @retval array
*/
function getDisplay(){
$return = $this -> getLabelInfos();
$parseValues=array();
$invalidValues=array();
foreach($this -> values as $val) {
$keyValue=supannParseCompositeValue($val);
if ($keyValue) {
$parseValue=array('value' => $val);
foreach($keyValue as $key => $value) {
$parseValue[$key]=$this -> translateComponentValue($key,$value);
}
$parseValues[]=$parseValue;
}
else {
$invalidValues[]=$val;
}
}
$return['html'] = $this -> fetchTemplate(NULL,
array(
'parseValues' => $parseValues,
'components' => $this -> components
)
);
LSsession :: addCssFile('LSformElement_supannCompositeAttribute.css');
if (!$this -> isFreeze()) {
LSsession :: addJSconfigParam(
$this -> name,
array(
'searchBtn' => _('Modify'),
'noValueLabel' => _('No set value'),
'noResultLabel' => _('No result'),
'components' => $this->components
)
);
LSsession :: addJSscript('LSformElement_supannCompositeAttribute_field_value_component.js');
LSsession :: addJSscript('LSformElement_supannCompositeAttribute_field_value.js');
LSsession :: addJSscript('LSformElement_supannCompositeAttribute_field.js');
LSsession :: addJSscript('LSformElement_supannCompositeAttribute.js');
}
return $return;
}
/**
* Retourne le code HTML d'un champ vide
*
* @retval string Code HTML d'un champ vide.
*/
function getEmptyField() {
return $this -> fetchTemplate($this -> fieldTemplate,array('components' => $this -> components));
}
/**
* Traduit la valeur d'un composant
*
* Retourne un array contenant :
* - label : l'étiquette de la valeur ou 'no' sinon
* - value : la valeur brute
* - translated : la valeur traduite ou la valeur elle même
*
* @param[in] $c string Le nom du composant
* @param[in] $val string La valeur
*
* @retval array
**/
function translateComponentValue($c,$val) {
$retval = array (
'translated' => $val,
'label' => 'no',
'value' => $val,
);
if (isset($this -> components[$c])) {
if ($this -> components[$c]['type']=='table') {
$pv=supannParseLabeledValue($val);
if ($pv) {
$retval['label'] = $pv['label'];
$retval['translated'] = supannGetNomenclatureLabel($this -> components[$c]['table'],$pv['label'],$pv['value']);
}
}
elseif ($this -> components[$c]['type']=='codeEntite') {
$retval['translated']=supanGetEntiteNameById($val);
}
//elseif type == 'text' => aucune transformation
}
return $retval;
}
/**
* Recupère la valeur de l'élement passée en POST
*
* Cette méthode vérifie la présence en POST de la valeur de l'élément et la récupère
* pour la mettre dans le tableau passer en paramètre avec en clef le nom de l'élément
*
* @param[] array Pointeur sur le tableau qui recupèrera la valeur.
*
* @retval boolean true si la valeur est présente en POST, false sinon
*/
function getPostData(&$return) {
if($this -> isFreeze()) {
return true;
}
$count=0;
$end=false;
$parseValues=array();
$return[$this -> name]=array();
while ($end==false) {
$value="";
$parseValue=array();
$errors=array();
$unemptyComponents=array();
foreach ($this -> components as $c => $cconf) {
if (isset($_POST[$this -> name.'__'.$c][$count])) {
$parseValue[$c]=$_POST[$this -> name.'__'.$c][$count];
if ($cconf['required'] && empty($parseValue[$c])) {
$errors[]=getFData(__('Component %{c} must be defined'),__($cconf['label']));
continue;
}
if (empty($parseValue[$c])) {
continue;
}
$unemptyComponents[]=$c;
if ($cconf['type']=='table') {
$pv=supannParseLabeledValue($parseValue[$c]);
if ($pv) {
if (!supannValidateNomenclatureValue($cconf['table'],$pv['label'],$pv['value'])) {
$errors[]=getFData(__('Invalid value for component %{c}.'),__($cconf['label']));
}
}
else {
$errors[]=getFData(__('Unparsable value for component %{c}.'),__($cconf['label']));
}
}
elseif ($cconf['type']=='codeEntite') {
if (!supannValidateEntityId($parseValue[$c])) {
$errors[]=getFData(__('Invalid value for component %{c}.'),__($cconf['label']));
}
}
if (is_array($cconf['check_data'])) {
foreach($cconf['check_data'] as $ruleType => $rconf) {
$className='LSformRule_'.$ruleType;
if (LSsession::loadLSclass($className)) {
$r=new $className();
if (!$r -> validate($parseValue[$c],$rconf,$this)) {
if (isset($rconf['msg'])) {
$errors[]=getFData(__($rconf['msg']),__($cconf['label']));
}
else {
$errors[]=getFData(__('Invalid value for component %{c}.'),__($cconf['label']));
}
}
}
else {
$errors[]=getFData(__("Can't validate value of component %{c}."),__($cconf['label']));
}
}
}
$value.="[".$c."=".$parseValue[$c].']';
}
else {
// end of value break
$end=true;
break;
}
}
if (!$end) {
if (!empty($unemptyComponents)) {
foreach($errors as $e) {
$this -> form -> setElementError($this -> attr_html,$e);
}
$return[$this -> name][]=$value;
$parseValues[]=$parseValue;
}
$count++;
}
}
$this -> _postParsedData=$parseValues;
return true;
}
/**
* This ajax method is used by the searchComponentPossibleValues function of the form element.
*
* @param[in] $data The address to the array of data witch will be return by the ajax request
*
* @retval void
**/
public static function ajax_searchComponentPossibleValues(&$data) {
if ((isset($_REQUEST['attribute'])) && (isset($_REQUEST['objecttype'])) && (isset($_REQUEST['component'])) && (isset($_REQUEST['pattern'])) && (isset($_REQUEST['idform'])) ) {
if (LSsession ::loadLSobject($_REQUEST['objecttype'])) {
$object = new $_REQUEST['objecttype']();
$form = $object -> getForm($_REQUEST['idform']);
$field=$form -> getElement($_REQUEST['attribute']);
if (isset($field->components[$_REQUEST['component']])) {
$data['possibleValues'] = $field -> searchComponentPossibleValues($_REQUEST['component'],$_REQUEST['pattern']);
}
}
}
}
private function searchComponentPossibleValues($c,$pattern) {
$pattern=strtolower($pattern);
$retval=array();
if (isset($this -> components[$c])) {
if ($this -> components[$c]['type'] == 'table') {
$table=supannGetNomenclatureTable($this -> components[$c]['table']);
foreach($table as $label => $values) {
foreach($values as $v => $txt) {
if (strpos(strtolower($txt),$pattern)!==false) {
$retval[]=array(
'label' => $label,
'value' => "{".$label."}".$v,
'translated' => $txt
);
}
}
}
}
elseif ($this -> components[$c]['type'] == 'codeEntite') {
foreach (supannSearchEntityByPattern($pattern) as $code => $displayName) {
$retval[]=array(
'label' => 'no',
'value' => $code,
'translated' => $displayName
);
}
}
}
return $retval;
}
}
?>

View file

@ -34,17 +34,7 @@ LSsession :: loadLSaddon('supann');
class LSformElement_supannEtablissement extends LSformElement_supannLabeledValue {
/**
* Traduit une valeur
*
* @param[in] $value La valeur
*
* @retval array Un tableau cle->valeur contenant translated et label ou False
**/
function translate($value) {
return supannTranslateEtablissement($value);
}
var $supannNomenclatureTable = 'codeEtablissement';
}

View file

@ -36,6 +36,8 @@ class LSformElement_supannLabeledValue extends LSformElement {
var $template = 'LSformElement_supannLabeledValue.tpl';
var $fieldTemplate = 'LSformElement_supannLabeledValue_field.tpl';
var $supannNomenclatureTable = null;
/**
* Retourne les infos d'affichage de l'élément
@ -49,31 +51,33 @@ class LSformElement_supannLabeledValue extends LSformElement {
$parseValues=array();
foreach($this -> values as $val) {
$parseValue=array(
'value' => $val
);
$tr=$this -> translate($val);
if ($tr) {
if($tr['translated'])
$parseValue['translated']=$tr['translated'];
if($tr['label'])
$parseValue['label']=$tr['label'];
}
$parseValues[]=$parseValue;
$parseValues[]=$this -> parseValue($val);
}
$return['html'] = $this -> fetchTemplate(NULL,array('parseValues' => $parseValues));
return $return;
}
/**
* Traduit une valeur
* Parse une valeur
*
* @param[in] $value La valeur
*
* @retval array Un tableau cle->valeur contenant translated et label ou False
* @retval array Un tableau cle->valeur contenant value, translated et label
**/
function translate($value) {
return supannTranslateLabeledValue($value);
function parseValue($value) {
$retval=array(
'value' => $value,
);
$pv=supannParseLabeledValue($value);
if ($pv) {
$retval['label'] = $pv['label'];
$retval['translated'] = supannGetNomenclatureLabel($this -> supannNomenclatureTable,$pv['label'],$pv['value']);
}
else {
$retval['label'] = 'no';
$retval['translated'] = getFData(__('%s (Unparsable value)'),$value);
}
return $retval;
}
}

View file

@ -20,7 +20,7 @@
******************************************************************************/
LSsession :: loadLSclass('LSformElement');
LSsession :: loadLSclass('LSformElement_supannCompositeAttribute');
LSsession :: loadLSaddon('supann');
/**
@ -32,46 +32,29 @@ LSsession :: loadLSaddon('supann');
* @author Benjamin Renard <brenard@easter-eggs.com>
*/
class LSformElement_supannRoleEntite extends LSformElement {
class LSformElement_supannRoleEntite extends LSformElement_supannCompositeAttribute {
var $template = 'LSformElement_supannRoleEntite.tpl';
var $fieldTemplate = 'LSformElement_supannRoleEntite_field.tpl';
/**
* Retourne les infos d'affichage de l'élément
*
* Cette méthode retourne les informations d'affichage de l'élement
*
* @retval array
*/
function getDisplay(){
$return = $this -> getLabelInfos();
$parseValues=array();
foreach($this -> values as $val) {
$keyValue=supannParseCompositeValue($val);
if ($keyValue) {
$parseValue=array('value' => $val);
foreach($keyValue as $key => $value) {
$parseValue[$key]=array(
'value' => $value
);
$tr=supannTranslateRoleEntiteValue($key,$value);
if ($tr) {
if($tr['translated'])
$parseValue[$key]['translated']=$tr['translated'];
if($tr['label'])
$parseValue[$key]['label']=$tr['label'];
}
}
$parseValues[]=$parseValue;
}
}
$return['html'] = $this -> fetchTemplate(NULL,array('parseValues' => $parseValues));
return $return;
function LSformElement_supannRoleEntite (&$form, $name, $label, $params,&$attr_html){
$this -> components = array (
'role' => array (
'label' => _('Role'),
'type' => 'table',
'table' => 'roleGenerique',
'required' => true,
),
'type' => array (
'label' => _('Entity type'),
'type' => 'table',
'table' => 'typeEntite',
'required' => true,
),
'code' => array (
'label' => _('Entity'),
'type' => 'codeEntite',
'required' => false
)
);
return parent::LSformElement ($form, $name, $label, $params,$attr_html);
}
}
?>

View file

@ -34,17 +34,7 @@ LSsession :: loadLSaddon('supann');
class LSformElement_supannRoleGenerique extends LSformElement_supannLabeledValue {
/**
* Traduit une valeur
*
* @param[in] $value La valeur
*
* @retval array Un tableau cle->valeur contenant translated et label ou False
**/
function translate($value) {
return supannTranslateRoleEntiteValue('role',$value);
}
var $supannNomenclatureTable = 'roleGenerique';
}

View file

@ -34,17 +34,7 @@ LSsession :: loadLSaddon('supann');
class LSformElement_supannTypeEntite extends LSformElement_supannLabeledValue {
/**
* Traduit une valeur
*
* @param[in] $value La valeur
*
* @retval array Un tableau cle->valeur contenant translated et label ou False
**/
function translate($value) {
return supannTranslateRoleEntiteValue('type',$value);
}
var $supannNomenclatureTable = 'typeEntite';
}

View file

@ -0,0 +1,18 @@
var LSformElement_supannCompositeAttribute = new Class({
initialize: function(){
this.fields = [];
this.initialiseLSformElement_supannCompositeAttribute();
},
initialiseLSformElement_supannCompositeAttribute: function(el) {
if (!$type(el)) {
el = document;
}
el.getElements('ul.LSformElement_supannCompositeAttribute').each(function(ul) {
this.fields[ul.id] = new LSformElement_supannCompositeAttribute_field(ul);
}, this);
}
});
window.addEvent(window.ie ? 'load' : 'domready', function() {
varLSformElement_supannCompositeAttribute = new LSformElement_supannCompositeAttribute();
});

View file

@ -0,0 +1,34 @@
var LSformElement_supannCompositeAttribute_field = new Class({
initialize: function(ul){
this.ul=ul;
this.dd=ul.getParent();
this.name = ul.id;
this.values = [];
this.field_type = ul.get('data-fieldType');
this.initializeLSformElement_supannCompositeAttribute_field();
varLSform.addField(this.name,this);
},
initializeLSformElement_supannCompositeAttribute_field: function(el) {
if (!$type(el)) {
el = this.ul;
}
el.getElements('li').each(function(li) {
this.values.push(new LSformElement_supannCompositeAttribute_field_value(li,this.name,this.field_type));
}, this);
},
clearValue: function() {
console.log('clear');
console.log(this.values);
if (this.values.length>1) {
for(var i=1; i<=this.values.length; i++) {
$(this.values[i].li).dispose();
}
this.values[0].clear();
}
else if (this.values.length==1) {
this.values[0].clear();
}
}
});

View file

@ -0,0 +1,29 @@
var LSformElement_supannCompositeAttribute_field_value = new Class({
initialize: function(li,name,field_type){
this.li=li;
this.name = name;
this.components = {};
this.field_type = field_type;
this.initializeLSformElement_supannCompositeAttribute_field_value();
varLSform.addModule(field_type,this);
},
initializeLSformElement_supannCompositeAttribute_field_value: function(el) {
if (!$type(el)) {
el = this.li;
}
el.getElements('p').each(function(p) {
this.components[p.get('data-component')]=new LSformElement_supannCompositeAttribute_field_value_component(p,p.get('data-component'),this.name);
}, this);
},
reinitialize: function(el) {
this.initializeLSformElement_supannCompositeAttribute_field_value(el);
},
clear: function() {
for (c in this.components) {
this.components[c].clear();
}
}
});

View file

@ -0,0 +1,174 @@
var LSformElement_supannCompositeAttribute_field_value_component = new Class({
initialize: function(p,name,field_name){
this.p = p;
this.field_name = field_name;
this.name = name;
this.params = varLSdefault.LSjsConfig[this.field_name];
this.input = p.getElement('input');
this.img = p.getElement('img');
this.span = p.getElement('span');
if (this.params.components[this.name].type=="table" || this.params.components[this.name].type=="codeEntite") {
this.inputSearch=new Element(
'input',
{
'class': 'LSformElement_supannCompositeAttribute_search',
'styles': {
'display': 'none'
}
}
);
this.inputSearch.addEvent('keydown',this.onKeyUpInputSearch.bindWithEvent(this));
this.inputSearch.injectInside(this.p);
this.searchBtn=new Element(
'img',
{
'src': varLSdefault.imagePath('modify'),
'alt': this.params.searchBtn,
'title': this.params.searchBtn,
}
);
this.searchBtn.addEvent('click',this.toogleInputSearch.bind(this));
this.searchBtn.injectBefore(this.inputSearch);
this._lastSearch=null;
this._possibleValues=null;
}
},
toogleInputSearch: function() {
if (this.inputSearch.getStyle('display')=='none') {
this.inputSearch.setStyle('display','block');
this.inputSearch.focus();
}
else {
this.hidePossibleValues();
this.inputSearch.setStyle('display','none');
this.inputSearch.set('value','');
}
},
onKeyUpInputSearch: function(event) {
event = new Event(event);
if ((event.key=='enter')||(event.key=='tab')) {
event.stop();
if (this.inputSearch.value!="") {
this.launchSearch();
}
}
if (event.key=='esc') {
this.toogleInputSearch();
}
},
launchSearch: function() {
this.hidePossibleValues();
this._lastSearch=this.inputSearch.value;
var data = {
template: 'LSformElement_supannCompositeAttribute',
action: 'searchComponentPossibleValues',
attribute: this.field_name,
objecttype: varLSform.objecttype,
idform: varLSform.idform,
component: this.name,
pattern: this.inputSearch.value
};
data.imgload=varLSdefault.loadingImgDisplay(this.inputSearch);
new Request({url: 'index_ajax.php', data: data, onSuccess: this.onSearchComplete.bind(this)}).send();
},
onSearchComplete: function(responseText, responseXML) {
var data = JSON.decode(responseText);
if ( varLSdefault.checkAjaxReturn(data) ) {
this.displayPossibleValues(data.possibleValues);
}
},
displayPossibleValues: function(possibleValues) {
if (this._possibleValues==null) {
this._possibleValues=new Element(
'div',
{
'class': 'supannCompositeAttribute_possibleValues',
}
);
this._possibleValues.injectInside(this.p);
}
var ul=new Element('ul');
possibleValues.each(function(v) {
var li=new Element(
'li',
{
'data-value': v.value,
'data-label': v.label,
'data-translated': v.translated,
}
);
if (v.label!='no') {
li.set('html',"<img src='"+varLSdefault.imagePath('supann_label_'+v.label)+"' alt='["+v.label+"]'/> "+v.translated);
}
else {
li.set('html',v.translated);
}
li.injectInside(this);
}, ul);
if (ul.getElements('li').length==0) {
new Element(
'li',
{
'html': this.params.noResultLabel
}
).injectInside(ul);
}
else {
ul.getElements('li').each(function(li) {
li.addEvent('click',this.onClickPossibleValue.bindWithEvent(this));
}, this);
}
ul.injectInside(this._possibleValues);
this._possibleValues.setStyle('display', 'block');
},
hidePossibleValues: function() {
if (this._possibleValues!=null) {
this._possibleValues.setStyle('display', 'none');
this._possibleValues.empty();
}
},
onClickPossibleValue: function(event) {
this.hidePossibleValues();
event = new Event(event);
var li=$(event.target);
if (event.target.tagName=='IMG') {
li=li.getParent();
}
this.input.set('value',li.get('data-value'));
if (li.get('data-label')!='no') {
if (this.img==null) {
this.img=new Element('img');
this.img.injectBefore(this.span);
}
this.img.set('src',varLSdefault.imagePath('supann_label_'+li.get('data-label')));
}
this.span.set('html',li.get('data-translated'));
this.toogleInputSearch();
},
clear: function() {
if (this.img) {
this.img.dispose();
this.img=null;
}
this.input.set('value','');
if (this.span) {
this.span.set('html',this.params.noValueLabel);
}
}
});

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,7 @@
<ul class='LSform {if $multiple && !$freeze} LSformElement_multiple{/if} LSformElement_supannCompositeAttribute' id='{$attr_name}' data-fieldType="{$fieldType}">
{foreach from=$parseValues item=parseValue}
<li>{include file="ls:$fieldTemplate"}</li>
{foreachelse}
<li {if $freeze}class='noValue'{/if}>{include file="ls:$fieldTemplate"}</li>
{/foreach}
</ul>

View file

@ -0,0 +1,37 @@
{if $freeze}
{if isset($parseValue)}
{foreach $components as $c => $cconf}
{if !isset($parseValue[$c])}{continue}{/if}
<p>
<label>{tr msg=$cconf.label} : </label>
{if !empty($parseValue[$c].label) and $parseValue[$c].label!='no'}
{assign var=clabel value=$parseValue[$c].label}
<img src='{img name="supann_label_$clabel"}' alt='[{$clabel}]' title='{$clabel}'/>
{/if}
<span title="{$parseValue[$c].value}">{$parseValue[$c].translated}</span>
</p>
{/foreach}
{else}
{$noValueTxt}
{/if}
{else}
{foreach $components as $c => $cconf}
<p data-component="{$c}">
<label>{tr msg=$cconf.label}{if $cconf.required}*{/if} :</label>
{if $cconf.type=='table' or $cconf.type=='codeEntite'}
<input type='hidden' name='{$attr_name}__{$c}[]' value="{if $parseValue and $parseValue[$c]}{$parseValue[$c].value}{/if}"/>
{if $parseValue and !empty($parseValue[$c].label) and $parseValue[$c].label!='no'}
{assign var=clabel value=$parseValue[$c].label}
<img src='{img name="supann_label_$clabel"}' alt='[{$clabel}]' title='{$clabel}'/>
{/if}
{if $parseValue}
<span title="{$parseValue[$c].value}">{$parseValue[$c].translated}</span>
{else}
<span>{$noValueTxt}</span>
{/if}
{else}
<input type='text' name='{$attr_name}__{$c}[]' value="{if $parseValue and $parseValue[$c]}{$parseValue[$c].value}{/if}"/>
{/if}
</p>
{/foreach}
{/if}

View file

@ -1,7 +1,7 @@
{if $freeze}
{if $value or $parseValue}
{if $parseValue}
<span class='LSformElement_supannLabeledValue'>{if $label}<img src='{img name="LSformElement_supannLabeledValue_label_$label"}' alt='[{$label}]' title='{$label}' /> {/if}<span title='{$parseValue.value}'>{$value}</span></span>
<span class='LSformElement_supannLabeledValue'>{if $label}<img src='{img name="supann_label_$label"}' alt='[{$label}]' title='{$label}' /> {/if}<span title='{$parseValue.value}'>{$value}</span></span>
{else}
<span class='LSformElement_supannLabeledValue_unparsed'>{$value}</span>
{/if}

View file

@ -1,25 +0,0 @@
<ul class='LSform{if $multiple && !$freeze} LSformElement_multiple'{/if}' id='{$attr_name}'>
{if $parseValues}
{foreach from=$parseValues item=parseValue}
{if $parseValue.role.translated}{assign var=role value=$parseValue.role.translated}{else}{assign var=role value=$parseValue.role.value}{/if}
{if $parseValue.role.label!="no"}{assign var=label_role value=$parseValue.role.label}{else}{assign var=label_role value=""}{/if}
{if $parseValue.type.translated}{assign var=type value=$parseValue.type.translated}{else}{assign var=type value=$parseValue.type.value}{/if}
{if $parseValue.type.label!="no"}{assign var=label_type value=$parseValue.type.label}{else}{assign var=label_type value=""}{/if}
{if $parseValue.code.translated}{assign var=code value=$parseValue.code.translated}{else}{assign var=code value=$parseValue.code.value}{/if}
{if $parseValue.code.label!="no"}{assign var=label_code value=$parseValue.code.label}{else}{assign var=label_code value=""}{/if}
<li>{include file="ls:$fieldTemplate"}</li>
{foreachelse}
{assign var=value value=""}
{assign var=parseValue value=""}
<li>{include file="ls:$fieldTemplate"}</li>
{/foreach}
{else}
{foreach from=$values item=value}
<li>{include file="ls:$fieldTemplate"}</li>
{foreachelse}
{assign var=value value=""}
{assign var=parseValue value=""}
<li>{include file="ls:$fieldTemplate"}</li>
{/foreach}
{/if}
</ul>

View file

@ -1,17 +0,0 @@
{if $freeze}
{if $value or $parseValue}
{if $parseValue}
<span class='LSformElement_supannRoleEntite'>{if $label_role}<img src='{img name="LSformElement_supannRoleEntite_label_$label_role"}' alt='[{$label_role}]' title='{$label_role}' /> {/if}<span title='{$parseValue.role.value}'>{$role}</span> : {if $label_code}<img src='{img name="LSformElement_supannRoleEntite_label_$label_code"}' alt='[{$label_code}]' title='{$label_code}' /> {/if}<span title='{$parseValue.code.value}'>{$code}</span> ({if $label_type}<img src='{img name="LSformElement_supannRoleEntite_label_$label_type"}' alt='[{$label_type}]' title='{$label_type}' /> {/if}<span title='{$parseValue.type.value}'>{$type}</span>)</span>
{else}
<span class='LSformElement_supannRoleEntite_unparsed'>{$value}</span>
{/if}
{else}
{$noValueTxt}
{/if}
{else}
{if $parseValue}
<input type='text' name='{$attr_name}[]' class='LSformElement_text' value="{$parseValue.value}" autocomplete="off"/>
{else}
<input type='text' name='{$attr_name}[]' class='LSformElement_text' value="{$value}" autocomplete="off"/>
{/if}
{/if}