PageRenderTime 58ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/class.xoptions.inc

https://github.com/jcplat/console-seolan
PHP | 734 lines | 711 code | 5 blank | 18 comment | 51 complexity | 2ddc334676d0db1059e43b4ef6378967 MD5 | raw file
Possible License(s): LGPL-2.0, LGPL-2.1, GPL-3.0, Apache-2.0, BSD-3-Clause
  1. <?php
  2. /****c* tzr-5/XOptions
  3. * NAME
  4. * XOptions -- gestion d'un ensemble d'options
  5. * DESCRIPTION
  6. * Classe permettant la gestion d'un ensemble d'options dans un bloc de données
  7. * Utilisation: options des champs, options des modules, etc...
  8. * SYNOPSIS
  9. ****/
  10. class XOptions {
  11. private $_s = NULL;
  12. private $_p = array();
  13. function __construct($id = null) {
  14. if (!is_null($id)) $this->setId($id);
  15. }
  16. public function setId($id) {
  17. $this->id=$id;
  18. }
  19. /// Déclaration d'une nouvelle option
  20. public function setOpt($label, $option, $type, $opts=NULL, $def=NULL, $group='Specific', $level='admin') {
  21. if(XShell::admini_mode()) $this->_p[$option]=array('label'=>$label, 'type'=>$type, 'options'=>$opts, 'def'=>$def, 'group'=>$group, 'level'=>$level);
  22. else $this->_p[$option]=array('type'=>$type, 'options'=>$opts, 'def'=>$def, 'level'=>$level);
  23. }
  24. /// Applique la valeur d'une option à un objet
  25. public function set(&$s,$field,$value) {
  26. // Recupere la valeur par defaut dans l'objet si celle ci n'est pas renseignée dans l'option
  27. if($this->_p[$field]['def']===NULL && isset($s->$field)) $this->_p[$field]['def']=$s->$field;
  28. if(@$this->_p[$field]['type']=='boolean') {
  29. if(!isset($value)) $value=@$this->_p[$field]['def'];
  30. if($value==1) $s->$field=true;
  31. else $s->$field=false;
  32. return;
  33. }elseif(@$this->_p[$field]['type']=='ttext'){
  34. $lang=XShell::getLangData();
  35. $txts=XLabels::getAMsg($this->id.':'.$field,$lang,false);
  36. $s->$field=$txts;
  37. return;
  38. }else{
  39. if($value==='' || $value===NULL) $value=@$this->_p[$field]['def'];
  40. $s->$field=$value;
  41. }
  42. }
  43. /// Positionne l'option en lecture seule
  44. public function setRO($field) {
  45. $this->_p[$field]['options']['read-only']=true;
  46. }
  47. public function delOpt($option) {
  48. unset($this->_p[$option]);
  49. }
  50. public function clearOpts() {
  51. $this->_p=array();
  52. }
  53. public function get($s, $field) {
  54. return $s->$field;
  55. }
  56. public function getValues($s) {
  57. foreach($this->_p as $n => $p) {
  58. $r[$n]=$this->get($s, $n);
  59. }
  60. return $r;
  61. }
  62. public function setValues(&$s1, $s=NULL) {
  63. if(!is_array($s)) $s=array();
  64. foreach($this->_p as $n =>$v) {
  65. if(!isset($s[$n])) $s[$n]=NULL;
  66. $this->set($s1, $n, $s[$n]);
  67. }
  68. }
  69. public function setLabel($label,$option) {
  70. if($this->_p[$option])
  71. $this->_p[$option]['label']=$label;
  72. }
  73. public function setComment($comment,$option) {
  74. if($this->_p[$option])
  75. $this->_p[$option]['comment']=$comment;
  76. }
  77. public function setGroupComment($comment,$option) {
  78. if($this->_p[$option])
  79. $this->_p[$option]['groupcomment']=$comment;
  80. }
  81. public function getDialog(&$o, $ar=NULL,$block='options',$level='admin') {
  82. $lang = XShell::getLangUser();
  83. $ui=array();
  84. $groups=array();
  85. foreach($this->_p as $n =>$v) {
  86. if(!empty($v['group']) && !in_array($v['group'],$groups)) {
  87. $groups[]=$v['group'];
  88. }
  89. }
  90. if(empty($groups)) $groups[]='Specific';
  91. foreach($groups as $i1=>$g) {
  92. foreach($this->_p as $n =>$v) {
  93. if(empty($v['group'])) $v['group']='Specific';
  94. if($v['group']==$g) {
  95. if((@$v['options']['read-only']) || (($level!='admin') && ($v['level']=='admin'))) {
  96. $ui[]=array('field'=>$n,
  97. 'group'=>@$v['group'],
  98. 'label'=>@$v['label'],
  99. 'options'=>@$v['options'],
  100. 'comment'=>@$v['comment'],
  101. 'groupcomment'=>@$v['groupcomment'],
  102. 'edit'=>$this->_getView($block, $n,$this->get($o, $n))
  103. );
  104. } else {
  105. $ui[]=array('field'=>$n, 'group'=>@$v['group'],
  106. 'label'=>@$v['label'],
  107. 'options'=>@$v['options'],
  108. 'comment'=>@$v['comment'],
  109. 'groupcomment'=>@$v['groupcomment'],
  110. 'edit'=>$this->_getUI($block, $n, $o)
  111. );
  112. }
  113. }
  114. }
  115. }
  116. return $ui;
  117. }
  118. /**
  119. * Enregistre les propriétés passées en paramètre
  120. * @param &$obj Objet dont les propriétés vont être modifiées
  121. * @param &$values Nouvelles valeurs à insérer dans l'objet passé en paramètre précédent
  122. */
  123. public function procDialog(&$obj,&$values) {
  124. $lang = XShell::getLangUser();
  125. $ui=array();
  126. foreach($this->_p as $n =>$v) {
  127. if(isset($values[$n])){
  128. $val=$values[$n];
  129. if(method_exists($this, '_proc'.$this->_p[$n]['type'])) {
  130. $m='_proc'.$this->_p[$n]['type'];
  131. $this->$m($obj, $n, $val);
  132. }
  133. $this->set($obj, $n, $val);
  134. $values[$n]=$val;
  135. }
  136. }
  137. }
  138. private function _procdependency($s, $n, &$v) {
  139. // suppression des quotes protégeant l'opérateur pour export excel
  140. $v['op'] = preg_replace('/"(.*)"/', '$1', $v['op']);
  141. }
  142. private function _procttext($s, $n, &$v) {
  143. XLabels::updateAMsg($this->id.':'.$n, $v);
  144. $v=$this->id.':'.$n;
  145. }
  146. private function _proctemplate($s, $n, &$v) {
  147. if(is_array($v)) {
  148. $v=implode('',$v);
  149. }
  150. }
  151. private function _procdate($s, $n, &$v) {
  152. if(empty($this->_p[$n]['options']['free'])){
  153. $xdate=new XDateDef();
  154. $ret=$xdate->post_edit($v);
  155. $v=$ret->raw;
  156. }
  157. }
  158. public function getView(&$o, $ar=NULL,$block='opt') {
  159. $lang = XShell::getLangUser();
  160. $ui=array();
  161. $groups=array();
  162. foreach($this->_p as $n =>$v) {
  163. if(!empty($v['group']) && !in_array($v['group'],$groups)) {
  164. $groups[]=$v['group'];
  165. }
  166. }
  167. if(empty($groups)) $groups[]='Specific';
  168. foreach($groups as $i1=>$g) {
  169. foreach($this->_p as $n =>$v) {
  170. if(empty($v['group'])) $v['group']='Specific';
  171. if($v['group']==$g) {
  172. $ui[]=array('field'=>$n,
  173. 'group'=>$v['group'],
  174. 'options'=>$v['options'],
  175. 'label'=>$v['label'],
  176. 'view'=>$this->_getView($block, $n,$this->get($o, $n)));
  177. }
  178. }
  179. }
  180. return $ui;
  181. }
  182. private function _getUI($block,$n,&$o) {
  183. $v=$this->get($o,$n);
  184. $type=$this->_p[$n]['type'];
  185. $opts=$this->_p[$n]['options'];
  186. $txt='';
  187. if($block) $name=$block.'['.$n.']';
  188. else $name=$n;
  189. $onchange = (!empty($opts['validate'])?'onchange="if(this.form.onsubmit()) this.form.submit();"':'');
  190. switch($type) {
  191. case 'ttext':
  192. if(is_array($v)) $txts=$v;
  193. else{
  194. $txts=XLabels::getAMsg($this->id.':'.$n,NULL,false);
  195. }
  196. $txt="<table>";
  197. $size=(!empty($opts['size'])?$opts['size']:30);
  198. if(!empty($opts['rows'])) {
  199. $cols=$opts['cols'];
  200. $rows=$opts['rows'];
  201. }
  202. $varid=uniqid('v');
  203. $js='';
  204. foreach($GLOBALS['TZR_LANGUAGES'] as $lang=>$iso) {
  205. $txt.='<tr><th>'.$lang.'</th><td>';
  206. $v=str_replace('<br />','',$txts[$lang]);
  207. if($opts['rows']) {
  208. if($lang == TZR_DEFAULT_LANG){
  209. $js .= "jQuery('#".$varid.$lang."').blur(function(){var val = jQuery(this).val();var oldval= jQuery(this).attr('oldval'); jQuery('textarea[id^=$varid]').each(function(){if(jQuery(this).val()==oldval) jQuery(this).val(val)})}).focus(function(){jQuery(this).attr('oldval',jQuery(this).val());});";
  210. }
  211. $txt.='<textarea id="'.$varid.$lang.'" name="'.$block.'['.$n.']['.$lang.']" cols="'.$cols.'" rows="'.$rows.'" '.$onchange.'>'.$v.'</textarea>';
  212. } else {
  213. $txt.='<input id="'.$varid.$lang.'" type="text" name="'.$block.'['.$n.']['.$lang.']" value="'.$v.'" size="'.$size.'" '.$onchange.'/>';
  214. if($lang == TZR_DEFAULT_LANG){
  215. $js .= "jQuery('#".$varid.$lang."').blur(function(){var val = jQuery(this).val();var oldval= jQuery(this).attr('oldval'); jQuery('input[id^=$varid]').each(function(){if(jQuery(this).val()==oldval) jQuery(this).val(val)})}).focus(function(){jQuery(this).attr('oldval',jQuery(this).val());});";
  216. }
  217. }
  218. $txt.='</td></tr>';
  219. if(!empty($opts['compulsory'])){
  220. $js.='TZR.addValidator(["'.$varid.$lang.'",/(.+)/,"","'.XIni::get('error_color').'","XShortTextDef"]);';
  221. }
  222. }
  223. $txt.='</table>';
  224. if($js !='' ) $txt.='<script type="text/javascript">'.$js.'</script>';
  225. break;
  226. case 'text':
  227. $varid=uniqid('v');
  228. $size=(!empty($opts['size'])?$opts['size']:30);
  229. if(@$opts['rows']) {
  230. $cols=$opts['cols'];
  231. $rows=$opts['rows'];
  232. $txt='<textarea id="'.$varid.'" name="'.$block.'['.$n.']" cols="'.$cols.'" rows="'.$rows.'" '.$onchange.'>'.$v.'</textarea>';
  233. } else {
  234. $txt='<input id="'.$varid.'" type="text" name="'.$block.'['.$n.']" value="'.htmlentities($v,ENT_COMPAT,TZR_INTERNAL_CHARSET).'" size="'.$size.'" '.@$onchange.'/>';
  235. }
  236. if(!empty($opts['compulsory'])){
  237. $txt.='<script type="text/javascript">TZR.addValidator(["'.$varid.'",/(.+)/,"","'.XIni::get('error_color').'","XShortTextDef"]);</script>';
  238. }
  239. break;
  240. case 'label':
  241. $size=(!empty($opts['size'])?$opts['size']:30);
  242. if(!empty($opts['rows'])) {
  243. $cols=$opts['cols'];
  244. $rows=$opts['rows'];
  245. $txt="<textarea name=\"".$block."[$n]\" cols=\"$cols\" rows=\"$rows\" $onchange >$v</textarea>";
  246. } else {
  247. $txt="<input type=\"text\" name=\"".$block."[$n]\" value=\"$v\" size=\"$size\" $onchange />";
  248. }
  249. break;
  250. case 'boolean':
  251. $txt='<select name="'.$block."[$n]\"><option value=\"1\" ".($v?'selected':'').'>'.
  252. XLabels::getSysLabel('general','yes').'</option>'.
  253. '<option value="0" '.(!$v?'selected':'').'>'.XLabels::getSysLabel('general','no').'</option>';
  254. $txt.='</select>';
  255. break;
  256. case 'date':
  257. $txt=$this->_getDateUI($block.'['.$n.']',$v,$opts);
  258. break;
  259. case 'object':
  260. if(empty($opts['table'])) return '';
  261. $txt=$this->_getLinkUI($block.'['.$n.']',$v,$opts,$opts['table']);
  262. break;
  263. case 'template':
  264. if(!preg_match('/([0-9]+)/',$opts['moid']) && !empty($opts['moid'])) {
  265. $f=$opts['moid'];
  266. $opts['moid']=$o->$f;
  267. }
  268. $txt=$this->_getLinkUI($block.'['.$n.']',$v,$opts,'TEMPLATES');
  269. break;
  270. case 'letter':
  271. $txt=$this->_getLinkUI($block."[$n]",$v,$opts,'LETTERS');
  272. break;
  273. case 'table':
  274. $k = new Kernel;
  275. $txt=$k->baseSelector(array('fieldname'=>$name,'value'=>$v,'misc'=>$onchange,'emptyok'=>$opts['emptyok']));
  276. break;
  277. case 'module':
  278. if(!array_key_exists('emptyok',$opts)) $opts['emptyok']=true;
  279. if(is_object($v)) $v=$v->_moid;
  280. $txt=XModule::moduleSelector(array('fieldname'=>$name,'value'=>$v,'misc'=>$onchange,'emptyok'=>$opts['emptyok'],
  281. 'toid'=>@$opts['toid'],'table'=>@$opts['table']));
  282. break;
  283. case 'list':
  284. $txt =$this->_getListUI($block."[$n]",$v,$opts['labels'],$opts['values'],$onchange);
  285. break;
  286. case 'multiplelist':
  287. $txt =$this->_getMultipleListUI($block."[$n]",$v,$opts['labels'],$opts['values'],$onchange);
  288. break;
  289. case 'field':
  290. $t=$opts['table'];
  291. if(empty($t)) $t='table';
  292. $table=$this->get($o,$t);
  293. if(empty($table)) $table=$t;
  294. if(empty($table) || $table=='%') {
  295. $txt='';
  296. } else {
  297. $x=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$table);
  298. $txt=$x->fieldSelector(array('fieldname'=>$block."[$n]",
  299. 'compulsory'=>$opts['compulsory'],
  300. 'value'=>$v,'type'=>$opts['type']));
  301. }
  302. break;
  303. case 'dependency':
  304. $t=$opts['table'];
  305. if(empty($t)) {
  306. $t='table';
  307. }
  308. $table=$this->get($o,$t);
  309. if(empty($table)) {
  310. $txt='';
  311. break;
  312. }
  313. $x = XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$table);
  314. list($foo,$field)=explode(':',$this->id);
  315. if(!isset($x->desc[$field])){
  316. $txt='';
  317. break;
  318. }
  319. $txt=$x->fieldSelector(array('fieldname'=>$block."[$n][f]",'compulsory'=>false,'value'=>$v['f'],
  320. 'type'=>array('XBoolDef','XLinkDef','XStringSetDef'),
  321. 'filter'=>array('multivalued'=>false,'field'=>array('!=',$o->field))));
  322. $txt=str_replace('<select ','<select onchange="document.getElementById(\'ddep_'.$block.'_'.$n.'\').innerHTML=\'\';" ',$txt);
  323. if(strpos($txt,$x->desc[$v['f']]->field)===false) return $txt;
  324. if(!empty($v['f'])){
  325. $xd=clone($x->desc[$v['f']]);
  326. $xd->multivalued=false;
  327. $xf=clone($x->desc[$field]);
  328. $xf->compulsory=false;
  329. if($xd->ftype=='XBoolDef'){
  330. $xd->listbox=true;
  331. }
  332. $txt.='<div id="ddep_'.$block.'_'.$n.'">';
  333. $txt.='<table id="tdep_'.$block.'_'.$n.'"><tr><td></td><th>Valeur</th><th>Style</th><th>Nouvelle valeur</th></tr>';
  334. $txt.='<tr><td></td><td></td><td></td><td></td><td></td></tr>';
  335. foreach($v['dval'] as $i=>$foo){
  336. $uniq=uniqid();
  337. $ui=$this->_getDependencyUI($block."[$n][xxx][$uniq]",$table,$field,$v['f'],
  338. $v['op'][$i],$v['dval'][$i],$v['style'][$i],$v['val'][$i],$v['nochange'][$i]);
  339. $txt.='<tr>';
  340. $txt.='<td><a onclick="TZR.delLine(this); return false;">'.XLabels::getSyslabel('general','delete').'</a></td>';
  341. $txt.='<td>'.$ui[0].'</td>';
  342. $txt.='<td>'.$ui[1].'</td>';
  343. $txt.='<td>'.$ui[2].'</td>';
  344. }
  345. $txt.='</table>';
  346. $txt.='<a href="#" onclick="TZR.addTableLine(\'tdep_'.$block.'_'.$n.'\','.$n.'tds,1); return false;">Ajouter</a>';
  347. $ui=$this->_getDependencyUI($block."[$n][xxx][xidxid]",$table,$field,$v['f']);
  348. $txt.='<script type="text/javascript">';
  349. $txt.='var '.$n.'tds=new Array();';
  350. $txt.=$n.'tds[0]="'.escapeJavascript('<a onclick="TZR.delLine(this); return false;">'.XLabels::getSyslabel('general','delete').
  351. '</a>').'";';
  352. $txt.=$n.'tds[1]="'.escapeJavascript($ui[0]).'";';
  353. $txt.=$n.'tds[2]="'.escapeJavascript($ui[1]).'";';
  354. $txt.=$n.'tds[3]="'.escapeJavascript($ui[2]).'";';
  355. $txt.='</script>';
  356. $txt.='</div>';
  357. }
  358. break;
  359. }
  360. return $txt;
  361. }
  362. private function _getView($block, $n,$v) {
  363. $lang = XShell::getLangUser();
  364. $type = $this->_p[$n]['type'];
  365. $opts = $this->_p[$n]['options'];
  366. $txt=$v;
  367. switch($type) {
  368. case 'boolean':
  369. $txt = ($v?XLabels::getSysLabel('general','yes'):XLabels::getSysLabel('general','no'));
  370. break;
  371. case 'date':
  372. $txt = $v;
  373. break;
  374. case 'object':
  375. if(empty($opts['table'])) return '';
  376. $txt = $this->_getLinkView($block."[$n]",$v,$opts['table']);
  377. break;
  378. case 'template':
  379. $txt = $this->_getLinkView($block."[$n]",$v,'TEMPLATES');
  380. break;
  381. case 'letter':
  382. $txt = $this->_getLinkView($block."[$n]",$v,'LETTERS');
  383. break;
  384. case 'list':
  385. $txt = $v;
  386. break;
  387. case 'table':
  388. if(!empty($v)) {
  389. $x = XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$v);
  390. $txt=$x->getLabel();
  391. }
  392. break;
  393. case 'module':
  394. $txt='( '.XLabels::getSysLabel('general.empty').' )';
  395. if(!empty($v)) {
  396. $x = &XModule::objectFactory(array('moid'=>$v,'tplentry'=>TZR_RETURN_DATA));
  397. if(!empty($x)) $txt=$x->getLabel();
  398. }
  399. break;
  400. }
  401. return $txt;
  402. }
  403. public function serialize(&$o) {
  404. $a=$this->getValues($o);
  405. return serialize($a);
  406. }
  407. private function _getDependencyUI($name,$table,$f,$d,$op=NULL,$valued=NULL,$style=NULL,$value=NULL,$nochange=NULL){
  408. $x=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$table);
  409. $xd=clone($x->desc[$d]);
  410. $xf=clone($x->desc[$f]);
  411. $xf->compulsory=false;
  412. $xd->multivalued=$xf->multivalued=false;
  413. $xd->dependency=$xf->dependency=NULL;
  414. $txt=array();
  415. $opt=array('fieldname'=>str_replace('[xxx]','[dval]',$name),'simple'=>true);
  416. $o=&$xd->edit($valued,$opt);
  417. $txt[0]='<select name="'.str_replace('[xxx]','[op]',$name).'">'.
  418. '<option value="="'.($op=='='?' selected':'').'>=</option>'.
  419. '<option value="!="'.($op=='!='?' selected':'').'>!=</option>'.
  420. '</select> '.$o->html;
  421. $txt[1]=$this->_getDependencyStyleUI($name,$style);
  422. $valname=str_replace('[xxx]','[val]',$name);
  423. $opt=array('fieldname'=>$valname,'simple'=>true);
  424. $o=&$xf->edit($value,$opt);
  425. $txt[2]='<input type="hidden" name="'.str_replace('[xxx]','[nochange_HID]',$name).'" value="0">'.
  426. '<input type="checkbox" value="1" name="'.str_replace('[xxx]','[nochange]',$name).'" '.($nochange?'checked ':'').
  427. 'onclick="if(this.checked) document.getElementById(\''.$valname.'\').style.display=\'none\'; else '.
  428. 'document.getElementById(\''.$valname.'\').style.display=\'inline\';">no change';
  429. $txt[2].='<br><span id="'.$valname.'"'.($nochange?'style="display:none" ':'').
  430. '>'.$o->html.'</span>';
  431. unset($xd);
  432. unset($xf);
  433. return $txt;
  434. }
  435. private function _getDependencyStyleUI($name,$style){
  436. $txt='<select name="'.str_replace('[xxx]','[style]',$name).'">';
  437. $txt.='<option value="">----</option>';
  438. $txt.='<option value="hidden"'.($style=='hidden'?' selected':'').'>Cacher</option>';
  439. $txt.='<option value="invalid"'.($style=='invalid'?' selected':'').'>Invalider</option>';
  440. $txt.='</select>';
  441. return $txt;
  442. }
  443. private function _getDateUI($name, $value, $opts=NULL) {
  444. if(!empty($opts['free'])){
  445. $t='<input type="text" name="'.$name.'_free" value="'.$value.'">';
  446. }else{
  447. list($year,$month,$day)=explode('-',$value);
  448. $xdate=new XDateDef();
  449. $t=$xdate->getJSCode($value,$name,$name,uniqid(),2);
  450. }
  451. return $t;
  452. }
  453. private function _getLinkUI($name,$value,$options,$table) {
  454. $r['FIELD']=$name;
  455. $r['FTYPE']='XLinkDef';
  456. $r['DTAB']='';
  457. $r['COMPULSORY']=false;
  458. $r['MULTIVALUED']=false;
  459. $r['TARGET']=$table;
  460. $o=(object)$r;
  461. $n=XFieldDef::objectFactory($o);
  462. $cond='';
  463. if(!empty($options['cond'])) $cond='and '.$options['cond'];
  464. if(!empty($options['moid'])) $cond="(modid='".$options['moid']."') $cond";
  465. $n->filter=$cond;
  466. $n->checkbox=false;
  467. $n->multivalued=$options['multivalued'];
  468. if($n->multivalued) $value=implode('||',unserialize($value));
  469. if(is_array($value)) $value=implode('',$value);
  470. $opts1=array('intable'=>true);
  471. $e=$n->edit($value,$opts);
  472. $boid=XDataSource::getBoidFromSpecs('XDSTable',$table);
  473. $url=$GLOBALS['TZR_SESSION_MANAGER']::complete_self().'&moid='.XModule::getMoid(XMODDATASOURCE_TOID).'&function=XDSContentInput&tplentry=br&boid='.$boid.
  474. '&template=xmoddatasource/XDSContentInput.html&modid='.$options['moid'];
  475. $e->html.=' <a class="cv8-ajaxlink" href="'.$url.'">'.XLabels::getSysLabel('general','new').'</a>';
  476. return $e->html;
  477. }
  478. private function _getLinkView($name, $value,$table) {
  479. $r['FIELD']=$name;
  480. $r['FTYPE']='XLinkDef';
  481. $r['DTAB']='';
  482. $r['COMPULSORY']=false;
  483. $r['MULTIVALUED']=false;
  484. $r['TARGET']=$table;
  485. $o=(object)$r;
  486. $n = XFieldDef::objectFactory($o);
  487. $e = $n->display($value);
  488. return $e->html;
  489. }
  490. private function _getListUI($name, $value, $labels, $values,$onchange) {
  491. $t = "<select name=\"$name\" $onchange >";
  492. foreach($labels as $i => $l) {
  493. if($value==$values[$i])
  494. $t.="<option value=\"".$values[$i]."\" selected>".$labels[$i]."</option>";
  495. else
  496. $t.="<option value=\"".$values[$i]."\">".$labels[$i].'</option>';
  497. }
  498. return $t;
  499. }
  500. private function _getMultipleListUI($name, $value, $labels, $values, $onchange) {
  501. $t = "<select name=\"{$name}[]\" multiple $onchange >";
  502. foreach($labels as $i => $l) {
  503. if(in_array($values[$i],$value))
  504. $t.="<option value=\"".$values[$i]."\" selected>".$labels[$i]."</option>";
  505. else
  506. $t.="<option value=\"".$values[$i]."\">".$labels[$i].'</option>';
  507. }
  508. return $t;
  509. }
  510. /// Retourne le tableau des options avec leur valeur complète
  511. public function getAllValues(&$o,$ar=NULL,$block='options') {
  512. $options=array();
  513. foreach($this->_p as $n=>$v) {
  514. switch($v['type']){
  515. case 'ttext':
  516. $txts=XLabels::getAMsg($this->id.':'.$n);
  517. foreach($GLOBALS['TZR_LANGUAGES'] as $lang=>$iso) {
  518. if(!empty($txts[$lang])) $options[$block.'['.$n.']['.$lang.']']=str_replace("\r\n","\n",$txts[$lang]);
  519. }
  520. break;
  521. case 'module':
  522. $v=$this->get($o,$n);
  523. if(!empty($v)) $options[$block.'['.$n.']']=$v;
  524. break;
  525. case 'boolean':
  526. $v=$this->get($o,$n);
  527. if($v) $options[$block.'['.$n.']']=1;
  528. else $options[$block.'['.$n.']']=0;
  529. break;
  530. case 'table':
  531. $v=$this->get($o,$n);
  532. if($v && $v!='%') $options[$block.'['.$n.']']=$v;
  533. break;
  534. case 'dependency':
  535. $v=$this->get($o,$n);
  536. if($v['f']){
  537. $options[$block.'[dependency][f]']=$v['f'];
  538. foreach($v['dval'] as $i=>$dv){
  539. if ($ar['for_export']) // protéger l'operateur pour excel
  540. $options[$block.'[dependency][op]['.$i.']'] = '"' . $v['op'][$i] . '"';
  541. else
  542. $options[$block.'[dependency][op]['.$i.']']=$v['op'][$i];
  543. $options[$block.'[dependency][dval]['.$i.']']=$v['dval'][$i];
  544. $options[$block.'[dependency][style]['.$i.']']=$v['style'][$i];
  545. $options[$block.'[dependency][nochange]['.$i.']']=$v['nochange'][$i];
  546. $options[$block.'[dependency][val]['.$i.']']=$v['val'][$i];
  547. }
  548. }
  549. break;
  550. default:
  551. $v=$this->get($o,$n);
  552. if(!empty($v)) $options[$block.'['.$n.']']=$v;
  553. break;
  554. }
  555. }
  556. return $options;
  557. }
  558. /****m* XOptions/toXML
  559. * NAME
  560. * XOptions::toXML - serialisation vers XML
  561. * DESCRIPTION
  562. * Serialisation d'un ensemble d'options vers XML
  563. * INPUTS
  564. * $s - bloc contenant les valeurs des options
  565. * RETURN
  566. * chaine representant les options en XML
  567. ****/
  568. public function toXML(&$s) {
  569. $txt="<?xml version=\"1.0\" encoding=\"utf-8\" ?".">";
  570. $txt.='<properties>';
  571. foreach($this->_p as $n =>$v) {
  572. $typ=$v['type'];
  573. $txt.= "<field name=\"$n\" type=\"$typ\">";
  574. $val=$this->get($s, $n);
  575. if($typ=='module' && is_object($val)){
  576. $val=$val->_moid;
  577. }elseif(is_array($val)){
  578. if($v['type']=='dependency' && $val['f']){
  579. // Fait un post_edit sur les valeurs et tri les regles par opérateurs
  580. $x=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$this->get($s,'table'));
  581. $defined=$orgval=array();
  582. foreach($val['dval'] as $i=>$foo){
  583. $tmp=$x->desc[$val['f']]->post_edit($val['dval'][$i]);
  584. if(in_array($val['op'][$i].'-'.$tmp->raw,$defined)) continue;
  585. $tmp2=$s->post_edit($val['val'][$i]);
  586. $orgval[$val['op'][$i]]['op'][]=$val['op'][$i];
  587. $orgval[$val['op'][$i]]['val'][]=$tmp2->raw;
  588. $orgval[$val['op'][$i]]['dval'][]=$tmp->raw;
  589. $orgval[$val['op'][$i]]['style'][]=$val['style'][$i];
  590. $orgval[$val['op'][$i]]['nochange'][]=$val['nochange'][$i];
  591. $defined[]=$val['op'][$i].'-'.$tmp->raw;
  592. }
  593. $val['op']=array_merge((array)$orgval['=']['op'],(array)$orgval['!=']['op']);
  594. $val['val']=array_merge((array)$orgval['=']['val'],(array)$orgval['!=']['val']);
  595. $val['dval']=array_merge((array)$orgval['=']['dval'],(array)$orgval['!=']['dval']);
  596. $val['style']=array_merge((array)$orgval['=']['style'],(array)$orgval['!=']['style']);
  597. $val['nochange']=array_merge((array)$orgval['=']['nochange'],(array)$orgval['!=']['nochange']);
  598. $val=serialize($val);
  599. }else{
  600. foreach($val as &$v) convert_charset($v,TZR_INTERNAL_CHARSET,"UTF-8");
  601. $val=serialize($val);
  602. }
  603. }else{
  604. convert_charset($val, TZR_INTERNAL_CHARSET,"UTF-8");
  605. }
  606. if(isset($val)) $txt.='<value><![CDATA['.$val.']]></value>';
  607. else $txt.='<value />';
  608. $txt.='</field>';
  609. }
  610. $txt.='</properties>';
  611. return $txt;
  612. }
  613. /***** XOptions/rawToXML
  614. * NAME
  615. * XOptions::rawToXML - transformation d'un tableau en bloc XML
  616. * DESCRIPTION
  617. * création d'un bloc xml depuis un tableau
  618. * INPUTS
  619. * $ar - le tableau
  620. * $ch - encodage des valeurs du tableau
  621. * RETURN
  622. * chaine bloc XML
  623. ****/
  624. static public function rawToXML($ar,$ch = TZR_INTERNAL_CHARSET){
  625. $txt="<?xml version=\"1.0\" encoding=\"utf-8\" ?".">";
  626. $txt.='<properties>';
  627. if(is_array($ar)) {
  628. foreach($ar as $n =>$v) {
  629. $txt.= "<field name=\"$n\" type=\"\">";
  630. $val=$v;
  631. if($ch != "UTF-8"){
  632. if(is_array($val)){
  633. foreach($val as &$v) convert_charset($v,$ch,"UTF-8");
  634. $val=serialize($val);
  635. }else{
  636. convert_charset($val, $ch,"UTF-8");
  637. }
  638. }
  639. if(isset($val))
  640. $txt.='<value><![CDATA['.$val.']]></value>';
  641. else
  642. $txt.='<value />';
  643. $txt.='</field>';
  644. }
  645. }
  646. $txt.='</properties>';
  647. return $txt;
  648. }
  649. /**
  650. * Liste d'options construite par XML
  651. * @param $values object Objet qui récupère les valeurs par défaut des options
  652. * @param $xml string chaine XML contenant les options
  653. */
  654. function setOptsFromXML(&$values, &$xml) {
  655. $oxml = simplexml_load_string($xml);
  656. if (empty($oxml->field)) return;
  657. foreach ($oxml->field as $field) {
  658. $name = (string) $field['name'];
  659. $type = (string) $field['type'];
  660. $label = (string) $field->label;
  661. $default = (string) $field->default;
  662. $comment = (string) $field->comment;
  663. $options = (array) $field->options;
  664. $group = (string) $field->group;
  665. $level = (string) $field->level;
  666. $this->setOpt($label, $name, $type, $options, $default, empty($group) ? 'Specific' : $group, empty($level) ? 'none' : $level);
  667. if (!empty($comment)) $this->setComment($comment, $name);
  668. if (!empty($default)) $this->set($values, $name, $default);
  669. }
  670. }
  671. /****m* XOptions/fromXML
  672. * NAME
  673. * XOptions::fromXML - recupération des donnees depuis un bloc xml
  674. * DESCRIPTION
  675. * Recuperation des données des options depuis un bloc xml
  676. * INPUTS
  677. * $s - objet de stockage des données
  678. * $xml - chaine contenant la representation xml
  679. * OUTPUTS
  680. * $s - les valeurs sont mises à jour
  681. ****/
  682. public function fromXML(&$s, &$xml) {
  683. $r=self::rawFromXML($xml);
  684. $this->setValues($s,$r);
  685. }
  686. /****m* XOptions/rawFromXML
  687. * NAME
  688. * XOptions::rawFromXML - recupération des donnees depuis un bloc xml
  689. * DESCRIPTION
  690. * Recuperation des données des options depuis un bloc xml
  691. * INPUTS
  692. * $xml - chaine contenant la representation xml
  693. * OUTPUTS
  694. * return - les valeurs sont mises à jour
  695. ****/
  696. static public function rawFromXML(&$xml) {
  697. $oxml=simplexml_load_string($xml);
  698. $r=array();
  699. if(empty($oxml->field)) return $r;
  700. foreach($oxml->field as $o) {
  701. $name=(string)$o['name'];
  702. $type=(string)$o['type'];
  703. $value=(string)$o->value;
  704. if($type=='multiplelist' || $type=='dependency') $value=unserialize($value);
  705. if(TZR_INTERNAL_CHARSET != "UTF-8"){
  706. if(is_array($value)){
  707. foreach($value as &$v) convert_charset($v,"UTF-8",TZR_INTERNAL_CHARSET);
  708. }else{
  709. convert_charset($value,"UTF-8",TZR_INTERNAL_CHARSET);
  710. }
  711. }
  712. $r[$name]=$value;
  713. }
  714. return $r;
  715. }
  716. }
  717. ?>