public function printItem(&$mod, $item, $acces = 'RW', $domEtape, $optimize = '') { global $formxSession; global $compteurItem; //eko($item['id']); //Certains items ne peuvent être affichés if (in_array($item['type'], array('CLOSER'))) { return; } //print '<br />'.$domEtape->getAttribute('no_etape')._.$item['id'] ; $hideItem = false; //print "******************ACCESS $acces ********************"; if ($acces == 'RW') { $compteurItem++; $this->debug("____________________ITEM {$compteurItem} _______________"); } //eko($item[id]." = ".$item->Val[0]); $this->debug("Entrée dans printItem pour l'item " . $item['id']); $domItem = $this->getDomItemFromId($item['id'], $domEtape); //---------------------------------------- //Gestion des conditions sur l'item et de leur implication sur l'affichage if ($item->Cond['type'] && !($acces == 'RO' && $optimize)) { //cas normal, ou pas d'optmize sur RO (rare) $this->debug("test de la condition activee pour l'item"); //test condition if ($item['isfresh'] == 'y') { //TraiterPostPost vient de le calculer //if( $item[id] == 'is_psl' ) eko("c'est frais: ".$item['lasttestcond']); $resCond = $item['lasttestcond'] == 'y' ? true : false; $domItem->setAttribute('isfresh', ''); } else { //sinon on le recalcule //eko("c'est pas frais"); $resCond = $this->majCondAffichage($domItem); $domItem->setAttribute('isfresh', ''); } $this->debug("Fin du calcul"); if (!$resCond) { //condition renvoie faux //on quitte l'affichage de l'item, sauf dans le cas où l'item est lié avec du DHTML, au quel cas il doit s'afficher caché if (!$item['printHidden']) { return; } else { if (!$this->testCondDOM($domItem, 'prerequite')) { return ''; } $hideItem = true; } } } elseif ($item->Cond['type'] && $acces == 'RO' && $item['lasttestcond'] == 'n') { //optimize est activé , lecture seule, et en cache on a la valeur non return; } //--------------fin des conditions sur l'item $this->debug("calculs preliminaires"); //si saut de l'item en mode non-impression if ($this->modeImpression && (string) $item['dontPrint']) { return; } //generation d'un id de champ de formulaire $id = $this->prefix . $item['id']; //ajout ou non de l'asterisque if ($this->XMLCore['showOblig'] && $this->isItemOblig($item['id']) && !$this->modeImpression) { $showOblig = '<span style="color:red"> * </span>'; } else { $showOblig = ""; } //si précisions supplémentaires nécéssaires if ((string) $item['multiple'] && (string) $item['type'] == 'LISTE') { //eko('lplp'); $precisions = '<span style="color:#AACC00;"><I> choix multiple = [ctrl]</I></span>'; } else { $precisions = ""; } if ((string) $item['hyperinfo'] && !$this->modeImpression) { $precisions .= clFoRmXtOoLs::getHyperLink((string) $item['hyperinfo']); } //recuperation du libelle mis en forme //attention, le libellé peut être redéfini plus loin //pour l'instant, faire une recherche de texte item->Libelle pour les retrouver if ((string) $item->Libelle[0]) { //$mod -> MxText ( "etape.item.libelle.libelles","yahourt bleu"); $mod->MxText("etape.item.libelle.libelles", clFoRmXtOoLs::getStyledBal($item->Libelle) . $showOblig . $precisions); } //affectation de l'id de la ligne $mod->MxText("etape.item.idligne", 'ligne_' . $item['id']); //cachageDeLaLigne if ($hideItem) { $mod->MxText("etape.item.optionsligne", "style='display:none;'"); } else { $mod->MxText("etape.item.optionsligne", ""); } //maintenant on va traiter suivant le type de la balise item (attribut) $type_item = $item['type']; //si l'etape est finie ou //si balise Readonly, alors texte en lecture seule //SAUF pour les items beneficiant d'un affichage spécial, //il faut les lister ici if ($acces == 'RO' && $type_item != 'TAB' && $type_item != 'SLIDER') { $type_item = 'RO'; } //si pas le droit d'acces à ce champ if ($item['access'] && !$formxSession->getDroit(utf8_decode((string) $item['access']), 'r')) { $type_item = 'NORIGHT'; } if ($item['readonly'] && in_array($item['readonly'], array('y', 'yes', 'o', 'oui', 'Y', 'O', 'OUI', 'YES')) && !in_array($item['readonly'], array('n', 'no', 'non', 'N', 'NON', 'NO'))) { $type_item = 'RO'; } //si demande d'appel externe pour remplir le champ if ($item->From[0] && !($optimize && $acces == 'RO')) { if (isset($valXT)) { unset($valXT); } $valXT = (string) $this->getValueFrom($item->From[0]); if ($this->current_fusion) { $this->setFormVar($item['id'], utf8_decode($valXT), 'no_simplexml_update no_sql_update'); $item->Val[0] = $valXT; //cas général } else { if (($valXT != '' && !(string) $item->Val[0] || $item['resync']) && !($optimize && $acces == 'RO')) { $item->Val[0] = $valXT; $this->setFormVar($item['id'], utf8_decode($valXT), 'no_simplexml_update no_sql_update'); } } } //si demande de saut de l'item quand il est nul if ((string) $item['dontPrintwhenNull'] and $acces == 'RO' and !(string) $item->Val || in_array((string) $item->Val, $this->session->getNullValues())) { //eko( (string) $item->Val); //eko( "<xmp>".$item->asXML()."</xmp>"); return; } //Si la variable est liée à une variable globale d'ids //migré dans traitePostPost , pour recette, décommenter si problème //if($item['link'] && ! ($optimize && $acces == 'RO')) $this->setVar($item['link'],(string) utf8_decode( $item->Val )); //Si valeur persitante demandée if ($item->ValPersist[0]) { $item->Val[0] = (string) $item->ValPersist; } if ($item->FromPersist[0]) { $item->Val[0] = $this->getValueFrom((string) $item->FromPersist); } //si rechargement demandé if ($item['onChangeReload'] == 'y') { $options = "onchange=\"document.formx_form.pavalider.value='y' ;document.formx_form.submit() ;\""; $optionsradio = "onclick=\"document.formx_form.pavalider.value='y' ;document.formx_form.submit() ;\""; } //si rechargement demandé avec possibilité de validation if ($item['onChangeSubmit'] == 'y') { $options = "onchange=\"document.formx_form.submit() ;\""; $optionsradio = "onclick=\"document.formx_form.submit() ;\""; } //------------ affichage DHTML de certains items --------------- //Construction du javascript exécuté à chaque changement de valeur de l'item $nbItemsDhtmlKinked = 0; $js = ''; //1) on cache tous ceux qui sont cités foreach ($item->ShowItemsOnVal as $showItemOnVal) { if (!(string) $showItemOnVal->OnVal) { continue; } $liste = explode('|', $this->getValueFrom((string) $showItemOnVal->ListIdItems)); foreach ($liste as $idLinkedItem) { $js .= " formxjs_disappears('{$idLinkedItem}') ; "; } } //2) on fait apparaitre ceux qui ont une valeur autorisée foreach ($item->ShowItemsOnVal as $showItemOnVal) { if (!(string) $showItemOnVal->OnVal) { continue; } $nbItemsDhtmlKinked++; $val = $this->getValueFrom((string) $showItemOnVal->OnVal); $liste = explode('|', $this->getValueFrom((string) $showItemOnVal->ListIdItems)); foreach ($liste as $idLinkedItem) { $js .= " if ( formxjs_getvalue('" . $item['id'] . "') == '" . addslashes($val) . "' || formxjs_invalue('" . addslashes($val) . "','" . $item['id'] . "') ) { formxjs_appears('{$idLinkedItem}') ; } ; "; } } if ($nbItemsDhtmlKinked > 0) { $options = "onchange=\"{$js}\" "; $optionsradio = "onclick=\"{$js}\" "; } //-------------------FIN DHTML conditionel items---------------------- //on garde juste le bloc modelixe concerné $this->keepBloc(&$mod, "etape.item", $type_item); $this->tmp_parite = ($this->tmp_parite + 1) % 2; if ($this->tmp_parite == 1) { $mod->Mxattribut("etape.item.style_gche", "aa_gauche"); $mod->Mxattribut("etape.item.style_dte", "aa_bb"); } else { $mod->Mxattribut("etape.item.style_gche", "aa_gauche_pair"); $mod->Mxattribut("etape.item.style_dte", "aa_bb_pair"); } //si pas d'exlpication pour l'item, on vire le bloc explication if (isset($item->Explication)) { $mod->MxText("etape.item.explication.expl", $item->Explication[0]); $mod->MxText("etape.item.explication.lib", $item->Libelle[0] . $showOblig . $precisions); $mod->MxBloc("etape.item.libelle", "delete"); if ($this->tmp_parite == 1) { $mod->Mxattribut("etape.item.explication.style_gche", "aa_gauche"); } else { $mod->Mxattribut("etape.item.explication.style_gche", "aa_gauche_pair"); } } elseif ((string) $item['histo']) { //recuperation de l'historisation des données précédentes $varsFusions = $this->getAllValuesFromFormx($this->idformx, (string) $item['id'], "", "moreinfos"); $i = 0; $nb = $varsFusions['INDIC_SVC'][2]; $info = ""; for ($i = 0; $i < $nb - 1; $i++) { if (!(string) $varsFusions["infosmore_auteur"][$nb - $i - 1]) { $auteur = "inconnu"; } else { $auteur = $varsFusions["infosmore_auteur"][$nb - $i - 1]; } //$info.= "<br />".$varsFusions["infosmore_dt_creation"][$nb-$i-1].", ".$auteur.": ".utf8_encode($varsFusions[(string) $item['id']][$nb-$i-1]) ; $info .= "<br />" . utf8_encode($varsFusions["infosmore_dt_creation"][$nb - $i - 1]) . ", " . $auteur . ": " . utf8_encode($varsFusions[(string) $item['id']][$nb - $i - 1]); } $mod->MxText("etape.item.explication.lib", clFoRmXtOoLs::getStyledBal($item->Libelle) . $showOblig . $precisions); $mod->MxText("etape.item.explication.expl", $info); $mod->MxBloc("etape.item.libelle", "delete"); if ($this->tmp_parite == 1) { $mod->Mxattribut("etape.item.explication.style_gche", "aa_gauche"); } else { $mod->Mxattribut("etape.item.explication.style_gche", "aa_gauche_pair"); } } else { $mod->MxBloc("etape.item.explication", "delete"); } $this->debug("debut bloc affichage"); $reg = array(); //distiguons suivant le type d'item switch ($type_item) { //Si l'etape est finie et qu'on est en read only case 'NORIGHT': break; case 'RO': if ($item['type'] == 'HIDDEN') { $this->tmp_parite = ($this->tmp_parite + 1) % 2; break; } $nullvals = array('#', ''); $txt = $item->Val[0]; //si cal; et qu'une valeur d'affichage differe de valeur de stockage if ($item['type'] == 'CAL' && (string) $item->Val2) { $txt = $item->Val2[0]; } //si check, et valeur de libelle différente if ($item['type'] == 'CHECK' && (string) $item->FromListLibelles) { $tablibsPossibles = explode('|', (string) $item->FromListLibelles); $tabValsPossibles = explode('|', (string) $item->FromList); $tabVals = explode('|', (string) $item->Val); $tabLibs = array(); for ($i = 0; $i < count($tabVals); $i++) { for ($j = 0; $j < count($tabValsPossibles); $j++) { if ($tabVals[$i] == $tabValsPossibles[$j]) { $tabLibs[] = $tablibsPossibles[$j]; } } } $txt = implode(' , ', $tablibsPossibles); } if (in_array($txt, $nullvals)) { $txt = ''; } //application de styles if ((string) $item['class']) { $txt = "<span class='" . $item['class'] . "'>{$txt}</span>"; } if ((string) $item['style']) { $txt = "<span style='" . $item['style'] . "'>{$txt}</span>"; } if (preg_match('/^(.*)[\\t]{15}(.*)$/', $txt, $tabMatch)) { $txt = $tabMatch[1]; } $mod->MxText("etape.item.RO.minitxt", $txt); break; case 'RADIO': $mXtype = 'radio'; case 'CHECK': if ($item['cols']) { $nbcols = (int) $item['cols']; } else { $nbcols = 1; } if (!isset($mXtype)) { $mXtype = 'checkbox'; } //Cas de liste figée if (isset($item->FromList)) { $val = ereg("list:(.*)", $item->FromList[0], $reg); $tabtmp = explode('|', $reg[1]); } //cas de liste XHAM if (isset($item->FromXHAMList)) { //recuperation de la liste HHAM $tabtmp = $this->listeGen->getListeItems(addslashes(utf8_decode($item->FromXHAMList[0])), "1", '', '', ""); //creation de la liste unset($tabtmp[0]); if (count($tabtmp) < 1) { $this->listeGen->addListeWithItem(addslashes(utf8_decode($item->FromXHAMList[0]))); $tabtmp = $this->listeGen->getListeItems(addslashes(utf8_decode($item->FromXHAMList[0])), "1", '', '', ""); } //on enlve une specificité XHAM unset($tabtmp[0]); $tabtmp2 = array_map('utf8_encode', $tabtmp); unset($tabtmp); foreach ($tabtmp2 as $cle => $valeur) { $tabtmp[$valeur] = substr($valeur, 0, $this->lngchmp); } unset($tabtmp2); } if (isset($item->FromTerminalListeItem)) { //recuperation de la liste HHAM $tabtmp = objListe::getListeFromCol($this->getSubject()->getTerminal()->getIdTermConfiguration(), (string) $item->FromTerminalListeItem); } //si demande de libelles à la place des valeurs if (isset($tablibs)) { unset($tablibs); } if (isset($item->FromListLibelles)) { $tablibs = ereg("list:(.*)", $item->FromListLibelles[0], $reg); $tablibs = explode('|', $reg[1]); } //on recupere les données XML $vals = explode('|', $item->Val[0]); //affichage $i = -1; if (!isset($optionsradio)) { $optionsradio = ''; } foreach ($tabtmp as $val) { $i++; if (in_array($val, $vals)) { $value = 'CHECKED'; } else { $value = ''; } //$mod -> MxCheckerField("etape.item.$type_item.champ",$mXtype, $id.'[]', $val,$value,$optionsradio); if ($item['reloadOnlyCheckValues'] && !in_array($val, explode('|', $item['reloadOnlyCheckValues']))) { $currentOptionRadio = ''; } else { $currentOptionRadio = $optionsradio; } $mod->MxCheckerField("etape.item.{$type_item}.ligne.col.champ", $mXtype, $id . '[]', $val, $value, $currentOptionRadio); if (!isset($tablibs)) { $tablibs = ""; } if (!$tablibs) { $mod->MxText("etape.item.{$type_item}.ligne.col.champ_aff", $val); } else { $mod->MxText("etape.item.{$type_item}.ligne.col.champ_aff", $tablibs[$i]); } //$mod -> MxText("etape.item.$type_item.ligne.col.champ_aff",$tablibs[$i]); $mod->MxBloc("etape.item." . $type_item . ".ligne.col", 'loop'); if ($i % $nbcols == $nbcols - 1) { $mod->MxBloc("etape.item." . $type_item . ".ligne", 'loop'); } //$mod -> MxBloc("etape.item.".$type_item,'loop'); } //si sortie de la boucle avant validation du bloc de la derniere ligne if ($i % $nbcols != $nbcols - 1) { $mod->MxBloc("etape.item." . $type_item . ".ligne", 'loop'); } unset($mXtype); unset($tabtmp); break; case 'LISTEN': //pour communiquer avec la fonction appellée $this->ListenVals = explode('|', $item->Val[0]); //recuperer le tableau des listes if (isset($item->FromFuncListN)) { //recuperation de la liste HHAM $tablist = $this->callFunc($item->FromFuncListN[0]); } //combien on a de $nb_listes = count($tablist); for ($i = 0; $i < $nb_listes; $i++) { if (!is_array($tablist[$i])) { $tablist[$i] = array(); } $mod->MxSelect("etape.item.LISTEN.miniitem.select1", $id . "_LISTEN_{$i}", $this->ListenVals[$i], $tablist[$i], $this->invselect, '', "class=\"select_mono\"" . " onchange=\"document.formx_form.pavalider.value='y' ;document.formx_form.submit() ;\""); //$mod->Mxattribut("actions.frem.code","document.FoRmXcase.FormX_ext_goto_.value = 'RM".$data[id_instance][$i]."';document.FoRmXcase.submit();"); $mod->MxBloc("etape.item.LISTEN.miniitem", "loop"); } break; case 'LISTEDYN': //peu de difference avec LISTE, c'est pour ça qu'on ne le fait pas sortir //et qu'il va emprunter le case LISTE //generation du formfield d'ajout de champ $size = $this->lngchmp - 20; if (!isset($options)) { $options = ''; } $mod->MxAttribut('etape.item.LISTEDYN.img', FX_URLIMGRET); $mod->MxFormField("etape.item.LISTEDYN.newEntry", 'text', $id . "_new", '', "class=\"text2\" size=\"{$size}\" {$options}"); case 'LISTE': $this->debug("entrée dans le cas type='LISTE'"); $tabtmp = $this->getListes($item); $val = $item->Val[0]; //si c'est un select multiple if (isset($multiple)) { unset($multiple); } $invselect = $this->invselect; if (isset($item['multiple'])) { //précisions sur le libelle $invselect = ''; //traitement suivant valeur de l'attribut if ($item['multiple'] == 'yes' || $item['multiple'] == 'y') { $multiple = (int) $this->multiselectsize; } elseif ($item['multiple'] == 'all') { $multiple = sizeof($tabtmp); } else { $multiple = (int) $item['multiple']; } //on repasse en array pour que le form prenne bien la valeur par defaut $val = explode('|', $item->Val[0]); } //instanciation du modelisque if (!isset($options)) { $options = ''; } if (!isset($multiple)) { $multiple = ''; } if (!is_array($tabtmp)) { $tabtmp = array(); $this->addErreur("Attention ! le 4eme argument de MxSelect n' est pas un tableau!! assumé par tableau vide"); } $mod->MxSelect("etape.item.{$type_item}.select1", $id, $val, $tabtmp, $invselect, $multiple, "class=\"select_mono\" {$options}"); unset($tabtmp); unset($tablist); break; case 'TXT': $options = ''; $query = ''; $val = $item->Val[0]; if ((string) $item->FromTGSScore) { if (preg_match('/^(.*)[\\t]{15}(.*)$/', $val, $tabMatch)) { $val = $tabMatch[1]; $query = $tabMatch[2]; } $idScore = $this->getValueFrom($item->FromTGSScore); $options = " id='{$id}' "; $options .= " onClick=score_print('{$idScore}','{$id}','" . $this->getIdInstance() . "','{$query}') "; } $mod->MxFormField("etape.item.TXT.textsimple", 'text', $id, $val, "{$options} class=\"text1\" size=\"" . ($this->lngchmp + 2) . "\""); break; case 'SLIDER': $mod->MxAttribut("etape.item.SLIDER.idsliderinput", $id); $mod->MxAttribut("etape.item.SLIDER.idslidername", $id); $mod->MxText('etape.item.SLIDER.slidervalue', $item->Val[0]); $mod->MxAttribut("etape.item.SLIDER.idslider", $id . '_container'); $mod->MxText('etape.item.SLIDER.varsliderid', $id); $mod->MxText('etape.item.SLIDER.idslider2', $id . '_container'); $mod->MxText('etape.item.SLIDER.idsliderinput2', $id); $mod->MxText('etape.item.SLIDER.minslider', $item['min']); $mod->MxText('etape.item.SLIDER.maxslider', $item['max']); $mod->MxText('etape.item.SLIDER.slider_labelg', $item->LibelleGauche[0]); $mod->MxText('etape.item.SLIDER.slider_labeld', $item->LibelleDroite[0]); if ($acces == 'RO') { $mod->MxText('etape.item.SLIDER.isreadonly', 'true'); } else { $mod->MxText('etape.item.SLIDER.isreadonly', 'false'); } break; case 'NONE': break; case 'TAB': if ($acces == 'RO') { $option = 'readonly'; } ereg("list:(.*)", $item->Rows[0], $reg); $rows = explode('|', $reg[1]); ereg("list:(.*)", $item->Cols[0], $reg); $cols = explode('|', $reg[1]); $tabval = explode('|', (string) $item->Val); $mod->MxBloc("etape.item.TAB.titre", "loop"); $nb_cols = 0; foreach ($cols as $col) { $nb_cols++; $mod->MxText("etape.item.TAB.titre.libel", $col); $mod->MxBloc("etape.item.TAB.titre", "loop"); } $x = 0; $y = 0; $oki = ''; foreach ($rows as $row) { $mod->MxText("etape.item.TAB.ligne.lib", $row); foreach ($cols as $col) { $oki = ''; foreach ($item->Col as $colsp) { if ($colsp['lib'] == (string) $col) { if ($colsp['type'] == 'LISTE' && $option != 'readonly') { $oki = 1; /* ereg("list:(.*)",(string) $colsp->FromList,$reg); $tabtmp = explode('|',$reg[1]); unset($tab2); $tab2['']=''; foreach ( $tabtmp as $cle=>$val ) $tab2[$val]=$val; unset($tabtmp);*/ $tabtmp = $this->getListes($item->Col); //FIXME : traitement liste comme les autres : ici ca differe $tabtmp = array("" => "") + $tabtmp; $mod->MxSelect("etape.item.TAB.ligne.colonne.case_select.lacase", $id . "_{$x}" . "_{$y}", $tabval[$y * $nb_cols + $x], $tabtmp, '', '', "class=\"case\" {$option}"); //$mod -> MxFormField("etape.item.TAB.ligne.colonne.case_simple.lacase",'text', $id."_$x"."_$y",$tabval[$y*$nb_cols+$x],"class=\"case\" $option"); $mod->MxBloc("etape.item.TAB.ligne.colonne.case_simple", "delete"); $mod->MxBloc("etape.item.TAB.ligne.colonne", "loop"); $x++; } } } if ($oki) { continue; } $mod->MxFormField("etape.item.TAB.ligne.colonne.case_simple.lacase", 'text', $id . "_{$x}" . "_{$y}", $tabval[$y * $nb_cols + $x], "class=\"case\" {$option}"); $mod->MxBloc("etape.item.TAB.ligne.colonne.case_select", "delete"); $mod->MxBloc("etape.item.TAB.ligne.colonne", "loop"); $x++; } $x = 0; $y++; $mod->MxBloc("etape.item.TAB.ligne", "loop"); } break; case 'HIDDEN': //eko("OO"); $this->tmp_parite = ($this->tmp_parite + 1) % 2; $this->setFormVar($item['id'], (string) $item->Val, 'no_simplexml_update'); //return ; break; case 'LONGTXT': //si argument longueur de ligne if (isset($item['rows'])) { $rows = $item['rows']; } else { //Sinon valeur par defaut $rows = $this->defrows; } $cols = $this->lngchmp - 1; $mod->MxFormField("etape.item.LONGTXT.textlong", "textarea", $id, $item->Val[0], "class=\"formx_longtext\" cols=\"{$cols}\" rows=\"{$rows}\""); break; case 'FILE': switch ((string) $item->Val) { case 'ok': $mod->MxText("etape.item.FILE.indication", utf8_encode("<span style='color:green'>Fichier correctement transféré</span>")); break; case utf8_encode('¤ko'): $mod->MxText("etape.item.FILE.indication", utf8_encode("<span style='color:red'>Problème lors de l'envoi du fichier</span>")); break; default: $mod->MxText("etape.item.FILE.indication", utf8_encode("Choisissez un fichier à envoyer")); } $mod->MxAttribut("etape.item.FILE.name", $id); $mod->MxAttribut("etape.item.FILE.value", 1000 * $this->max_size_upload); break; case 'CAL': //val1 un contient la donnée brute, val2 la donnée d'affichage //c'est au niveau de affctPost qu'on passe de 2 à 1 par appel à la classe date $this->ya_un_cal = '1'; //eko("val XML du cal :<xmp>".$item->asXML()."</xmp>"); //format date ou datetime ? if ($item['format'] == 'datetime') { $format = '%Y-%m-%d %H:%M:%S'; } else { if (ereg('[YmdHMS]+', $item['format'])) { $format = clFoRmXtOoLs::formatDatePhp2FormatCalJs($item['format']); } else { $format = '%d-%m-%Y'; } } //1ere clause pour fonctionnement de la balise From if ($item->Val2[0] == '' && $item->Val[0] != '') { $dv = $item->Val[0]; } else { $dv = $item->Val2[0]; } //si on a demandé d'afficher la date courante par defaut et que la date n'a pas encore été instanciée: if ($item['default'] == 'today' && !$item->Val2[0]) { $dv = date(strtr($format, array('%' => '', 'M' => 'i'))); } $mod->MxFormField("etape.item.CAL.textCal", "text", $id, $dv, "class=\"text2\" id=\"{$id}\" size=\"20\" readonly"); $mod->MxAttribut('etape.item.CAL.img', FX_URLIMGCAL); $mod->MxText("etape.item.CAL.id", $id); //def d'une id pour l'appel du calendrier javascript $mod->MxAttribut("etape.item.CAL.idcal", $id . '_trigger'); //le calendrier javascript necessite d'être defini juste apres le formulaire. $mod->MxText("JavaCAL.javcalid", $id); //$mod -> MxText ( "JavaCAL.javcalidtrigger",$id.'_trigger'); //$mod -> MxText ( "JavaCAL.javcalform",$format); $mod->MxBloc("JavaCAL", "loop"); break; } $this->debug("fin bloc affichage"); //eko("item fini ".$item[id]); $mod->MxHidden("hidden_listen", "pavalider=n"); $mod->MxBloc("etape.item", "loop"); }