PageRenderTime 62ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/class.xmodform.inc

https://github.com/jcplat/console-seolan
PHP | 574 lines | 499 code | 31 blank | 44 comment | 71 complexity | 4cafd51639313fa22fb20a18b0471b22 MD5 | raw file
Possible License(s): LGPL-2.0, LGPL-2.1, GPL-3.0, Apache-2.0, BSD-3-Clause
  1. <?php
  2. class XModForm extends XModTable{
  3. function __construct($ar=NULL){
  4. parent::__construct($ar);
  5. }
  6. /// securite des fonctions accessibles par le web
  7. function secGroups($function, $group=NULL) {
  8. $g=array();
  9. $g['viewForm']=array('ro','rw','rwv','admin');
  10. $g['editForm']=array('rw','rwv','admin');
  11. $g['procEditForm']=array('rw','rwv','admin');
  12. $g['answer']=array('ro','rw','rwv','admin');
  13. $g['procAnswer']=array('ro','rw','rwv','admin');
  14. $g['delAnswers']=array('rw','rwv','admin');
  15. $g['dashboard']=array('rw','rwv','admin');
  16. $g['exportAnswers']=array('rw','rwv','admin');
  17. $g['sendInvitations']=array('rw','rwv','admin');
  18. $g['procSendInvitations']=array('rw','rwv','admin');
  19. $g['createMod']=array('rw','rwv','admin');
  20. if(isset($g[$function])) {
  21. if(!empty($group)) return in_array($group, $g[$function]);
  22. return $g[$function];
  23. }
  24. return parent::secGroups($function,$group);
  25. }
  26. public function initOptions() {
  27. parent::initOptions();
  28. $this->_options->setOpt(XLabels::getSysLabel('xmodform','answerstable'),'atable','table',array('validate'=>true),NULL);
  29. }
  30. /// Cette fonction est appliquee pour afficher l'ensemble des methodes de ce module
  31. protected function _actionlist(&$my) {
  32. parent::_actionlist($my);
  33. $oid=@$_REQUEST['oid'];
  34. if(XShell::_function()=='sendInvitations') {
  35. $br=&$this->xset->rDisplayText($oid, array());
  36. $o1=new XModuleAction($this,'browse',$br['link'],
  37. '&moid='.$moid.'&_function=display&template=xmodtable/view.html&tplentry=br&oid='.$oid,'display');
  38. $my['stack'][]=$o1;
  39. }
  40. }
  41. function al_display(&$my){
  42. parent::al_display($my);
  43. $u=XShell::uniqid();
  44. $oid=$_REQUEST['oid'];
  45. $o1=new XModuleAction($this,'sendinvit',XLabels::getSysLabel('xmodform','sendinvitations','text'),
  46. '&moid='.$this->_moid.'&function=sendInvitations&tplentry=br&template=xmodform/sendInvitations.html&oid='.$oid,'edit');
  47. $o1->menuable=true;
  48. $my['sendinvit']=$o1;
  49. $o1=new XModuleAction($this,'createmod',XLabels::getSysLabel('xmodform','createmod','text'),
  50. '&moid='.$this->_moid.'&function=createMod&template=basic/message.html&oid='.$oid,'more');
  51. $o1->menuable=true;
  52. $my['createmod']=$o1;
  53. }
  54. /// Creation d'un module ensemble de fiche sur les reponses d'un formulaire
  55. function createMod($ar=NULL){
  56. $p=new XParam($oid,NULL);
  57. $oid=$p->get('oid');
  58. $ors=selectQueryGetAll('select * from '.$this->table.' where KOID="'.$oid.'" LIMIT 1');
  59. if($ors['KOID']){
  60. $mod=new XModTableWd(array('newmoid'=>XMODTABLE_TOID));
  61. $mod->_module->modulename=$ors['title'];
  62. $mod->_module->group=$this->group;
  63. $mod->_module->table=$ors['qtable'];
  64. $moid=$mod->iend();
  65. $GLOBALS['XUSER']->setUserAccess('',$moid,'all','','admin');
  66. XShell::toScreen2('','message',XLabels::getSysLabel('xmodform','createmodok','text'));
  67. }
  68. }
  69. /// Affichage d'une fiche
  70. function &display($ar=NULL){
  71. $p=new XParam($ar,NULL);
  72. $tplentry=$p->get('tplentry');
  73. $ar['tplentry']=TZR_RETURN_DATA;
  74. $ret=parent::display($ar);
  75. $ret['__ajaxtabs'][]=array('title'=>XLabels::getSysLabel('xmodform','viewform','text'),
  76. 'url'=>$GLOBALS['TZR_SESSION_MANAGER']::complete_self().'&moid='.$this->_moid.'&oid='.$ret['oid'].
  77. '&tplentry=br&function=viewForm&template=xmodform/viewForm.html&_ajax=1&_raw=1&tabsmode=1&skip=1&_uniqid='.XShell::uniqid());
  78. $ret['__ajaxtabs'][]=array('title'=>XLabels::getSysLabel('xmodform','dashboard','text'),
  79. 'url'=>$GLOBALS['TZR_SESSION_MANAGER']::complete_self().'&moid='.$this->_moid.'&oid='.$ret['oid'].'&tplentry=br'.
  80. '&function=dashboard&template=xmodform/dashboard.html&_ajax=1&_raw=1&tabsmode=1&skip=1&_uniqid='.XShell::uniqid());
  81. return XShell::toScreen1($tplentry,$ret);
  82. }
  83. /// Edition d'une fiche
  84. function &edit($ar=NULL){
  85. $p=new XParam($ar,NULL);
  86. $tplentry=$p->get('tplentry');
  87. $ar['tplentry']=TZR_RETURN_DATA;
  88. $ret=parent::edit($ar);
  89. $ret['__ajaxtabs'][]=array('title'=>XLabels::getSysLabel('xmodform','editform','text'),
  90. 'url'=>$GLOBALS['TZR_SESSION_MANAGER']::complete_self().'&moid='.$this->_moid.'&oid='.$ret['oid'].'&skip=1&'.
  91. '&tplentry=br&function=editForm&template=xmodform/editForm.html&_ajax=1&_raw=1&tabsmode=1&_uniqid='.XShell::uniqid());
  92. return XShell::toScreen1($tplentry,$ret);
  93. }
  94. /// Créé un nouveau questionnaire
  95. function procInsert($ar=NULL) {
  96. $p=new XParam($ar,NULL);
  97. $t=$p->get('qtable');
  98. $title=$p->get('title');
  99. // Création de la table des questions/réponses
  100. if(empty($t)){
  101. $ar1=array();
  102. $ar1['translatable']=0;
  103. $ar1['auto_translate']=0;
  104. $ar['qtable']=$ar1['btab']=XDSTable::newTableNumber('FORM');
  105. $ar1['bname'][TZR_DEFAULT_LANG]=$this->modulename.' : '.$title;
  106. $ar1['publish']=0;
  107. XDSTable::procNewSource($ar1);
  108. $x=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$ar['qtable']);
  109. $x->createField('email','Email','XShortTextDef','255','2','0','1','0','0','0','0');
  110. $reedit=$p->get('reedit');
  111. $hid=$p->get('reedit_HID');
  112. if($reedit==1 || $hid['val']){
  113. $x->createField('close','Clos','XBoolDef','0','3', '0','1','0','0','0','0');
  114. }
  115. }
  116. $isopen=$p->get('isopen');
  117. $hid=$p->get('isopen_HID');
  118. if(!$hid && $isopen==1 || $hid['val']){
  119. $oid=$ar['newoid']=$this->xset->getNewOID($ar);
  120. $ar['accesurl']=$GLOBALS['TZR_SESSION_MANAGER']::complete_self(false,true).'&moid='.$this->_moid.'&oid='.$oid.
  121. '&function=answer&template=generic8-raw.html&insidefile=xmodform/viewForm.html&tplentry=br';
  122. }else{
  123. $ar['accesurl']='Accès restreint. Aucune URL publique.';
  124. }
  125. return parent::procInsert($ar);
  126. }
  127. /// Dupplique la table des questions avant de duppliquer le formulaire
  128. function procEditDup($ar=NULL) {
  129. $p = new XParam($ar,NULL);
  130. $qtable = $p->get('qtable');
  131. $title = $p->get('title');
  132. $xset_qtable = XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$qtable);
  133. $result = $xset_qtable->procDuplicateDataSource(array(
  134. 'newtable' => XDSTable::newTableNumber('FORM'),
  135. 'mtxt' => $this->modulename.' : '.$title.' (clone)'
  136. ));
  137. $ar['qtable'] = $result['table'];
  138. // Duplication des réponses dans la table associée
  139. if ($this->atable) {
  140. // Récupération des choix groupés par KOID (pour dupliquer le multilingue)
  141. $choices = selectQuery("SELECT KOID,{$this->atable}.* FROM {$this->atable} WHERE dtable='$qtable'")->fetchAll(PDO::FETCH_GROUP);
  142. foreach ($choices as $koid => $choices_by_languages) {
  143. $koid = XDataSource::getNewBasicOID($this->atable);
  144. foreach ($choices_by_languages as $choice) {
  145. $choice['KOID'] = $koid;
  146. $choice['dtable'] = $result['table'];
  147. updateQuery(getInsertQuery($this->atable, $choice));
  148. }
  149. }
  150. }
  151. return parent::procEditDup($ar);
  152. }
  153. /// Supprime la table des questions ainsi que les choix de réponses liées au formulaire
  154. function del($ar=NULL) {
  155. $p = new XParam($ar,NULL);
  156. $oid = $p->get('oid');
  157. // Table des questions
  158. $qtable = selectQuery("SELECT qtable FROM {$this->table} WHERE KOID='$oid'")->fetch(PDO::FETCH_COLUMN);
  159. if ($qtable) {
  160. // Suppression des choix de réponses
  161. if ($this->atable) updateQuery("DELETE FROM {$this->atable} WHERE dtable='$qtable'");
  162. // Suppression de la table des questions
  163. XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$qtable)->procDeleteDataSource();
  164. }
  165. return parent::del($ar);
  166. }
  167. /// Edition un nouveau questionnaire
  168. function procEdit($ar=NULL){
  169. $p=new XParam($ar,NULL);
  170. $oid=$p->get('oid');
  171. if(is_array($oid)) return parent::procEdit($ar);
  172. $isopen=$p->get('isopen');
  173. $hid=$p->get('isopen_HID');
  174. if(!$hid && $isopen==1 || $hid['val']){
  175. $ar['accesurl']=$GLOBALS['TZR_SESSION_MANAGER']::complete_self(false,true).'&moid='.$this->_moid.'&oid='.$oid.
  176. '&function=answer&template=generic8-raw.html&insidefile=xmodform/viewForm.html&tplentry=br';
  177. }elseif($hid){
  178. $ar['accesurl']='Accès restreint. Aucune URL publique.';
  179. }
  180. $ret=parent::procEdit($ar);
  181. $d=$this->display(array('oid'=>$oid,'tplentry'=>TZR_RETURN_DATA,'selectedfields'=>array('qtable','reedit')));
  182. $x=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$d['oqtable']->raw);
  183. if($d['oreedit']==1 && !$x->desc['close']) $x->createField('close','Clos','XBoolDef','0','2','0','1','0','0','0','0');
  184. return $ret;
  185. }
  186. /// Voir le formulaire
  187. function viewForm($ar=NULL){
  188. $p=new XParam($ar,NULL);
  189. $tplentry=$p->get('tplentry');
  190. $ar['tplentry']=TZR_RETURN_DATA;
  191. $ret=$this->display($ar);
  192. $xds=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$ret['oqtable']->raw);
  193. $this->setSysFields($xds);
  194. $ret['__table']=$xds->input();
  195. return XShell::toScreen1($tplentry,$ret);
  196. }
  197. /// Repondre au formulaire
  198. function answer($ar=NULL){
  199. $p=new XParam($ar,array('email'=>'nobody'));
  200. $oid=$p->get('oid');
  201. $tplentry=$p->get('tplentry');
  202. $email=$p->get('email');
  203. $ar['tplentry']=TZR_RETURN_DATA;
  204. $ret=$this->display($ar);
  205. $date=date('Y-m-d');
  206. if($date<$ret['odtstart']->raw && $date>$ret['odtend']->raw){
  207. $ret['__error']=XLabels::getSysLabel('xmodform','wrongdate');
  208. }else{
  209. $table=$ret['oqtable']->raw;
  210. $xds=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$table);
  211. $this->setSysFields($xds);
  212. // Recupere une eventuelle reponse deja enregistrée (si formulaire reeditable, on veux la fiche en cours en priorité)
  213. if($ret['oreedit']->raw==1) $order=' order by FIELD(close,1)';
  214. else $order='';
  215. $ors=array();
  216. if(!XUser::isNobody()) $ors=selectQueryGetOne('select * from '.$table.' where OWN="'.XUser::get_current_user_uid().'"'.$order.' limit 1');
  217. elseif($email!='nobody') $ors=selectQueryGetOne('select * from '.$table.' where email="'.addslashes($email).'"'.$order.' limit 1');
  218. if(empty($ors)){
  219. // Pas de reponse enregistré => insertion
  220. $ret['__table']=$xds->input($ar);
  221. }elseif($ret['oamulti']->raw!=1 && !($ret['oreedit']->raw==1 && $ors['close']!=1)){
  222. // Fiche deja existante et plus modifiable => erreur
  223. $ret['__error']=XLabels::getSysLabel('xmodform','answeralreadyexists');
  224. }elseif($ret['oreedit']->raw==1 && $ors['close']!=1){
  225. // Fiche editable presente => edition de la fiche
  226. $ar['oid']=$ors['KOID'];
  227. $ret['__table']=$xds->edit($ar);
  228. }else{
  229. // Tous les autres cas => insertion d'une nouvelle fiche
  230. $ret['__table']=$xds->input($ar);
  231. }
  232. }
  233. if($ret['oisopen']->raw==1) $ret['__captcha']=$this->createCaptcha(array('tplentry'=>TZR_RETURN_DATA),true);
  234. return XShell::toScreen1($tplentry,$ret);
  235. }
  236. /// Enregistre une reponse
  237. function procAnswer($ar=NULL){
  238. $p=new XParam($ar,NULL);
  239. $oid=$p->get('oid');
  240. $aoid=$p->get('aoid');
  241. $close=$p->get('close');
  242. $f=$this->display(array('oid'=>$oid,'tplentry'=>TZR_RETURN_DATA));
  243. if($f['oisopen']->raw==1){
  244. $captcha_key=md5($p->get('captcha_key'));
  245. $captcha_id=$p->get('captcha_id');
  246. $cnt=countSelectQuery('SELECT COUNT(*) FROM _VARS WHERE name = "CAPTCHA_'.$captcha_id.'" AND value = "'.$captcha_key.'" ');
  247. updateQuery('DELETE FROM _VARS WHERE name="CAPTCHA_'.$captcha_id.'" or (UPD<"'.date('YmdHis',strtotime('- 20 minutes')).'" AND '.
  248. 'name LIKE "CAPTCHA_%")');
  249. if(!$cnt) {
  250. $onerror=$p->get('onerror');
  251. if(!empty($onerror)){
  252. if(!preg_match('@(^http://|^/)@',$onerror)) $onerror=$GLOBALS['TZR_SESSION_MANAGER']::complete_self().$onerror;
  253. }else{
  254. $onerror=$_SERVER['HTTP_REFERER'];
  255. }
  256. header('Location: '.$onerror);
  257. die();
  258. }
  259. }
  260. $table=$f['oqtable']->raw;
  261. $xds=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$table);
  262. if($aoid){
  263. $ar['oid']=$aoid;
  264. $ret=$xds->procEdit($ar);
  265. }else{
  266. $ret=$xds->procInput($ar);
  267. }
  268. if(!$xds->desc['close'] || $close==1) setSessionVar('message',XLabels::getSysLabel('xmodform','answerokclose'));
  269. else setSessionVar('message',XLabels::getSysLabel('xmodform','answerok'));
  270. return $ret;
  271. }
  272. /// Prepare l'edition du questionnaire
  273. function editForm($ar=NULL){
  274. $p=new XParam($ar,NULL);
  275. $tplentry=$p->get('tplentry');
  276. $ar['tplentry']=TZR_RETURN_DATA;
  277. $ret=$this->display($ar);
  278. $xds=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$ret['oqtable']->raw);
  279. $this->setSysFields($xds);
  280. $axds=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$this->atable);
  281. $ret['__table']=array();
  282. $max=0;
  283. foreach($xds->desc as $n=>$f){
  284. if($f->sys) continue;
  285. $table=array('field'=>$n,'q'=>$f->get_labels(),'compulsory'=>$f->get_compulsory(),'comment'=>$f->get_option('comment'),
  286. 'type'=>$this->getQuestionType($f),
  287. 'fgroup'=>$f->get_option('fgroup'), 'ftype'=>$f->ftype);
  288. if($f->ftype=='XLinkDef'){
  289. foreach($GLOBALS['TZR_LANGUAGES'] as $lang=>$foo) {
  290. $table['answers'][$lang]=$axds->browse(array('selectedfields'=>array('title','score'),'_filter'=>'dtable="'.$ret['oqtable']->raw.'" and '.
  291. 'dfield="'.$n.'"','tplentry'=>TZR_RETURN_DATA,'order'=>'ord','LANG_DATA'=>$lang));
  292. }
  293. }
  294. $ret['__table'][]=$table;
  295. $max=max($max,substr($n,1));
  296. }
  297. $ret['__lastnum']=$max+1;
  298. return XShell::toScreen1($tplentry,$ret);
  299. }
  300. /// Efface toutes les réponses
  301. function delAnswers($ar=NULL){
  302. $p=new XParam($ar,NULL);
  303. $oid=$p->get('oid');
  304. $ors=selectQueryGetOne('select qtable from '.$this->table.' where KOID="'.$oid.'" LIMIT 1');
  305. if($ors['qtable']) updateQuery('truncate table '.$ors['qtable']);
  306. }
  307. /// Enregistre l'edition d'un formulaire
  308. function procEditForm($ar=NULL){
  309. $p=new XParam($ar,NULL);
  310. $qs=$p->get('question');
  311. $cs=$p->get('comment');
  312. $qts=$p->get('qtype');
  313. $comps=$p->get('compulsory');
  314. $answers=$p->get('answers');
  315. $fgroup=$p->get('fgroup');
  316. $scores=$p->get('scores');
  317. $ar['tplentry']=TZR_RETURN_DATA;
  318. $ret=$this->display($ar);
  319. $table=$ret['oqtable']->raw;
  320. $xds=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$table);
  321. $this->setSysFields($xds);
  322. $fields=array('email','close');
  323. $i=2;
  324. foreach($qs as $n=>$q){
  325. if(empty($q)) continue;
  326. // Récupération des parametres des champs
  327. $editopt=array();
  328. $qt=$qts[$n];
  329. $c=$cs[$n];
  330. $group=$fgroup[$n];
  331. $comp=$comps[$n];
  332. $ans=$answers[$n];
  333. $sc=$scores[$n];
  334. if(!$comp) $comp=false;
  335. switch($qt){
  336. case 'shorttext':
  337. $type='XShortTextDef';
  338. $size=255;
  339. $multi=false;
  340. $setans=false;
  341. $editopt=array('listbox'=>false);
  342. break;
  343. case 'longtext':
  344. $type='XTextDef';
  345. $size=60;
  346. $multi=false;
  347. $setans=false;
  348. break;
  349. case 'select':
  350. $type='XLinkDef';
  351. $size=0;
  352. $editopt=array('checkbox'=>0,'filter'=>'dtable="'.$table.'" and dfield="'.$n.'"',
  353. 'query'=>"SELECT KOID FROM ".$this->atable." WHERE dtable='$table' AND dfield='$n' ORDER BY ord");
  354. $multi=false;
  355. $setans=true;
  356. break;
  357. case 'checkbox':
  358. $type='XLinkDef';
  359. $size=0;
  360. $editopt=array('checkbox'=>1,'checkbox_cols'=>1,'filter'=>'dtable="'.$table.'" and dfield="'.$n.'"',
  361. 'query'=>"SELECT KOID FROM ".$this->atable." WHERE dtable='$table' AND dfield='$n' ORDER BY ord");
  362. $multi='on';
  363. $setans=true;
  364. break;
  365. case 'radio':
  366. $type='XLinkDef';
  367. $size=0;
  368. $editopt=array('checkbox'=>1,'checkbox_cols'=>1,'usedefault'=>false,'filter'=>'dtable="'.$table.'" and dfield="'.$n.'"',
  369. 'query'=>"SELECT KOID FROM ".$this->atable." WHERE dtable='$table' AND dfield='$n' ORDER BY ord");
  370. $multi=false;
  371. $setans=true;
  372. break;
  373. case 'date':
  374. $type='XDateDef';
  375. $size=0;
  376. $editopt=array();
  377. $multi=false;
  378. $setans=true;
  379. break;
  380. case 'file':
  381. $type='XFileDef';
  382. $size=0;
  383. $editopt=array();
  384. $multi=false;
  385. $setans=true;
  386. break;
  387. }
  388. if($c) $editopt['comment']=$c;
  389. if($group) $editopt['fgroup']=$group;
  390. // Création du champ s'il n'existe pas encore
  391. if(!isset($xds->desc[$n])) $xds->createField($n,$q,$type,$size,$i+5,$comp,'1','1','0',$multi,'0',$this->atable);
  392. // Mise à jour du champ avec toutes les options
  393. $xds->procEditField(array('field'=>$n,'table'=>$xds->getTable(),'_todo'=>'save','options'=>$editopt,'_options'=>array('local'=>1),
  394. 'ftype'=>$type,'compulsory'=>$comp,'multivalued'=>$multi,'fcount'=>$size,'forder'=>$i+5,'target'=>$this->atable,
  395. 'label'=>$q));
  396. // Mise à jour des reponses possible pour les questions à choix multiple
  397. if($setans){
  398. $axds=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$this->atable);
  399. $soids=array();
  400. foreach($ans as $j=>$a){
  401. if(empty($a)) continue;
  402. if(substr($j,0,3)!='foo'){
  403. $axds->procEdit(array('oid'=>$j,'title'=>$a[TZR_DEFAULT_LANG],'score'=>$sc[$j],'ord'=>count($soids),'LANG_DATA'=>TZR_DEFAULT_LANG,
  404. '_options'=>array('local'=>true)));
  405. $soids[]=$oid=$j;
  406. }else{
  407. $ret=$axds->procInput(array('dtable'=>$table,'dfield'=>$n,'title'=>$a[TZR_DEFAULT_LANG],'score'=>$sc[$j],
  408. 'LANG_DATA'=>TZR_DEFAULT_LANG,
  409. 'ord'=>count($soids),'_options'=>array('local'=>true)));
  410. $soids[]=$oid=$ret['oid'];
  411. }
  412. foreach($a as $lang=>$title) {
  413. $axds->procEdit(array('oid'=>$oid,'title'=>$a[$lang],'LANG_DATA'=>$lang,'_options'=>array('local'=>true)));
  414. }
  415. }
  416. updateQuery('DELETE FROM '.$this->atable.' where dtable="'.$table.'" AND dfield="'.$n.'" AND KOID NOT IN("'.implode('","',$soids).'")');
  417. }else{
  418. updateQuery('DELETE FROM '.$this->atable.' where dtable="'.$table.'" AND dfield="'.$n.'"');
  419. }
  420. $i++;
  421. $fields[]=$n;
  422. }
  423. // Suppression des champs qui ne sont plus present dans le questionnaire
  424. foreach($xds->desc as $n=>$f){
  425. if(!$f->sys && !in_array($n,$fields)) $xds->delField(array('field'=>$n,'action'=>'OK'));
  426. }
  427. }
  428. /// Parcourir les reponses
  429. function dashboard($ar=NULL){
  430. $p=new XParam($ar,NULL);
  431. $oid=$p->get('oid');
  432. $tplentry=$p->get('tplentry');
  433. $ar['tplentry']=TZR_RETURN_DATA;
  434. $ret=$this->display($ar);
  435. $table=$ret['oqtable']->raw;
  436. $ret['__total']=countSelectQuery('select count(*) from '.$table);
  437. if($ret['oreedit']->raw==1){
  438. $ret['__ototal']=countSelectQuery('select count(*) from '.$table.' where close!=1 or close is null');
  439. $ret['__ctotal']=countSelectQuery('select count(*) from '.$table.' where close=1');
  440. }
  441. return XShell::toScreen1($tplentry,$ret);
  442. }
  443. /// Exporte les reponses d'un questionnaire
  444. function exportAnswers($ar=NULL){
  445. $p=new XParam($ar,NULL);
  446. $oid=$p->get('oid');
  447. $ors=selectQueryGetOne('select title,qtable from '.$this->table. ' where KOID="'.$oid.'" limit 1');
  448. $xds=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$ors['qtable']);
  449. $xds->browse(array('tplentry'=>'br','pagesize'=>999999,'order'=>'UPD','selectedfields'=>'all'));
  450. $this->_exportXLS($ar2=array('fname'=>rewriteToAscii($ors['title']),'fmt'=>'xl07'));
  451. }
  452. /// Prepare l'envoie des invitations
  453. function sendInvitations($ar=NULL){
  454. return $this->display($ar);
  455. }
  456. /// Envoi des invitations
  457. function procSendInvitations($ar=NULL){
  458. $p=new XParam($ar,NULL);
  459. $oid=$p->get('oid');
  460. $ar['tplentry']=TZR_RETURN_DATA;
  461. $d=$this->display($ar);
  462. $sender=$p->get('sender');
  463. $sub=$p->get('subject');
  464. $mess=$p->get('content');
  465. $mess='<html><body>'.$mess.'</body></html>';
  466. $url=$GLOBALS['TZR_SESSION_MANAGER']::complete_self().'&moid='.$this->_moid.'&oid='.$oid.'&function=answer&template=generic8-raw.html&'.
  467. 'insidefile=xmodform/viewForm.html&tplentry=br';
  468. // Envoi aux personnes externes
  469. $emails=preg_split("/[;\n, ]/",$d['odestm']->raw);
  470. foreach($emails as $email){
  471. $email=trim($email);
  472. if(!preg_match('/^[^@]+@[^.]+.*$/',$email)) continue;
  473. $tmess=str_replace('<url>','<a href="'.$url.'&email='.$email.'&key='.md5($oid.'-'.$email).'">',$mess);
  474. $tmess=str_replace('</url>','</a>',$tmess);
  475. $this->sendMail2User($sub,$tmess,$email,$sender);
  476. }
  477. // Envoi aux personnes internes
  478. foreach($d['odest']->oidcollection as $uoid){
  479. $ors=selectQueryGetOne('select email from USERS where KOID="'.$uoid.'" LIMIT 1');
  480. $email=$ors['email'];
  481. $email=trim($email);
  482. if(!preg_match('/^[^@]+@[^.]+.*$/',$email)) continue;
  483. $tmess=str_replace('<url>','<a href="'.$url.'">',$mess);
  484. $tmess=str_replace('</url>','</a>',$tmess);
  485. $this->sendMail2User($sub,$tmess,$email,$sender);
  486. }
  487. // Notifie que l'envoi a été effetué
  488. updateQuery('update '.$this->table.' set UPD=UPD,invitok=1 where KOID="'.$oid.'"');
  489. setSessionVar('message',XLabels::getSysLabel('xmodmaillist','sent'));
  490. }
  491. /// Retourne le type de champ simplifié du champ d'une source
  492. function getQuestionType(&$f){
  493. if($f->ftype=='XShortTextDef') return 'shorttext';
  494. if($f->ftype=='XDateDef') return 'date';
  495. if($f->ftype=='XFileDef') return 'file';
  496. if($f->ftype=='XTextDef') return 'longtext';
  497. if($f->ftype=='XLinkDef'){
  498. if($f->multivalued) return 'checkbox';
  499. if($f->checkbox) return 'radio';
  500. return 'select';
  501. }
  502. }
  503. /// Passe certains champs du questionnaire en champ systeme
  504. function setSysFields(&$x){
  505. if(!empty($x->desc['email'])) $x->desc['email']->sys=true;
  506. if(!empty($x->desc['close'])) $x->desc['close']->sys=true;
  507. }
  508. /// Verification des droits sur un objet
  509. function secure($oid,$function,$user=NULL,$lang=TZR_DEFAULT_LANG){
  510. // Pour repondre à un formulaire, on vérifie avant que la personne est dans la liste des destinataires
  511. if($function=='answer' || $function=='procAnswer'){
  512. $nb=countSelectQuery('select count(*) from '.$this->table.' where KOID="'.$oid.'" and LANG="'.$lang.'" and isopen=1');
  513. if($nb) return true;
  514. if($user && $user->_curoid!=TZR_USERID_NOBODY){
  515. $nb=countSelectQuery('select count(*) from '.$this->table.' where KOID="'.$oid.'" and LANG="'.$lang.'" and dest like "%'.$user->_curoid.'%"');
  516. }elseif(!$user && !XUser::isNobody()){
  517. $nb=countSelectQuery('select count(*) from '.$this->table.' where '.
  518. 'KOID="'.$oid.'" and LANG="'.$lang.'" and dest like "%'.XUser::get_current_user_uid().'%"');
  519. }else{
  520. // Pour les personnes externes, on verifie la clé d'acces
  521. if($_REQUEST['key']!=md5($oid.'-'.$_REQUEST['email'])) return false;
  522. $nb=countSelectQuery('select count(*) from '.$this->table.' where '.
  523. 'KOID="'.$oid.'" and LANG="'.$lang.'" and destm like "%'.addslashes($_REQUEST['email']).'%"');
  524. }
  525. if(!$nb) return false;
  526. else return true;
  527. }
  528. return parent::secure($oid,$function,$user,$lang);
  529. }
  530. /// Rend la liste des fonctions utilisables dans le gestionnaire de rubriques en mode fonction (tableau de paires fonction=>label)
  531. function getUIFunctionList() {
  532. return array('answer'=>XLabels::getSysLabel('xmodform','uianswer','text'));
  533. }
  534. function UIParam_answer(){
  535. $ret['__oid']=XFieldDef::objectFactory((object)array('FIELD'=>'__oid','FTYPE'=>'XLinkDef','COMPULSORY'=>1,'TARGET'=>$this->table,
  536. 'LABEL'=>XLabels::getSysLabel('xmodform','form','text')));
  537. $ret['__nextalias']=XFieldDef::objectFactory((object)array('FIELD'=>'__nextalias','FTYPE'=>'XShortTextDef','COMPULSORY'=>1,
  538. 'LABEL'=>XLabels::getSysLabel('xmodtable','uiinsert_okalias','text')));
  539. $ret['__nextalias']->listbox=false;
  540. return $ret;
  541. }
  542. }
  543. ?>