PageRenderTime 54ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/apps/editar/modules/navigator/actions/actions.class.php

http://pumukit.googlecode.com/
PHP | 373 lines | 255 code | 58 blank | 60 comment | 26 complexity | f088fb802bb3f8f1514eb4d85074c4de MD5 | raw file
Possible License(s): LGPL-2.1
  1. <?php
  2. /**
  3. * MODULO NAVIGATOR.
  4. * Modulo de administracion de los ficheros publicos del portal. Con este modulo se puede administrar de forma remota,
  5. * a traves del navegador WEB, los directorios y ficheros publicos como: ficheros adjuntos de los objetos multimedia,
  6. * las capturas de los archivos de video y banners e imagenes para ilustrar tanto templates del portal como cabeceras de las series.
  7. *
  8. * @package pumukit
  9. * @subpackage navigator
  10. * @author Ruben Gonzalez Gonzalez (rubenrua at uvigo dot com)
  11. * @version 1.0
  12. */
  13. class navigatorActions extends sfActions
  14. {
  15. protected
  16. $uploadDir = '',
  17. $uploadDirName = '',
  18. $useThumbnails = false,
  19. $thumbnailsDir = '';
  20. public function preExecute()
  21. {
  22. if (sfConfig::get('app_sfMediaLibrary_use_thumbnails', true) && class_exists('sfThumbnail'))
  23. {
  24. $this->useThumbnails = true;
  25. $this->thumbnailsDir = sfConfig::get('app_sfMediaLibrary_thumbnails_dir', 'thumbnail');
  26. }
  27. $this->uploadDirName = sfConfig::get('app_sfMediaLibrary_upload_dir', sfConfig::get('sf_upload_dir_name').'');
  28. $this->uploadDir = sfConfig::get('sf_web_dir').'/'.$this->uploadDirName;
  29. }
  30. /**
  31. * -- INDEX -- /editar.php/navigator
  32. * Muestra la lista de directorio y archivos de la ruta que se pasa por parametro.
  33. *
  34. * Accion por defecto en la aplicacion. Parametro por URL dir
  35. *
  36. */
  37. public function executeIndex()
  38. {
  39. sfConfig::set('template_menu','active');
  40. $currentDir = $this->dot2slash($this->getRequestParameter('dir'));
  41. $this->currentDir = $this->getRequestParameter('dir');
  42. $this->current_dir_slash = $currentDir.'/';
  43. $this->webAbsCurrentDir = $this->getRequest()->getRelativeUrlRoot().'/'.$this->uploadDirName.'/'.$currentDir;
  44. $this->absCurrentDir = $this->uploadDir.'/'.$currentDir;
  45. $this->forward404Unless(is_dir($this->absCurrentDir));
  46. // directories
  47. $dirsQuery = sfFinder::type('dir')->maxdepth(0)->prune('.*')->discard('.*')->relative();
  48. if ($this->useThumbnails)
  49. {
  50. $dirsQuery = $dirsQuery->discard($this->thumbnailsDir);
  51. }
  52. $dirs = $dirsQuery->in($this->absCurrentDir);
  53. sort($dirs);
  54. $this->dirs = $dirs;
  55. // files, with stats
  56. $files = sfFinder::type('file')->maxdepth(0)->prune('.*')->discard('.*')->relative()->in($this->absCurrentDir);
  57. sort($files);
  58. $infos = array();
  59. foreach ($files as $file)
  60. {
  61. $ext = substr($file, strrpos($file, '.') - strlen($file) + 1);
  62. if (!$this->getRequestParameter('images_only') || $this->isImage($ext))
  63. {
  64. $infos[$file] = $this->getInfo($file);
  65. }
  66. }
  67. $this->files = $infos;
  68. // parent dir
  69. $tmp = explode(' ', $this->currentDir);
  70. array_pop($tmp);
  71. $this->parentDir = implode(' ', $tmp);
  72. }
  73. protected function isImage($ext)
  74. {
  75. return in_array(strtolower($ext), array('png', 'jpg', 'gif'));
  76. }
  77. public function executeChoice()
  78. {
  79. $this->executeIndex();
  80. }
  81. /**
  82. * -- RENAME -- /editar.php/index/rename
  83. * Renombra un fichero o directorio, si alguna ruta de la base de datos posee el nombre a renombrar,
  84. * esta tambien se actualiza.
  85. *
  86. * Parametros por POST current_path, name, new_name y type
  87. */
  88. public function executeRename()
  89. {
  90. $currentDir = $this->dot2slash($this->getRequestParameter('current_path'));
  91. $this->currentDir = $this->getRequestParameter('current_path');
  92. $type = $this->getRequestParameter('type');
  93. $this->count = $this->getRequestParameter('count');
  94. $this->webAbsCurrentDir = '/'.$this->uploadDirName.'/'.$currentDir;
  95. $absCurrentDir = $this->uploadDir.'/'.$currentDir;
  96. $this->forward404Unless(is_dir($absCurrentDir));
  97. $name = $this->getRequestParameter('name');
  98. $new_name = $this->getRequestParameter('new_name');
  99. if ($type === 'folder')
  100. {
  101. $new_name = $this->sanitizeDir($new_name);
  102. $this->forward404Unless(is_dir($absCurrentDir.'/'.$name));
  103. }
  104. else
  105. {
  106. $new_name = $this->sanitizeFile($new_name);
  107. $this->forward404Unless(is_file($absCurrentDir.'/'.$name));
  108. }
  109. @rename($absCurrentDir.'/'.$name, $absCurrentDir.'/'.$new_name);
  110. if(substr($currentDir, 0, 5) === '/pic/'){
  111. $c = new Criteria();
  112. $c->add(PicPeer::URL, '/uploads' . $currentDir . '/' . $name);
  113. $pics = PicPeer::doSelect($c);
  114. foreach($pics as $pic){
  115. $pic->setUrl('/uploads' . $currentDir . '/' . $new_name);
  116. $pic->save();
  117. }
  118. }elseif(substr($currentDir, 0, 10) === '/material/'){
  119. $c = new Criteria();
  120. $c->add(MaterialPeer::URL, '/uploads' . $currentDir . '/' . $currentFile);
  121. $materials = MaterialPeer::doSelect($c);
  122. foreach($materials as $material){
  123. $material->setUrl('/uploads' . $currentDir . '/' . $new_name);
  124. $material->save();
  125. }
  126. }
  127. if ($this->useThumbnails && ($type === 'file') && file_exists($absCurrentDir.'/'.$this->thumbnailsDir.'/'.$name))
  128. {
  129. @rename($absCurrentDir.'/'.$this->thumbnailsDir.'/'.$name, $absCurrentDir.'/'.$this->thumbnailsDir.'/'.$new_name);
  130. }
  131. $this->absCurrentDir = $absCurrentDir;
  132. $this->info = array();
  133. if (is_dir($absCurrentDir.'/'.$new_name) and ($type === 'folder'))
  134. {
  135. $this->name = $new_name;
  136. }
  137. else if (is_file($absCurrentDir.'/'.$new_name) and ($type === 'file'))
  138. {
  139. $this->name = $new_name;
  140. $this->info = $this->getInfo($new_name);
  141. }
  142. else
  143. {
  144. $this->name = $name;
  145. $this->info = $this->getInfo($name);
  146. }
  147. $this->type = $type;
  148. }
  149. protected function getInfo($filename)
  150. {
  151. $info = array();
  152. $info['ext'] = substr($filename, strrpos($filename, '.') - strlen($filename) + 1);
  153. $stats = stat($this->absCurrentDir.'/'.$filename);
  154. $info['size'] = $stats['size'];
  155. $info['thumbnail'] = true;
  156. if ($this->isImage($info['ext']))
  157. {
  158. if ($this->useThumbnails && is_readable(sfConfig::get('sf_web_dir').$this->webAbsCurrentDir.'/'.$this->thumbnailsDir.'/'.$filename))
  159. {
  160. $info['icon'] = $this->webAbsCurrentDir.'/'.$this->thumbnailsDir.'/'.$filename;
  161. }
  162. else
  163. {
  164. $info['icon'] = $this->webAbsCurrentDir.'/'.$filename;
  165. $info['thumbnail'] = false;
  166. }
  167. }
  168. else
  169. {
  170. if (is_readable(sfConfig::get('sf_web_dir').'/images/admin/navigator/'.$info['ext'].'.png'))
  171. {
  172. $info['icon'] = '/images/admin/navigator/'.$info['ext'].'.png';
  173. }
  174. else
  175. {
  176. $info['icon'] = '/images/admin/navigator/unknown.png';
  177. }
  178. }
  179. return $info;
  180. }
  181. /**
  182. * -- UPLOAD -- /editar.php/index/upload
  183. * Sube un archivo local a servidor, lo situa en la ruta indicada en el formulario
  184. *
  185. * Parametros por POST
  186. */
  187. public function executeUpload()
  188. {
  189. $currentDir = $this->dot2slash($this->getRequestParameter('current_dir'));
  190. $webAbsCurrentDir = '/'.$this->uploadDirName.'/'.$currentDir;
  191. $absCurrentDir = $this->uploadDir.'/'.$currentDir;
  192. $this->forward404Unless(is_dir($absCurrentDir));
  193. $filename = $this->sanitizeFile($this->getRequest()->getFileName('file'));
  194. $info['ext'] = substr($filename, strrpos($filename, '.') - strlen($filename) + 1);
  195. if ($this->isImage($info['ext']) && $this->useThumbnails)
  196. {
  197. if (!is_dir($absCurrentDir.'/'.$this->thumbnailsDir))
  198. {
  199. // If the thumbnails directory doesn't exist, create it now
  200. $old = umask(0000);
  201. @mkdir($absCurrentDir.'/'.$this->thumbnailsDir, 0777, true);
  202. umask($old);
  203. }
  204. $thumbnail = new sfThumbnail(64, 64);
  205. $thumbnail->loadFile($this->getRequest()->getFilePath('file'));
  206. $thumbnail->save($absCurrentDir.'/'.$this->thumbnailsDir.'/'.$filename);
  207. }
  208. $this->getRequest()->moveFile('file', $absCurrentDir.'/'.$filename);
  209. $this->redirect('navigator/index?dir='.$this->getRequestParameter('current_dir'));
  210. }
  211. /**
  212. * -- DELETE -- /editar.php/index/delete
  213. * Borra un fichero. Actualiza la base de datos si es necesario.
  214. *
  215. * Parametros por POST current_path y name
  216. */
  217. public function executeDelete()
  218. {
  219. $currentDir = $this->dot2slash($this->getRequestParameter('current_path'));
  220. $currentFile = $this->getRequestParameter('name');
  221. $absCurrentFile = $this->uploadDir.'/'.$currentDir.'/'.$currentFile;
  222. $this->forward404Unless(is_readable($absCurrentFile));
  223. if(substr($currentDir, 0, 5) === '/pic/'){
  224. $c = new Criteria();
  225. $c->add(PicPeer::URL, '/uploads' . $currentDir . '/' . $currentFile);
  226. PicPeer::doDelete($c);
  227. }elseif(substr($currentDir, 0, 10) === '/material/'){
  228. $c = new Criteria();
  229. $c->add(MaterialPeer::URL, '/uploads' . $currentDir . '/' . $currentFile);
  230. MaterialPeer::doDelete($c);
  231. }
  232. unlink($absCurrentFile);
  233. if ($this->useThumbnails)
  234. {
  235. $absThumbnailFile = $this->uploadDir.'/'.$currentDir.'/'.$this->thumbnailsDir.'/'.$currentFile;
  236. if (is_readable($absThumbnailFile))
  237. {
  238. unlink($absThumbnailFile);
  239. }
  240. }
  241. $this->redirect('navigator/index?dir='.$this->getRequestParameter('current_path'));
  242. }
  243. /**
  244. * -- MKDIR -- /editar.php/index/mkdir
  245. * Crea una carpeta.
  246. *
  247. * Parametros por POST current_path y name
  248. */
  249. public function executeMkdir()
  250. {
  251. $currentDir = $this->dot2slash($this->getRequestParameter('current_dir'));
  252. $dirName = $this->sanitizeDir($this->getRequestParameter('name'));
  253. $absCurrentDir = $this->uploadDir.'/'.(empty($currentDir) ? '' : $currentDir.'/').$dirName;
  254. $old = umask(0000);
  255. @mkdir($absCurrentDir, 0777);
  256. if ($this->useThumbnails)
  257. {
  258. @mkdir($absCurrentDir.'/'.$this->thumbnailsDir, 0777);
  259. }
  260. umask($old);
  261. $this->redirect('navigator/index?dir='.$this->getRequestParameter('current_dir'));
  262. }
  263. /**
  264. * -- RMDIR -- /editar.php/index/rmdir
  265. * Borra un directorio vacio
  266. *
  267. * Parametros por POST current_path y name
  268. */
  269. public function executeRmdir()
  270. {
  271. $currentDir = $this->dot2slash('.'.$this->getRequestParameter('current_path'));
  272. $absCurrentDir = $this->uploadDir.'/'.$currentDir.'/'.$this->getRequestParameter('name');
  273. $this->forward404Unless(is_dir($absCurrentDir));
  274. if($this->useThumbnails && is_readable($absCurrentDir.'/'.$this->thumbnailsDir))
  275. {
  276. rmdir($absCurrentDir.'/'.$this->thumbnailsDir);
  277. }
  278. rmdir($absCurrentDir);
  279. $this->redirect('navigator/index?dir='.$this->getRequestParameter('current_path'));
  280. }
  281. /**
  282. * -- LIST -- /editar.php/index/list
  283. * Lista de forma asincrona el contenido de un directorio del servidor. El resultado es un vector codificador en JSON que procesa el cliente.
  284. *
  285. * Funcion asincrona, Parametros por POST current_path y name
  286. */
  287. public function executeList()
  288. {
  289. $dir = urldecode($this->getRequestParameter('dir'));
  290. $dir = str_replace(sfConfig::get('app_videoserv_url'), sfConfig::get('app_videoserv_mount'), $dir, $count0);
  291. $dir = str_replace(sfConfig::get('app_transcoder_path_win'), sfConfig::get('app_transcoder_path_unix'), $dir, $count1);
  292. $dirs = sfFinder::type('dir')->maxdepth(0)->prune('.*')->discard('.*')->relative()->in($dir);
  293. rsort($dirs);
  294. $files = sfFinder::type('file')->maxdepth(0)->prune('.*')->discard('.*')->relative()->in($dir);
  295. $sal = array('dirs' => $dirs, 'files' => $files);
  296. //$sal = sfFinder::type('any')->in($dir);
  297. return $this->renderText(json_encode($sal));
  298. }
  299. protected function dot2slash($txt)
  300. {
  301. return preg_replace('#[\+\s]+#', '/', $txt);
  302. }
  303. protected function slash2dot($txt)
  304. {
  305. return preg_replace('#/+#', '+', $txt);
  306. }
  307. protected function sanitizeDir($dir)
  308. {
  309. return preg_replace('/[^a-z0-9_-]/i', '_', $dir);
  310. }
  311. protected function sanitizeFile($file)
  312. {
  313. return preg_replace('/[^a-z0-9_\.-]/i', '_', $file);
  314. }
  315. }