PageRenderTime 62ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 2ms

/class.xmodtable.inc

https://github.com/jcplat/console-seolan
PHP | 4658 lines | 4000 code | 247 blank | 411 comment | 778 complexity | 55424be8b9a6697202b4b2a0f9d9c4c8 MD5 | raw file
Possible License(s): LGPL-2.0, LGPL-2.1, GPL-3.0, Apache-2.0, BSD-3-Clause

Large files files are truncated, but you can click here to view the full file

  1. <?php
  2. /****c* tzr-5/XModTable
  3. * NAME
  4. * XModTable -- gestion d'un ensemble de fiches
  5. * DESCRIPTION
  6. * Affichage edition et manipulations diverses sur une ensemble de fiches.
  7. * SYNOPSIS
  8. * La creation d'un module est realisee par utilisation de la methode de classe XModule::objectFactory.
  9. * PARAMETERS
  10. ****/
  11. /// Module de gestion de fiches, base sur une simple table SQL
  12. class XModTable extends XModule implements XModuleContainerInterface, XCalInterface {
  13. static $_templates;
  14. public $xset=NULL;
  15. public $fieldssec=array();
  16. public $boid;
  17. public $table='T001';
  18. public $multipleedit=true;
  19. public $owner_sec=true;
  20. public $filter='';
  21. public $order='UPD DESC';
  22. public $quickquery=true;
  23. public $stored_query=false;
  24. public $pagesize=TZR_XMODTABLE_BROWSE_PAGESIZE;
  25. public $templates='';
  26. public $btemplates='';
  27. public $captcha=false;
  28. public $savenext='standard';
  29. public $showsystprop='show';
  30. public $persistentquery=false;
  31. public $trackaccess=false;
  32. public $trackchanges=true;
  33. public $archive=false;
  34. public $searchtemplate='xmodtable/searchResult.html';
  35. public $submodsearch=false;
  36. private $secOids_cache;
  37. private $navActions = NULL;
  38. function __construct($ar=NULL) {
  39. parent::__construct($ar);
  40. XLabels::loadLabels('xmodtable');
  41. $this->xset=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$this->table);
  42. if (!is_object($this->xset)) {
  43. throw new Exception('Non existent table: "'.$this->table.'"');
  44. }
  45. $this->boid=$this->xset->getBoid();
  46. if(XShell::admini_mode() && empty($this->_templates) && (!empty($this->templates) || !empty($this->btemplates)))
  47. $this->_templates=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS=TEMPLATES');
  48. if(!XShell::isRoot() && !empty($GLOBALS['XUSER'])) $this->loadFieldsSec($this->fieldssec);
  49. }
  50. /// Duplication d'un module, méthode interne
  51. /// Retour : duplicatetables => liste des tables dupliquées par le module (cle : ancienne table, valeur : nouvelle table))
  52. /// Retour : duplicatemods => liste des modules dupliqués par le module (cle : ancien moid, valeur : nouveau moid))
  53. function _duplicateModule($newmoid,&$params,$prefix) {
  54. if(!is_array($params['tables'])) $params['tables']=array();
  55. if(!$params['noduplicatetable']){
  56. if(empty($params['tables'][$this->table])){
  57. $ar['newtable']=XDSTable::newTableNumber();
  58. if(($pos=strpos($this->xset->getLabel(),':'))!==false) $ar['mtxt']=$prefix.substr($this->xset->getLabel(),$pos);
  59. else $ar['mtxt']=$prefix.':'.$this->xset->getLabel();
  60. $ar['data']=true;
  61. $ar['_options']=array('local'=>1);
  62. $xset2=$this->xset->procDuplicateDataSource($ar);
  63. $params['table']=$ar['newtable'];
  64. }else{
  65. $params['table']=$params['tables'][$this->table];
  66. }
  67. }
  68. unset($params['noduplicatetable']);
  69. return array('duplicatetables'=>array($this->table=>$params['table']),'duplicatemods'=>array());
  70. }
  71. /// securite des fonctions accessibles par le web
  72. function secGroups($function, $group=NULL) {
  73. $g=array();
  74. $g['browse']=array('list','ro','rw','rwv','admin');
  75. $g['browseFiles']=array('list','ro','rw','rwv','admin');
  76. $g['del']=array('rw','rwv','admin');
  77. $g['delAll']=array('rw','rwv','admin');
  78. $g['delStoredQuery']=array('rw','rwv','admin');
  79. $g['display']=array('ro','rw','rwv','admin');
  80. $g['XMCdisplay']=array('ro','rw','rwv','admin');
  81. $g['edit']=array('rw','rwv','admin');
  82. $g['editSelection']=array('rw','rwv','admin');
  83. $g['editAll']=array('rw','rwv','admin');
  84. $g['export']=array('list','ro','rw','rwv','admin');
  85. $g['exportDisplay']=array('ro','rw','rwv','admin');
  86. $g['exportFilesBatch']=array('ro','rw','rwv','admin');
  87. $g['gDisplay']=array('admin');
  88. $g['insert']=array('rw','rwv','admin');
  89. $g['journal']=array('ro','rw','rwv','admin');
  90. $g['prePrintBrowse']=array('list','ro','rw','rwv','admin');
  91. $g['prePrintDisplay']=array('list','ro','rw','rwv','admin');
  92. $g['preExportBrowse']=array('list','ro','rw','rwv','admin');
  93. $g['preExportDisplay']=array('list','ro','rw','rwv','admin');
  94. $g['printBrowse']=array('list','ro','rw','rwv','admin');
  95. $g['printDisplay']=array('ro','rw','rwv','admin');
  96. $g['procEdit']=array('rw','rwv','admin');
  97. $g['procEditDup']=array('rw','rwv','admin');
  98. $g['procEditAllLang']=array('rw','rwv','admin');
  99. $g['procEditSelection']=array('rw','rwv','admin');
  100. $g['procInsert']=array('rw','rwv','admin');
  101. $g['procQuery']=array('list','ro','rw','rwv','admin');
  102. $g['procQueryFiles']=array('list','ro','rw','rwv','admin');
  103. $g['publish']=array('rwv','admin');
  104. $g['query']=array('list', 'ro','rw','rwv','admin');
  105. $g['quickquery']=array('list','ro','rw','rwv','admin');
  106. $g['adminSubscribe']=array('admin');
  107. $g['getUnread']=array('list','ro','rw','rwv','admin');
  108. $g['markAsRead']=array('list','ro','rw','rwv','admin');
  109. self::getGetAdminSecGroups($g);
  110. if(isset($g[$function])) {
  111. if(!empty($group)) return in_array($group, $g[$function]);
  112. return $g[$function];
  113. }
  114. return parent::secGroups($function,$group);
  115. }
  116. /// Complete le tableau des focntion du module avec les fonction d'administration
  117. function getGetAdminSecGroups(&$g){
  118. $g['adminBrowseFields']=array('admin');
  119. $g['adminPrint']=array('admin');
  120. $g['adminClear']=array('admin');
  121. $g['adminDuplicate']=array('admin');
  122. $g['adminProcDuplicate']=array('admin');
  123. $g['adminChk']=array('admin');
  124. $g['adminEditSourceProperties']=array('admin');
  125. $g['adminProcEditSourceProperties']=array('admin');
  126. $g['adminNewField']=array('admin');
  127. $g['adminProcNewField']=array('admin');
  128. $g['adminEditField']=array('admin');
  129. $g['adminProcEditField']=array('admin');
  130. $g['adminProcEditFields']=array('admin');
  131. $g['adminDelField']=array('admin');
  132. $g['adminBrowseStrings']=array('admin');
  133. $g['adminNewString']=array('admin');
  134. $g['adminProcNewString']=array('admin');
  135. $g['adminEditString']=array('admin');
  136. $g['adminProcEditString']=array('admin');
  137. $g['adminDelString']=array('admin');
  138. $g['adminSortStrings']=array('admin');
  139. $g['adminClearStrings']=array('admin');
  140. $g['adminPreImportFieldsSec']=array('admin');
  141. $g['adminImportFieldsSec']=array('admin');
  142. $g['adminResetChrono']=array('admin');
  143. }
  144. /* Webservice du module */
  145. /// Sous fonction chargée d'ajouter les types necessaires
  146. function _SOAPWSDLTypes(&$wsdl){
  147. $fields=array(array('minOccurs'=>1,'maxOccurs'=>1,'name'=>'oid','type'=>'xsd:string'));
  148. foreach($this->xset->desc as $n=>&$f){
  149. $type=$f->getSoapType();
  150. $fields[]=array('minOccurs'=>0,'maxOccurs'=>1,'name'=>$n,'type'=>$type['name']);
  151. if(!empty($type['descr'])) $this->_SOAPAddTypes($wsdl,$type['descr']);
  152. }
  153. $this->_SOAPAddTypes($wsdl,array('browseParam'=>array(array('name'=>'filter','minOccurs'=>0,'maxOccurs'=>1,'type'=>'xsd:string'),
  154. array('name'=>'fields','minOccurs'=>0,'maxOccurs'=>1,'type'=>'xsd:string')),
  155. 'displayParam'=>array(array('name'=>'oid','minOccurs'=>1,'maxOccurs'=>1,'type'=>'xsd:string')),
  156. 'displayResult'=>$fields,
  157. 'browseResult'=>array(array('name'=>'line','minOccurs'=>0,'maxOccurs'=>'unbounded','type'=>'tns:displayResult'))));
  158. return;
  159. }
  160. /// Sous fonction chargée d'ajouter les messages necessaires
  161. function _SOAPWSDLMessages(&$wsdl){
  162. $wsdl->addMessage('browseIn',array('context'=>'tns:contextParam','param'=>'tns:browseParam'));
  163. $wsdl->addMessage('browseOut',array('return'=>'tns:browseResult'));
  164. $wsdl->addMessage('displayIn',array('context'=>'tns:contextParam','param'=>'tns:displayParam'));
  165. $wsdl->addMessage('displayOut',array('return'=>'tns:displayResult'));
  166. return;
  167. }
  168. /// Sous fonction chargée d'ajouter les ports necessaires
  169. function _SOAPWSDLPortOps(&$wsdl,&$pt){
  170. $wsdl->addPortOperation($pt,'browse','tns:browseIn','tns:browseOut');
  171. $wsdl->addPortOperation($pt,'display','tns:displayIn','tns:displayOut');
  172. return;
  173. }
  174. /// Sous fonction chargée d'ajouter les operations necessaires
  175. function _SOAPWSDLBindingOps(&$wsdl,&$b){
  176. $bo=$wsdl->addBindingOperation($b,'browse',array('use'=>'literal'),array('use'=>'literal'));
  177. $o=$wsdl->addSoapOperation($bo,'');
  178. $o->setAttribute('style','rpc');
  179. $bo=$wsdl->addBindingOperation($b,'display',array('use'=>'literal'),array('use'=>'literal'));
  180. $o=$wsdl->addSoapOperation($bo,'');
  181. $o->setAttribute('style','rpc');
  182. return;
  183. }
  184. /// Sous fonction declarant les fonctions du module
  185. function _SOAPRequestFunctions(&$server) {
  186. function browse($context,$params){
  187. global $soapmod;
  188. $LANG_DATA = XShell::getLangData();
  189. XLogs::debug("SOAPRequest function browse LANG:$LANG_DATA filter:".$params->filter." fields:".$params->fields);
  190. $soapmod->SOAPContext($context,'browse');
  191. $ar=array('tplentry'=>TZR_RETURN_DATA,'pagesize'=>999999);
  192. if(!empty($params->fields)){
  193. if($params->fields=='all' || $params->fields=='*') $ar['selectedfields']='all';
  194. else $ar['selectedfields']=explode(',',$params->fields);
  195. }
  196. if(!empty($params->filter)){
  197. $translatable = $soapmod->xset->getTranslatable();
  198. if(!$translatable) $LANG_DATA=TZR_DEFAULT_LANG;
  199. $ar['select']='select * from '.$soapmod->table.' where LANG="'.$LANG_DATA.'" AND ('.str_ireplace(' select ','',$params->filter).')';
  200. }
  201. $ar['nocount'] = 1;
  202. foreach($ar['selectedfields'] as $fieldname){
  203. $ar['options'][$fieldname]['nofollowlinks']=1;
  204. }
  205. $br=$soapmod->browse($ar);
  206. $lines=array();
  207. foreach($br['lines_oid'] as $i=>$oid){
  208. $line=array('oid'=>$oid);
  209. foreach($br['header_fields'] as $j=>&$f){
  210. $line[$f->field]=$br['lines_o'.$f->field][$i]->getSoapValue();
  211. }
  212. $lines[]=$line;
  213. }
  214. return array('line'=>$lines);
  215. }
  216. function display($context,$params){
  217. global $soapmod;
  218. XLogs::debug("SOAPRequest function display oid:".$params->oid);
  219. $soapmod->SOAPContext($context,'display',$params->oid);
  220. $ar=array('tplentry'=>TZR_RETURN_DATA,'oid'=>$params->oid);
  221. $br=$soapmod->display($ar);
  222. $ret=array('oid'=>$br['oid']);
  223. foreach($br['fields_object'] as $j=>&$f){
  224. $ret[$f->field]=$br['o'.$f->field]->getSoapValue();
  225. }
  226. return $ret;
  227. }
  228. $server->addFunction(array('browse','display'));
  229. }
  230. /// Rend la liste des fonctions utilisables dans le gestionnaire de rubriques en mode fonction (tableau de paires fonction=>label)
  231. function getUIFunctionList() {
  232. return array('display'=>XLabels::getSysLabel('xmodtable','uidisplay','text'),
  233. 'procQuery'=>XLabels::getSysLabel('xmodtable','uiquery','text'),
  234. 'insert'=>XLabels::getSysLabel('xmodtable','uiinsert','text'));
  235. }
  236. /// Suppression du module
  237. function delete($ar=NULL) {
  238. return parent::delete($ar);
  239. }
  240. /// Initialisation des propriétés
  241. public function initOptions() {
  242. parent::initOptions();
  243. $genlabel=XLabels::getSysLabel('xmodule.general');
  244. $this->_options->setOpt(XLabels::getSysLabel('xmodtable','multipleedit'),'multipleedit','boolean',NULL,NULL,$genlabel);
  245. $slabel=XLabels::getSysLabel('general','security','text');
  246. $this->_options->setOpt(XLabels::getSysLabel('xmodtable','owner_sec'),'owner_sec','boolean',NULL,NULL,$slabel);
  247. $alabel = XLabels::getSysLabel('xmodtable.modulename');
  248. $this->_options->setOpt(XLabels::getSysLabel('xmodtable','table'),'table','table',array('validate'=>true),NULL,$alabel);
  249. $this->_options->setOpt(XLabels::getSysLabel('xmodtable','filter'),'filter','text',NULL,NULL,$alabel);
  250. $this->_options->setOpt(XLabels::getSysLabel('xmodtable.order'),'order','text',NULL,NULL,$alabel);
  251. $this->_options->setOpt(XLabels::getSysLabel('xmodtable.quickquery'),'quickquery','boolean',NULL,NULL,$alabel);
  252. $this->_options->setOpt(XLabels::getSysLabel('xmodtable.stored_query'),'stored_query','boolean',NULL,NULL,$alabel);
  253. $this->_options->setOpt(XLabels::getSysLabel('xmodtable.pagesize'),'pagesize','text',NULL,NULL,$alabel);
  254. $this->_options->setOpt(XLabels::getSysLabel('xmodtable.templates'),'templates','template',array('moid'=>$this->_moid, 'cond'=>"(gtype like '%')"),
  255. NULL,$alabel);
  256. $this->_options->setOpt(XLabels::getSysLabel('xmodtable.btemplates'),'btemplates','template',array('moid'=>$this->_moid, 'cond'=>"(gtype like '%')"),
  257. NULL,$alabel);
  258. $this->_options->setOpt(XLabels::getSysLabel('xmodtable.captcha'),'captcha','boolean',NULL,NULL,$alabel);
  259. $this->_options->setOpt(XLabels::getSysLabel('xmodtable.savenext'),'savenext','list',
  260. array('values'=>array('standard','display','edit'),
  261. 'labels'=>array(XLabels::getSysLabel('xmodtable.savenext_std'),
  262. XLabels::getSysLabel('xmodtable.savenext_display'),
  263. XLabels::getSysLabel('xmodtable.savenext_edit'))),
  264. NULL, $alabel);
  265. $this->_options->setOpt(XLabels::getSysLabel('general.systemproperties'),'showsystprop','list',
  266. array('values'=>array('show','hide'),
  267. 'labels'=>array(XLabels::getSysLabel('general.yes'),
  268. XLabels::getSysLabel('general.no'))),
  269. NULL,$alabel);
  270. $this->_options->setOpt(XLabels::getSysLabel('xmodtable.persistentquery'),'persistentquery','boolean',NULL,NULL,$alabel);
  271. $slabel=XLabels::getSysLabel('xmodule.ssmod');
  272. $tlabel=XLabels::getSysLabel('general','title','text');
  273. $flabel=XLabels::getSysLabel('general','field','text');
  274. $ilabel=XLabels::getSysLabel('xmodtable','activate_additem');
  275. $dlabel=XLabels::getSysLabel('xmodtable','dependentfiles');
  276. $this->_options->setOpt(XLabels::getSysLabel('xmodtable','submodmax'),'submodmax','text',NULL,NULL,$slabel);
  277. $this->_options->setOpt(XLabels::getSysLabel('xmodtable','submodsearch'),'submodsearch','boolean',NULL,NULL,$slabel);
  278. if(!empty(XModule::$_mcache[$this->_moid]['MPARAM']['submodmax']))
  279. $this->_options->set($this,'submodmax',XModule::$_mcache[$this->_moid]['MPARAM']['submodmax']);
  280. for($i=1;$i<=$this->submodmax;$i++) {
  281. $this->_options->setOpt($tlabel.' '.$i,'ssmodtitle'.$i,'text',NULL,'',$slabel);
  282. $this->_options->setOpt($flabel.' '.$i,'ssmodfield'.$i,'text',NULL,'',$slabel);
  283. $this->_options->setOpt($slabel.' '.$i,'ssmod'.$i,'module',array('validate'=>true),'', $slabel);
  284. $this->_options->setOpt($ilabel.' '.$i,'ssmodactivate_additem'.$i,'boolean',NULL,true,$slabel);
  285. $this->_options->setOpt($dlabel.' '.$i,'ssmoddependent'.$i,'boolean',NULL,false,$slabel);
  286. }
  287. $tlabel=XLabels::getSysLabel('xmodule.tracking');
  288. $this->_options->setOpt(XLabels::getSysLabel('xfielddef','trackchanges'),'trackchanges','boolean',NULL,NULL,$tlabel);
  289. $this->_options->setOpt(XLabels::getSysLabel('xfielddef','trackaccess'),'trackaccess','boolean',NULL,NULL,$tlabel);
  290. $this->_options->setOpt(XLabels::getSysLabel('xfielddef','archive'),'archive','boolean',NULL,NULL,$tlabel);
  291. }
  292. /// Cette fonction est appliquee pour afficher l'ensemble des methodes de ce module
  293. protected function _actionlist(&$my) {
  294. parent::_actionlist($my);
  295. $myclass=get_class($this);
  296. $moid=$this->_moid;
  297. $myoid=@$_REQUEST['oid'];
  298. $user=&XUser::get_user();
  299. $f=XShell::_function();
  300. $uniqid='v'.XShell::uniqid();
  301. $submodcontext=NULL;
  302. // Parcourir
  303. if($this->secure('','browse')){
  304. // recupération du contexte sous module
  305. $submodcontext = $this->subModuleContext(array(), true);
  306. // en sous fiche, le browse est un retour à la fiche parent
  307. if($this->dependant_module && $submodcontext) {
  308. $o1=new XModuleAction($this,'browse',XLabels::getSysLabel('general','browse','text'),
  309. '&moid='.$this->dependant_module.'&_function=display&template=xmodtable/view.html&tplentry=br&oid='.
  310. $submodcontext['_parentoids'][0].$submodcontext['urlparms'],'display');
  311. } else {
  312. $o1=new XModuleAction($this,'browse',XLabels::getSysLabel('general','browse','text'),
  313. '&moid='.$moid.'&_function=browse&template=xmodtable/browse.html&tplentry=br','display');
  314. }
  315. $o1->containable=true;
  316. $o1->setToolbar('general','browse');
  317. $my['browse']=$o1;
  318. }
  319. // Recherche
  320. if((!$this->dependant_module || !$submodcontext) && $this->secure('','query')) {
  321. $o1=new XModuleAction($this,'query',XLabels::getSysLabel('general','query','text'),
  322. '&moid='.$moid.'&_function=query&template=xmodtable/query2.html&tplentry=br&querymode=query2','display');
  323. $o1->containable=true;
  324. $o1->setToolbar('general','query');
  325. $my['query']=$o1;
  326. }
  327. // Recherche en cours
  328. if($this->isThereAQueryActive()) {
  329. $o1=new XModuleAction($this,'procQuery',XLabels::getSysLabel('general','currentquery','text'),
  330. '&moid='.$moid.'&_function=procQuery&template=xmodtable/browse.html&tplentry=br','display');
  331. $o1->setToolbar('general','currentquery');
  332. $my['procquery']=$o1;
  333. }
  334. // Insert
  335. $lang_data=XShell::getLangData();
  336. $foo=NULL;
  337. if($this->xset->getTranslatable()==3) $sec=$this->secure($myoid,'insert',$foo,$lang_data);
  338. else $sec=$this->secure($myoid,'insert');
  339. if($sec && (!$this->dependant_module || !$submodcontext)) {
  340. $o1=new XModuleAction($this,'insert',XLabels::getSysLabel('general','new','text'),
  341. '&moid='.$moid.'&_function=insert&template=xmodtable/new.html&tplentry=br','edit');
  342. $o1->setToolbar('general','new');
  343. $o1->order=1;
  344. $my['insert']=$o1;
  345. }
  346. // Actions de navigation de fiche en fiche : nous ne sommes pas en sous module
  347. if(!empty($this->navActions) && !$submodcontext){
  348. foreach($this->navActions as $ak=>$o){
  349. $my[$ak] = $o;
  350. }
  351. }
  352. // Avertir
  353. $oid=@$_REQUEST['oid'];
  354. if ($this->secure('', 'sendACopyTo')){
  355. if(!empty($oid)) {
  356. $o1=new XModuleAction($this,'sendACopy',XLabels::getSysLabel('xmodule','sendacopyto','text'),
  357. '&moid='.$moid.'&tplentry=br&oid='.$oid.'&_function=sendACopyTo&template=xmodule/sendacopyto.html&tplentry=br');
  358. }else{
  359. $o1=new XModuleAction($this,'sendACopy',XLabels::getSysLabel('xmodule','sendacopyto','text'),
  360. 'javascript:'.$uniqid.'.applyfunction("sendACopyTo","",{template:"xmodule/sendacopyto.html"},true,true);');
  361. }
  362. $o1->menuable=true;
  363. $o1->group='more';
  364. $my['sendacopy']=$o1;
  365. }
  366. // Impression
  367. if(in_array(XShell::_function(),array('display','edit'))) $printfct='printDisplay';
  368. else $printfct='printBrowse';
  369. if(XShell::_function()!='insert' && $this->secure($myoid,$printfct)){
  370. $o1=new XModuleAction($this,'print',XLabels::getSysLabel('general','print','text'),
  371. 'javascript:'.$uniqid.'.printselected();','display');
  372. $o1->setToolbar('general','print');
  373. $my['print']=$o1;
  374. }
  375. // Export
  376. if(in_array(XShell::_function(),array('display','edit'))) $expfct='exportDisplay';
  377. else $expfct='export';
  378. if(XShell::_function()!='insert' && $this->secure($myoid,$expfct)){
  379. $o1=new XModuleAction($this,'export',XLabels::getSysLabel('general','export','text'),'javascript:'.$uniqid.'.exportselected();',
  380. 'edit');
  381. $o1->menuable=true;
  382. $my['sexport']=$o1;
  383. }
  384. //Import
  385. if($this->secure('','manage')){
  386. $o1=new XModuleAction($this,'manage',XLabels::getSysLabel('general','import','text'),
  387. $GLOBALS['TZR_SESSION_MANAGER']::complete_self().'&moid='.$this->_moid.'&function=manage&template=xmodule/manage.html','edit');
  388. $o1->menuable=true;
  389. $my['import']=$o1;
  390. }
  391. // Voir les documents non lus
  392. if($this->trackaccess && $this->secure('','getUnread')){
  393. $o1=new XModuleAction($this,'lastdoc',XLabels::getSysLabel('xmodule','unread','text'),
  394. '&moid='.$this->_moid.'&_function=getUnread&tplentry=br&template=xmodtable/getUnread.html','more');
  395. $o1->menuable=true;
  396. $my['unread']=$o1;
  397. }
  398. // Abonnements
  399. $modsubmoid=XModule::getMoid(XMODSUB_TOID);
  400. if(!empty($modsubmoid)){
  401. $o1=new XModuleAction($this, 'subscribe', XLabels::getSysLabel('xmodsub','subadd','text'),
  402. '&amoid='.$this->_moid.'&moid='.$modsubmoid.
  403. '&_function=preSubscribe&tplentry=br&template=xmodsub/sub.html&aoid='.$myoid);
  404. $o1->menuable=true;
  405. $o1->group='more';
  406. $my['subscribe']=$o1;
  407. }
  408. // Regles workflow
  409. if($this->stored_query){
  410. $modrulemoid=XModule::getMoid(XMODRULE_TOID);
  411. if(!empty($modrulemoid)){
  412. $o1=new XModuleAction($this, 'rule', XLabels::getSysLabel('xmodrule','addrule','text'),
  413. '&amoid='.$this->_moid.'&moid='.$modrulemoid.
  414. '&_function=insertRule&tplentry=br&template=xmodrule/newRule.html&atemplate=xmodtable/editSelection.html');
  415. $o1->menuable=true;
  416. $o1->group='more';
  417. $my['rule']=$o1;
  418. }
  419. }
  420. // Mode conception et administration
  421. if($this->secure('','adminBrowseFields')){
  422. $o1=new XModuleAction($this, 'administration', XLabels::getSysLabel('general', 'administration', 'text'),
  423. '&moid='.$this->_moid.'&function=adminBrowseFields&template=xmodule/admin/browseFields.html','admin');
  424. $o1->setToolBar('general', 'administration');
  425. $my['administration']=$o1;
  426. }
  427. // Chemin
  428. if($this->interactive) {
  429. if($this->dependant_module && $submodcontext) {
  430. $mod1=XModule::objectFactory($this->dependant_module);
  431. $o1=new XModuleAction($this,'browse',$mod1->modulename,
  432. '&moid='.$this->dependant_module.'&_function=browse&template=xmodtable/browse.html&tplentry=br');
  433. $my['stack'][]=$o1;
  434. $d1=&$mod1->xset->rDisplayText($submodcontext['_parentoids'][0], array());
  435. $o1=new XModuleAction($this,'d1',$d1['link'],
  436. '&moid='.$this->dependant_module.'&_function=display&template=xmodtable/view.html&tplentry=br&oid='.
  437. $submodcontext['_parentoids'][0]);
  438. $my['stack'][]=$o1;
  439. } else {
  440. $o1=new XModuleAction($this,'browse',$this->modulename,
  441. '&moid='.$moid.'&_function=browse&template=xmodtable/browse.html&tplentry=br','display');
  442. $my['stack'][]=$o1;
  443. $f=XShell::_function();
  444. if(strpos($f,'admin')===0){
  445. $o1=new XModuleAction($this,'adminBrowseFields',XLabels::getSysLabel('xmodule','browsefields','text').' ('.$this->xset->getTable().')',
  446. '&moid='.$moid.'&_function=adminBrowseFields&template=xmodule/admin/browseFields.html','display');
  447. $my['stack'][]=$o1;
  448. }
  449. }
  450. if(!empty($oid) && !is_array($oid)) {
  451. $br=&XShell::from_screen('br');
  452. $br=&$this->xset->rDisplayText($oid, array());
  453. if($submodcontext) {
  454. $o1=new XModuleAction($this,'browse',$br['link'],
  455. '&moid='.$moid.$submodcontext['urlparms'].
  456. '&_function=display&template=xmodtable/view.html&tplentry=br&oid='.$oid,'display');
  457. } else {
  458. $o1=new XModuleAction($this,'browse',$br['link'],
  459. '&moid='.$moid.'&_function=display&template=xmodtable/view.html&tplentry=br&oid='.$oid,'display');
  460. }
  461. $my['stack'][]=$o1;
  462. }
  463. }
  464. }
  465. /// Action principale du menu
  466. public function getMainAction(){
  467. return $GLOBALS['TZR_SESSION_MANAGER']::complete_self().'moid='.$this->_moid.'&function=browse&tplentry=br&template=xmodtable/browse.html&_persistent=1';
  468. }
  469. /**
  470. * Contruit la liste des actions relatives aux sous-modules
  471. * @param &$my array() Liste de XModuleAction
  472. */
  473. function getSSMAl(&$my){
  474. $uniqid='v'.XShell::uniqid();
  475. $myoid=@$_REQUEST['oid'];
  476. $ssmmenu=array();
  477. for($i=1;$i<=$this->submodmax;$i++) {
  478. $f='ssmod'.$i;
  479. $ff='ssmodfield'.$i;
  480. $fa='ssmodactivate_additem'.$i;
  481. if(!$this->$fa || !$this->$f) continue;
  482. if(empty($this->$ff)){
  483. $smod=XModule::objectFactory($this->$f);
  484. $links=$smod->xset->getXLinkDefs(NULL,$this->table);
  485. if(!empty($links)) list($foo,$linkfield)=each($links);
  486. } else {
  487. $linkfield = $this->$ff;
  488. }
  489. $ssm=XModule::objectFactory($this->$f);
  490. if(!$ssm->secure('','insert')) continue;
  491. $submodcontext=$this->subModuleContext($ar); // ???? sert pas
  492. $o1=new XModuleAction($this,$f,$ssm->modulename,
  493. 'javascript:'.$uniqid.'.addTabs("'.$this->$f.'","'.$GLOBALS['TZR_SESSION_MANAGER']::complete_self().'&moid='.$this->$f.'&function=insert&template=xmodtable/new.html&tplentry=br&_linkedfields[]='.$linkfield.
  494. '&_parentoids[]='.$myoid.'&_parentoid='.$myoid.'&_linkedfield='.$linkfield.'&_raw=1&_ajax=1&skip=1'.
  495. '&tabsmode=1","'.XLabels::getSysLabel('general','add','text').' : '.addslashes($ssm->modulename).'");');
  496. $o1->menuable=true;
  497. $ssmmenu[]=$o1;
  498. }
  499. if(count($ssmmenu)>1){
  500. $o1=new XModuleAction($this,'alladd',XLabels::getSysLabel('general','add','text'),'#');
  501. $o1->menuable=true;
  502. $o1->newgroup='ssm';
  503. $my['ssm']=$o1;
  504. foreach($ssmmenu as &$o1){
  505. $o1->group='ssm';
  506. $my[$o1->xfunction]=$o1;
  507. }
  508. }else{
  509. foreach($ssmmenu as &$o1){
  510. $o1->name=XLabels::getSysLabel('general','add','text').' : '.$o1->name;
  511. $my[$o1->xfunction]=$o1;
  512. }
  513. }
  514. }
  515. /**
  516. * Construit la liste des actions à rendre disponible lors de l'affichage d'une fiche (display)
  517. * @param &$my array() Liste de XModuleAction
  518. */
  519. function al_display(&$my){
  520. $uniqid='v'.XShell::uniqid();
  521. $moid=$this->_moid;
  522. $myoid=@$_REQUEST['oid'];
  523. $sec=$this->secure($myoid,'edit');
  524. if($sec) {
  525. // recuperation contexte sous module
  526. $submodcontext=$this->subModuleContext();
  527. $o1=new XModuleAction($this,'edit',XLabels::getSysLabel('general','edit','text'),
  528. '&function=edit&moid='.$moid.'&template=xmodtable/edit.html&tplentry=br&oid='.$myoid.$submodcontext['urlparms'],'edit');
  529. $o1->order=2;
  530. $o1->setToolbar('general','edit');
  531. $my['edit']=$o1;
  532. }
  533. $sec=$this->secure($myoid,'del');
  534. if($sec){
  535. $o1=new XModuleAction($this,'del',XLabels::getSysLabel('general','delete','text'),'javascript:'.$uniqid.'.deleterecord();','edit');
  536. $o1->order=3;
  537. $o1->setToolbar('general','delete');
  538. $my['del']=$o1;
  539. }
  540. $this->getSSMAl($my);
  541. }
  542. /**
  543. * Construit la liste des actions à rendre disponible lors de la préparation à l'édition d'une fiche (edit)
  544. * @param &$my array() Liste de XModuleAction
  545. */
  546. function al_edit(&$my){
  547. $uniqid='v'.XShell::uniqid();
  548. $myoid=@$_REQUEST['oid'];
  549. $o1=new XModuleAction($this,'save',XLabels::getSysLabel('general','save','text'),'javascript:'.$uniqid.'.saverecord();','edit');
  550. $o1->order=1;
  551. $o1->setToolbar('general','save');
  552. $my['save']=$o1;
  553. // recuperation contexte sous module
  554. $submodcontext=$this->subModuleContext();
  555. $o1=new XModuleAction($this,'display',XLabels::getSysLabel('general','display','text'),
  556. '&function=display&moid='.$this->_moid.'&template=xmodtable/view.html&tplentry=br&oid='.$myoid.$submodcontext['urlparms'],
  557. 'edit');
  558. $o1->order=2;
  559. $o1->setToolbar('general','display');
  560. $my['display']=$o1;
  561. $sec=$this->secure($myoid,'del');
  562. if($sec){
  563. $o1=new XModuleAction($this,'del',XLabels::getSysLabel('general','delete','text'),'javascript:'.$uniqid.'.deleterecord();','edit');
  564. $o1->order=3;
  565. $o1->setToolbar('general','delete');
  566. $my['del']=$o1;
  567. }
  568. $this->getSSMAl($my);
  569. }
  570. /**
  571. * Construit la liste des actions à rendre disponible lors de l'édition d'une fiche (procEdit)
  572. * @param &$my array() Liste de XModuleAction
  573. */
  574. function al_procEdit(&$my){
  575. $this->al_edit($my);
  576. }
  577. /**
  578. * Construit la liste des actions à rendre disponible lors de la duplication d'une fiche (procEditDup)
  579. * @param &$my array() Liste de XModuleAction
  580. */
  581. function al_procEditDup(&$my){
  582. $this->al_insert($my);
  583. }
  584. /**
  585. * Construit la liste des actions à rendre disponible lors de la préparation à l'insertion d'une fiche (insert)
  586. * @param &$my array() Liste de XModuleAction
  587. */
  588. function al_insert(&$my){
  589. $uniqid='v'.XShell::uniqid();
  590. $o1=new XModuleAction($this,'save',XLabels::getSysLabel('general','save','text'),'javascript:'.$uniqid.'.saverecord();','edit');
  591. $o1->order=1;
  592. $o1->setToolbar('general','save');
  593. $my['save']=$o1;
  594. }
  595. /**
  596. * Construit la liste des actions à rendre disponible lors de l'insertion d'une fiche (procInsert)
  597. * @param &$my array() Liste de XModuleAction
  598. */
  599. function al_procInsert(&$my){
  600. $this->al_insert($my);
  601. }
  602. /**
  603. * Construit la liste des actions à rendre disponible lors du listing des fiches du module (browse)
  604. * @param &$my array() Liste de XModuleAction
  605. */
  606. function al_browse(&$my){
  607. $uniqid='v'.XShell::uniqid();
  608. $moid=$this->_moid;
  609. $myoid=@$_REQUEST['oid'];
  610. if($this->secure($myoid,'del')){
  611. $o1=new XModuleAction($this,'del',XLabels::getSysLabel('general','delete','text'),'javascript:'.$uniqid.'.deleteselected();','edit');
  612. $o1->setToolbar('general','delete');
  613. $o1->order=3;
  614. $my['del']=$o1;
  615. }
  616. if($this->objectSecurityEnabled() && $this->secure($myoid,'secEditSimple')){
  617. $o1=new XModuleAction($this,'seceditsimple',XLabels::getSysLabel('general','security','text'),
  618. 'javascript:TZR.editSec("'.$GLOBALS['TZR_SESSION_MANAGER']::complete_self(true).'","'.$this->_moid.'","",'.$uniqid.');','edit');
  619. $o1->setToolbar('general','security');
  620. $o1->order=4;
  621. $my['secEditSimple']=$o1;
  622. }
  623. if(isset($this->xset->desc['PUBLISH'])){
  624. if($this->secure($myoid,'publish')){
  625. $o1=new XModuleAction($this,'approve',XLabels::getSysLabel('general','approve','text'),
  626. 'javascript:'.$uniqid.".applyfunction('publish','',{value:1});",'edit');
  627. $o1->menuable=true;
  628. $my['approve']=$o1;
  629. $o1=new XModuleAction($this,'unapprove',XLabels::getSysLabel('general','unapprove','text'),
  630. 'javascript:'.$uniqid.".applyfunction('publish','',{value:2});",'edit');
  631. $o1->menuable=true;
  632. $my['unapprove']=$o1;
  633. }
  634. }
  635. // Affichage (changement taille page, ajout de champ...)
  636. $o1=new XModuleAction($this,'fieldgrp',XLabels::getSysLabel('xmodtable','field_label','text'),'#','display');
  637. $o1->menuable=true;
  638. $o1->newgroup='fieldgrp';
  639. $my['fieldgrp']=$o1;
  640. foreach($this->xset->orddesc as $i=>$fn){
  641. $f=$this->xset->getField($fn);
  642. $o1=new XModuleAction($this,'field'.$fn,$f->label,'javascript:'.$uniqid.'.add_field(\''.$fn.'\');'.$uniqid.'.go_browse(\'\',0);','fieldgrp');
  643. $o1->menuable=true;
  644. $my['field'.$fn]=$o1;
  645. }
  646. $o1=new XModuleAction($this,'pgmore',XLabels::getSysLabel('xmodtable','page_size','text').' * 2',
  647. 'javascript:'.$uniqid.'.go_browse("start","*2");','display');
  648. $o1->menuable=true;
  649. $my['pgmore']=$o1;
  650. $o1=new XModuleAction($this,'pgless',XLabels::getSysLabel('xmodtable','page_size','text').' / 2',
  651. 'javascript:'.$uniqid.'.go_browse("start","/2");','display');
  652. $o1->menuable=true;
  653. $my['pgless']=$o1;
  654. if($this->multipleedit && $this->secure('','editSelection')){
  655. $o1=new XModuleAction($this,'editselection',XLabels::getSysLabel('xmodmedia','editselection','text'),
  656. 'javascript:'.$uniqid.'.applyfunction("editSelection","",{template:"xmodtable/editSelection.html"},true,true);','edit');
  657. $o1->order=2;
  658. $o1->setToolbar('general','edit');
  659. $my['editselection']=$o1;
  660. }
  661. // Edition/suppression sur le resultat d'une recherche
  662. if($this->isThereAQueryActive()){
  663. if($this->secure('','editAll')){
  664. $o1=new XModuleAction($this,'editall',XLabels::getSysLabel('general','editall','text'),
  665. 'javascript:'.$uniqid.'.applyfunction("editAll","",{template:"xmodmedia/editSelection.html"},false,true);','edit');
  666. $o1->order=2;
  667. $o1->menuable=true;
  668. $my['editall']=$o1;
  669. }
  670. if($this->secure('','delAll')){
  671. $o1=new XModuleAction($this,'delall',XLabels::getSysLabel('general','delall','text'),
  672. 'javascript:'.$uniqid.'.applyfunction("delAll","'.XLabels::getSysLabel('general','confirm_delete_object','text').'","");','edit');
  673. $o1->order=3;
  674. $o1->menuable=true;
  675. $my['delall']=$o1;
  676. }
  677. }
  678. }
  679. /**
  680. * Construit la liste des actions à rendre disponible lors d'une recherche sur les fiches du module (procQuery)
  681. * @param &$my array() Liste de XModuleAction
  682. */
  683. function al_procQuery(&$my){
  684. $this->al_browse($my);
  685. }
  686. /// Fonctions sur gestion des champs
  687. function al_adminBrowseFields(&$my){
  688. $uniqid='v'.XShell::uniqid();
  689. $o1=new XModuleAction($this,'importfieldssec',XLabels::getSysLabel('xmodule','importfieldssec','text'),
  690. '&moid='.$this->_moid.'&_function=adminPreImportFieldsSec&template=xmodule/admin/preimportfieldssec.html&tplentry=br','more');
  691. $o1->menuable=true;
  692. $my['importfieldssec']=$o1;
  693. $o1=new XModuleAction($this,'newfield',XLabels::getSysLabel('xdatasource','new_field','text'),
  694. '&moid='.$this->_moid.'&function=adminNewField&template=xmodule/admin/newField.html');
  695. $o1->menuable=true;
  696. $my['newfield']=$o1;
  697. $o1=new XModuleAction($this,'emptydata',XLabels::getSysLabel('xdatasource','empty_data','text'),
  698. 'javascript:'.$uniqid.'.emptybase();','more');
  699. $o1->menuable=true;
  700. $my['emptydata']=$o1;
  701. $o1=new XModuleAction($this,'clonebase',XLabels::getSysLabel('general','clone','text'),
  702. '&moid='.$this->_moid.'&function=adminDuplicate&template=xmodule/admin/duplicate.html&tplentry=br','more');
  703. $o1->menuable=true;
  704. $my['clonebase']=$o1;
  705. $o1=new XModuleAction($this,'checkbase',XLabels::getSysLabel('general','check','text'),
  706. '&moid='.$this->_moid.'&function=adminChk&skip=1&_next='.rawurlencode($GLOBALS['XSHELL']->get_back_url(0)),'more');
  707. $o1->menuable=true;
  708. $my['checkbase']=$o1;
  709. $o1=new XModuleAction($this,'checkrbase',XLabels::getSysLabel('general','check_and_repair','text'),
  710. '&moid='.$this->_moid.'&function=adminChk&skip=1&repair=1&_next='.rawurlencode($GLOBALS['XSHELL']->get_back_url(0)),'more');
  711. $o1->menuable=true;
  712. $my['checkrbase']=$o1;
  713. $o1=new XModuleAction($this,'propbase',XLabels::getSysLabel('general','properties','text'),
  714. '&moid='.$this->_moid.'&function=adminEditSourceProperties&template=xmodule/admin/editSource.html','more');
  715. $o1->menuable=true;
  716. $my['propbase']=$o1;
  717. $o1=new XModuleAction($this,'printbase',XLabels::getSysLabel('general','print','text'),
  718. 'javascript:'.$uniqid.'.printselected();');
  719. $o1->menuable=true;
  720. $my['printbase']=$o1;
  721. }
  722. /// Fonctions sur gestion des champs
  723. function al_adminBrowseStrings(&$my){
  724. $uniqid='v'.XShell::uniqid();
  725. $o1=new XModuleAction($this,'alphasort',XLabels::getSysLabel('general','alpha_sort','text'),
  726. '&moid='.$this->_moid.'&function=adminSortStrings&skip=1&field='.$_REQUEST['field'].'&_next='.rawurlencode($GLOBALS['XSHELL']->get_back_url(0)));
  727. $o1->menuable=true;
  728. $my['alphasort']=$o1;
  729. $o1=new XModuleAction($this,'deletebase',XLabels::getSysLabel('general','delete_all','text'),
  730. 'javascript:'.$uniqid.'.deleteall();');
  731. $o1->menuable=true;
  732. $my['deleteall']=$o1;
  733. $o1=new XModuleAction($this,'newstring',XLabels::getSysLabel('general','new','text'),
  734. '&moid='.$this->_moid.'&function=adminNewString&template=xmodule/admin/newString.html&field='.$_REQUEST['field']);
  735. $o1->menuable=true;
  736. $my['newstring']=$o1;
  737. }
  738. /// Fonctions sur gestion des champs
  739. function al_adminEditField(&$my){
  740. $uniqid='v'.XShell::uniqid();
  741. $br=&XShell::from_screen('');
  742. $o1=new XModuleAction($this,'resetchrono','Reset',
  743. '&moid='.$this->_moid.'&_function=adminResetChrono&field='.$br['field'].'&boid='.$br['boid'].'&skip=1&_next='.
  744. rawurlencode($GLOBALS['XSHELL']->get_back_url(0)),'more');
  745. $o1->menuable=true;
  746. $my['resetchrono']=$o1;
  747. }
  748. function nav($ar=NULL){
  749. parent::nav($ar);
  750. if(substr(XShell::_function(),0,5)=='admin') {
  751. $this->pushNav(XLabels::getSysLabel('general','administration','text'),
  752. '&function=adminBrowseFields&moid='.$this->_moid.'&template=xmodule/admin/browseFields.html&boid='.$this->boid);
  753. }
  754. }
  755. function isDependant() {
  756. return XDbIni::get('dependant:'.$this->_moid,'val');
  757. }
  758. /// Preparartion des donnees pour ecran de parametrage d'impression
  759. public function prePrintBrowse($ar) {
  760. $p=new XParam($ar,array());
  761. $order=$p->get('order');
  762. $tplentry=$p->get('tplentry');
  763. if(empty($order)) $order=$this->order;
  764. $ar['order']=$order;
  765. $ar['table']=$this->table;
  766. // Recherche des templates d'impression
  767. if(empty($this->_templates)) $this->_templates=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS=TEMPLATES');
  768. if(!empty($this->_templates)) {
  769. $q1=$this->_templates->select_query(array('cond'=>array('modid'=>array('=',$this->_moid),
  770. 'gtype'=>array('=','xmodtable_browse_print'))));
  771. $r=&$this->_templates->browse(array('select'=>$q1,'pagesize'=>100,'tplentry'=>TZR_RETURN_DATA));
  772. XShell::toScreen1($tplentry.'t',$r);
  773. }
  774. // recherche des donnees
  775. $ar['_filter']=$this->getFilter(true,$ar);
  776. $ar['tplentry']=TZR_RETURN_DATA;
  777. $ar['fieldssec']=$this->getFieldsSec($ar);
  778. $ar['selectedfields']='all';
  779. $ar['pagesize']=1;
  780. $ar['ssmoid']='all';
  781. for($i=1;$i<=$this->submodmax;$i++) {
  782. $f='ssmod'.$i;
  783. $ar['options'][$this->$f]['selectedfields']='all';
  784. }
  785. // cas module ayant lui meme en sous modules
  786. $mycurrentquery = NULL;
  787. if($this->isThereAQueryActive())
  788. $mycurrentquery = $this->_getSession('query');
  789. $r=&$this->xset->browse($ar);
  790. $this->setSubModules($ar,$r);
  791. if ($mycurrentquery != NULL)
  792. $this->_setSession('query', $mycurrentquery);
  793. // calcul du nombre d'enregistrements impactes (passage d'oid, browseSelection ou browse/query classique)
  794. $r['_selected']=$p->get('_selected');
  795. if(is_array($r['_selected'])) {
  796. $r['record_count']=count($r['_selected']);
  797. }elseif($p->get('fromfunction')=='browseSelection') {
  798. $selection=getSessionVar('selection');
  799. $r['_selected']=$selection[$this->_moid];
  800. $r['record_count']=count($r['_selected']);
  801. }else{
  802. $context=$this->getContextQuery($ar,false);
  803. $ar['select']=$context['query'];
  804. $q=$this->xset->getSelectQuery($ar);
  805. $r['record_count']=countSelectQuery($q[1],true);
  806. $r['queryfields']=$context['all']['queryfields'];
  807. }
  808. return XShell::toScreen1($tplentry,$r);
  809. }
  810. /// Retourne la requete permattant de recuperer tous les objets suivant le contexte (selection, recherche en cours...)
  811. function getContextQuery($ar,$queryonly=true){
  812. $p=new XParam($ar,array());
  813. $oidsel=$p->get('_selected');
  814. $noreg=$p->get('noreg');
  815. $from=$p->get('fromfunction');
  816. if(is_array($oidsel)) {
  817. $oid=array_keys($oidsel);
  818. $q=$this->xset->select_query(array('cond'=>array('KOID'=>array('=',$oid))));
  819. }elseif($this->isThereAQueryActive() && ($from=='procQuery')) {
  820. $_storedquery=$this->_getSession('query');
  821. $ar1=array_merge($_storedquery,$ar);
  822. if($queryonly){
  823. $ar1['getselectonly']=true;
  824. $q=$this->xset->procQuery($ar1);
  825. }else{
  826. $ar1['getselectonly']=false;
  827. $ar1['pagesize']=1;
  828. $r=$this->xset->procQuery($ar1);
  829. $q=$r['select'];
  830. $params=array('queryobject'=>$r['queryobject']);
  831. }
  832. if(!$noreg) $q=preg_replace('@select (.*) from (.*)$@i','select '.$this->table.'.* from $2',$q);
  833. }else{
  834. $q=$this->xset->select_query(array("cond"=>array()));
  835. }
  836. if($queryonly) return $q;
  837. else return array('query'=>$q,'all'=>$r);
  838. }
  839. /// Impression sur un browse
  840. public function printBrowse($ar) {
  841. $p=new XParam($ar,array());
  842. $title=$p->get('title');
  843. $email=$p->get('dest');
  844. $target=$p->get('_target');
  845. $linkedfield=$p->get('_linkedfield');
  846. $fmt=$p->get('fmt');
  847. $context=$this->getContextQuery($ar,false);
  848. $q=$context['query'];
  849. $ar['selected']='0';
  850. $ar['pagesize']='100000';
  851. $ar['select']=$q;
  852. $ar['_format']='text/html';
  853. $ar['tplentry']=TZR_RETURN_DATA;
  854. $tpldata['param']=array('title'=>$title,'queryfields'=>$context['all']['queryfields']);
  855. $oldinteractive=$this->interactive;
  856. $this->interactive=false;
  857. if(!empty($target) && $target!=$this->_moid){
  858. $mod=XModule::objectFactory($target);
  859. if($mod->secure('','export')){
  860. $ar2=$ar;
  861. $ar['selectedfields']=array('xx');
  862. $ar['order']=$this->order;
  863. $b=$this->browse($ar);
  864. $q='select * from '.$mod->table.' where '.$linkedfield.' in ("'.implode('","',$b['lines_oid']).'")';
  865. $ar2['select']=$q;
  866. $ar2['tplentry']=$tplentry;
  867. if($fmt=='pdf') $ar2['_format']='application/prince';
  868. $res=$mod->browse($ar2);
  869. }
  870. }else{
  871. if($fmt=='pdf') $ar['_format']='application/prince';
  872. $res=$this->browse($ar);
  873. $mod=&$this;
  874. }
  875. $this->interactive=$oldinteractive;
  876. if($fmt=='pdf') {
  877. // Impression PDF par defaut
  878. if(!empty($this->_templates) && !empty($this->btemplates)) {
  879. $r=&$this->_templates->display(array('oid'=>$this->btemplates,'_options'=>array('error'=>'return'),'tplentry'=>TZR_RETURN_DATA));
  880. if(!empty($r['oprintp']->filename)) $filename=$r['oprintp']->filename;
  881. }
  882. $this->_printBrowsePDF($ar,$filename);
  883. }elseif(Kernel::isAKoid($fmt)) {
  884. // Impression via un template d'impressions
  885. $t=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$fmt);
  886. $dispfmt=$t->rDisplay($fmt);
  887. $displayformats=explode(',',$dispfmt['odfmt']->raw);
  888. if(in_array('text/html',$displayformats) || empty($dispfmt['odfmt']->raw)) $this->_printBrowseHTML($ar,$dispfmt['oprint']->filename);
  889. elseif(in_array('application/prince',$displayformats)) $this->_printBrowsePDF($ar,$dispfmt['oprint']->filename);
  890. }else{
  891. // Impression HTML par defaut
  892. $template=$p->get('template');
  893. $this->_printBrowseHTML($ar,$template);
  894. }
  895. }
  896. /// Sous fonction d'impression au format HTML
  897. function _printBrowseHTML($ar=NULL,$filename=NULL){
  898. $p=new XParam($ar,NULL);
  899. $email=$p->get('dest');
  900. if(empty($filename)) $filename='xmodtable/print.html';
  901. $content=$this->_printGetContent($ar,$filename,'browse');
  902. if(!empty($email)) $this->sendMail2User('print','',$email,NULL,false,NULL,'report.html',$content);
  903. echo $content;
  904. exit(0);
  905. }
  906. /// Sous fonction d'impression au format PDF
  907. function _printBrowsePDF($ar=NULL,$filename=NULL){
  908. $p=new XParam($ar,array('pdfname'=>'browse.pdf'));
  909. $email=$p->get('dest');
  910. if(empty($filename)) $filename='xmodtable/print.xml';
  911. $ar['_format']='application/prince';
  912. $content=$this->_printGetContent($ar,$filename,'browse');
  913. $tmpname=princeTidyXML2PDF(NULL,$content);
  914. if(!empty($email) && !empty($tmpname)) {
  915. $content=file_get_contents($tmpname);
  916. $this->sendMail2User('print','',$email,NULL,false,NULL,'browse.pdf',$content,'application/pdf');
  917. }
  918. $pdfname=$p->get('pdfname');
  919. header('Content-type: application/pdf');
  920. header('Content-disposition: attachment; filename='.$pdfname);
  921. $size=filesize($tmpname);
  922. header('Accept-Ranges: bytes');
  923. header('Content-Length: '.$size);
  924. readfile($tmpname);
  925. unlink($tmpname);
  926. exit(0);
  927. }
  928. /// Impression d'une fiche
  929. public function printDisplay($ar) {
  930. $p=new XParam($ar,array('pdfname'=>'view.pdf'));
  931. $tplentry=$p->get('tplentry');
  932. $ar['tplentry']=TZR_RETURN_DATA;
  933. $ar['ssmoid']='all';
  934. $fmt=$p->get('fmt');
  935. if($fmt=='pdf') {
  936. // Impression PDF par defaut
  937. if(!empty($this->_templates) && !empty($this->templates)) {
  938. $r=&$this->_templates->display(array('oid'=>$this->templates,'_options'=>array('error'=>'return'),'tplentry'=>TZR_RETURN_DATA));
  939. if(!empty($r['oprintp']->filename)) $filename=$r['oprintp']->filename;
  940. }
  941. $this->_printDisplayPDF($ar,$filename);
  942. }elseif(Kernel::isAKoid($fmt)) {
  943. // Impression via un template d'impressions
  944. $t=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$fmt);
  945. $dispfmt=$t->display(array('oid'=>$fmt,'tplentry'=>TZR_RETURN_DATA));
  946. $displayformats=explode(',',$dispfmt['odfmt']->raw);
  947. if(in_array('text/html',$displayformats) || empty($dispfmt['odfmt']->raw)) $this->_printDisplayHTML($ar,$dispfmt['oprint']->filename);
  948. elseif(in_array('application/prince',$displayformats)) $this->_printDisplayPDF($ar,$dispfmt['oprint']->filename);
  949. }else{
  950. // Impression HTML par defaut
  951. $template=$p->get('template');
  952. $this->_printDisplayHTML($ar,$template);
  953. }
  954. }
  955. /// Sous fonction d'impression au format HTML
  956. function _printDisplayHTML($ar=NULL,$filename=NULL){
  957. $p=new XParam($ar,NULL);
  958. $email=$p->get('dest');
  959. if(empty($filename)) $filename='xmodtable/printdisplay.html';
  960. $content=$this->_printGetContent($ar,$filename,'display');
  961. if(!empty($email)) $this->sendMail2User('print','',$email,NULL,false,NULL,'report.html',$content);
  962. echo $content;
  963. exit(0);
  964. }
  965. /// Sous fonction d'impression au format PDF
  966. function _printDisplayPDF($ar=NULL,$filename=NULL){
  967. $p=new XParam($ar,array('pdfname'=>'view.pdf'));
  968. $email=$p->get('dest');
  969. if(empty($filename)) $filename='xmodtable/print-view.xml';
  970. $ar['_format']='application/prince';
  971. $content=$this->_printGetContent($ar,$filename,'display');
  972. $tmpname=princeTidyXML2PDF(NULL,$content);
  973. if(!empty($email) && !empty($tmpname)) {
  974. $content=file_get_contents($tmpname);
  975. $this->sendMail2User('print','',$email,NULL,false,NULL,'view.pdf',$content,'application/pdf');
  976. }
  977. $pdfname=$p->get('pdfname');
  978. header('Content-type: application/pdf');
  979. header('Content-disposition: attachment; filename='.$pdfname);
  980. $size=filesize($tmpname);
  981. header('Accept-Ranges: bytes');
  982. header('Content-Length: '.$size);
  983. readfile($tmpname);
  984. unlink($tmpname);
  985. exit(0);
  986. }
  987. /// Recupere le contenu pour une impression
  988. function &_printGetContent($ar,$filename,$f,$tpldata=array()){
  989. $p=new XParam($ar,NULL);
  990. $title=$p->get('title');
  991. $res=&$this->$f($ar);
  992. $xt=new XTemplate('file:'.$filename);
  993. $labels=&$GLOBALS['XSHELL']->labels->get_labels(array('selectors'=>array('global'),'local'=>true));
  994. $xt->set_glob(array('labels'=>&$labels));
  995. $r3=array();
  996. $tpldata['param']=array('title'=>$title);
  997. $tpldata['br']=$res;
  998. $tpldata['imod']=&XShell::from_screen('imod');
  999. $content=$xt->parse($tpldata,$r3,NULL);
  1000. return $content;
  1001. }
  1002. /// Exporte une fiche
  1003. public function exportDisplay($ar=NULL){
  1004. $p= new XParam($ar,array());
  1005. $fmt=$p->get('fmt');
  1006. $ar['norow']=1;
  1007. $ar['nodef']=1;
  1008. $ar['ssmoid']='all';
  1009. $ar['_options']=array('genpublishtag'=>false);
  1010. if($fmt=='xl' || $fmt=='xl07') $ar['_format']='application/excel';
  1011. $this->display($ar);
  1012. if($fmt=='xl' || $fmt=='xl07') $this->_exportXLSDisplay($ar);
  1013. if($fmt=='html') $this->printDisplay($ar);
  1014. if($fmt=='csv') $this->_exportCSVDisplay($ar);
  1015. }
  1016. /// Exporte une fiche au format excel
  1017. public function _exportXLSDisplay($ar){
  1018. require_once('add-ons/PHPExcel/PHPExcel.php');
  1019. $p=new XParam($ar,NULL);
  1020. $fmt=$p->get('fmt');
  1021. $br=&XShell::from_screen('br');
  1022. $ss=new PHPExcel();
  1023. $ss->setActiveSheetIndex(0);
  1024. $ws=$ss->getActiveSheet();
  1025. $ws->setTitle('Main');
  1026. $ws->SetCellValue('A1','OID');
  1027. $ws->SetCellValue('B1',$br['oid']);
  1028. $row=2;
  1029. foreach($br['fields_object'] as $j => &$f) {
  1030. if(!$f->sys){
  1031. $l=$f->fielddef->label;
  1032. $c=$f->field;
  1033. convert_charset($l,TZR_INTERNAL_CHARSET,'UTF-8');
  1034. $ws->setCellValueByColumnAndRow(0,$row,$l);
  1035. $f1=&$this->xset->getField($c);
  1036. $f1->writeXLS($ws,$row++,1,$br['o'.$c],0,$ss);
  1037. }
  1038. }
  1039. $ws->getStyle('A1:A'.($row-1))->getFont()->setBold(true);
  1040. foreach($br['__ssmod'] as $i=>&$ssr){
  1041. $ssmod=XModule::objectFactory($br['__ssprops'][$i]['_moid']);
  1042. $l=$br['__ssprops'][$i]['modulename'];
  1043. convert_charset($l,TZR_INTERNAL_CHARSET,'UTF-8');
  1044. $ss->createSheet($i+1);
  1045. $ss->setActiveSheetIndex($i+1);
  1046. $ws=$ss->getActiveSheet();
  1047. $ws->setTitle($l);
  1048. foreach($ssr['header_fields'] as $j => &$f) {
  1049. $l=$ssr['header_fields'][$j]->label;
  1050. convert_charset($l,TZR_INTERNAL_CHARSET,'UTF-8');
  1051. $ws->setCellValueByColumnAndRow($j,1,$l);
  1052. }
  1053. foreach($ssr['lines_oid'] as $j=>$oid){
  1054. foreach($ssr['header_fields'] as $k=>&$f) {
  1055. $f->writeXLS($ws,$j+2,$k,$ssr['lines_o'.$f->field][$j],0,$ss);
  1056. }
  1057. }
  1058. $ws->getStyle('A1:'.PHPExcel_Cell::stringFromColumnIndex($k).'1')->getFont()->setBold(true);
  1059. }
  1060. $ss->setActiveSheetIndex(0);
  1061. sendPHPExcelFile($ss,$fmt,'export');
  1062. }
  1063. /// Exporte une fiche et ses sous fiches au format csv (si sous fiches, un fichier csv par sous modules, le tout dans un zip)
  1064. public function _exportCSVDisplay($ar=NULL){
  1065. $p= new XParam($ar,array('fname'=>'Export'));
  1066. $fsep=$p->get('csvfsep');
  1067. $textsep=stripslashes($p->get('csvtextsep'));
  1068. $charset=stripslashes($p->get('csvcharset'));
  1069. $fname=$p->get('fname');
  1070. $br=&XShell::from_screen('br');
  1071. $csv=$headers=$row=array();
  1072. foreach($br['fields_object'] as $j => &$f) {
  1073. if(!$f->sys){
  1074. $f1=&$this->xset->getField($f->field);
  1075. $headers[]=$textsep.$f->fielddef->label.$textsep;
  1076. $row[]=$f1->writeCSV($br['o'.$f->field],$textsep);
  1077. }
  1078. }
  1079. $csv[]=implode($fsep,$headers);
  1080. $csv[]=implode($fsep,$row);
  1081. $csv=implode("\r\n",$csv);
  1082. convert_charset($csv,TZR_INTERNAL_CHARSET,$charset);
  1083. if(empty($br['__ssmod'])){
  1084. ob_clean();
  1085. header('Content-Type: text/csv; charset='.$charset);
  1086. header('Content-Transfer-Encoding:'.$charset);
  1087. header('Content-disposition: attachment; filename='.str_replace(' ','_',removeaccents($fname)).'.csv');
  1088. header('Content-Length: '.strlen($csv));
  1089. echo $csv;
  1090. exit(0);
  1091. }else{
  1092. $dir=TZR_TMP_DIR.'exportdisp'.uniqid();
  1093. @mkdir($dir);
  1094. file_put_contents($dir.'/Main.csv',$csv);
  1095. foreach($br['__ssmod'] as $i=>&$ssr){
  1096. $csv=$headers=$row=array();
  1097. $ssmod=XModule::objectFactory($br['__ssprops'][$i]['_moid']);
  1098. $l=$br['__ssprops'][$i]['modulename'];
  1099. $fields=array();
  1100. foreach($ssr['header_fields'] as $j=>&$f) {
  1101. $headers[]=$textsep

Large files files are truncated, but you can click here to view the full file