Просмотр исходного кода

#556 Files module - search by files content

Alex Trofimov 9 лет назад
Родитель
Сommit
f4be185c8d

+ 1 - 0
install/classes/BxDolInstallSiteConfig.php

@@ -454,6 +454,7 @@ EOF;
         $aMarkers['time'] = time();
         $aMarkers['secret'] = genRndPwd(11);
         $aMarkers['ffmpeg_path'] = $aMarkers['root_dir'] . 'plugins/ffmpeg/ffmpeg.exe';
+        $aMarkers['java_path'] = trim(`whereis java`);
 
         return $aMarkers;
     }

+ 1 - 0
install/patterns/header.inc.php

@@ -13,6 +13,7 @@ define('BX_DATABASE_USER', '%DB_USER%'); ///< db user
 define('BX_DATABASE_PASS', '%DB_PASSWORD%'); ///< db password
 define('BX_DATABASE_NAME', '%DB_NAME%'); ///< db name
 
+define('BX_SYSTEM_JAVA', '%JAVA_PATH%'); ///< path to java binary
 define('BX_SYSTEM_FFMPEG', '%FFMPEG_PATH%'); ///< path to ffmpeg binary
 define('BX_DOL_SECRET', '%SECRET%'); ///< secret word
 

+ 3 - 1
modules/base/general/classes/BxBaseModGeneralFormEntry.php

@@ -143,8 +143,10 @@ class BxBaseModGeneralFormEntry extends BxTemplFormView
         foreach ($aGhostFiles as $aFile) {
             if (is_array($mixedFileIds) && !in_array($aFile['id'], $mixedFileIds))
                 continue;
+
             if ($aFile['private'])
-                $oStorage->setFilePrivate ($aFile['id'], 0);
+                $oStorage->setFilePrivate ($aFile['id'], 1);
+            
             if ($iContentId)
                 $this->_associalFileWithContent($oStorage, $aFile['id'], $iProfileId, $iContentId, $sFieldFile);
         }

+ 20 - 0
modules/boonex/files/classes/BxFilesCronProcessData.php

@@ -0,0 +1,20 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Files Files
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxFilesCronProcessData extends BxDolCron
+{
+    function processing()
+    {
+        BxDolService::call('bx_files', 'process_files_data', array(3));
+    }
+}
+
+/** @} */

+ 18 - 0
modules/boonex/files/classes/BxFilesDb.php

@@ -24,6 +24,24 @@ class BxFilesDb extends BxBaseModTextDb
         $sQuery = $this->prepare ("SELECT `c`.`title` FROM `" . $this->_oConfig->CNF['TABLE_ENTRIES'] . "` AS `c` INNER JOIN `sys_storage_ghosts` AS `g` ON(`g`.`object` = ? AND `g`.`content_id` = `c`.`id`) WHERE `g`.`id` = ?", $this->_oConfig->CNF['TABLE_FILES'], $iFileId);
         return $this->getOne($sQuery);
     }
+
+    public function updateFileId ($iContentId, $iFileId)
+    {
+        $sQuery = $this->prepare ("UPDATE `" . $this->_oConfig->CNF['TABLE_ENTRIES'] . "` SET `file_id` = ?, `data` = '', `data_processed` = 0 WHERE `id` = ?", $iFileId, $iContentId);
+        return $this->query($sQuery);
+    }
+    
+    public function updateFileData ($iContentId, $sData, $iDataProcessed = 1)
+    {
+        $sQuery = $this->prepare ("UPDATE `" . $this->_oConfig->CNF['TABLE_ENTRIES'] . "` SET `data` = ?, `data_processed` = ? WHERE `id` = ?", $sData, $iDataProcessed, $iContentId);
+        return $this->query($sQuery);
+    }
+
+    public function getNotProcessedFiles ($iLimit)
+    {
+        $sQuery = $this->prepare ("SELECT * FROM `" . $this->_oConfig->CNF['TABLE_ENTRIES'] . "` WHERE `data_processed` = 0 ORDER BY `added` ASC LIMIT ?", $iLimit);
+        return $this->getAll($sQuery);
+    }
 }
 
 /** @} */

+ 7 - 0
modules/boonex/files/classes/BxFilesFormEntry.php

@@ -38,6 +38,13 @@ class BxFilesFormEntry extends BxBaseModTextFormEntry
             $this->aInputs[$CNF['FIELD_ALLOW_VIEW_TO']] = array_merge($this->aInputs[$CNF['FIELD_ALLOW_VIEW_TO']], $aGroupChooser, $aSave);
 		}
     }
+
+    protected function _associalFileWithContent($oStorage, $iFileId, $iProfileId, $iContentId, $sPictureField = '')
+    {
+        parent::_associalFileWithContent($oStorage, $iFileId, $iProfileId, $iContentId, $sPictureField);
+
+        $this->_oModule->_oDb->updateFileId($iContentId, $iFileId);
+    }
 }
 
 /** @} */

+ 39 - 0
modules/boonex/files/classes/BxFilesModule.php

@@ -133,6 +133,45 @@ class BxFilesModule extends BxBaseModTextModule
     {
         return $this->_serviceTemplateFunc ('entryFilePreview', $iContentId);
     }
+
+    public function serviceProcessFilesData($iNumberOfFilesToProcessAtOnce = 3)
+    {
+        $CNF = $this->_oConfig->CNF;
+        
+        if (!defined('BX_SYSTEM_JAVA') || !constant('BX_SYSTEM_JAVA'))
+            return;
+        
+        $a = $this->_oDb->getNotProcessedFiles($iNumberOfFilesToProcessAtOnce);
+        if (!$a)
+            return;
+
+        $oStorage = BxDolStorage::getObjectInstance($CNF['OBJECT_STORAGE']);
+        if (!$oStorage)
+            return false;
+        
+        foreach ($a as $aContentInfo) {
+            $aFile = $this->getContentFile($aContentInfo);
+            if (!$aFile) {
+                $this->_oDb->updateFileData ($aContentInfo[$CNF['FIELD_ID']], '');
+                continue;
+            }
+
+            $sFileUrl = $oStorage->getFileUrlById($aFile['id']);
+            $sFilePath = BX_DIRECTORY_PATH_TMP . $aFile['remote_id'] . '.' . $aFile['ext'];
+            @file_put_contents($sFilePath, file_get_contents($sFileUrl));
+            if (!file_exists($sFilePath)) {
+                $this->_oDb->updateFileData ($aContentInfo[$CNF['FIELD_ID']], '');
+                continue;
+            }
+            
+            $sCommand = '"' . constant('BX_SYSTEM_JAVA') . '" -jar "' . $this->_oConfig->getHomePath() . 'data/tika-app.jar" --encoding=UTF-8 --text "' . $sFilePath . '"';
+            $sData = `$sCommand`;
+
+            @unlink($sFilePath);
+
+            $this->_oDb->updateFileData ($aContentInfo[$CNF['FIELD_ID']], $sData);
+        }
+    }
 }
 
 /** @} */

+ 1 - 0
modules/boonex/files/data/.htaccess

@@ -0,0 +1 @@
+Deny from all

BIN
modules/boonex/files/data/tika-app.jar


+ 3 - 1
modules/boonex/files/install/langs/en.xml

@@ -27,7 +27,9 @@
 	<string name="_bx_files_form_entry_input_cat"><![CDATA[Category]]></string>
     <string name="_bx_files_form_entry_input_cat_err"><![CDATA[Please select category]]></string>
 	<string name="_bx_files_form_entry_input_sys_desc"><![CDATA[Description]]></string>
-	<string name="_bx_files_form_entry_input_desc"><![CDATA[Description]]></string>
+    <string name="_bx_files_form_entry_input_desc"><![CDATA[Description]]></string>
+	<string name="_bx_files_form_entry_input_sys_data"><![CDATA[File data]]></string>
+	<string name="_bx_files_form_entry_input_data"><![CDATA[File data]]></string>
 	<string name="_bx_files_form_entry_input_sys_delete_confirm"><![CDATA[Delete confirmation]]></string>
 	<string name="_bx_files_form_entry_input_delete_confirm"><![CDATA[I am sure I want to delete this file]]></string>
 	<string name="_bx_files_form_entry_input_delete_confirm_info"><![CDATA[This action can not be undone]]></string>

+ 4 - 0
modules/boonex/files/install/sql/disable.sql

@@ -43,3 +43,7 @@ DELETE FROM `sys_objects_uploader` WHERE `object` IN('bx_files_simple', 'bx_file
 SET @iHandler := (SELECT `id` FROM `sys_alerts_handlers` WHERE `name` = 'bx_files' LIMIT 1);
 DELETE FROM `sys_alerts` WHERE `handler_id` = @iHandler;
 DELETE FROM `sys_alerts_handlers` WHERE `id` = @iHandler;
+
+-- CRON
+DELETE FROM `sys_cron_jobs` WHERE `name` = 'bx_files_process_data';
+

+ 6 - 1
modules/boonex/files/install/sql/enable.sql

@@ -15,7 +15,7 @@ INSERT INTO `sys_options` (`name`, `value`, `category_id`, `caption`, `type`, `c
 ('bx_files_plain_summary_chars', '240', @iCategId, '_bx_files_option_plain_summary_chars', 'digit', '', '', '', 2),
 ('bx_files_per_page_browse', '12', @iCategId, '_bx_files_option_per_page_browse', 'digit', '', '', '', 10),
 ('bx_files_rss_num', '10', @iCategId, '_bx_files_option_rss_num', 'digit', '', '', '', 20),
-('bx_files_searchable_fields', 'title,desc', @iCategId, '_bx_files_option_searchable_fields', 'list', '', '', 'a:2:{s:6:"module";s:8:"bx_files";s:6:"method";s:21:"get_searchable_fields";}', 30);
+('bx_files_searchable_fields', 'title,desc,data', @iCategId, '_bx_files_option_searchable_fields', 'list', '', '', 'a:2:{s:6:"module";s:8:"bx_files";s:6:"method";s:21:"get_searchable_fields";}', 30);
 
 -- PAGE: create entry
 
@@ -381,3 +381,8 @@ INSERT INTO `sys_alerts` (`unit`, `action`, `handler_id`) VALUES
 ('system', 'save_setting', @iHandler),
 ('profile', 'delete', @iHandler);
 
+-- CRON
+
+INSERT INTO `sys_cron_jobs` (`name`, `time`, `class`, `file`, `service_call`) VALUES
+('bx_files_process_data', '* * * * *', 'BxFilesCronProcessData', 'modules/boonex/files/classes/BxFilesCronProcessData.php', '');
+

+ 8 - 4
modules/boonex/files/install/sql/install.sql

@@ -12,6 +12,8 @@ CREATE TABLE IF NOT EXISTS `bx_files_main` (
   `title` varchar(255) NOT NULL,
   `cat` int(11) NOT NULL,
   `desc` text NOT NULL,
+  `data` text NOT NULL,
+  `data_processed` tinyint(4) NOT NULL DEFAULT '0',
   `views` int(11) NOT NULL default '0',
   `rate` float NOT NULL default '0',
   `votes` int(11) NOT NULL default '0',
@@ -22,7 +24,7 @@ CREATE TABLE IF NOT EXISTS `bx_files_main` (
   `status` enum('active','hidden') NOT NULL DEFAULT 'active',
   `status_admin` enum('active','hidden') NOT NULL DEFAULT 'active',
   PRIMARY KEY (`id`),
-  FULLTEXT KEY `search_fields` (`title`,`desc`)
+  FULLTEXT KEY `search_fields` (`title`,`desc`,`data`)
 );
 
 -- TABLE: storages & transcoders
@@ -181,6 +183,7 @@ INSERT INTO `sys_form_inputs`(`object`, `module`, `name`, `value`, `values`, `ch
 ('bx_files', 'bx_files', 'do_submit', '_bx_files_form_entry_input_do_submit', '', 0, 'submit', '_bx_files_form_entry_input_sys_do_submit', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
 ('bx_files', 'bx_files', 'attachments', 'a:1:{i:0;s:14:"bx_files_html5";}', 'a:2:{s:15:"bx_files_simple";s:26:"_sys_uploader_simple_title";s:14:"bx_files_html5";s:25:"_sys_uploader_html5_title";}', 0, 'files', '_bx_files_form_entry_input_sys_attachments', '_bx_files_form_entry_input_attachments', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
 ('bx_files', 'bx_files', 'desc', '', '', 0, 'textarea', '_bx_files_form_entry_input_sys_desc', '_bx_files_form_entry_input_desc', '', 0, 0, 2, '', '', '', '', '', '', 'XssHtml', '', 1, 0),
+('bx_files', 'bx_files', 'data', '', '', 0, 'textarea', '_bx_files_form_entry_input_sys_data', '_bx_files_form_entry_input_data', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
 ('bx_files', 'bx_files', 'title', '', '', 0, 'text', '_bx_files_form_entry_input_sys_title', '_bx_files_form_entry_input_title', '', 1, 0, 0, '', '', '', 'Avail', '', '_bx_files_form_entry_input_title_err', 'Xss', '', 1, 0),
 ('bx_files', 'bx_files', 'cat', '', '#!bx_files_cats', 0, 'select', '_bx_files_form_entry_input_sys_cat', '_bx_files_form_entry_input_cat', '', 1, 0, 0, '', '', '', 'avail', '', '_bx_files_form_entry_input_cat_err', 'Xss', '', 1, 0),
 ('bx_files', 'bx_files', 'added', '', '', 0, 'datetime', '_bx_files_form_entry_input_sys_date_added', '_bx_files_form_entry_input_date_added', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
@@ -207,9 +210,10 @@ INSERT INTO `sys_form_display_inputs`(`display_name`, `input_name`, `visible_for
 ('bx_files_entry_edit', 'title', 2147483647, 1, 3),
 ('bx_files_entry_edit', 'cat', 2147483647, 1, 4),
 ('bx_files_entry_edit', 'desc', 2147483647, 1, 5),
-('bx_files_entry_edit', 'attachments', 2147483647, 1, 6),
-('bx_files_entry_edit', 'allow_view_to', 2147483647, 1, 7),
-('bx_files_entry_edit', 'do_submit', 2147483647, 1, 8),
+('bx_files_entry_edit', 'data', 0, 1, 6),
+('bx_files_entry_edit', 'attachments', 2147483647, 1, 7),
+('bx_files_entry_edit', 'allow_view_to', 2147483647, 1, 8),
+('bx_files_entry_edit', 'do_submit', 2147483647, 1, 9),
 ('bx_files_entry_view', 'attachments', 2147483647, 0, 0),
 ('bx_files_entry_view', 'delete_confirm', 2147483647, 0, 0),
 ('bx_files_entry_view', 'desc', 2147483647, 0, 0),