Source for file FileLibrary.class.php

Documentation is available at FileLibrary.class.php

  1. /**
  2.  * Содержит класс FileLibrary
  3.  *
  4.  * @package energine
  5.  * @subpackage share
  6.  * @author dr.Pavka
  7.  * @copyright ColoCall 2006
  8.  * @version $Id: fsource_energine_share_modulessharecomponentsFileLibrary.class.php.html,v 1.1 2007/09/17 14:32:36 pavka Exp $
  9.  */
  10.  
  11. require_once 'core/modules/image/components/Image.class.php';
  12. require_once('core/modules/share/components/DataSet.class.php');
  13. require_once('core/framework/DirectoryObject.class.php');
  14. require_once('core/framework/FileUploader.class.php');
  15. require_once('core/modules/share/components/JSONUploadBuilder.class.php');
  16.  
  17. /**
  18.  * Библитека изображений
  19.  *
  20.  * @package energine
  21.  * @subpackage share
  22.  */
  23. class FileLibrary extends DataSet {
  24.     /**
  25.      * Путь к директории в которой хранятся загруженные пользователями файлы
  26.      *
  27.      */
  28.     const UPLOADS_MAIN_DIR = 'uploads';
  29.  
  30.     /**
  31.      * Uploads Directory
  32.      *
  33.      * @var DirectoryObject 
  34.      * @access private
  35.      */
  36.     private $uploadsDir;
  37.  
  38.     /**
  39.      * Конструктор класса
  40.      *
  41.      * @param string $name 
  42.      * @param string $module 
  43.      * @param Document $document 
  44.      * @param array $params 
  45.      * @access public
  46.      */
  47.     public function __construct($name$moduleDocument $document,  array $params null{
  48.         parent::__construct($name$module$document,  $params);
  49.         $this->setProperty('grid''grid');
  50.         $this->setType(self::COMPONENT_TYPE_LIST);
  51.         $this->setTitle($this->translate('TXT_'.strtoupper($this->getName())));
  52.         //Отключили pager
  53.         $this->setParam('recordsPerPage'false);
  54.         if (!isset($_POST['path'])) {
  55.             $path self::UPLOADS_MAIN_DIR;
  56.         }
  57.         else {
  58.             $path $_POST['path'];
  59.         }
  60.         $this->uploadsDir DirectoryObject::loadFrom($path);
  61.     }
  62.  
  63.     /**
  64.      * Переопределен параметр active
  65.      *
  66.      * @return int 
  67.      * @access protected
  68.      */
  69.  
  70.     protected function defineParams({
  71.         $result = array_merge(parent::defineParams(),
  72.         array(
  73.         'active'=>true,
  74.         ));
  75.         return $result;
  76.     }
  77.  
  78.     /**
  79.      * Загружает описание данных из таблицы
  80.      *
  81.      * @return DataDescription 
  82.      * @access protected
  83.      */
  84.  
  85.     protected function loadDataDescription({
  86.         $result $this->dbh->getColumnsInfo(DirectoryObject::TABLE_NAME);
  87.         $result['upl_mime_type'array(
  88.         'length'=>100,
  89.         'nullable'=>false,
  90.         'default' => false,
  91.         'key' => false,
  92.         'type' => FieldDescription::FIELD_TYPE_STRING
  93.         );
  94.         $result['className'array(
  95.         'length'=>100,
  96.         'nullable'=>false,
  97.         'default' => false,
  98.         'key' => false,
  99.         'type' => FieldDescription::FIELD_TYPE_STRING
  100.         );
  101.         foreach ($result as $key => $value{
  102.             $result[$key]['tabName']  $this->getTitle();
  103.         }
  104.         return $result;
  105.     }
  106.  
  107.     /**
  108.      * Метод загрузки данных
  109.      *
  110.      * @return void 
  111.      * @access public
  112.      */
  113.  
  114.     public function loadData({
  115.         if ($this->getAction(== 'getRawData'{
  116.             $result array();
  117.             if ($this->uploadsDir->getPath(!= self::UPLOADS_MAIN_DIR{
  118.                 $result $this->uploadsDir->asArray();
  119.                 $result['upl_path'= dirname($result['upl_path']);
  120.                 $result['upl_name''...';
  121.             }
  122.             $this->uploadsDir->open();
  123.  
  124.             if (!empty($result)) {
  125.                 $result = array_merge(array($result)$this->uploadsDir->asArray());
  126.             }
  127.             else {
  128.                 $result $this->uploadsDir->asArray();
  129.             }
  130.  
  131.             $result = array_map(array($this'addClass')$result);
  132.         }
  133.         elseif ($this->getAction(== self::DEFAULT_ACTION_NAME{
  134.             $result false;
  135.         }
  136.         else {
  137.             $result parent::loadData();
  138.         }
  139.         return $result;
  140.     }
  141.  
  142.     /**
  143.      * На основании значения константы набора типов формируется поле типа class
  144.      *
  145.      * @return array 
  146.      * @access private
  147.      */
  148.  
  149.     private function addClass($row{
  150.         switch ($row['upl_mime_type']{
  151.             case FileSystemObject::FOLDER_TYPE_FAMILY:
  152.                 $row['className''folder';
  153.                 break;
  154.             case FileSystemObject::IMAGE_TYPE_FAMILY:
  155.                 $row['className''image';
  156.             break;
  157.             case FileSystemObject::TXT_TYPE_FAMILY:
  158.                 $row['className''txt';
  159.             break;
  160.             case FileSystemObject::PDF_TYPE_FAMILY:
  161.                 $row['className''pdf';
  162.             break;
  163.             default:
  164.                 $row['className''undefined';
  165.                 break;
  166.         }
  167.         return $row;
  168.     }
  169.  
  170.     /**
  171.      * Выводит данные в JSON формате для AJAX
  172.      *
  173.      * @return void 
  174.      * @access protected
  175.      */
  176.  
  177.     protected function getRawData({
  178.         try {
  179.             $this->config->setCurrentMethod(self::DEFAULT_ACTION_NAME);
  180.             $this->setBuilder(new JSONUploadBuilder());
  181.  
  182.  
  183.             $this->setDataDescription($this->createDataDescription());
  184.             $this->getBuilder()->setDataDescription($this->getDataDescription());
  185.             $this->getBuilder()->setCurrentDir($this->uploadsDir->getPath());
  186.  
  187.             $data $this->createData();
  188.             if ($data instanceof Data{
  189.                 $this->setData($data);
  190.                 $this->getBuilder()->setData($this->getData());
  191.             }
  192.  
  193.             if ($this->getBuilder()->build()) {
  194.                 $result $this->getBuilder()->getResult();
  195.             }
  196.             else {
  197.                 $result $this->getBuilder()->getErrors();
  198.             }
  199.  
  200.         }
  201.         catch (Exception $e){
  202.             $message['errors'][array('message'=>$e->getMessage().current($e->getCustomMessage()));
  203.             $result = json_encode(array_merge(array('result'=>false'header'=>$this->translate('TXT_SHIT_HAPPENS'))$message));
  204.         }
  205.  
  206.         $this->response->write($result);
  207.         $this->response->commit();
  208.     }
  209.  
  210.     /**
  211.      * Добавляем таб
  212.      *
  213.      * @return DOMNode 
  214.      * @access public
  215.      */
  216.  
  217.     public function prepare({
  218.         parent::prepare();
  219.         $this->addTab($this->buildTab($this->getTitle()));
  220.     }
  221.  
  222.     /**
  223.      * Method Description
  224.      *
  225.      * @return type 
  226.      * @access protected
  227.      */
  228.  
  229.      protected function main({
  230.         parent::main();
  231.         $this->setProperty('allowed_file_type''all');
  232.         if ($params $this->getActionParams()) {
  233.             if (is_array($params&& !empty($params&& $params[0== 'image-only'{
  234.                 $this->setProperty('allowed_file_type''image');
  235.             }
  236.         }
  237.      }
  238.  
  239.     /**
  240.      * Метод выводит форму создания новой папки
  241.      *
  242.      * @return void 
  243.      * @access protected
  244.      */
  245.  
  246.     protected function addDir({
  247.         $this->setType(self::COMPONENT_TYPE_FORM_ADD);
  248.         $this->prepare();
  249.     }
  250.  
  251.     /**
  252.      * Сохранение данных о папке
  253.      *
  254.      * @return void 
  255.      * @access protected
  256.      */
  257.  
  258.     protected function saveDir({
  259.         try {
  260.             $folder new DirectoryObject();
  261.             $folder->create($_POST);
  262.  
  263.             $JSONResponse array(
  264.             'result' => true,
  265.             'mode' => 'insert'
  266.             );
  267.         }
  268.         catch (SystemException $e){
  269.             $message['errors'][array('message'=>$e->getMessage().current($e->getCustomMessage()));
  270.             $JSONResponse = array_merge(array('result'=>false'header'=>$this->translate('TXT_SHIT_HAPPENS'))$message);
  271.  
  272.         }
  273.         $this->response->write(json_encode($JSONResponse));
  274.         $this->response->commit();
  275.     }
  276.  
  277.     /**
  278.      * Метод сохранения файла
  279.      *
  280.      * @return void 
  281.      * @access protected
  282.      */
  283.  
  284.     protected function save({
  285.         try {
  286.             $folder new FileObject();
  287.             $folder->create($_POST);
  288.  
  289.             $JSONResponse array(
  290.             'result' => true,
  291.             'mode' => 'insert'
  292.             );
  293.         }
  294.         catch (SystemException $e){
  295.             $message['errors'][array('message'=>$e->getMessage().current($e->getCustomMessage()));
  296.             $JSONResponse = array_merge(array('result'=>false'header'=>$this->translate('TXT_SHIT_HAPPENS'))$message);
  297.  
  298.         }
  299.         $this->response->write(json_encode($JSONResponse));
  300.         $this->response->commit();
  301.     }
  302.  
  303.     /**
  304.      * Удаление папки/файла
  305.      *
  306.      * @return void 
  307.      * @access protected
  308.      */
  309.  
  310.     protected function delete({
  311.         try {
  312.             if (!isset($_POST['file'])) {
  313.  
  314.             }
  315.             if (($fileType = key($_POST['file'])) == 'folder'{
  316.                 $file DirectoryObject::loadFrom($_POST['file'][$fileType]);
  317.             }
  318.             else {
  319.                 $file FileObject::loadFrom($_POST['file'][$fileType]);
  320.             }
  321.  
  322.             $file->delete();
  323.  
  324.             $JSONResponse array(
  325.             'result' => true,
  326.             'mode' => 'delete'
  327.             );
  328.         }
  329.         catch (SystemException $e){
  330.             $message['errors'][array('message'=>$e->getMessage().current($e->getCustomMessage()));
  331.             $JSONResponse = array_merge(array('result'=>false'header'=>$this->translate('TXT_SHIT_HAPPENS'))$message);
  332.  
  333.         }
  334.         $this->response->write(json_encode($JSONResponse));
  335.         $this->response->commit();
  336.  
  337.     }
  338.  
  339.     /**
  340.      * Выводит форму создания файла
  341.      *
  342.      * @return void 
  343.      * @access protected
  344.      */
  345.  
  346.     protected function add({
  347.         $this->setType(self::COMPONENT_TYPE_FORM_ADD);
  348.         $this->prepare();
  349.     }
  350.  
  351.     /**
  352.      * Метод для заливки файла
  353.      * Вызывается в невидимом фрейме и должен отдать HTML страницу включающаю скрипт
  354.      *
  355.      * @return void 
  356.      * @access protected
  357.      * @final
  358.      */
  359.     final protected function upload({
  360.         try {
  361.             $js =
  362.             'var doc = window.parent.document;'."\n".
  363.             'var path = doc.getElementById(\'path\');'."\n".
  364.             'var pb = doc.getElementById(\'progress_bar\'); '."\n".
  365.             'var iframe = doc.getElementById(\'uploader\'); '."\n";
  366.  
  367.             if (empty($_FILES|| !isset($_FILES['file'])) {
  368.                 throw new SystemException('ERR_NO_FILE'SystemException::ERR_CRITICAL);
  369.             }
  370.  
  371.             $uploader new FileUploader();
  372.             $uploader->setFile($_FILES['file']);
  373.             $uploader->upload('tmp/');
  374.             $fileName $uploader->getFileObjectName();
  375.             if (FileSystemObject::getTypeInfo($fileNametrue== FileSystemObject::IMAGE_TYPE_FAMILY{
  376.                 $js .= 'iframe.preview.src = "'.$fileName.'";';
  377.             }
  378.             else {
  379.                 $js .= 'iframe.preview.src = "images/icons/icon_undefined.gif";';
  380.             }
  381.             $js .= sprintf(
  382.             'path.parentNode.removeChild(path);'.
  383.             'pb.parentNode.removeChild(pb); '.
  384.             'iframe.filename.value = "%s"; '.
  385.             'iframe.parentNode.removeChild(iframe);',
  386.             $_POST['path'].'/'.basename($fileName)
  387.             );
  388.  
  389.         }
  390.         catch (SystemException $e{
  391.             $js .=
  392.             'path.parentNode.removeChild(path);'."\n".
  393.             'pb.parentNode.removeChild(pb); '."\n".
  394.             'alert(\''.$this->translate('TXT_SHIT_HAPPENS').': '.$e->getMessage().'\'); '.
  395.             'iframe.parentNode.removeChild(iframe); '."\n";
  396.         }
  397.  
  398.         $responseText ''.$js.' ';
  399.         $response Response::getInstance();
  400.         $response->setHeader('Content-Type''text/html; charset=UTF-8');
  401.         $response->write($responseText);
  402.         $response->commit();
  403.     }
  404.  
  405.     /**
  406.      * Переименование файла/папки
  407.      *
  408.      * @return void 
  409.      * @access protected
  410.      */
  411.  
  412.      protected function rename({
  413.         try {
  414.             if (!isset($_POST['file'])) {
  415.  
  416.             }
  417.             if (($fileType = key($_POST['file'])) == 'folder'{
  418.                 $file DirectoryObject::loadFrom($_POST['file'][$fileType]);
  419.             }
  420.             else {
  421.                 $file FileObject::loadFrom($_POST['file'][$fileType]);
  422.             }
  423.  
  424.             $file->rename($_POST['name']);
  425.  
  426.             $JSONResponse array(
  427.             'result' => true,
  428.             'mode' => 'insert'
  429.             );
  430.         }
  431.         catch (SystemException $e){
  432.             $message['errors'][array('message'=>$e->getMessage().current($e->getCustomMessage()));
  433.             $JSONResponse = array_merge(array('result'=>false'header'=>$this->translate('TXT_SHIT_HAPPENS'))$message);
  434.  
  435.         }
  436.         $this->response->write(json_encode($JSONResponse));
  437.         $this->response->commit();
  438.      }
  439. }

Documentation generated on Mon, 17 Sep 2007 13:29:04 +0300 by phpDocumentor 1.4.0a2