PageRenderTime 54ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/class.xmodmedia.inc

https://github.com/jcplat/console-seolan
PHP | 2046 lines | 1704 code | 116 blank | 226 comment | 298 complexity | 1b7889a79805ba6dbd506f4bea36cb7e 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. /// Module de gestion d'une médiathèque
  3. class XModMedia extends XModTable {
  4. public $submodmax=0;
  5. public $collectionmod;
  6. public $imgresize='800x600>';
  7. public $searchtemplate='xmodmedia/searchResult.html';
  8. function __construct($ar=NULL){
  9. parent::__construct($ar);
  10. XLabels::loadLabels('xmodmedia');
  11. if(!empty($this->collection))
  12. $this->collectionmod=XModule::objectFactory($this->collection);
  13. }
  14. /// Liste des groupes de droits valides pour ce module
  15. static function getRoList(){
  16. return array('ro1','ro2','ro3','ro');
  17. }
  18. /// Securite des fonctions accessibles par le web
  19. function secGroups($function, $group=NULL) {
  20. $list=static::secListList();
  21. $ro=static::secRoList();
  22. $g=array();
  23. $g['browse']=$list;
  24. $g['browseFiles']=$list;
  25. $g['display']=$ro;
  26. $g['displayMedia']=$ro;
  27. $g['displayInfos']=$ro;
  28. $g['insert']=array('rw','rwv','admin');
  29. $g['procInsert']=array('rw','rwv','admin');
  30. $g['edit']=array('rw','rwv','admin');
  31. $g['editSelection']=array('rw','rwv','admin');
  32. $g['editAll']=array('rw','rwv','admin');
  33. $g['procEdit']=array('rw','rwv','admin');
  34. $g['procEditAllLang']=array('rw','rwv','admin');
  35. $g['procEditSelection']=array('rw','rwv','admin');
  36. $g['del']=array('rw','rwv','admin');
  37. $g['delAll']=array('rw','rwv','admin');
  38. $g['query']=$list;
  39. $g['quickquery']=$list;
  40. $g['procQuery']=$list;
  41. $g['procQueryFiles']=$list;
  42. $g['delStoredQuery']=array('rw','rwv','admin');
  43. $g['preExportFiles']=$list;
  44. $g['exportFiles']=$list;
  45. $g['exportFilesBatch']=$list;
  46. $g['importOnFly']=array('rw','rwv','admin');
  47. $g['procImportOnFly']=array('rw','rwv','admin');
  48. $g['chooseDownloadFormat']=$list;
  49. $g['downloadMedias']=$ro;
  50. $g['prePrintContactSheet']=$list;
  51. $g['printContactSheet']=$list;
  52. $g['importBrowse']=array('admin');
  53. $g['importDisplay']=array('admin');
  54. $g['importInput']=array('admin');
  55. $g['importProcInput']=array('admin');
  56. $g['importEdit']=array('admin');
  57. $g['importProcEdit']=array('admin');
  58. $g['importDel']=array('admin');
  59. $g['runImports']=array('admin');
  60. $g['exportBrowse']=array('admin');
  61. $g['exportDisplay']=array('admin');
  62. $g['exportInput']=array('admin');
  63. $g['exportProcInput']=array('admin');
  64. $g['exportEdit']=array('admin');
  65. $g['exportProcEdit']=array('admin');
  66. $g['exportDel']=array('admin');
  67. $g['runExports']=array('admin');
  68. if(isset($g[$function])) {
  69. if(!empty($group)) return in_array($group, $g[$function]);
  70. return $g[$function];
  71. }
  72. return parent::secGroups($function,$group);
  73. }
  74. /// Rend la liste des fonctions utilisables dans le gestionnaire de rubriques en mode fonction (tableau de paires fonction=>label)
  75. function getUIFunctionList() {
  76. return array('procQuery'=>XLabels::getSysLabel('xmodtable','uiquery','text'));
  77. }
  78. /// Options du module
  79. public function initOptions() {
  80. parent::initOptions();
  81. $this->_options->delOpt('object_sec');
  82. $this->_options->delOpt('multipleedit');
  83. $this->_options->delOpt('owner_sec');
  84. $this->_options->delOpt('btemplates');
  85. $this->_options->delOpt('captcha');
  86. $this->_options->delOpt('submodmax');
  87. $this->_options->delOpt('submodsearch');
  88. $alabel=XLabels::getSysLabel('xmodmedia.modulename');
  89. $this->_options->setOpt(XLabels::getSysLabel('xmodmedia','collectionmod'),'collection','module',array('validate'=>true,'emptyok'=>false,'toid'=>XMODMEDIACOLLECTION_TOID),NULL,$alabel);
  90. $this->_options->setOpt(XLabels::getSysLabel('xmodmedia','imports'),'imports','table',array('validate'=>true),NULL,$alabel);
  91. $this->_options->setOpt(XLabels::getSysLabel('xmodmedia.imgresize'),'imgresize','text',NULL,'800x600>',$alabel);
  92. }
  93. /// Cette fonction est appliquee pour afficher l'ensemble des methodes de ce module
  94. protected function _actionlist(&$my) {
  95. XModule::_actionlist($my);
  96. $f=XShell::_function();
  97. @$myoid=$_REQUEST['oid'];
  98. $uniqid='v'.XShell::uniqid();
  99. // Stack
  100. if($this->interactive){
  101. $o1=new XModuleAction($this,'browse',$this->modulename,
  102. '&moid='.$this->_moid.'&_function=browse&template=xmodmedia/browse.html&tplentry=br','display');
  103. $my['stack'][]=$o1;
  104. if(strpos($f,'import')===0 && $f!='importOnFly'){
  105. $o1=new XModuleAction($this,'importBrowse',XLabels::getSysLabel('xmodmedia','imports','text'),
  106. '&moid='.$this->_moid.'&function=importBrowse&template=xmodmedia/importBrowse.html&tplentry=br');
  107. $my['stack'][]=$o1;
  108. }
  109. if(strpos($f,'export')===0){
  110. $o1=new XModuleAction($this,'exportBrowse',XLabels::getSysLabel('xmodmedia','exports','text'),
  111. '&moid='.$this->_moid.'&function=exportBrowse&template=xmodmedia/exportBrowse.html&tplentry=br');
  112. $my['stack'][]=$o1;
  113. }
  114. }
  115. if($this->secure('','browse')){
  116. // Parcourir
  117. $o1=new XModuleAction($this,'browse',XLabels::getSysLabel('general','browse','text'),
  118. '&moid='.$this->_moid.'&_function=browse&template=xmodmedia/browse.html&tplentry=br','display');
  119. $o1->containable=true;
  120. $o1->setToolbar('general','browse');
  121. $my['browse']=$o1;
  122. }
  123. // Recherche
  124. if($this->secure('','query')){
  125. $o1=new XModuleAction($this,'query',XLabels::getSysLabel('general','query','text'),
  126. '&moid='.$this->_moid.'&_function=query&template=xmodmedia/query.html&tplentry=br&querymode=query2','display');
  127. $o1->containable=true;
  128. $o1->setToolbar('general','query');
  129. $my['query']=$o1;
  130. }
  131. // Recherche en cours
  132. if($this->isThereAQueryActive()) {
  133. $o1=new XModuleAction($this,'procQuery',XLabels::getSysLabel('general','currentquery','text'),
  134. '&moid='.$this->_moid.'&_function=procQuery&template=xmodmedia/browse.html&tplentry=br','display');
  135. $o1->setToolbar('general','currentquery');
  136. $my['procquery']=$o1;
  137. }
  138. // Insert
  139. $lang_data=XShell::getLangData();
  140. $foo=NULL;
  141. if($this->xset->getTranslatable()==3) $sec=$this->secure($myoid,'insert',$foo,$lang_data);
  142. else $sec=$this->secure($myoid,'insert');
  143. if($sec) {
  144. $o1=new XModuleAction($this,'insert',XLabels::getSysLabel('general','new','text'),
  145. '&moid='.$this->_moid.'&_function=insert&template=xmodmedia/new.html&tplentry=br','edit');
  146. $o1->setToolbar('general','new');
  147. $o1->order=1;
  148. $my['insert']=$o1;
  149. }
  150. // Avertir
  151. if ($this->secure('', 'sendACopyTo')){
  152. if(!empty($myoid)) {
  153. $o1=new XModuleAction($this,'sendACopy',XLabels::getSysLabel('xmodule','sendacopyto','text'),
  154. '&moid='.$this->_moid.'&tplentry=br&oid='.$myoid.'&_function=sendACopyTo&template=xmodule/sendacopyto.html&tplentry=br');
  155. }else{
  156. $o1=new XModuleAction($this,'sendACopy',XLabels::getSysLabel('xmodule','sendacopyto','text'),
  157. 'javascript:'.$uniqid.'.applyfunction("sendACopyTo","",{template:"xmodule/sendacopyto.html"},true,true);');
  158. }
  159. $o1->menuable=true;
  160. $o1->group='more';
  161. $my['sendacopy']=$o1;
  162. }
  163. // Imports
  164. if($this->secure(NULL,'importOnFly')){
  165. $o1=new XModuleAction($this,'import',XLabels::getSysLabel('xmodmedia','importonfly','text'),
  166. '&moid='.$this->_moid.'&function=importOnFly&template=xmodmedia/importOnFly.html&tplentry=br','more');
  167. $o1->menuable=true;
  168. $my['importonfly']=$o1;
  169. }
  170. if($this->secure(NULL,'importBrowse')){
  171. $o1=new XModuleAction($this,'import',XLabels::getSysLabel('xmodmedia','imports','text'),'#','more');
  172. $o1->menuable=true;
  173. $o1->newgroup='impgrp';
  174. $my['import']=$o1;
  175. $o1=new XModuleAction($this,'importbrowse',XLabels::getSysLabel('general','browse','text'),
  176. '&moid='.$this->_moid.'&function=importBrowse&template=xmodmedia/importBrowse.html&tplentry=br','impgrp');
  177. $o1->menuable=true;
  178. $my['importBrowse']=$o1;
  179. if($this->secure($myoid,'importInput')){
  180. $o1=new XModuleAction($this,'importinput',XLabels::getSysLabel('general','new','text'),
  181. '&moid='.$this->_moid.'&function=importInput&template=xmodmedia/importNew.html&tplentry=br','impgrp');
  182. $o1->menuable=true;
  183. $my['importNew']=$o1;
  184. }
  185. }
  186. // Exports
  187. if($this->secure(NULL,'exportBrowse')){
  188. $o1=new XModuleAction($this,'import',XLabels::getSysLabel('xmodmedia','exports','text'),'#','more');
  189. $o1->menuable=true;
  190. $o1->newgroup='expgrp';
  191. $my['exports']=$o1;
  192. $o1=new XModuleAction($this,'exportbrowse',XLabels::getSysLabel('general','browse','text'),
  193. '&moid='.$this->_moid.'&function=exportBrowse&template=xmodmedia/exportBrowse.html&tplentry=br','expgrp');
  194. $o1->menuable=true;
  195. $my['exportBrowse']=$o1;
  196. if($this->secure($myoid,'exportInput')){
  197. $o1=new XModuleAction($this,'exportinput',XLabels::getSysLabel('general','new','text'),
  198. '&moid='.$this->_moid.'&function=exportInput&template=xmodmedia/exportNew.html&tplentry=br','expgrp');
  199. $o1->menuable=true;
  200. $my['exportNew']=$o1;
  201. }
  202. }
  203. // Regles workflow
  204. if($this->stored_query){
  205. $modrulemoid=XModule::getMoid(XMODRULE_TOID);
  206. if(!empty($modrulemoid)){
  207. $o1=new XModuleAction($this,'rule',XLabels::getSysLabel('xmodrule','addrule','text'),
  208. '&amoid='.$this->_moid.'&moid='.$modrulemoid.
  209. '&_function=insertRule&tplentry=br&template=xmodrule/newRule.html&atemplate=xmodmedia/editSelection.html');
  210. $o1->menuable=true;
  211. $o1->group='more';
  212. $my['rule']=$o1;
  213. }
  214. }
  215. // Mode conception et administration
  216. if($this->secure(NULL,':admin')){
  217. $o1=new XModuleAction($this, 'administration', XLabels::getSysLabel('general', 'administration', 'text'),
  218. '&moid='.$this->_moid.'&function=adminBrowseFields&template=xmodule/admin/browseFields.html&boid='.$this->boid,
  219. 'admin');
  220. $o1->setToolBar('general','administration');
  221. $my['administration']=$o1;
  222. }
  223. }
  224. /// Actions du browse
  225. function al_browse(&$my){
  226. $uniqid='v'.XShell::uniqid();
  227. $moid=$this->_moid;
  228. // Changement taille page
  229. $o1=new XModuleAction($this,'pgmore',XLabels::getSysLabel('xmodtable','page_size','text').' * 2',
  230. 'javascript:'.$uniqid.'.go_browse("start","*2");','display');
  231. $o1->menuable=true;
  232. $my['pgmore']=$o1;
  233. $o1=new XModuleAction($this,'pgless',XLabels::getSysLabel('xmodtable','page_size','text').' / 2',
  234. 'javascript:'.$uniqid.'.go_browse("start","/2");','display');
  235. $o1->menuable=true;
  236. $my['pgless']=$o1;
  237. if($this->secure('','del')){
  238. $o1=new XModuleAction($this,'del',XLabels::getSysLabel('general','delete','text'),
  239. 'javascript:'.$uniqid.'.applyfunction("del","'.XLabels::getSysLabel('general','confirm_delete_object','text').'","",true);',
  240. 'edit');
  241. $o1->setToolbar('general','delete');
  242. $o1->order=3;
  243. $my['del']=$o1;
  244. }
  245. // Export
  246. if($this->secure($myoid,'exportFiles')) {
  247. $o1=new XModuleAction($this,'export',XLabels::getSysLabel('xmodmedia','export','text'),
  248. 'javascript:'.$uniqid.'.applyfunction("preExportFiles","",{fromfunction:"'.XShell::_function().'",'.
  249. 'template:"xmodmedia/preExportFiles.html"},false,true,true);','edit');
  250. $o1->menuable=true;
  251. $my['export']=$o1;
  252. }
  253. // Impression contact
  254. if($this->secure($myoid,'prePrintContactSheet')) {
  255. $o1=new XModuleAction($this,'sheet',XLabels::getSysLabel('xmodmedia','printsheet','text'),
  256. 'javascript:'.$uniqid.'.applyfunction("prePrintContactSheet","",{fromfunction:"'.XShell::_function().'",'.
  257. 'template:"xmodmedia/prePrintContactSheet.html"},false,true,true);','edit');
  258. $o1->menuable=true;
  259. $my['sheet']=$o1;
  260. }
  261. // Edition par lot
  262. if($this->secure('','editSelection')){
  263. $o1=new XModuleAction($this,'editselection',XLabels::getSysLabel('xmodmedia','editselection','text'),
  264. 'javascript:'.$uniqid.'.applyfunction("editSelection","",{template:"xmodmedia/editSelection.html"},true,true);','edit');
  265. $o1->order=2;
  266. $o1->setToolbar('general','edit');
  267. $my['editselection']=$o1;
  268. }
  269. // Edition/suppression sur le resultat d'une recherche
  270. if($this->isThereAQueryActive()){
  271. if($this->secure('','editAll')){
  272. $o1=new XModuleAction($this,'editall',XLabels::getSysLabel('general','editall','text'),
  273. 'javascript:'.$uniqid.'.applyfunction("editAll","",{template:"xmodmedia/editSelection.html"},false,true);','edit');
  274. $o1->order=2;
  275. $o1->menuable=true;
  276. $my['editall']=$o1;
  277. }
  278. if($this->secure('','delAll')){
  279. $o1=new XModuleAction($this,'delall',XLabels::getSysLabel('general','delall','text'),
  280. 'javascript:'.$uniqid.'.applyfunction("delAll","'.XLabels::getSysLabel('general','confirm_delete_object','text').'","");','edit');
  281. $o1->order=3;
  282. $o1->menuable=true;
  283. $my['delall']=$o1;
  284. }
  285. }
  286. }
  287. function al_procQuery(&$my){
  288. $this->al_browse($my);
  289. }
  290. function al_display(&$my){
  291. $uniqid='v'.XShell::uniqid();
  292. if($this->secure('','edit')){
  293. $o1=new XModuleAction($this,'edit',XLabels::getSysLabel('general','edit','text'),
  294. '&function=edit&moid='.$this->_moid.'&template=xmodmedia/edit.html&tplentry=br&oid='.@$_REQUEST['oid'],'edit');
  295. $o1->order=2;
  296. $o1->setToolbar('general','edit');
  297. $my['edit']=$o1;
  298. }
  299. }
  300. function al_input(&$my){
  301. $uniqid='v'.XShell::uniqid();
  302. $o1=new XModuleAction($this,'save',XLabels::getSysLabel('general','save','text'),'javascript:'.$uniqid.'.saverecord();','edit');
  303. $o1->order=1;
  304. $o1->setToolbar('general','save');
  305. $my['save']=$o1;
  306. }
  307. function al_edit(&$my){
  308. $uniqid='v'.XShell::uniqid();
  309. $o1=new XModuleAction($this,'save',XLabels::getSysLabel('general','save','text'),'javascript:'.$uniqid.'.saverecord();','edit');
  310. $o1->order=1;
  311. $o1->setToolbar('general','save');
  312. $my['save']=$o1;
  313. }
  314. /// Action principale du menu
  315. public function getMainAction(){
  316. return $GLOBALS['TZR_SESSION_MANAGER']::complete_self().'moid='.$this->_moid.'&function=browse&tplentry=br&template=xmodmedia/browse.html&_persistent=1';
  317. }
  318. /// Fonction daemon
  319. public function _daemon($period='any'){
  320. $this->runExports();
  321. $this->runImports();
  322. }
  323. /// Liste des tables utilisées par le module
  324. public function usedTables(){
  325. $ret=array($this->table,$this->collectionmod->table,$this->imports);
  326. return $ret;
  327. }
  328. /// Affichage du media uniquement
  329. function &displayMedia($ar=NULL){
  330. $p=new XParam($ar,array('selectedfields'=>array()));
  331. $selectedfields=$p->get('selectedfields');
  332. $selectedfields[]='media';
  333. $ar['selectedfields']=$selectedfields;
  334. $this->xset->desc['media']->autoplay=true;
  335. $template=XShell::getTemplate();
  336. if (!file_exists($GLOBALS['TEMPLATES_DIR'].$template)){
  337. $file= TZR_SHARE_DIR.'xmodmedia/viewMedia.html';
  338. $xt = new XTemplate('file:/'.$file);
  339. $r3=array();
  340. $ret=$this->xset->display($ar);
  341. $tpldata['br']=$ret;
  342. $content=$xt->parse($tpldata,$r3,NULL);
  343. echo($content);
  344. exit(0);
  345. }
  346. return $this->xset->display($ar);
  347. }
  348. /// Affichage des infos d'un media
  349. function &displayInfos($ar=NULL){
  350. $p=new XParam($ar,NULL);
  351. $tplentry=$p->get('tplentry');
  352. $ar['tplentry']=TZR_RETURN_DATA;
  353. $d=$this->xset->display($ar);
  354. return XShell::toScreen1($tplentry,$d);
  355. }
  356. /// Mode parcourir
  357. function &browse($ar=NULL){
  358. $p=new XParam($ar,NULL);
  359. $order=$p->get('order');
  360. $select=$p->get('select');
  361. $tplentry=$p->get('tplentry');
  362. $persistent=$p->get('_persistent');
  363. $this->checkOrderFields($order);
  364. $pagesize=$p->get('pagesize');
  365. if(empty($pagesize)) $pagesize=$this->pagesize;
  366. if($this->persistentquery && $persistent) clearSessionVar('filterquery'.$this->_moid);
  367. if($this->interactive){
  368. $this->_setSession('lastorder',$order);
  369. if($this->isThereAQueryActive()) $this->_clearSession('query');
  370. }
  371. $ar['pagesize']=$pagesize;
  372. $filter=$this->getFilter(true,$ar);
  373. if($filter===NULL) return NULL;
  374. $ar['_filter']=$filter;
  375. $ar['order']=$order;
  376. $lang_data=XShell::getLangData();
  377. $ar['tplentry']=TZR_RETURN_DATA;
  378. if(empty($ar['fmoid'])) $ar['fmoid']=$this->_moid;
  379. $ar['fieldssec']=$this->fieldssec;
  380. // on ne recherche que les champs affichés
  381. $selectedfields = $p->get('selectedfields');
  382. if(!empty($selectedfields))
  383. $ar['selectedfields']=$selectedfields;
  384. else $ar['selectedfields']=$this->xset->getPublished();
  385. if(!in_array('media',$ar['selectedfields'])) $ar['selectedfields'][]='media';
  386. if(!in_array('PUBLISH',$ar['selectedfields'])) $ar['selectedfields'][]='PUBLISH';
  387. if($this->xset->fieldExists('mediahd') && !in_array('mediahd',$ar['selectedfields'])) $ar['selectedfields'][]='mediahd';
  388. $r = &$this->xset->browse($ar);
  389. $r['function']='browse';
  390. $this->applyObjectsSec($r);
  391. unset($ar['selectedfields']);
  392. if(XShell::admini_mode()) {
  393. if (!$p->get('without_actions')) $this->browse_actions($r);
  394. // Recherche rapide
  395. if ($this->quickquery) {
  396. $ar['tplentry']=TZR_RETURN_DATA;
  397. $r['_qq']=$this->quickquery($ar);
  398. }
  399. }
  400. return XShell::toScreen1($tplentry, $r);
  401. }
  402. /// Parcours le module pour la selection d'un fichier
  403. public function &browseFiles($ar) {
  404. // pas d'edition ni suppression depuis l'écran de parcours
  405. $fields = array();
  406. //cinq champ publié max et les champ fichier
  407. foreach($this->xset->desc as $fname=>$fdef){
  408. if( (count($fields) < 5 && $fdef->get_published()) || ($fdef->get_ftype() == 'XFileDef' || $fdef->get_ftype() == 'XImageDef')){
  409. $fields[]=$fname;
  410. }
  411. }
  412. $ar['selectedfields']=$fields;
  413. $ar['without_actions'] = true;
  414. $browse = $this->browse($ar);
  415. // si pas de titre aux images, ajout depuis le champ title
  416. // permet la récupération d'un titre dans "parcourir les modules"
  417. foreach ($browse['lines_oid'] as $i => $oid) {
  418. if (preg_match('/title=""/', $browse['lines_omedia'][$i]->html)) {
  419. $browse['lines_omedia'][$i]->html = preg_replace('/(title|alt)=""/', '$1="'.$browse['lines_otitle'][$i]->html.'"', $browse['lines_omedia'][$i]->html);
  420. }
  421. }
  422. return $browse;
  423. }
  424. /// Initialise les champs sélectionnés par défaut
  425. public function &UIEdit_procQuery($ar=NULL) {
  426. if (empty($ar['__selectedfields'])) {
  427. $ar['__selectedfields'] = $this->xset->fieldExists('mediahd') ? array('media','mediahd') : array('media');
  428. }
  429. return parent::UIEdit_procQuery($ar);
  430. }
  431. /* /// Fonctions d'affichage du resultat d'une requete dans une section
  432. public function &UIEdit_procQuery($ar=NULL){
  433. $ret=$this->query($ar);
  434. $grp=XLabels::getSysLabel('general','result','text');
  435. $fs['___storedquery']=XFieldDef::objectFactory((object)array('FIELD'=>'___storedquery','FTYPE'=>'XLinkDef','MULTIVALUED'=>0,
  436. 'COMPULSORY'=>false,'TARGET'=>'QUERIES',
  437. 'LABEL'=>XLabels::getSysLabel('xmodtable','stored_query','text')));
  438. $fs['___storedquery']->filter='modid="'.$this->_moid.'"';
  439. $fs['___storedquery']->fgroup=$grp;
  440. $fs['__selectedfields']=XFieldDef::objectFactory((object)array('FIELD'=>'__selectedfields','FTYPE'=>'XTableFieldDef','MULTIVALUED'=>1,
  441. 'COMPULSORY'=>false,'TARGET'=>$this->table,
  442. 'LABEL'=>XLabels::getSysLabel('general','fields','text')));
  443. $fs['__selectedfields']->fgroup=$grp;
  444. $fs['__selectedfields']->doublebox=true;
  445. $options['__selectedfields']=array('except'=>($this->xset->fieldExists('mediahd'))?array('media','mediahd'):array('media'));
  446. $fs['__order']=XFieldDef::objectFactory((object)array('FIELD'=>'__order','FTYPE'=>'XTableFieldDef','MULTIVALUED'=>1,
  447. 'COMPULSORY'=>false,'TARGET'=>$this->table,
  448. 'LABEL'=>XLabels::getSysLabel('general','order','text')));
  449. $fs['__order']->doublebox=$fs['__order']->withorder=true;
  450. $fs['__order']->fgroup=$grp;
  451. $fs['__pagesize']=XFieldDef::objectFactory((object)array('FIELD'=>'__pagesize','FTYPE'=>'XRealDef','COMPULSORY'=>true,
  452. 'LABEL'=>XLabels::getSysLabel('xmodinfotree','max_nb','text')));
  453. $fs['__pagesize']->default=999;
  454. $fs['__pagesize']->fgroup=$grp;
  455. $fs['__viewpagination']=XFieldDef::objectFactory((object)array('FIELD'=>'__viewpagination','FTYPE'=>'XBoolDef','MULTIVALUED'=>0,
  456. 'COMPULSORY'=>false,
  457. 'LABEL'=>XLabels::getSysLabel('xmodtable','viewpagination','text')));
  458. $fs['__viewpagination']->default=2;
  459. $fs['__viewpagination']->fgroup=$grp;
  460. foreach($fs as $fn=>&$f){
  461. $value=(is_array($ar[$fn])?implode('||',$ar[$fn]):$ar[$fn]);
  462. if(empty($options[$fn])) $options[$fn]=array();
  463. $o=$f->edit($ar[$fn],$options[$fn]);
  464. $ret['o'.$fn]=$ret['fields_object'][]=$o;
  465. }
  466. return $ret;
  467. }
  468. public function &UIProcEdit_procQuery($ar=NULL){
  469. $p=new XParam($ar,NULL);
  470. $params=$this->xset->captureQuery($ar);
  471. $params['___storedquery']=$p->get('___storedquery');
  472. $selectedfields=$p->get('__selectedfields');
  473. $selectedfields[]='media';
  474. $params['__selectedfields']=implode('||',$selectedfields);
  475. $params['__order']=implode('||',$p->get('__order'));
  476. $params['__pagesize']=$p->get('__pagesize');
  477. $xbool=new XBoolDef();
  478. $xbool->field='__viewpagination';
  479. $tmp=$xbool->post_edit($p->get('__viewpagination'),$opt=array('__viewpagination_HID'=>$p->get('__viewpagination_HID')));
  480. $params['__viewpagination']=$tmp->raw;
  481. return $params;
  482. }
  483. public function &UIView_procQuery($ar=NULL){
  484. $params=$_REQUEST['sectionopts'];
  485. $ar['_storedquery']=$ar['___storedquery'];
  486. if($ar['__selectedfields'] == 'media') {
  487. $ar['selectedfields'] = $this->xset->browsableFields();
  488. $ar['selectedfields'][] = 'media';
  489. } else
  490. $ar['selectedfields'] = explode('||',$ar['__selectedfields']);
  491. if($params[$ar['itoid']]['order']) $ar['order']=$params[$ar['itoid']]['order'];
  492. else{
  493. $order=explode('||',$ar['__order']);
  494. $ar['order']=array();
  495. foreach($order as $o){
  496. if(!empty($o)) $ar['order'][]=$o;
  497. }
  498. $ar['order']=implode(',',$ar['order']);
  499. }
  500. $ar['pagesize']=$ar['__pagesize'];
  501. $ar['first']=$params[$ar['itoid']]['first'];
  502. return $this->procQuery($ar);
  503. }*/
  504. /// Mode recherche
  505. function &procQuery($ar) {
  506. $p=new XParam($ar,array('first'=>0));
  507. $tplentry=$p->get('tplentry');
  508. $clearrequest=$p->get('clearrequest');
  509. $storedquery=$p->get('_storedquery');
  510. if(!empty($storedquery)) $clearrequest=1;
  511. $first=$p->get('first');
  512. $getselectonly=$p->get('getselectonly');
  513. $persistent=$p->get('_persistent');
  514. $pagesize=$p->get('pagesize');
  515. if(empty($pagesize)) $pagesize=$this->pagesize;
  516. $order=$p->get('order');
  517. $this->checkOrderFields($order);
  518. if($this->persistentquery && $persistent) clearSessionVar('filterquery'.$this->_moid);
  519. if($this->interactive) $this->_setSession('lastorder',$p->get('order'));
  520. $ar['pagesize']=$pagesize;
  521. $ar['table']=$this->table;
  522. $filter=$this->getFilter(true,$ar);
  523. if($filter===NULL) return NULL;
  524. $ar['_filter']=$filter;
  525. $ar['order']=$order;
  526. $ar['tplentry']=TZR_RETURN_DATA;
  527. // Patch de stockage des requêtes nommées
  528. if(XDataSource::sourceExists('QUERIES')) {
  529. $storename=$p->get('_storename');
  530. $storegroup=$p->get('_storegroup');
  531. if(!empty($storename)) {
  532. $fields=$p->get('_FIELDS');
  533. $st=$this->xset->captureQuery($ar);
  534. $queries=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS=QUERIES');
  535. $queries->procInput(array('title'=>$storename,'rtype'=>'table','modid'=>$this->_moid,'grp'=>$storegroup,
  536. 'query'=>addslashes(serialize($st))));
  537. }
  538. }
  539. if($this->isThereAQueryActive() && empty($clearrequest) && $this->interactive) {
  540. // recuperation de la requete active s'il y en a une
  541. $_storedquery=$this->_getSession('query');
  542. $ar=array_merge($_storedquery,$ar);
  543. }elseif(!empty($storedquery)){
  544. $_storedquery=$this->xset->prepareQuery($ar,$storedquery);
  545. $_storedquery=$this->xset->captureQuery($ar);
  546. $this->_setSession('query',$_storedquery);
  547. $ar=array_merge($_storedquery,$ar);
  548. $ar['_storedquery']='';
  549. } elseif($this->interactive && sessionActive()) {
  550. $fields=$p->get('_FIELDS');
  551. $_storedquery=$this->xset->captureQuery($ar);
  552. // Mode affinage
  553. if((int)$clearrequest==2){
  554. $_storedquery2=$this->_getSession('query');
  555. $_storedquery['_FIELDS']=array_merge($_storedquery2['_FIELDS'],$_storedquery['_FIELDS']);
  556. $_storedquery=array_merge($_storedquery2,$_storedquery);
  557. }
  558. $this->_setSession('query',$_storedquery);
  559. $ar=array_merge($_storedquery,$ar);
  560. }
  561. if(empty($ar['fmoid'])) $ar['fmoid']=$this->_moid;
  562. $ar['fieldssec']=$this->fieldssec;
  563. if($spesource){
  564. $ar['fields']=$this->table.'.*';
  565. list($select,$query)=$this->xset->getSelectQuery($ar);
  566. $ar['select']=str_ireplace('from '.$this->table,
  567. 'from '.$this->table.' left outer join '.$spesource.' on '.$this->table.'.KOID='.$spesource.'.mediaobj AND '.
  568. $this->table.'.LANG='.$spesource.'.LANG',$query);
  569. }
  570. $ar['selectedfields']=$p->get('selectedfields');
  571. if(empty($ar['selectedfields'])) $ar['selectedfields']=$this->xset->getPublished();
  572. $ar['selectedfields'][]='media';
  573. if($this->xset->fieldExists('mediahd')) $ar['selectedfields'][]='mediahd';
  574. $ar['selectedfields'][]='PUBLISH';
  575. $r=$this->xset->procQuery($ar);
  576. unset($ar['selectedfields']);
  577. if(!empty($getselectonly)) return $r;
  578. elseif($this->persistentquery && $persistent) setSessionVar('filterquery'.$this->_moid,$r['select']);
  579. $r['function']='procQuery';
  580. $this->applyObjectsSec($r);
  581. $this->browse_actions($r);
  582. if(XShell::admini_mode() && $this->quickquery) {
  583. $ar['tplentry']=TZR_RETURN_DATA;
  584. $r['_qq']=$this->quickquery($ar);
  585. }
  586. return XShell::toScreen1($tplentry, $r);
  587. }
  588. /// Parcours le module pour la selection d'un fichier
  589. public function &procQueryFiles($ar) {
  590. $browse = $this->procQuery($ar);
  591. // si pas de titre aux images, ajout depuis le champ title
  592. // permet la récupération d'un titre dans "parcourir les modules"
  593. foreach ($browse['lines_oid'] as $i => $oid) {
  594. if (preg_match('/title=""/', $browse['lines_omedia'][$i]->html)) {
  595. $browse['lines_omedia'][$i]->html = preg_replace('/(title|alt)=""/', '$1="'.$browse['lines_otitle'][$i]->html.'"', $browse['lines_omedia'][$i]->html);
  596. }
  597. if ($this->xset->fieldExists('mediahd') && preg_match('/title=""/', $browse['lines_omediahd'][$i]->html))
  598. $browse['lines_omediahd'][$i]->html = preg_replace('/(title|alt)=""/', '$1="'.$browse['lines_otitle'][$i]->html.'"', $browse['lines_omediahd'][$i]->html);
  599. }
  600. return $browse;
  601. }
  602. /// Affiche toutes les infos d'un media
  603. function &display($ar=NULL){
  604. $p=new XParam($ar,array());
  605. $tplentry=$p->get('tplentry');
  606. $ar['table']=$this->table;
  607. $ar['tplentry']=TZR_RETURN_DATA;
  608. if(empty($ar['fmoid'])) $ar['fmoid']=$this->_moid;
  609. $ar['fieldssec']=$this->fieldssec;
  610. $r2=$this->xset->display($ar);
  611. // Choix du templates d'édition s'il existe
  612. if(!empty($this->_templates) && !empty($this->templates) && $tplentry!=TZR_RETURN_DATA) {
  613. $r=$this->_templates->display(array('oid'=>$this->templates,
  614. '_options'=>array('error'=>'return'),
  615. 'tplentry'=>TZR_RETURN_DATA));
  616. XShell::toScreen1($tplentry.'t',$r);
  617. }
  618. return XShell::toScreen1($tplentry,$r2);
  619. }
  620. /// Supression de média
  621. function del($ar) {
  622. $p=new XParam($ar,NULL);
  623. $oids=$p->get('_selected');
  624. $selectedok=$p->get('_selectedok');
  625. $oids=array_keys($oids);
  626. if($selectedok!='ok' || empty($oids)) $oids=array($p->get('oid'));
  627. $ar['table']=$this->table;
  628. $ar['action']='OK';
  629. $this->xset->del($ar);
  630. }
  631. /// Insere une nouvelle fiche
  632. function &procInsert($ar) {
  633. $p=new XParam($ar,array('applyrules'=>true));
  634. $tplentry=$p->get('tplentry');
  635. $applyrules=$p->get('applyrules');
  636. if($this->procInsertCtrl($ar)) {
  637. $ar['table']=$this->table;
  638. $ar['tplentry']=TZR_RETURN_DATA;
  639. $ar['fieldssec']=$this->fieldssec;
  640. if(empty($ar['fmoid'])) $ar['fmoid']=$this->_moid;
  641. if(!$p->is_set('PUBLISH')) $ar['PUBLISH']=($this->defaultispublished?1:2);
  642. if($this->xset->fieldExists('mediahd') && empty($_FILES['media']['tmp_name']) && !empty($_FILES['mediahd']['tmp_name'])){
  643. $ld=$this->generateLDFromHD($_FILES['mediahd']['tmp_name'],$_FILES['mediahd']['name'],$_FILES['mediahd']['mime']);
  644. $ar['media']=$_FILES['mediahd'];
  645. $ar['media']['tmp_name']=$ld;
  646. $ar['media']['size']=NULL;
  647. }
  648. $r=$this->xset->procInput($ar);
  649. if($applyrules) XModRule::applyRules($this,$r['oid']);
  650. if($this->savenext=='display' && $tplentry!=TZR_RETURN_DATA){
  651. XShell::setnext($GLOBALS['TZR_SESSION_MANAGER']::complete_self(true,true).'&moid='.$this->_moid.'&function=display&'.
  652. 'template=xmodtable/view.html&tplentry=br&oid='.$r['oid']);
  653. }elseif($p->is_set('save_and_edit')){
  654. XShell::setnext($GLOBALS['TZR_SESSION_MANAGER']::complete_self(true,true).'&moid='.$this->_moid.'&function=edit&'.
  655. 'template=xmodtable/edit.html&tplentry=br&oid='.$r['oid']);
  656. }
  657. }elseif($tplentry!=TZR_RETURN_DATA){
  658. $options=&$this->xset->prepareReInput($ar);
  659. $t='xmodmedia/new.html';
  660. XShell::changeTemplate($t);
  661. XShell::setnext();
  662. $ar['options']=$options;
  663. $ar['tplentry']='br';
  664. $this->insert($ar);
  665. return;
  666. }
  667. return XShell::toScreen1($tplentry, $r);
  668. }
  669. /// Enregistre les modifications d'une fiche
  670. function &procEdit($ar=NULL){
  671. $p=new XParam($ar,array('applyrules'=>true));
  672. $ar['table']=$this->table;
  673. $ar['_track']=$this->trackchanges;
  674. $ar['_archive']=$this->archive;
  675. $ar['fieldssec']=$this->fieldssec;
  676. if(empty($ar['fmoid'])) $ar['fmoid']=$this->_moid;
  677. $oid=$p->get('oid');
  678. $tplentry=$p->get('tplentry');
  679. $editbatch=$p->get('editbatch');
  680. $mediadel=$p->get('media_del');
  681. $applyrules=$p->get('applyrules');
  682. // Edition d'une selection
  683. if(is_array($oid) && $editbatch) {
  684. $reeditone=$p->get('reeditone');
  685. unset($ar['reeditone']);
  686. foreach($oid as $oid1){
  687. $ar['oid']=$oid1;
  688. $this->procEdit($ar);
  689. }
  690. if($reeditone){
  691. $_storedquery=$this->xset->captureQuery(array('_options'=>array('local'=>true),'oids'=>$oid,'order'=>'KOID'));
  692. $this->_setSession('query',$_storedquery);
  693. $this->_setSession('lastorder','KOID');
  694. list($p,$n,$a)=$this->mkNavParms(array('_options'=>array('local'=>true)));
  695. XShell::setNext('moid='.$this->_moid.'&function=edit&template=xmodmedia/edit.html&tplentry=br&oid='.$a.'&usenav=1');
  696. }
  697. return;
  698. }
  699. if($this->procEditCtrl($ar)) {
  700. if($this->xset->fieldExists('mediahd') && empty($_FILES['media']['tmp_name']) && !empty($_FILES['mediahd']['tmp_name']) && $mediadel){
  701. $ld=$this->generateLDFromHD($_FILES['mediahd']['tmp_name'],$_FILES['mediahd']['name'],$_FILES['mediahd']['mime']);
  702. $ar['media']=$_FILES['mediahd'];
  703. $ar['media']['tmp_name']=$ld;
  704. $ar['media']['size']=NULL;
  705. }
  706. $ar['media_title'] = $p->get('media_title');
  707. $r=$this->xset->procEdit($ar);
  708. // Traitement des champs spécifiques
  709. if($applyrules) XModRule::applyRules($this,$oid);
  710. if($this->savenext && $this->savenext=='display' && $tplentry!=TZR_RETURN_DATA){
  711. XShell::setNext($GLOBALS['TZR_SESSION_MANAGER']::complete_self(true, true).
  712. '&moid='.$this->_moid.'&function=display&template=xmodtable/view.html&tplentry=br&oid='.$oid);
  713. }
  714. }else{
  715. $options=&$this->xset->prepareReEdit($ar);
  716. $t='xmodmedia/edit.html';
  717. XShell::changeTemplate($t);
  718. XShell::setNext();
  719. $ar['options']=$options;
  720. $ar['tplentry']= 'br';
  721. $this->edit($ar);
  722. return;
  723. }
  724. return $r;
  725. }
  726. /// Retourne la liste des formats de téléchargement disponibles sous forme de tableau
  727. function getAllDLFormats(){
  728. $formats=array();
  729. // vignette
  730. $formats['ro1']['image/*']['425x282']=array('label'=>'425 x 282','command'=>'-resize 425x282>');
  731. // web
  732. $formats['ro2']=$formats['ro1'];
  733. $formats['ro2']['image/*']['850x565']=array('label'=>'850 x 565','command'=>'-resize 850x565>');
  734. // basse Def
  735. $formats['ro3']=$formats['ro2'];
  736. $formats['ro3']['image/*']['1691x1123']=array('label'=>'1691 x 1123','command'=>'-resize 1691x1123>');
  737. $formats['ro3']['image/*']['2360x1568']=array('label'=>'2360 x 1568','command'=>'-resize 2360x1568>');
  738. // haute def (tous)
  739. $formats['ro']=$formats['ro3'];
  740. $formats['ro']['image/*']['4288x2848']=array('label'=>'4288 x 2848','command'=>'-resize 4288x2848>');
  741. $formats['ro']['image/*']['original']=array('label'=>'Original','command'=>'');
  742. $formats['rw']=$formats['rwv']=$formats['admin']=$formats['ro'];
  743. // Format par defaut si aucun autre n'est défini, a laisser en derniere position
  744. $formats['ro1']['*']['original']=$formats['ro2']['*']['original']=$formats['ro3']['*']['original']=$formats['ro']['*']['original']=
  745. $formats['rw']['*']['original']=$formats['admin']['*']['original']=array('label'=>'Original','command'=>null);
  746. return $formats;
  747. }
  748. /// Retourne la liste des formats de téléchargement disponibles en fonction des droits de l'utilisateur sur le module
  749. function &getSecDLFormats($objs=NULL){
  750. static $formats,$rw,$user,$lang_data,$colmodlvl,$file;
  751. // Cache en cas d'appel multiple de la méthode
  752. if(!$formats){
  753. $formats=$this->getAllDLFormats();
  754. $user=&XUser::get_user();
  755. $lang_data=XShell::getLangData();
  756. $rw=$this->secure('',':rw');
  757. $colmodlvl=XUser::secure8maxlevel($this->collectionmod,'',null,$lang_data);
  758. }
  759. // Si le parametre passé n'est pas un tableau d'oid ou un tableau de display
  760. if(!is_array($objs) || $objs['oid']) $objs=array($objs);
  761. $main=$files=array();
  762. foreach($objs as $i=>&$d){
  763. if(!is_array($d)){
  764. $d=$this->xset->display(array('tplentry'=>TZR_RETURN_DATA,'oid'=>$d,'selectedfields'=>$this->xset->fieldExists('mediahd')?array('collection','media','mediahd'):array('collection','media')));
  765. }
  766. $oid=$d['oid'];
  767. if(!$this->collectionmod->object_sec || $rw || !$d['ocollection']->oidcollection){
  768. $ri=$colmodlvl;
  769. }else{
  770. $oidsrights=$GLOBALS['XUSER']->getObjectsAccess($this->collectionmod,$lang_data,$d['ocollection']->oidcollection);
  771. $lvl0=$lvl1=array_shift($oidsrights);
  772. while($lvl2=array_shift($oidsrights)){
  773. $lvl1=array_diff_key($lvl1,$lvl2);
  774. }
  775. if(empty($lvl1)) $lvl1=$lvl0;
  776. $ri=array_pop(array_keys($lvl1));
  777. }
  778. if($this->xset->fieldExists('mediahd') && ($d['omediahd']->filename || @$d['omediahd']->isExternal)) $file=$d['omediahd'];
  779. elseif($d['omedia']->filename || @$d['omedia']->isExternal) $file=$d['omedia'];
  780. if($file->isExternal){
  781. continue;
  782. }elseif($file->mime && $formats[$ri]){
  783. foreach($formats[$ri] as $fmtmime=>$fmts){
  784. if(preg_match('#'.str_replace('*','.*',$fmtmime).'#',$file->mime)){
  785. break;
  786. }
  787. }
  788. }else{
  789. $fmts=$formats[$ri];
  790. }
  791. $file->formats=$fmts;
  792. $files[]=$file;
  793. if(!empty($main) && $main!==$fmts){
  794. $main=array('min'=>array('label'=>XLabels::getSysLabel('xmodmedia','downloadminsize'),'command'=>''),
  795. 'max'=>array('label'=>XLabels::getSysLabel('xmodmedia','downloadmaxsize'),'command'=>''));
  796. break;
  797. }else{
  798. $main=$fmts;
  799. }
  800. }
  801. return array('formats'=>$main,'files'=>$files);
  802. }
  803. /// Liste les formats possible pour le téléchargement. Si un seul format possible, on lance le téléchargement directement
  804. function chooseDownloadFormat($ar=NULL){
  805. $p=new XParam($ar,NULL);
  806. $oid=$p->get('oid');
  807. if(!is_array($oid)) $oid=array($oid);
  808. $fmts=$this->getSecDLFormats($oid);
  809. $fmts=$fmts['formats'];
  810. if(count($fmts)>1){
  811. $content=$this->getTemplateContent('xmodmedia/chooseDownloadFormat.html',array('br'=>array('fmts'=>$fmts,'oid'=>$oid)));
  812. echo json_encode(array('content'=>$content,'url'=>''));
  813. die();
  814. }elseif(count($fmts)==1){
  815. $fmts=array_keys($fmts);
  816. echo json_encode(array('content'=>'','url'=>$GLOBALS['TZR_SESSION_MANAGER']::complete_self().'moid='.$this->_moid.'&function=downloadMedias&'.http_build_query(array('oid'=>$oid)).'&dlfmt='.$fmts[0]));
  817. die();
  818. }
  819. }
  820. /// Telecharge des medias à un certain format
  821. function downloadMedias($ar=NULL){
  822. $p=new XParam($ar,NULL);
  823. $mimeClasse=XMimeTypes::getInstance();
  824. $dlfmt=$p->get('dlfmt');
  825. $oid=$p->get('oid');
  826. $dir=TZR_TMP_DIR.uniqid('dl');
  827. $fmts=$this->getSecDLFormats($oid);
  828. $files=$fmts['files'];
  829. $fmts=$fmts['formats'];
  830. if(!$fmts[$dlfmt]){
  831. die('Unauthorized format');
  832. }
  833. mkdir($dir);
  834. //compteur de fichier du meme nom
  835. $cnt = array();
  836. foreach($files as $file){
  837. $fileoriginalname = $file->originalname;
  838. if(strpos($fileoriginalname,'.') === false){
  839. //pas d'extension on tente de l'ajouter
  840. $mime=$mimeClasse->getValidMime($file->mime,$dir.'/'.$fileoriginalname,NULL);
  841. $fileoriginalname .= '.'.$mimeClasse->get_extension($mime);
  842. }
  843. if(file_exists($dir.'/'.$fileoriginalname)){
  844. $cnt[$fileoriginalname]++;
  845. //on ajoute un increment pour éviter d'écraser
  846. $fileoriginalname = addFileSuffix($fileoriginalname,$cnt[$fileoriginalname]);
  847. }
  848. if($dlfmt=='min'){
  849. $fmt=array_shift($file->formats);
  850. $command=$fmt['command'];
  851. }elseif($dlfmt=='max'){
  852. $fmt=array_pop($file->formats);
  853. $command=$fmt['command'];
  854. }else{
  855. $command=$fmts[$dlfmt]['command'];
  856. }
  857. if($file->isImage){
  858. if($command) {
  859. $cmdline
  860. = TZR_MOGRIFY_RESIZER
  861. . ' '
  862. . escapeshellcmd ($command)
  863. . ' '
  864. . single_quote_into_sh_arg ($file->filename)
  865. . ' '
  866. . single_quote_into_sh_arg ($dir . '/' . $fileoriginalname)
  867. ;
  868. system ($cmdline);
  869. }
  870. else copy($file->filename,$dir.'/'.$fileoriginalname);
  871. }else{
  872. copy($file->filename,$dir.'/'.$fileoriginalname);
  873. }
  874. }
  875. if(count($files)>1){
  876. exec('(cd '.$dir.'; zip -r '.$dir.'.zip .)2>&1 > '.TZR_TMP_DIR.'errorlog');
  877. $size=filesize($dir.'.zip');
  878. header('Content-type: application/zip');
  879. header('Content-disposition: attachment; filename=export_'.date('Y-m-d-H-i-s').'.zip');
  880. header('Accept-Ranges: bytes');
  881. header('Content-Length: '.$size);
  882. @readfile($dir.'.zip');
  883. register_shutdown_function('unlink',$dir.'.zip');
  884. }else{
  885. $downloadedFile = $dir.'/'.$fileoriginalname;
  886. $size=filesize($downloadedFile);
  887. $mime=$mimeClasse->getValidMime(NULL,$downloadedFile,NULL);
  888. header('Content-type: '.$mime);
  889. header('Content-disposition: attachment; filename='.$fileoriginalname);
  890. header('Accept-Ranges: bytes');
  891. header('Content-Length: '.$size);
  892. @readfile($downloadedFile);
  893. register_shutdown_function('unlink',$downloadedFile);
  894. }
  895. register_shutdown_function('XDir::unlink',$dir);
  896. die();
  897. }
  898. /// Prepare l'impression d'une planche contact
  899. function prePrintContactSheet($ar=NULL){
  900. $p=new XParam($ar,array());
  901. $tplentry=$p->get('tplentry');
  902. $ar['table']=$this->table;
  903. $ar['_filter']=$this->getFilter(true,$ar);
  904. $ar['tplentry']=TZR_RETURN_DATA;
  905. $ar['selectedfields']='all';
  906. $ar['pagesize']=1;
  907. // Recherche des templates d'impression
  908. if(empty($this->_templates)) $this->_templates=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS=TEMPLATES');
  909. if(!empty($this->_templates)) {
  910. $q1=$this->_templates->select_query(array('cond'=>array('modid'=>array('=',$this->_moid),
  911. 'gtype'=>array('=','xmodmedia_sheet_print'))));
  912. $r=&$this->_templates->browse(array('select'=>$q1,'pagesize'=>100,'tplentry'=>TZR_RETURN_DATA));
  913. XShell::toScreen1($tplentry.'t',$r);
  914. }
  915. // Calcul du nombre d'enregistrements impactes (passage d'oid, browseSelection ou browse/query classique)
  916. $r=&$this->xset->browse($ar);
  917. $r['_selected']=$p->get('_selected');
  918. if(is_array($r['_selected'])) {
  919. $r['record_count']=count($r['_selected']);
  920. }elseif($p->get('fromfunction')=='browseSelection') {
  921. $r['_selected']=$this->getSelectionFromSession();
  922. $r['record_count']=count($r['_selected']);
  923. }else{
  924. $context=$this->getContextQuery($ar,false);
  925. $ar['select']=$context['query'];
  926. $q=$this->xset->getSelectQuery($ar);
  927. $r['record_count']=countSelectQuery($q[1],true);
  928. $r['queryfields']=$context['all']['queryfields'];
  929. }
  930. return XShell::toScreen1($tplentry,$r);
  931. }
  932. /// Impression d'une planche contact
  933. function printContactSheet($ar=NULL){
  934. $p=new XParam($ar,array('pdfname'=>'contact_sheet.pdf'));
  935. $pdfname=$p->get('pdfname');
  936. $tplentry=$p->get('tplentry');
  937. $email=$p->get('dest');
  938. $fmt=$p->get('fmt');
  939. $dpi=$p->get('dpi');
  940. $mmsize=$p->get('mmsize');
  941. $q=$this->getContextQuery($ar);
  942. $ar['selected']='0';
  943. $ar['pagesize']='100000';
  944. $ar['select']=$q;
  945. $ar['norow']=1;
  946. $ar['nodef']=1;
  947. $ar['selectedfield']=($this->xset->fieldExists('mediahd'))?array('ref','title','media','mediahd'):array('ref','title','media');
  948. $ar['_options']=array('genpublishtag'=>false);
  949. $ar['tplentry']=TZR_RETURN_DATA;
  950. $ar['_format']='application/prince';
  951. $oldinteractive=$this->interactive;
  952. $this->interactive=false;
  953. $imgsize=round($mmsize['w']/10*0.3937*$dpi).'x'.round($mmsize['h']/10*0.3937*$dpi).'%3E';
  954. $tpldata['']=array('mmsize'=>$mmsize,'imgsize'=>$imgsize,'margin'=>$p->get('margin'),'imargin'=>$p->get('imargin'),
  955. 'pformat'=>$p->get('pformat'),'title'=>$p->get('title'),'descr'=>$p->get('descr'));
  956. if(Kernel::isAKoid($fmt)){
  957. // Impression via un template d'impressions
  958. $t=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$fmt);
  959. $dispfmt=$t->display(array('oid'=>$fmt,'tplentry'=>TZR_RETURN_DATA));
  960. $displayformats=explode(',',$dispfmt['odfmt']->raw);
  961. if(in_array('application/prince',$displayformats)) $content=$this->_printGetContent($ar,$dispfmt['oprint']->filename,'browse',$tpldata);
  962. }else{
  963. $content=$this->_printGetContent($ar,'xmodmedia/printContactSheet.xml','browse',$tpldata);
  964. }
  965. $this->interactive=$oldinteractive;
  966. $tmpname=princeTidyXML2PDF(NULL,$content);
  967. if(!empty($email) && !empty($tmpname)) {
  968. $content=file_get_contents($tmpname);
  969. $this->sendMail2User('print','',$email,NULL,false,NULL,$pdfname,$content,'application/pdf');
  970. }
  971. header('Content-type: application/pdf');
  972. header('Content-disposition: attachment; filename='.$pdfname);
  973. $size=filesize($tmpname);
  974. header('Accept-Ranges: bytes');
  975. header('Content-Length: '.$size);
  976. readfile($tmpname);
  977. unlink($tmpname);
  978. exit(0);
  979. }
  980. /// Recupere le contenu pour une impression
  981. function &_printGetContent($ar,$filename,$f,$tpldata=array()){
  982. $p=new XParam($ar,NULL);
  983. $title=$p->get('title');
  984. $res=&$this->$f($ar);
  985. $xt=new XTemplate('file:'.$filename);
  986. $labels=&$GLOBALS['XSHELL']->labels->get_labels(array('selectors'=>array('global'),'local'=>true));
  987. $xt->set_glob(array('labels'=>&$labels));
  988. $r3=array();
  989. $tpldata['']['moid']=$this->_moid;
  990. $tpldata['param']=array('title'=>$title);
  991. $tpldata['br']=$res;
  992. $tpldata['imod']=&XShell::from_screen('imod');
  993. $content=$xt->parse($tpldata,$r3,NULL);
  994. return $content;
  995. }
  996. /// Prepare l'exportation des media avec leurs meta
  997. function preExportFiles($ar=NULL){
  998. $p=new XParam($ar,array('fname'=>'Export'));
  999. $tplentry=$p->get('tplentry');
  1000. $q=$this->getContextQuery($ar);
  1001. $ar['selected']='0';
  1002. $ar['pagesize']='100000';
  1003. $ar['select']=$q;
  1004. $ar['norow']=1;
  1005. $ar['nodef']=1;
  1006. $ar['selectedfield']=($this->xset->fieldExists('mediahd'))?array('ref','title','media','mediahd'):array('ref','title','media');
  1007. $ar['_options']=array('genpublishtag'=>false);
  1008. $ar['tplentry']=TZR_RETURN_DATA;
  1009. $oldinteractive=$this->interactive;
  1010. $this->interactive=false;
  1011. $br=$this->browse($ar);
  1012. $this->interactive=$oldinteractive;
  1013. $size=0;
  1014. foreach($br['lines_oid'] as $i=>$oid){
  1015. $size+=(($this->xset->fieldExists('mediahd') && $br['lines_omediahd'][$i]->filename)?filesize($br['lines_omediahd'][$i]->filename):filesize($br['lines_omedia'][$i]->filename));
  1016. }
  1017. $br['size']=$size;
  1018. return XShell::toScreen1($tplentry,$br);
  1019. }
  1020. /// Exporte les medias avec leurs metas
  1021. function exportFiles($ar=NULL){
  1022. $p=new XParam($ar,array('fname'=>'Export','zip'=>true));
  1023. $fname=$p->get('fname');
  1024. $fmt=$p->get('fmt');
  1025. $zip=$p->get('zip');
  1026. $tplentry=$p->get('tplentry');
  1027. $q=$p->get('select','local');
  1028. if(empty($q)) $q=$this->getContextQuery($ar);
  1029. if($fmt!='ftp'){
  1030. $ar['selected']='0';
  1031. $ar['pagesize']='100000';
  1032. $ar['select']=$q;
  1033. $ar['norow']=1;
  1034. $ar['nodef']=1;
  1035. $ar['selectedfield']=array('KOID','media','mediahd');
  1036. $ar['_options']=array('genpublishtag'=>false);
  1037. $ar['tplentry']=TZR_RETURN_DATA;
  1038. $oldinteractive=$this->interactive;
  1039. $this->interactive=false;
  1040. $br=$this->browse($ar);
  1041. $dir=TZR_TMP_DIR.uniqid('exportmedia');
  1042. mkdir($dir);
  1043. foreach($br['lines_oid'] as $i=>$oid){
  1044. if($this->xset->fieldExists('mediahd') && !empty($br['lines_omediahd'][$i]->filename)){
  1045. $media=$br['lines_omediahd'][$i];
  1046. }else{
  1047. $media=$br['lines_omedia'][$i];
  1048. }
  1049. $fname=$media->originalname;
  1050. // Pour éviter qu'un fichier en ecrase un autre s'ils ont le même nom
  1051. if(file_exists($dir.'/'.$fname)){
  1052. $fname=substr(strrchr($oid,':'),1).'_'.$fname;
  1053. }
  1054. copy($media->filename,$dir.'/'.$fname);
  1055. }
  1056. $this->interactive=$oldinteractive;
  1057. }
  1058. // Mode : direct download, envoi mail, envoi ftp en asynchrone
  1059. if($fmt=='dl'){
  1060. exec('(cd '.$dir.'; zip -r '.$dir.'.zip .)2>&1 > '.TZR_TMP_DIR.'errorlog');
  1061. $size=filesize($dir.'.zip');
  1062. header('Content-type: application/zip');
  1063. header('Content-disposition: attachment; filename='.str_replace(' ','_',removeaccents($fname)).'.zip');
  1064. header('Accept-Ranges: bytes');
  1065. header('Content-Length: '.$size);
  1066. @readfile($dir.'.zip');
  1067. XDir::unlink($dir);
  1068. unlink($dir.'.zip');
  1069. die();
  1070. }elseif($fmt=='ftp'){
  1071. $scheduler=new XModScheduler();
  1072. $o=array();
  1073. $o['function']='exportFilesBatch';
  1074. $o['uid']=getSessionVar('UID');
  1075. $o['ftpserver']=$p->get('ftpserver');
  1076. $o['ftplogin']=$p->get('ftplogin');
  1077. $o['ftppassword']=$p->get('ftppassword');
  1078. $o['ftpdir']=$p->get('ftpdir');
  1079. $o['zip']=$p->get('zip');
  1080. $o['select']=$q;
  1081. $o['fname']=$fname.'.zip';
  1082. $scheduler->createJob($this->_moid,date('Y-m-d H:i:s'),'Export media',$o,'');
  1083. $message=XLabels::getSysLabel('xmodmedia','exportftpok');
  1084. XShell::toScreen2('','message',$message);
  1085. }elseif($fmt=='ftpbatch'){
  1086. $ftpserver=$ar['ftpserver'];
  1087. $ftpserver=str_replace('ftp://','',$ftpserver);
  1088. if(substr($ftpserver,-1)=='/') $ftpserver=substr($ftpserver,0,-1);
  1089. $ftplogin=$ar['ftplogin'];
  1090. $ftppass=$ar['ftppassword'];
  1091. $ftpdir=$ar['ftpdir'];
  1092. $reportto=$ar['reportto'];
  1093. if(empty($reportto)) $reportto=$GLOBALS['XUSER']->email();
  1094. $zipname=basename($dir.'.zip');
  1095. $msg=$msglist='';
  1096. $files=XDir::scan($dir);
  1097. if(empty($files)) return;
  1098. $ftp=ftp_connect($ftpserver);
  1099. if(!$ftp) $msg='Unable to connect to '.$ftpserver;
  1100. else{
  1101. $ftpl=ftp_login($ftp,$ftplogin,$ftppass);
  1102. if(!$ftpl) $msg='Error logging into '.$ftpserver;
  1103. else{
  1104. if(!empty($ftpdir) && !ftp_chdir($ftp,$ftpdir)) $msg='Unable to change dir to '.$ftpdir;
  1105. else{
  1106. if($zip){
  1107. exec('(cd '.$dir.'; zip -r '.$dir.'.zip .)2>&1 > '.TZR_TMP_DIR.'errorlog');
  1108. $ftpp=ftp_put($ftp,$zipname,$dir.'.zip',FTP_BINARY);
  1109. if(!$ftpp) $msg='Unable to send file on the ftp server '.$ftpserver;
  1110. }else{
  1111. foreach($files as $file){
  1112. $ftpp=ftp_put($ftp,basename($file),$file,FTP_BINARY);
  1113. if(!$ftpp) $msglist="\n".basename($file).' => transfert error';
  1114. else $msglist="\n".basename($file).' => ok';
  1115. }
  1116. }
  1117. }
  1118. }
  1119. ftp_close($ftp);
  1120. }
  1121. if($reportto){
  1122. if(!empty($msg)) $msg=sprintf(XLabels::getSysLabel('xmodmedia','exportftpbatcherror'),$msg);
  1123. elseif($zip) $msg=sprintf(XLabels::getSysLabel('xmodmedia','exportftpbatchok'),$zipname);
  1124. else $msg=sprintf(XLabels::getSysLabel('xmodmedia','exportftpbatchok'),$ftpdir).$msglist;
  1125. $this->sendMail2User(sprintf(XLabels::getSysLabel('xmodmedia','exportftpbatchsub'),$this->modulename),$msg,$reportto);
  1126. }
  1127. XDir::unlink($dir);
  1128. @unlink($dir.'.zip');
  1129. }
  1130. }
  1131. /// Exporte les media avec leurs meta via tache planifiée
  1132. function exportFilesBatch(XModScheduler &$scheduler,&$o,&$more){
  1133. $ar=(array)$more;
  1134. $ar['fmt']='ftpbatch';
  1135. $this->exportFiles($ar);
  1136. }
  1137. /// Prépare une importation à la volée
  1138. function importOnFly($ar=NULL){
  1139. $p=new XParam($ar,NULL);
  1140. $tplentry=$p->get('tplentry');
  1141. $xds = XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$this->imports);
  1142. $r = $xds->input(array('tplentry'=>TZR_RETURN_DATA));
  1143. $o=new XFolderDef((object)(array('FIELD'=>'medias','FTYPE'=>'XFolderDef')));
  1144. $o->table=$this->table;
  1145. $o->multifilesupload=true;
  1146. $r['omedias']=$o->edit();
  1147. $r['hashd']=$this->xset->fieldExists('mediahd');
  1148. return XShell::toScreen1($tplentry,$r);
  1149. }
  1150. /// Importe des medias à la volée
  1151. function procImportOnFly($ar=NULL){
  1152. $p=new XParam($ar,NULL);
  1153. $hd=$p->get('hdmedia');
  1154. $uniqname=$p->get('uniqname');
  1155. $publishauto=$p->get('publishauto');
  1156. $uniqid=$p->get('medias_HID');
  1157. $tmpdir=TZR_TMP_DIR.'upload'.$uniqid.'/'.$this->table.'/medias';
  1158. $flist=unserialize(file_get_contents($tmpdir.'/'.$uniqid.'_catalog.txt'));
  1159. $ari=array('tpl…

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