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

Ticket #652 - Data indexing interface.

AntonLV 9 лет назад
Родитель
Сommit
a45a945bdd

+ 1 - 0
inc/classes/BxDol.php

@@ -100,5 +100,6 @@ interface iBxDolContentInfoService
     public function serviceGetThumb ($iContentId);
     public function serviceGetInfo ($iContentId, $bSearchableFieldsOnly = true);
     public function serviceGetSearchResultUnit ($iContentId, $sUnitTemplate = '');
+    public function serviceGetAll ($aParams = array());
 }
 /** @} */

+ 8 - 0
inc/classes/BxDolCmts.php

@@ -947,6 +947,14 @@ class BxDolCmts extends BxDolFactory implements iBxDolReplaceable, iBxDolContent
         return $this->getComment($aComment, array(), array('type' => BX_CMT_DISPLAY_FLAT, 'view_only' => true));
     }
 
+    public function serviceGetAll ($aParams = array())
+    {
+        if(empty($aParams) || !is_array($aParams))
+            $aParams = array('type' => 'all');
+
+        return $this->_oQuery->getCommentsBy($aParams);
+    }
+
     /**
      * Internal functions
      */

+ 15 - 2
inc/classes/BxDolCmtsQuery.php

@@ -202,14 +202,27 @@ class BxDolCmtsQuery extends BxDolDb
             		$sWhereClause .= " AND `{$this->_sTable}`.`cmt_author_id` " . (isset($aParams['others']) && (int)$aParams['others'] == 1 ? "<>" : "=") . " :cmt_author_id";
             	}
 
-                $sOrderClause = "ORDER BY `{$this->_sTable}`.`cmt_time` DESC";
+                $sOrderClause = "`{$this->_sTable}`.`cmt_time` DESC";
                 $sLimitClause = "";
                 if(isset($aParams['per_page']))
-                	$sLimitClause = $this->prepareAsString("LIMIT ?, ?", $aParams['start'], $aParams['per_page']);
+                	$sLimitClause = $this->prepareAsString("?, ?", $aParams['start'], $aParams['per_page']);
 
                 break;
+
+            case 'all_ids':
+                $aMethod['name'] = 'getColumn';
+
+                $sSelectClause = "`{$this->_sTable}`.`cmt_id`";
+                $sOrderClause =  "`{$this->_sTable}`.`cmt_time` ASC";
+                break;
         }
 
+        if(!empty($sOrderClause))
+            $sOrderClause = 'ORDER BY ' . $sOrderClause;
+
+        if(!empty($sLimitClause))
+            $sLimitClause = 'LIMIT ' . $sLimitClause;
+
         $aMethod['params'][0] = "SELECT " . $sSelectClause . " FROM `{$this->_sTable}` " . $sJoinClause . " WHERE 1 " . $sWhereClause . " " . $sOrderClause . " " . $sLimitClause;
 		return call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
     }

+ 5 - 0
inc/classes/BxDolContentInfo.php

@@ -282,6 +282,11 @@ class BxDolContentInfo extends BxDolFactory implements iBxDolFactoryObject
         return $this->_call('get_search_result_unit', $iContentId, $sUnitTemplate);
     }
 
+    public function getAll ($aParams = array())
+    {
+        return $this->_call('get_all', $aParams);
+    }
+
     protected function _call($sMethod)
     {
         if(!BxDolRequest::serviceExists($this->_sSystem, $sMethod))

+ 5 - 0
inc/classes/BxDolContentInfoCmts.php

@@ -69,6 +69,11 @@ class BxDolContentInfoCmts extends BxDolContentInfo
         $this->_oCmts->addCssJs();
         return '<ul class="cmts">' . $this->_oCmts->serviceGetSearchResultUnit($iContentId, $sUnitTemplate) . '</ul>';
     }
+
+    public function getAll ($aParams = array())
+    {
+        return $this->_oCmts->serviceGetAll($aParams);
+    }
 }
 
 /** @} */

+ 46 - 0
modules/base/general/classes/BxBaseModGeneralDb.php

@@ -22,6 +22,52 @@ class BxBaseModGeneralDb extends BxDolModuleDb
         $this->_oConfig = $oConfig;
     }
 
+    function getEntriesBy($aParams = array())
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+    	$aMethod = array('name' => 'getAll', 'params' => array(0 => 'query', 1 => array()));
+        $sSelectClause = $sJoinClause = $sWhereClause = $sOrderClause = $sLimitClause = "";
+
+        $sSelectClause = "`{$CNF['TABLE_ENTRIES']}`.*";
+
+        switch($aParams['type']) {
+            case 'id':
+                $aMethod['name'] = 'getRow';
+                $aMethod['params'][1]['id'] = (int)$aParams['id'];
+
+                $sWhereClause .= " AND `{$CNF['TABLE_ENTRIES']}`.`" . $CNF['FIELD_ID'] . "` = :id";
+                break;
+
+            case 'author':
+            	$aMethod['name'] = 'getRow';
+                $aMethod['params'][1]['author'] = (int)$aParams['author'];
+
+                $sWhereClause .= " AND `{$CNF['TABLE_ENTRIES']}`.`" . $CNF['FIELD_AUTHOR'] . "` = :author";
+                break;
+
+            case 'all_ids':
+                $aMethod['name'] = 'getColumn';
+
+                $sSelectClause = "`{$CNF['TABLE_ENTRIES']}`.`" . $CNF['FIELD_ID'] . "`";
+                $sOrderClause .=  "`{$CNF['TABLE_ENTRIES']}`.`" . $CNF['FIELD_ADDED'] . "` ASC";
+                break;
+
+            case 'all':
+                $sOrderClause .=  "`{$CNF['TABLE_ENTRIES']}`.`" . $CNF['FIELD_ADDED'] . "` ASC";
+                break;
+        }
+
+        if(!empty($sOrderClause))
+            $sOrderClause = 'ORDER BY ' . $sOrderClause;
+
+        if(!empty($sLimitClause))
+            $sLimitClause = 'LIMIT ' . $sLimitClause;
+
+        $aMethod['params'][0] = "SELECT " . $sSelectClause . " FROM `{$CNF['TABLE_ENTRIES']}` " . $sJoinClause . " WHERE 1 " . $sWhereClause . " " . $sOrderClause . " " . $sLimitClause;
+		return call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
+    }
+
     public function getEntriesByAuthor ($iProfileId)
     {
         $sQuery = $this->prepare ("SELECT * FROM `" . $this->_oConfig->CNF['TABLE_ENTRIES'] . "` WHERE `" . $this->_oConfig->CNF['FIELD_AUTHOR'] . "` = ?", $iProfileId);

+ 14 - 1
modules/base/general/classes/BxBaseModGeneralModule.php

@@ -94,7 +94,12 @@ class BxBaseModGeneralModule extends BxDolModule
         if(empty($aFields))
             return array();
 
-        return array_flip(array_intersect(array_flip($aContentInfo), $aFields));
+        $aResult = array();
+        foreach($aFields as $sField)
+            if(isset($aContentInfo[$sField]))
+                $aResult[$sField] = $aContentInfo[$sField];
+
+        return $aResult;
     }
 
     public function serviceGetSearchResultUnit ($iContentId, $sUnitTemplate = '')
@@ -109,6 +114,14 @@ class BxBaseModGeneralModule extends BxDolModule
         return $this->_oTemplate->unit($aContentInfo, true, $sUnitTemplate);
     }
 
+    public function serviceGetAll ($aParams = array())
+    {
+        if(empty($aParams) || !is_array($aParams))
+            $aParams = array('type' => 'all');
+
+        return $this->_oDb->getEntriesBy($aParams);
+    }
+
     public function serviceModuleIcon ()
     {
         return isset($this->_oConfig->CNF['ICON']) ? $this->_oConfig->CNF['ICON'] : '';

+ 1 - 1
modules/boonex/elasticsearch/classes/BxElsApi.php

@@ -3,7 +3,7 @@
  * Copyright (c) UNA, Inc - https://una.io
  * MIT License - https://opensource.org/licenses/MIT
  *
- * @defgroup    HostingAPI Hosting API
+ * @defgroup    ElasticSearch ElasticSearch
  * @ingroup     UnaModules
  *
  * @{

+ 12 - 0
modules/boonex/elasticsearch/classes/BxElsConfig.php

@@ -27,6 +27,18 @@ class BxElsConfig extends BxBaseModGeneralConfig
         	'FIELD_LINK' => 'link',
             'FIELD_TITLE' => 'title',
             'FIELD_TEXT' => 'text',
+
+            // objects
+        	'OBJECT_FORM_MANAGE' => 'bx_elasticsearch_manage',
+            'OBJECT_FORM_MANAGE_DISPLAY_INDEX' => 'bx_elasticsearch_manage_index',
+        );
+
+        $this->_aJsClasses = array(
+            'manage' => 'BxElsManage'
+        );
+
+        $this->_aJsObjects = array(
+            'manage' => 'oBxElsManage'
         );
     }
 

+ 56 - 0
modules/boonex/elasticsearch/classes/BxElsFormManage.php

@@ -0,0 +1,56 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    ElasticSearch ElasticSearch
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * Search form
+ */
+class BxElsFormManage extends BxTemplFormView
+{
+	protected $_sModule;
+	protected $_oModule;
+
+    public function __construct($aInfo, $oTemplate = false)
+    {
+        $this->_sModule = 'bx_elasticsearch';
+        $this->_oModule = BxDolModule::getInstance($this->_sModule);
+
+        parent::__construct($aInfo, $oTemplate);
+
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        if(isset($this->aInputs['index'])) {
+            $this->aInputs['index']['value'] = $this->_oModule->_oConfig->getIndex();
+        }
+
+        if(isset($this->aInputs['type'])) {
+            $aObjects = BxDolContentInfo::getSystems();
+            ksort($aObjects);
+
+            $aTypes = array(
+                array('key' => '', 'value' => _t('_bx_elasticsearch_form_manage_input_type_value_all'))
+            );
+            foreach ($aObjects as $sObject => $aObject)
+                $aTypes[] = array('key' => $sObject, 'value' => _t($aObject['title']));
+
+            $this->aInputs['type']['values'] = $aTypes;
+        }
+    }
+
+    public function getCode($bDynamicMode = false)
+    {
+        return $this->oTemplate->getJsCode('manage') . $this->oTemplate->parseHtmlByName('manage_form.html', array(
+            'form_id' => $this->getId(),
+            'form' => parent::getCode($bDynamicMode)
+        ));
+    }
+}
+
+/** @} */

+ 67 - 32
modules/boonex/elasticsearch/classes/BxElsModule.php

@@ -174,85 +174,120 @@ class BxElsModule extends BxBaseModGeneralModule
         return $this->_oApi->getData($sIndex, $sType, $iContentId);
     }
 
-    public function serviceAdd($iContentId, $mixedContenInfo)
+    public function serviceAdd($iContentId, $mixedContentInfo, $sIndex = '')
     {
-        if(is_array($mixedContenInfo)) {
-            $sMethod = 'getObjectInstanceByAlert' . bx_gen_method_name($mixedContenInfo['alert_type']);
-            $mixedContenInfo = BxDolContentInfo::$sMethod($mixedContenInfo['unit'], $mixedContenInfo['action']);
+        if(is_array($mixedContentInfo)) {
+            $sMethod = 'getObjectInstanceByAlert' . bx_gen_method_name($mixedContentInfo['alert_type']);
+            $mixedContentInfo = BxDolContentInfo::$sMethod($mixedContentInfo['unit'], $mixedContentInfo['action']);
         }
 
-        if(!($mixedContenInfo instanceof BxDolContentInfo))
+        if(!($mixedContentInfo instanceof BxDolContentInfo))
             return false;
 
         $CNF = &$this->_oConfig->CNF;
 
+        if(empty($sIndex))
+            $sIndex = $this->_oConfig->getIndex();
+
         $aInfo = array(
-            $CNF['FIELD_AUTHOR'] => $mixedContenInfo->getContentAuthor($iContentId),
-            $CNF['FIELD_ADDED'] => $mixedContenInfo->getContentDateAdded($iContentId),
-            $CNF['FIELD_CHANGED'] => $mixedContenInfo->getContentDateChanged($iContentId),
-            $CNF['FIELD_LINK'] => $mixedContenInfo->getContentLink($iContentId),
-            $CNF['FIELD_TITLE'] => $mixedContenInfo->getContentTitle($iContentId),
-            $CNF['FIELD_TEXT'] => $mixedContenInfo->getContentText($iContentId),
+            $CNF['FIELD_AUTHOR'] => $mixedContentInfo->getContentAuthor($iContentId),
+            $CNF['FIELD_ADDED'] => $mixedContentInfo->getContentDateAdded($iContentId),
+            $CNF['FIELD_CHANGED'] => $mixedContentInfo->getContentDateChanged($iContentId),
+            $CNF['FIELD_LINK'] => $mixedContentInfo->getContentLink($iContentId),
+            $CNF['FIELD_TITLE'] => $mixedContentInfo->getContentTitle($iContentId),
+            $CNF['FIELD_TEXT'] => $mixedContentInfo->getContentText($iContentId),
         );
-        $aInfo = array_merge($aInfo, $mixedContenInfo->getContentInfo($iContentId));
+        $aInfo = array_merge($aInfo, $mixedContentInfo->getContentInfo($iContentId));
 
-        $mixedResult = $this->_oApi->indexData($this->_oConfig->getIndex(), $mixedContenInfo->getName(), $iContentId, $aInfo);
+        $mixedResult = $this->_oApi->indexData($sIndex, $mixedContentInfo->getName(), $iContentId, $aInfo);
         if($mixedResult === null)
             return false;
 
         return $mixedResult['result'] == 'created';
     }
 
-    public function serviceUpdate($iContentId, $mixedContenInfo)
+    public function serviceUpdate($iContentId, $mixedContentInfo, $sIndex = '')
     {
-        if(is_array($mixedContenInfo)) {
-            $sMethod = 'getObjectInstanceByAlert' . bx_gen_method_name($mixedContenInfo['alert_type']);
-            $mixedContenInfo = BxDolContentInfo::$sMethod($mixedContenInfo['unit'], $mixedContenInfo['action']);
+        if(is_array($mixedContentInfo)) {
+            $sMethod = 'getObjectInstanceByAlert' . bx_gen_method_name($mixedContentInfo['alert_type']);
+            $mixedContentInfo = BxDolContentInfo::$sMethod($mixedContentInfo['unit'], $mixedContentInfo['action']);
         }
 
-        if(!($mixedContenInfo instanceof BxDolContentInfo))
+        if(!($mixedContentInfo instanceof BxDolContentInfo))
             return false;
 
         $CNF = &$this->_oConfig->CNF;
 
+        if(empty($sIndex))
+            $sIndex = $this->_oConfig->getIndex();
+
         $aInfo = array(
-            $CNF['FIELD_AUTHOR'] => $mixedContenInfo->getContentAuthor($iContentId),
-            $CNF['FIELD_ADDED'] => $mixedContenInfo->getContentDateAdded($iContentId),
-            $CNF['FIELD_CHANGED'] => $mixedContenInfo->getContentDateChanged($iContentId),
-            $CNF['FIELD_LINK'] => $mixedContenInfo->getContentLink($iContentId),
-            $CNF['FIELD_TITLE'] => $mixedContenInfo->getContentTitle($iContentId),
-            $CNF['FIELD_TEXT'] => $mixedContenInfo->getContentText($iContentId),
+            $CNF['FIELD_AUTHOR'] => $mixedContentInfo->getContentAuthor($iContentId),
+            $CNF['FIELD_ADDED'] => $mixedContentInfo->getContentDateAdded($iContentId),
+            $CNF['FIELD_CHANGED'] => $mixedContentInfo->getContentDateChanged($iContentId),
+            $CNF['FIELD_LINK'] => $mixedContentInfo->getContentLink($iContentId),
+            $CNF['FIELD_TITLE'] => $mixedContentInfo->getContentTitle($iContentId),
+            $CNF['FIELD_TEXT'] => $mixedContentInfo->getContentText($iContentId),
         );
-        $aInfo = array_merge($aInfo, $mixedContenInfo->getContentInfo($iContentId));
+        $aInfo = array_merge($aInfo, $mixedContentInfo->getContentInfo($iContentId));
 
-        $mixedResult = $this->_oApi->updateData($this->_oConfig->getIndex(), $mixedContenInfo->getName(), $iContentId, $aInfo);
+        $mixedResult = $this->_oApi->updateData($sIndex, $mixedContentInfo->getName(), $iContentId, $aInfo);
         if($mixedResult === null)
             return false;
 
         return $mixedResult['result'] == 'updated';
     }
 
-    public function serviceDelete($iContentId, $mixedContenInfo)
+    public function serviceDelete($iContentId, $mixedContentInfo, $sIndex = '')
     {
-        if(is_array($mixedContenInfo)) {
-            $sMethod = 'getObjectInstanceByAlert' . bx_gen_method_name($mixedContenInfo['alert_type']);
-            $mixedContenInfo = BxDolContentInfo::$sMethod($mixedContenInfo['unit'], $mixedContenInfo['action']);
+        if(is_array($mixedContentInfo)) {
+            $sMethod = 'getObjectInstanceByAlert' . bx_gen_method_name($mixedContentInfo['alert_type']);
+            $mixedContentInfo = BxDolContentInfo::$sMethod($mixedContentInfo['unit'], $mixedContentInfo['action']);
         }
 
-        if(!($mixedContenInfo instanceof BxDolContentInfo))
+        if(!($mixedContentInfo instanceof BxDolContentInfo))
             return false;
 
         $CNF = &$this->_oConfig->CNF;
 
+        if(empty($sIndex))
+            $sIndex = $this->_oConfig->getIndex();
+
         bx_import('Api', $this->_aModule);
         $oApi = new BxElsApi();
 
-        $mixedResult = $oApi->deleteData($this->_oConfig->getIndex(), $mixedContenInfo->getName(), $iContentId);
+        $mixedResult = $oApi->deleteData($sIndex, $mixedContentInfo->getName(), $iContentId);
         if($mixedResult === null)
             return false;
 
         return $mixedResult['result'] == 'deleted';
     }
+
+    public function serviceIndex($sIndex, $sType = '')
+    {
+        if(empty($sIndex))
+            $sIndex = $this->_oConfig->getIndex();
+
+        $aTypes = !empty($sType) ? array($sType) : array_keys(BxDolContentInfo::getSystems());
+        if(empty($aTypes) || !is_array($aTypes))
+            return false;
+
+        bx_import('Api', $this->_aModule);
+        $oApi = new BxElsApi();
+
+        foreach($aTypes as $sType) {
+            $oContentInfo = BxDolContentInfo::getObjectInstance($sType);
+            if(!$oContentInfo)
+                continue;
+
+            $aIds = $oContentInfo->getAll(array('type' => 'all_ids'));
+            if(empty($aIds) || !is_array($aIds))
+                continue;
+
+            foreach($aIds as $iId)
+                $this->serviceAdd($iId, $oContentInfo);
+        }
+    }
 }
 
 /** @} */

+ 66 - 0
modules/boonex/elasticsearch/classes/BxElsStudioPage.php

@@ -0,0 +1,66 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    ElasticSearch ElasticSearch
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+define('BX_DOL_STUDIO_MOD_TYPE_MANAGE', 'manage');
+
+class BxElsStudioPage extends BxTemplStudioModule
+{
+	protected $_sModule;
+	protected $_oModule;
+
+    function __construct($sModule = "", $sPage = "")
+    {
+    	$this->_sModule = 'bx_elasticsearch';
+    	$this->_oModule = BxDolModule::getInstance($this->_sModule);
+
+        parent::__construct($sModule, $sPage);
+
+        $this->aMenuItems[] = array('name' => BX_DOL_STUDIO_MOD_TYPE_MANAGE, 'icon' => 'wrench', 'title' => '_bx_elasticsearch_lmi_cpt_manage');
+
+        $this->_oModule->_oTemplate->addStudioJs(array('jquery.anim.js', 'jquery.form.min.js', 'manage.js'));
+    }
+
+	protected function getManage()
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        $sForm = $CNF['OBJECT_FORM_MANAGE'];
+        $sFormDisplay = $CNF['OBJECT_FORM_MANAGE_DISPLAY_INDEX'];
+
+        $oForm = BxDolForm::getObjectInstance($sForm, $sFormDisplay, $this->_oModule->_oTemplate);
+        if(!$oForm)
+            return '';
+
+        $oForm->initChecker();
+        if($oForm->isSubmittedAndValid()) {
+            $sIndex = $oForm->getCleanValue('index');
+            $sType = $oForm->getCleanValue('type');
+
+            if(BxDolCronQuery::getInstance()->addTransientJobService($sFormDisplay, array($this->_sModule, 'index', array($sIndex, $sType)))) {
+                $sJsObject = $this->_oModule->_oConfig->getJsObject('manage');
+				$sNotification = BxTemplStudioFunctions::getInstance()->inlineBox('', $this->_oModule->_oTemplate->parseHtmlByName('manage_form_result_inline.html', array(
+					'content' => _t('_bx_elasticsearch_msg_index_planned')
+				)), true);
+
+			    $aResult = array('code' => 0, 'notification' => $sNotification, 'eval' => $sJsObject . ".onIndex(oData);");
+            }
+            else 
+                $aResult = array('code' => 1, 'message' => _t('_error occured'));
+
+            echoJson($aResult);
+            exit;
+        }         
+
+        return $oForm->getCode();
+    }
+}
+
+/** @} */

+ 13 - 0
modules/boonex/elasticsearch/install/langs/en.xml

@@ -3,4 +3,17 @@
     <string name="_bx_elasticsearch"><![CDATA[ElasticSearch]]></string>
 
     <string name="_bx_elasticsearch_option_api_url"><![CDATA[API URL]]></string>
+
+    <string name="_bx_elasticsearch_form_manage"><![CDATA[Manage Form]]></string>
+    <string name="_bx_elasticsearch_form_manage_display_index"><![CDATA[Index]]></string>
+    <string name="_bx_elasticsearch_form_manage_input_sys_index"><![CDATA[Index]]></string>
+    <string name="_bx_elasticsearch_form_manage_input_sys_type"><![CDATA[Type]]></string>
+    <string name="_bx_elasticsearch_form_manage_input_type"><![CDATA[Type]]></string>
+    <string name="_bx_elasticsearch_form_manage_input_type_value_all"><![CDATA[All]]></string>
+    <string name="_bx_elasticsearch_form_manage_input_sys_do_submit"><![CDATA[Index]]></string>
+    <string name="_bx_elasticsearch_form_manage_input_do_submit"><![CDATA[Index]]></string> 
+
+    <string name="_bx_elasticsearch_lmi_cpt_manage"><![CDATA[Manage]]></string>
+    
+    <string name="_bx_elasticsearch_msg_index_planned"><![CDATA[Data indexing was planned.]]></string>
 </resources>

+ 18 - 0
modules/boonex/elasticsearch/install/sql/install.sql

@@ -1,4 +1,22 @@
 
+-- FORMS
+INSERT INTO `sys_objects_form`(`object`, `module`, `title`, `action`, `form_attrs`, `table`, `key`, `uri`, `uri_title`, `submit_name`, `params`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES
+('bx_elasticsearch_manage', 'bx_elasticsearch', '_bx_elasticsearch_form_manage', '', 'a:1:{s:7:"enctype";s:19:"multipart/form-data";}', '', '', '', '', 'do_submit', '', 0, 1, 'BxElsFormManage', 'modules/boonex/elasticsearch/classes/BxElsFormManage.php');
+
+INSERT INTO `sys_form_displays`(`object`, `display_name`, `module`, `view_mode`, `title`) VALUES 
+('bx_elasticsearch_manage', 'bx_elasticsearch_manage_index', 'bx_elasticsearch', 0, '_bx_elasticsearch_form_manage_display_index');
+
+INSERT INTO `sys_form_inputs`(`object`, `module`, `name`, `value`, `values`, `checked`, `type`, `caption_system`, `caption`, `info`, `required`, `collapsed`, `html`, `attrs`, `attrs_tr`, `attrs_wrapper`, `checker_func`, `checker_params`, `checker_error`, `db_pass`, `db_params`, `editable`, `deletable`) VALUES
+('bx_elasticsearch_manage', 'bx_elasticsearch', 'index', '0', '', 0, 'hidden', '_bx_elasticsearch_form_manage_input_sys_index', '', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 1, 0),
+('bx_elasticsearch_manage', 'bx_elasticsearch', 'type', '', '', 0, 'select', '_bx_elasticsearch_form_manage_input_sys_type', '_bx_elasticsearch_form_manage_input_type', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 1, 0),
+('bx_elasticsearch_manage', 'bx_elasticsearch', 'do_submit', '_bx_elasticsearch_form_manage_input_do_submit', '', 0, 'submit', '_bx_elasticsearch_form_manage_input_sys_do_submit', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0);
+
+INSERT INTO `sys_form_display_inputs` (`display_name`, `input_name`, `visible_for_levels`, `active`, `order`) VALUES
+('bx_elasticsearch_manage_index', 'index', 2147483647, 1, 1),
+('bx_elasticsearch_manage_index', 'type', 2147483647, 1, 2),
+('bx_elasticsearch_manage_index', 'do_submit', 2147483647, 1, 3);
+
+
 -- Studio page and widget
 INSERT INTO `sys_std_pages`(`index`, `name`, `header`, `caption`, `icon`) VALUES
 (3, 'bx_elasticsearch', '_bx_elasticsearch', '_bx_elasticsearch', 'bx_elasticsearch@modules/boonex/elasticsearch/|std-icon.svg');

+ 7 - 0
modules/boonex/elasticsearch/install/sql/uninstall.sql

@@ -1,4 +1,11 @@
 
+-- FORMS
+DELETE FROM `sys_objects_form` WHERE `module` = 'bx_elasticsearch';
+DELETE FROM `sys_form_displays` WHERE `module` = 'bx_elasticsearch';
+DELETE FROM `sys_form_inputs` WHERE `module` = 'bx_elasticsearch';
+DELETE FROM `sys_form_display_inputs` WHERE `display_name` IN('bx_forum_entry_add');
+
+
 -- Studio page and widget
 DELETE FROM `tp`, `tw`, `tpw`
 USING `sys_std_pages` AS `tp`, `sys_std_widgets` AS `tw`, `sys_std_pages_widgets` AS `tpw`

+ 29 - 0
modules/boonex/elasticsearch/js/manage.js

@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    ElasticSearch ElasticSearch
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+function BxElsManage(oOptions) {
+	this.sActionsUrl = oOptions.sActionUrl;
+    this.sObjName = oOptions.sObjName == undefined ? 'oBxElsManage' : oOptions.sObjName;
+    this.sAnimationEffect = oOptions.sAnimationEffect == undefined ? 'fade' : oOptions.sAnimationEffect;
+    this.iAnimationSpeed = oOptions.iAnimationSpeed == undefined ? 'slow' : oOptions.iAnimationSpeed;
+}
+
+BxElsManage.prototype.onIndex = function(oData) {
+	if(oData.notification && oData.notification.length > 0)
+		this.showNotification(oData.notification);
+};
+
+BxElsManage.prototype.showNotification = function(sContent) {
+	$(sContent).appendTo('body').dolPopupInline({
+		removeOnClose: true
+	});   
+};
+
+/** @} */

+ 20 - 0
modules/boonex/elasticsearch/template/manage_form.html

@@ -0,0 +1,20 @@
+<div class="bx-els-manage-form">
+    <div class="bx-els-manage-form-cnt">
+        __form__
+        <script type="text/javascript">
+            $(document).ready(function () {
+                $("#__form_id__").ajaxForm({ 
+                    dataType: "json",
+                    beforeSubmit: function(formData, jqForm, options) {
+                        bx_loading($("#__form_id__"), true);
+                    },
+                    success: function(oData) {
+                    	bx_loading($("#__form_id__"), false);
+
+                        processJsonData(oData);
+                    }
+                });
+            });
+        </script>
+    </div>
+</div>

+ 3 - 0
modules/boonex/elasticsearch/template/manage_form_result_inline.html

@@ -0,0 +1,3 @@
+<div class="bx-mod-action-result">
+    <div class="bx-mod-action-result-cnt">__content__</div>
+</div>

+ 19 - 0
modules/boonex/russian/data/langs/bx_els/ru.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources name="ru" flag="ru" title="Russian">
+	<string name="_bx_elasticsearch"><![CDATA[ElasticSearch]]></string>
+
+    <string name="_bx_elasticsearch_option_api_url"><![CDATA[API URL]]></string>
+
+    <string name="_bx_elasticsearch_form_manage"><![CDATA[Форма управления]]></string>
+    <string name="_bx_elasticsearch_form_manage_display_index"><![CDATA[Индексирование]]></string>
+    <string name="_bx_elasticsearch_form_manage_input_sys_index"><![CDATA[Индекс]]></string>
+    <string name="_bx_elasticsearch_form_manage_input_sys_type"><![CDATA[Тип]]></string>
+    <string name="_bx_elasticsearch_form_manage_input_type"><![CDATA[Тип]]></string>
+    <string name="_bx_elasticsearch_form_manage_input_type_value_all"><![CDATA[Все]]></string>
+    <string name="_bx_elasticsearch_form_manage_input_sys_do_submit"><![CDATA[Индексировать]]></string>
+    <string name="_bx_elasticsearch_form_manage_input_do_submit"><![CDATA[Индексировать]]></string>
+
+    <string name="_bx_elasticsearch_lmi_cpt_manage"><![CDATA[Управление]]></string>
+
+    <string name="_bx_elasticsearch_msg_index_planned"><![CDATA[Индексация данных запланирована.]]></string>
+</resources>