AntonLV 9 лет назад
Родитель
Сommit
56ac100abb
34 измененных файлов с 1009 добавлено и 0 удалено
  1. 3 0
      inc/classes/BxDol.php
  2. 39 0
      inc/classes/BxDolCmts.php
  3. 30 0
      inc/classes/BxDolCmtsQuery.php
  4. 10 0
      inc/classes/BxDolContentInfo.php
  5. 10 0
      inc/classes/BxDolContentInfoCmts.php
  6. 4 0
      inc/classes/BxDolFormQuery.php
  7. 109 0
      inc/classes/BxDolSearchExtended.php
  8. 94 0
      inc/classes/BxDolSearchExtendedQuery.php
  9. 0 0
      install/sql/system.sql
  10. 30 0
      modules/base/general/classes/BxBaseModGeneralDb.php
  11. 41 0
      modules/base/general/classes/BxBaseModGeneralModule.php
  12. 17 0
      modules/boonex/decorous/data/template/system/scripts/BxTemplSearchExtended.php
  13. 17 0
      modules/boonex/decorous/data/template/system/scripts/BxTemplSearchExtendedCmts.php
  14. 17 0
      modules/boonex/decorous/data/template/system/scripts/BxTemplSearchExtendedForm.php
  15. 17 0
      modules/boonex/decorous/data/template/system/scripts/BxTemplSearchExtendedFormCmts.php
  16. 14 0
      modules/boonex/decorous/data/template/system/scripts/BxTemplSearchExtendedServices.php
  17. 29 0
      modules/boonex/english/data/langs/system/en.xml
  18. 17 0
      modules/boonex/ocean/data/template/system/scripts/BxTemplSearchExtended.php
  19. 17 0
      modules/boonex/ocean/data/template/system/scripts/BxTemplSearchExtendedCmts.php
  20. 17 0
      modules/boonex/ocean/data/template/system/scripts/BxTemplSearchExtendedForm.php
  21. 17 0
      modules/boonex/ocean/data/template/system/scripts/BxTemplSearchExtendedFormCmts.php
  22. 14 0
      modules/boonex/ocean/data/template/system/scripts/BxTemplSearchExtendedServices.php
  23. 17 0
      modules/boonex/protean/data/template/system/scripts/BxTemplSearchExtended.php
  24. 17 0
      modules/boonex/protean/data/template/system/scripts/BxTemplSearchExtendedCmts.php
  25. 17 0
      modules/boonex/protean/data/template/system/scripts/BxTemplSearchExtendedForm.php
  26. 17 0
      modules/boonex/protean/data/template/system/scripts/BxTemplSearchExtendedFormCmts.php
  27. 14 0
      modules/boonex/protean/data/template/system/scripts/BxTemplSearchExtendedServices.php
  28. 29 0
      modules/boonex/russian/data/langs/system/ru.xml
  29. 48 0
      searchExtended.php
  30. 152 0
      template/scripts/BxBaseSearchExtended.php
  31. 26 0
      template/scripts/BxBaseSearchExtendedCmts.php
  32. 30 0
      template/scripts/BxBaseSearchExtendedForm.php
  33. 28 0
      template/scripts/BxBaseSearchExtendedFormCmts.php
  34. 51 0
      template/scripts/BxBaseSearchExtendedServices.php

+ 3 - 0
inc/classes/BxDol.php

@@ -128,5 +128,8 @@ interface iBxDolContentInfoService
     public function serviceGetInfo ($iContentId, $bSearchableFieldsOnly = true);
     public function serviceGetSearchResultUnit ($iContentId, $sUnitTemplate = '');
     public function serviceGetAll ($aParams = array());
+
+    public function serviceGetSearchableFieldsExtended();
+    public function serviceGetSearchResultExtended($aParams);
 }
 /** @} */

+ 39 - 0
inc/classes/BxDolCmts.php

@@ -972,6 +972,45 @@ class BxDolCmts extends BxDolFactory implements iBxDolReplaceable, iBxDolContent
         return $this->_oQuery->getCommentsBy($aParams);
     }
 
+    public function serviceGetSearchableFieldsExtended()
+    {
+        $oForm = BxDolForm::getObjectInstance('sys_comment', 'sys_comment_post', $this->_oTemplate);
+        if(!$oForm)
+            return array();
+
+        $aSrchNamesExcept = array();
+        $aSrchCaptions = array(
+            'cmt_author_id' => '_sys_form_comment_input_caption_cmt_author_id',
+            'cmt_text' => '_sys_form_comment_input_caption_cmt_text'
+        );
+
+        $aResult = array(
+            'cmt_author_id' => array(
+            	'type' => 'text_auto', 
+            	'caption' => $aSrchCaptions['cmt_author_id'],
+            	'values' => '' 
+            )
+        );
+
+        foreach ($oForm->aInputs as $aInput)
+            if (in_array($aInput['type'], BxDolSearchExtended::$SEARCHABLE_TYPES) && !in_array($aInput['name'], $aSrchNamesExcept))
+                $aResult[$aInput['name']] = array(
+                	'type' => $aInput['type'], 
+                	'caption' => !empty($aInput['caption_src']) ? $aInput['caption_src'] : (!empty($aSrchCaptions[$aInput['name']]) ? $aSrchCaptions[$aInput['name']] : ''),
+                    'values' => !empty($aInput['values_src']) ? $aInput['values_src'] : '',
+                );
+
+        return $aResult;
+    }
+
+    public function serviceGetSearchResultExtended($aParams)
+    {
+        if(empty($aParams) || !is_array($aParams))
+            return array();
+
+        return $this->_oQuery->getCommentsBy(array('type' => 'search_ids', 'search_params' => $aParams));
+    }
+
     /**
      * Internal functions
      */

+ 30 - 0
inc/classes/BxDolCmtsQuery.php

@@ -221,6 +221,36 @@ class BxDolCmtsQuery extends BxDolDb
 
                 break;
 
+            case 'search_ids':
+                $aMethod['name'] = 'getColumn';
+
+                $sSelectClause = "`{$this->_sTable}`.`cmt_id`";
+
+                $sWhereConditions = "1";
+                foreach($aParams['search_params'] as $sSearchParam => $aSearchParam) {
+                    $sSearchValue = "";
+                    switch ($aSearchParam['operator']) {
+                        case 'like':
+                            $sSearchValue = " LIKE " . $this->escape("%" . $aSearchParam['value'] . "%");
+                            break;
+
+                        case 'in':
+                            $sSearchValue = " IN (" . $this->implode_escape($aSearchParam['value']) . ")";
+                            break;
+
+                        default:
+                             $sSearchValue = " " . $aSearchParam['operator'] . " :" . $sSearchParam;
+                             $aMethod['params'][1][$sSearchParam] = $aSearchParam['value'];                             
+                    }
+
+                    $sWhereConditions .= " AND `{$this->_sTable}`.`" . $sSearchParam . "`" . $sSearchValue;
+                }
+
+                $sWhereClause .= " AND (" . $sWhereConditions . ")"; 
+
+                $sOrderClause .=  "`{$this->_sTable}`.`cmt_time` ASC";
+                break;
+
             case 'all_ids':
                 $aMethod['name'] = 'getColumn';
 

+ 10 - 0
inc/classes/BxDolContentInfo.php

@@ -287,6 +287,16 @@ class BxDolContentInfo extends BxDolFactory implements iBxDolFactoryObject
         return $this->_call('get_all', $aParams);
     }
 
+    public function getSearchableFieldsExtended ()
+    {
+        return $this->_call('get_searchable_fields_extended');
+    }
+
+    public function getSearchResultExtended ($aParams)
+    {
+        return $this->_call('get_search_result_extended', $aParams);
+    }
+
     protected function _call($sMethod)
     {
         if(!BxDolRequest::serviceExists($this->_sSystem, $sMethod))

+ 10 - 0
inc/classes/BxDolContentInfoCmts.php

@@ -74,6 +74,16 @@ class BxDolContentInfoCmts extends BxDolContentInfo
     {
         return $this->_oCmts->serviceGetAll($aParams);
     }
+    
+    public function getSearchableFieldsExtended ()
+    {
+        return $this->_oCmts->serviceGetSearchableFieldsExtended();
+    }
+
+    public function getSearchResultExtended ($aParams)
+    {
+        return $this->_oCmts->serviceGetSearchResultExtended($aParams);
+    }
 }
 
 /** @} */

+ 4 - 0
inc/classes/BxDolFormQuery.php

@@ -94,7 +94,9 @@ class BxDolFormQuery extends BxDolDb
             $aInput = array (
                 'type' => $a['type'],
                 'name' => $a['name'],
+            	'caption_src' => $a['caption'],
                 'caption' => _t($a['caption']),
+            	'info_src' => $a['info'] ? $a['info'] : '',
                 'info' => $a['info'] ? _t($a['info']) : '',
                 'required' => $a['required'] ? true : false,
             	'unique' => $a['unique'] ? true : false,
@@ -118,6 +120,8 @@ class BxDolFormQuery extends BxDolDb
                 $aInput['value'] = isset(self::$TYPES_TRANSLATABLE[$aInput['type']]) ? _t($a['value']) : $a['value'];
 
             if (!empty($a['values'])) {
+                $aInput['values_src'] = $a['values'];
+
                 if (0 === strncmp(BX_DATA_LISTS_KEY_PREFIX, $a['values'], 2)) {
                     $aInput['values_list_name'] = trim($a['values'], BX_DATA_LISTS_KEY_PREFIX . ' ');
                     $aInput['values'] = self::getDataItems(trim($a['values'], BX_DATA_LISTS_KEY_PREFIX . ' '), isset(self::$TYPES_SET[$aInput['type']]));

+ 109 - 0
inc/classes/BxDolSearchExtended.php

@@ -0,0 +1,109 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaCore UNA Core
+ * @{
+ */
+
+class BxDolSearchExtended extends BxDolFactory implements iBxDolFactoryObject
+{
+    public static $SEARCHABLE_TYPES = array(
+        'text', 'textarea', 'number', 
+    	'datepicker', 'date_time', 'datetime', 
+    	'select', 'radio_set', 
+    	'checkbox', 'switcher'
+    );
+
+    public static $TYPE_TO_TYPE_SEARCH = array(
+        'text' => array('text'),
+        'textarea' => array('text'),
+        'number' => array('text'),
+        'text_auto' => array('text_auto'),
+        'select' => array('checkbox_set', 'select_multiple', 'select'),
+        'radio_set' => array('checkbox_set', 'select_multiple', 'select'),
+        'checkbox' => array('checkbox', 'switcher'),
+    	'switcher' => array('checkbox', 'switcher'),
+    );
+
+    public static $TYPE_TO_OPERATOR = array(
+    	'text' => array('like'),
+        'textarea' => array('like'),
+        'number' => array('='),
+        'text_auto' => array('in'),
+        'select' => array('in'),
+        'radio_set' => array('in'),
+        'checkbox' => array('='),
+    	'switcher' => array('='),
+    );
+
+    protected $_oDb;
+
+    protected $_sObject;
+    protected $_aObject;
+
+
+    /**
+     * Constructor
+     * @param $aObject array of search options
+     */
+    protected function __construct($aObject)
+    {
+        parent::__construct();
+
+        $this->_oDb = new BxDolSearchExtendedQuery($this->_aObject);
+
+        $this->_sObject = $aObject['object'];
+        $this->_aObject = $aObject;
+    }
+
+    /**
+     * Get editor object instance by object name
+     * @param $sObject object name
+     * @return object instance or false on error
+     */
+    static public function getObjectInstance($sObject, $oTemplate = false)
+    {
+        if(isset($GLOBALS['bxDolClasses']['BxDolSearchExtended!' . $sObject]))
+            return $GLOBALS['bxDolClasses']['BxDolSearchExtended!' . $sObject];
+
+        $aObject = BxDolSearchExtendedQuery::getSearchObject($sObject);
+        if(!$aObject || !is_array($aObject))
+            return false;
+
+        $sClass = 'BxTemplSearchExtended';
+        if(!empty($aObject['class_name'])) {
+            $sClass = $aObject['class_name'];
+            if(!empty($aObject['class_file']))
+                require_once(BX_DIRECTORY_PATH_ROOT . $aObject['class_file']);
+        }
+
+        $o = new $sClass($aObject, $oTemplate);
+        return ($GLOBALS['bxDolClasses']['BxDolSearchExtended!' . $sObject] = $o);
+    }
+
+    static public function actionGetAuthors()
+    {
+        $aResult = BxDolService::call('system', 'profiles_search', array(bx_get('term')), 'TemplServiceProfiles');
+
+        header('Content-Type:text/javascript; charset=utf-8');
+        echo json_encode($aResult);
+    }
+
+    public function isEnabled()
+    {
+        return isset($this->_aObject['active']) && (int)$this->_aObject['active'] != 0;
+    }
+
+    public function reset()
+    {
+        if($this->_oDb->deleteFields(array('object' => $this->_sObject)) === false)
+            return false;
+
+        $this->_aObject['fields'] = BxDolSearchExtendedQuery::getSearchFields($this->_aObject);
+        return true;
+    }
+}
+
+/** @} */

+ 94 - 0
inc/classes/BxDolSearchExtendedQuery.php

@@ -0,0 +1,94 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaCore UNA Core
+ * @{
+ */
+
+class BxDolSearchExtendedQuery extends BxDolDb
+{
+    protected static $TYPES_SET = array (
+        'select_multiple' => 1,
+        'checkbox_set' => 1,
+    );
+
+    public function __construct($aObject = array())
+    {
+        parent::__construct();
+    }
+
+    static public function getSearchObject($sObject)
+    {
+        $oDb = BxDolDb::getInstance();
+
+        $sQuery = $oDb->prepare("SELECT * FROM `sys_objects_search_extended` WHERE `object` = ?", $sObject);
+
+        $aObject = $oDb->getRow($sQuery);
+        if(!$aObject || !is_array($aObject))
+            return false;
+
+        $aObject['fields'] = self::getSearchFields($aObject);
+        return $aObject;
+    }
+
+    static public function getSearchFields($aObject)
+    {
+        $oDb = BxDolDb::getInstance();
+
+        $sQueryFields = "SELECT * FROM `sys_search_extended_fields` WHERE `object` = :object ORDER BY `order`";
+        $aQueryFieldsBindings = array('object' => $aObject['object']);
+        $aFields = $oDb->getAll($sQueryFields, $aQueryFieldsBindings);
+
+        //--- Get fields
+        if(empty($aFields) || !is_array($aFields)) {
+            $aFields = BxDolContentInfo::getObjectInstance($aObject['object_content_info'])->getSearchableFieldsExtended();
+            if(empty($aFields) || !is_array($aFields))
+                return array();
+
+            $iOrder = 0;
+            foreach($aFields as $sField => $aField) 
+                $oDb->query("INSERT INTO `sys_search_extended_fields`(`object`, `name`, `type`, `caption`, `values`, `search_type`, `search_operator`, `active`, `order`) VALUES(:object, :name, :type, :caption, :values, :search_type, :search_operator, '1', :order)", array(
+                    'object' => $aObject['object'], 
+                    'name' => $sField,
+                    'type' => $aField['type'],
+                    'caption' => $aField['caption'],
+                    'values' => $aField['values'],
+                    'search_type' => reset(BxDolSearchExtended::$TYPE_TO_TYPE_SEARCH[$aField['type']]), 
+                    'search_operator' => reset(BxDolSearchExtended::$TYPE_TO_OPERATOR[$aField['type']]),
+                    'order' => $iOrder++
+                ));
+
+            $aFields = $oDb->getAll($sQueryFields, $aQueryFieldsBindings);
+        }
+
+        //--- Process fields
+        foreach ($aFields as $iIndex => $aField) {
+            //--- Process field Values            
+            if(!empty($aField['values'])) {
+                if(strncmp(BX_DATA_LISTS_KEY_PREFIX, $aField['values'], 2) === 0) {
+                    $sList = trim($aField['values'], BX_DATA_LISTS_KEY_PREFIX . ' ');
+                    $aFields[$iIndex] = array_merge($aField, array(
+                    	'values' => BxDolFormQuery::getDataItems($sList, isset(self::$TYPES_SET[$aField['search_type']])),
+                    	'values_list_name' => $sList,
+                    ));
+                }
+                else
+                    $aFields[$iIndex]['values'] = unserialize($aField['values']);
+            }
+        }
+
+        return $aFields;
+    }
+
+    public function deleteFields($aWhere)
+    {
+        if(empty($aWhere))
+    		return false;
+
+        return $this->query("DELETE FROM `sys_search_extended_fields` WHERE " . $this->arrayToSQL($aWhere, ' AND '));
+    }
+}
+
+/** @} */

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
install/sql/system.sql


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

@@ -57,6 +57,36 @@ class BxBaseModGeneralDb extends BxDolModuleDb
                 $sWhereClause .= " AND `{$CNF['TABLE_ENTRIES']}`.`" . $CNF['FIELD_AUTHOR'] . "` = :author";
                 break;
 
+            case 'search_ids':
+                $aMethod['name'] = 'getColumn';
+                
+                $sSelectClause = "`{$CNF['TABLE_ENTRIES']}`.`" . $CNF['FIELD_ID'] . "`";
+
+                $sWhereConditions = "1";
+                foreach($aParams['search_params'] as $sSearchParam => $aSearchParam) {
+                    $sSearchValue = "";
+                    switch ($aSearchParam['operator']) {
+                        case 'like':
+                            $sSearchValue = " LIKE " . $this->escape("%" . $aSearchParam['value'] . "%");
+                            break;
+
+                        case 'in':
+                            $sSearchValue = " IN (" . $this->implode_escape($aSearchParam['value']) . ")";
+                            break;
+
+                        default:
+                             $sSearchValue = " " . $aSearchParam['operator'] . " :" . $sSearchParam;
+                             $aMethod['params'][1][$sSearchParam] = $aSearchParam['value'];                             
+                    }
+
+                    $sWhereConditions .= " AND `{$CNF['TABLE_ENTRIES']}`.`" . $sSearchParam . "`" . $sSearchValue;
+                }
+
+                $sWhereClause .= " AND (" . $sWhereConditions . ")"; 
+
+                $sOrderClause .=  "`{$CNF['TABLE_ENTRIES']}`.`" . $CNF['FIELD_ADDED'] . "` ASC";
+                break;
+
             case 'all_ids':
                 $aMethod['name'] = 'getColumn';
 

+ 41 - 0
modules/base/general/classes/BxBaseModGeneralModule.php

@@ -122,6 +122,47 @@ class BxBaseModGeneralModule extends BxDolModule
         return $this->_oDb->getEntriesBy($aParams);
     }
 
+    public function serviceGetSearchableFieldsExtended()
+    {
+        $CNF = &$this->_oConfig->CNF;
+        $aSearchableNamesExcept = array(
+            'allow_view_to'
+        );
+
+        if(empty($CNF['OBJECT_FORM_ENTRY']) || empty($CNF['OBJECT_FORM_ENTRY_DISPLAY_ADD']))
+            return array();
+
+        $oForm = BxDolForm::getObjectInstance($CNF['OBJECT_FORM_ENTRY'], $CNF['OBJECT_FORM_ENTRY_DISPLAY_ADD'], $this->_oTemplate);
+        if(!$oForm)
+            return array();
+
+        $aResult = array();
+        if(!empty($CNF['FIELD_AUTHOR']))
+            $aResult[$CNF['FIELD_AUTHOR']] = array(
+            	'type' => 'text_auto', 
+            	'caption' => $CNF['T']['form_field_author'],
+            	'values' => '' 
+            );
+
+        foreach ($oForm->aInputs as $aInput)
+            if (in_array($aInput['type'], BxDolSearchExtended::$SEARCHABLE_TYPES) && !in_array($aInput['name'], $aSearchableNamesExcept))
+                $aResult[$aInput['name']] = array(
+                	'type' => $aInput['type'], 
+                	'caption' => $aInput['caption_src'],
+                    'values' => !empty($aInput['values_src']) ? $aInput['values_src'] : '',
+                );
+
+        return $aResult;
+    }
+
+    public function serviceGetSearchResultExtended($aParams)
+    {
+        if(empty($aParams) || !is_array($aParams))
+            return array();
+
+        return $this->_oDb->getEntriesBy(array('type' => 'search_ids', 'search_params' => $aParams));
+    }
+
     public function serviceModuleIcon ()
     {
         return isset($this->_oConfig->CNF['ICON']) ? $this->_oConfig->CNF['ICON'] : '';

+ 17 - 0
modules/boonex/decorous/data/template/system/scripts/BxTemplSearchExtended.php

@@ -0,0 +1,17 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaTemplate UNA Template Classes
+ * @{
+ */
+
+/**
+ * @see BxDolSearchExtended
+ */
+class BxTemplSearchExtended extends BxBaseSearchExtended
+{
+}
+
+/** @} */

+ 17 - 0
modules/boonex/decorous/data/template/system/scripts/BxTemplSearchExtendedCmts.php

@@ -0,0 +1,17 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaTemplate UNA Template Classes
+ * @{
+ */
+
+/**
+ * @see BxDolSearchExtendedCmts
+ */
+class BxTemplSearchExtendedCmts extends BxBaseSearchExtendedCmts
+{
+}
+
+/** @} */

+ 17 - 0
modules/boonex/decorous/data/template/system/scripts/BxTemplSearchExtendedForm.php

@@ -0,0 +1,17 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaTemplate UNA Template Classes
+ * @{
+ */
+
+/**
+ * @see BxBaseSearchExtendedForm
+ */
+class BxTemplSearchExtendedForm extends BxBaseSearchExtendedForm
+{
+}
+
+/** @} */

+ 17 - 0
modules/boonex/decorous/data/template/system/scripts/BxTemplSearchExtendedFormCmts.php

@@ -0,0 +1,17 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaTemplate UNA Template Classes
+ * @{
+ */
+
+/**
+ * @see BxBaseSearchExtendedFormCmts
+ */
+class BxTemplSearchExtendedFormCmts extends BxBaseSearchExtendedFormCmts
+{
+}
+
+/** @} */

+ 14 - 0
modules/boonex/decorous/data/template/system/scripts/BxTemplSearchExtendedServices.php

@@ -0,0 +1,14 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaTemplate UNA Template Classes
+ * @{
+ */
+
+class BxTemplSearchExtendedServices extends BxBaseSearchExtendedServices
+{
+}
+
+/** @} */

+ 29 - 0
modules/boonex/english/data/langs/system/en.xml

@@ -678,6 +678,11 @@
 	<string name="_adm_form_btn_pre_values_create"><![CDATA[Add New Item]]></string>
 	<string name="_adm_form_btn_pre_values_delete_item"><![CDATA[Delete Item]]></string>
 	<string name="_adm_form_btn_pre_values_edit_item"><![CDATA[Edit Item]]></string>
+	<string name="_adm_form_btn_search_forms_edit"><![CDATA[Edit search form]]></string>
+    <string name="_adm_form_btn_search_forms_fields_edit"><![CDATA[Edit search field]]></string>
+    <string name="_adm_form_btn_search_forms_fields_reset"><![CDATA[Reset]]></string>
+    <string name="_adm_form_btn_search_forms_save"><![CDATA[Save]]></string>
+    <string name="_adm_form_btn_search_forms_cancel"><![CDATA[Cancel]]></string>
 	<string name="_adm_form_dsc_displays_title"><![CDATA[Name of the form display mode. Displayed in Studio only.]]></string>
 	<string name="_adm_form_dsc_field_attrs_max"><![CDATA[Enter numeric value]]></string>
 	<string name="_adm_form_dsc_field_attrs_min"><![CDATA[Enter numeric value]]></string>
@@ -703,6 +708,8 @@
 	<string name="_adm_form_dsc_pre_lists_title"><![CDATA[List Name for Studio use only]]></string>
 	<string name="_adm_form_dsc_pre_values_empty"><![CDATA[You can use it for items like "Please select..." which can't be submitted.]]></string>
 	<string name="_adm_form_dsc_pre_values_lkey"><![CDATA[Item name displayed on site]]></string>
+	<string name="_adm_form_dsc_search_forms_fields_search_type"><![CDATA[The type of control element in search form]]></string>
+    <string name="_adm_form_dsc_search_forms_title"><![CDATA[Name of the search form. Displayed in Studio only.]]></string>
 	<string name="_adm_form_err_cannot_process_action"><![CDATA[Cannot process action. It does not have an associated handler.]]></string>
 	<string name="_adm_form_err_displays_edit"><![CDATA[Cannot update display]]></string>
 	<string name="_adm_form_err_displays_title"><![CDATA[Enter title, more then 3 characters]]></string>
@@ -730,6 +737,11 @@
 	<string name="_adm_form_err_pre_values_delete"><![CDATA[Cannot delete item]]></string>
 	<string name="_adm_form_err_pre_values_edit"><![CDATA[Cannot update item]]></string>
 	<string name="_adm_form_err_pre_values_lkey"><![CDATA[Enter title, more than one character]]></string>
+	<string name="_adm_form_err_search_forms_essential"><![CDATA[The field is essential. Please fill in.]]></string>
+    <string name="_adm_form_err_search_forms_fields_edit"><![CDATA[Cannot update the search form field.]]></string>
+    <string name="_adm_from_err_search_forms_fields_reset"><![CDATA[Cannot reset the search form.]]></string>
+    <string name="_adm_form_err_search_forms_edit"><![CDATA[Cannot update the selected search form.]]></string>
+    <string name="_adm_form_err_search_forms_title"><![CDATA[Enter name, more then 3 characters]]></string>
 	<string name="_adm_form_txt_all_modules"><![CDATA[All Modules]]></string>
 	<string name="_adm_form_txt_confirm_delete"><![CDATA[Are you sure you want to delete this field? It will be deleted from all Displays! You may just turn it off instead.]]></string>
 	<string name="_adm_form_txt_displays_edit_popup"><![CDATA[Edit "{0}" Display]]></string>
@@ -801,6 +813,7 @@
 	<string name="_adm_form_txt_field_type_submit"><![CDATA[submit]]></string>
 	<string name="_adm_form_txt_field_type_switcher"><![CDATA[switcher]]></string>
 	<string name="_adm_form_txt_field_type_text"><![CDATA[text]]></string>
+	<string name="_adm_form_txt_field_type_text_auto"><![CDATA[auto text]]></string>
 	<string name="_adm_form_txt_field_type_textarea"><![CDATA[textarea]]></string>
 	<string name="_adm_form_txt_field_type_value"><![CDATA[info]]></string>
 	<string name="_adm_form_txt_field_unique"><![CDATA[Unique]]></string>
@@ -856,6 +869,18 @@
 	<string name="_adm_form_txt_pre_values_empty"><![CDATA[Use empty value for this item]]></string>
 	<string name="_adm_form_txt_pre_values_gl_lkey"><![CDATA[Title]]></string>
 	<string name="_adm_form_txt_pre_values_lkey"><![CDATA[Title]]></string>
+    <string name="_adm_form_txt_search_forms_edit_popup"><![CDATA[Edit "{0}" Search Form]]></string>
+    <string name="_adm_form_txt_search_forms_fields"><![CDATA[Fields]]></string>
+    <string name="_adm_form_txt_search_forms_fields_type"><![CDATA[Type]]></string>
+    <string name="_adm_form_txt_search_forms_fields_caption"><![CDATA[Caption]]></string>
+    <string name="_adm_form_txt_search_forms_fields_search_type"><![CDATA[Search Type]]></string>
+    <string name="_adm_form_txt_search_forms_fields_search_operator"><![CDATA[Search Operator]]></string>
+    <string name="_adm_form_txt_search_forms_fields_select_object"><![CDATA[Select Form...]]></string>
+    <string name="_adm_form_txt_search_forms_fields_edit_popup"><![CDATA[Edit "{0}" Search Field]]></string>
+    <string name="_adm_form_txt_search_forms_manage_fields"><![CDATA[Manage fields]]></string>
+    <string name="_adm_form_txt_search_forms_module"><![CDATA[Module]]></string>
+    <string name="_adm_form_txt_search_forms_n_fields"><![CDATA[{0} fields]]></string>
+    <string name="_adm_form_txt_search_forms_title"><![CDATA[System Name]]></string>
 	<string name="_adm_form_txt_select_display"><![CDATA[Select Display...]]></string>
 	<string name="_adm_form_txt_select_form"><![CDATA[Select Form...]]></string>
 	<string name="_adm_form_txt_select_list"><![CDATA[Select List...]]></string>
@@ -873,6 +898,8 @@
 	<string name="_adm_lmi_cpt_checkout"><![CDATA[Checkout {checkout_counter}]]></string>
 	<string name="_adm_lmi_cpt_cover"><![CDATA[Cover]]></string>
 	<string name="_adm_lmi_cpt_search"><![CDATA[Search]]></string>
+	<string name="_adm_lmi_cpt_search_forms"><![CDATA[Search Forms]]></string>
+	<string name="_adm_lmi_cpt_search_fields"><![CDATA[Search Fields]]></string>
 	<string name="_adm_lmi_cpt_splash"><![CDATA[Splash]]></string>
 	<string name="_adm_lmi_cpt_displays"><![CDATA[Displays]]></string>
 	<string name="_adm_lmi_cpt_downloaded"><![CDATA[Downloaded]]></string>
@@ -1804,6 +1831,8 @@ If it is not enabled then please consider implement this optimization, since it
 	<string name="_sys_form_checkbox_value_off"><![CDATA[No]]></string>
 	<string name="_sys_form_checkbox_value_on"><![CDATA[Yes]]></string>
 	<string name="_sys_form_comment"><![CDATA[Comment]]></string>
+	<string name="_sys_form_comment_input_caption_cmt_author_id"><![CDATA[Author]]></string>
+	<string name="_sys_form_comment_input_caption_cmt_text"><![CDATA[Text]]></string>
 	<string name="_sys_form_comment_input_caption_system_action"><![CDATA[Action]]></string>
 	<string name="_sys_form_comment_input_caption_system_cmt_id"><![CDATA[Comment ID]]></string>
 	<string name="_sys_form_comment_input_caption_system_cmt_image"><![CDATA[Image]]></string>

+ 17 - 0
modules/boonex/ocean/data/template/system/scripts/BxTemplSearchExtended.php

@@ -0,0 +1,17 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaTemplate UNA Template Classes
+ * @{
+ */
+
+/**
+ * @see BxDolSearchExtended
+ */
+class BxTemplSearchExtended extends BxBaseSearchExtended
+{
+}
+
+/** @} */

+ 17 - 0
modules/boonex/ocean/data/template/system/scripts/BxTemplSearchExtendedCmts.php

@@ -0,0 +1,17 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaTemplate UNA Template Classes
+ * @{
+ */
+
+/**
+ * @see BxDolSearchExtendedCmts
+ */
+class BxTemplSearchExtendedCmts extends BxBaseSearchExtendedCmts
+{
+}
+
+/** @} */

+ 17 - 0
modules/boonex/ocean/data/template/system/scripts/BxTemplSearchExtendedForm.php

@@ -0,0 +1,17 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaTemplate UNA Template Classes
+ * @{
+ */
+
+/**
+ * @see BxBaseSearchExtendedForm
+ */
+class BxTemplSearchExtendedForm extends BxBaseSearchExtendedForm
+{
+}
+
+/** @} */

+ 17 - 0
modules/boonex/ocean/data/template/system/scripts/BxTemplSearchExtendedFormCmts.php

@@ -0,0 +1,17 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaTemplate UNA Template Classes
+ * @{
+ */
+
+/**
+ * @see BxBaseSearchExtendedFormCmts
+ */
+class BxTemplSearchExtendedFormCmts extends BxBaseSearchExtendedFormCmts
+{
+}
+
+/** @} */

+ 14 - 0
modules/boonex/ocean/data/template/system/scripts/BxTemplSearchExtendedServices.php

@@ -0,0 +1,14 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaTemplate UNA Template Classes
+ * @{
+ */
+
+class BxTemplSearchExtendedServices extends BxBaseSearchExtendedServices
+{
+}
+
+/** @} */

+ 17 - 0
modules/boonex/protean/data/template/system/scripts/BxTemplSearchExtended.php

@@ -0,0 +1,17 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaTemplate UNA Template Classes
+ * @{
+ */
+
+/**
+ * @see BxDolSearchExtended
+ */
+class BxTemplSearchExtended extends BxBaseSearchExtended
+{
+}
+
+/** @} */

+ 17 - 0
modules/boonex/protean/data/template/system/scripts/BxTemplSearchExtendedCmts.php

@@ -0,0 +1,17 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaTemplate UNA Template Classes
+ * @{
+ */
+
+/**
+ * @see BxDolSearchExtendedCmts
+ */
+class BxTemplSearchExtendedCmts extends BxBaseSearchExtendedCmts
+{
+}
+
+/** @} */

+ 17 - 0
modules/boonex/protean/data/template/system/scripts/BxTemplSearchExtendedForm.php

@@ -0,0 +1,17 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaTemplate UNA Template Classes
+ * @{
+ */
+
+/**
+ * @see BxBaseSearchExtendedForm
+ */
+class BxTemplSearchExtendedForm extends BxBaseSearchExtendedForm
+{
+}
+
+/** @} */

+ 17 - 0
modules/boonex/protean/data/template/system/scripts/BxTemplSearchExtendedFormCmts.php

@@ -0,0 +1,17 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaTemplate UNA Template Classes
+ * @{
+ */
+
+/**
+ * @see BxBaseSearchExtendedFormCmts
+ */
+class BxTemplSearchExtendedFormCmts extends BxBaseSearchExtendedFormCmts
+{
+}
+
+/** @} */

+ 14 - 0
modules/boonex/protean/data/template/system/scripts/BxTemplSearchExtendedServices.php

@@ -0,0 +1,14 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaTemplate UNA Template Classes
+ * @{
+ */
+
+class BxTemplSearchExtendedServices extends BxBaseSearchExtendedServices
+{
+}
+
+/** @} */

+ 29 - 0
modules/boonex/russian/data/langs/system/ru.xml

@@ -676,6 +676,11 @@
 	<string name="_adm_form_btn_pre_values_create"><![CDATA[Добавить новый Элемент]]></string>
 	<string name="_adm_form_btn_pre_values_delete_item"><![CDATA[Удалить Элемент]]></string>
 	<string name="_adm_form_btn_pre_values_edit_item"><![CDATA[Редактировать Элемент]]></string>
+	<string name="_adm_form_btn_search_forms_edit"><![CDATA[Редактировать форму поиска]]></string>
+    <string name="_adm_form_btn_search_forms_fields_edit"><![CDATA[Редактировать поле формы поиска]]></string>
+    <string name="_adm_form_btn_search_forms_fields_reset"><![CDATA[Сбросить]]></string>
+    <string name="_adm_form_btn_search_forms_save"><![CDATA[Сохранить]]></string>
+    <string name="_adm_form_btn_search_forms_cancel"><![CDATA[Отменить]]></string>
 	<string name="_adm_form_dsc_displays_title"><![CDATA[Название режима отображения Формы. Видимо только в Студии.]]></string>
 	<string name="_adm_form_dsc_field_attrs_max"><![CDATA[Введите числовое значение]]></string>
 	<string name="_adm_form_dsc_field_attrs_min"><![CDATA[Введите числовое значение]]></string>
@@ -701,6 +706,8 @@
 	<string name="_adm_form_dsc_pre_lists_title"><![CDATA[Название Списка для использования только в Студии]]></string>
 	<string name="_adm_form_dsc_pre_values_empty"><![CDATA[Вы можете использовать его для элементов, таких как "Пожалуйста, выберите...", которые не могут быть отправлены.]]></string>
 	<string name="_adm_form_dsc_pre_values_lkey"><![CDATA[Название Элемента, отображаемое на сайте]]></string>
+	<string name="_adm_form_dsc_search_forms_fields_search_type"><![CDATA[Тип элемента управления в форме поиска]]></string>
+    <string name="_adm_form_dsc_search_forms_title"><![CDATA[Название Формы поиска. Отображается только в Студии.]]></string>
 	<string name="_adm_form_err_cannot_process_action"><![CDATA[Невозможно выполнить действие. Отсутствует связанный обработчик.]]></string>
 	<string name="_adm_form_err_displays_edit"><![CDATA[Невозможно обновить дисплей]]></string>
 	<string name="_adm_form_err_displays_title"><![CDATA[Введите заголовок, более 3 символов]]></string>
@@ -728,6 +735,11 @@
 	<string name="_adm_form_err_pre_values_delete"><![CDATA[Невозможно удалить элемент]]></string>
 	<string name="_adm_form_err_pre_values_edit"><![CDATA[Невозможно обновить элемент]]></string>
 	<string name="_adm_form_err_pre_values_lkey"><![CDATA[Введите заголовок, более 1 символа]]></string>
+	<string name="_adm_form_err_search_forms_essential"><![CDATA[Это важное поле. Заполните его, пожалуйста.]]></string>
+    <string name="_adm_form_err_search_forms_fields_edit"><![CDATA[Не могу обновить поле формы поиска.]]></string>
+    <string name="_adm_from_err_search_forms_fields_reset"><![CDATA[Не могу сбросить форму поиска.]]></string>
+    <string name="_adm_form_err_search_forms_edit"><![CDATA[Не могу обновить выбранную форму поиска.]]></string>
+    <string name="_adm_form_err_search_forms_title"><![CDATA[Введите имя, более 3 символов]]></string>
 	<string name="_adm_form_txt_all_modules"><![CDATA[Все Модули]]></string>
 	<string name="_adm_form_txt_confirm_delete"><![CDATA[Вы уверены, что хотите удалить это поле? Оно будет удалено со всех Дисплеев! Вместо этого можно просто отключить его.]]></string>
 	<string name="_adm_form_txt_displays_edit_popup"><![CDATA[Редактировать "{0}" Дисплей]]></string>
@@ -799,6 +811,7 @@
 	<string name="_adm_form_txt_field_type_submit"><![CDATA[отправка]]></string>
 	<string name="_adm_form_txt_field_type_switcher"><![CDATA[переключатель]]></string>
 	<string name="_adm_form_txt_field_type_text"><![CDATA[текст]]></string>
+	<string name="_adm_form_txt_field_type_text_auto"><![CDATA[авто текст]]></string>
 	<string name="_adm_form_txt_field_type_textarea"><![CDATA[текстовое поле]]></string>
 	<string name="_adm_form_txt_field_type_value"><![CDATA[инфо]]></string>
 	<string name="_adm_form_txt_field_unique"><![CDATA[Уникальное]]></string>
@@ -854,6 +867,18 @@
 	<string name="_adm_form_txt_pre_values_empty"><![CDATA[Использовать пустое значение для данного элемента]]></string>
 	<string name="_adm_form_txt_pre_values_gl_lkey"><![CDATA[Заголовок]]></string>
 	<string name="_adm_form_txt_pre_values_lkey"><![CDATA[Заголовок]]></string>
+	<string name="_adm_form_txt_search_forms_edit_popup"><![CDATA[Редактировать "{0}" форму поиска]]></string>
+    <string name="_adm_form_txt_search_forms_fields"><![CDATA[Поля]]></string>
+    <string name="_adm_form_txt_search_forms_fields_type"><![CDATA[Тип]]></string>
+    <string name="_adm_form_txt_search_forms_fields_caption"><![CDATA[Заголовок]]></string>
+    <string name="_adm_form_txt_search_forms_fields_search_type"><![CDATA[Тип поиска]]></string>
+    <string name="_adm_form_txt_search_forms_fields_search_operator"><![CDATA[Оператор поиска]]></string>
+    <string name="_adm_form_txt_search_forms_fields_select_object"><![CDATA[Выбрать форму...]]></string>
+    <string name="_adm_form_txt_search_forms_fields_edit_popup"><![CDATA[Редактировать "{0}" поле формы поиска]]></string>
+    <string name="_adm_form_txt_search_forms_manage_fields"><![CDATA[Управление полями]]></string>
+    <string name="_adm_form_txt_search_forms_module"><![CDATA[Модуль]]></string>
+    <string name="_adm_form_txt_search_forms_n_fields"><![CDATA[{0} полей]]></string>
+    <string name="_adm_form_txt_search_forms_title"><![CDATA[Системное имя]]></string>
 	<string name="_adm_form_txt_select_display"><![CDATA[Выбрать Дисплей...]]></string>
 	<string name="_adm_form_txt_select_form"><![CDATA[Выбрать Форму...]]></string>
 	<string name="_adm_form_txt_select_list"><![CDATA[Выбрать Список...]]></string>
@@ -871,6 +896,8 @@
 	<string name="_adm_lmi_cpt_checkout"><![CDATA[Оплата {checkout_counter}]]></string>
 	<string name="_adm_lmi_cpt_cover"><![CDATA[Обложка]]></string>
 	<string name="_adm_lmi_cpt_search"><![CDATA[Поиск]]></string>
+	<string name="_adm_lmi_cpt_search_forms"><![CDATA[Формы поиска]]></string>
+    <string name="_adm_lmi_cpt_search_fields"><![CDATA[Поля поиска]]></string>
 	<string name="_adm_lmi_cpt_splash"><![CDATA[Заставка]]></string>
 	<string name="_adm_lmi_cpt_displays"><![CDATA[Дисплеи]]></string>
 	<string name="_adm_lmi_cpt_downloaded"><![CDATA[Скачано]]></string>
@@ -1802,6 +1829,8 @@
 	<string name="_sys_form_checkbox_value_off"><![CDATA[Нет]]></string>
 	<string name="_sys_form_checkbox_value_on"><![CDATA[Да]]></string>
 	<string name="_sys_form_comment"><![CDATA[Комментарий]]></string>
+	<string name="_sys_form_comment_input_caption_cmt_author_id"><![CDATA[Автор]]></string>
+	<string name="_sys_form_comment_input_caption_cmt_text"><![CDATA[Текст]]></string>
 	<string name="_sys_form_comment_input_caption_system_action"><![CDATA[Действие]]></string>
 	<string name="_sys_form_comment_input_caption_system_cmt_id"><![CDATA[Комментировать ID]]></string>
 	<string name="_sys_form_comment_input_caption_system_cmt_image"><![CDATA[Изображение]]></string>

+ 48 - 0
searchExtended.php

@@ -0,0 +1,48 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaCore UNA Core
+ * @{
+ */
+
+require_once('./inc/header.inc.php');
+require_once(BX_DIRECTORY_PATH_INC . "design.inc.php");
+
+bx_import('BxDolLanguages');
+
+check_logged();
+
+$sObject = isset($_REQUEST['object']) ? bx_process_input($_REQUEST['object']) : '';
+$sAction = isset($_REQUEST['action']) && preg_match ('/^[A-Za-z_-]+$/', $_REQUEST['action']) ? bx_process_input($_REQUEST['action']) : '';
+
+if(!empty($sObject)) {
+    $oSearch = BxDolSearchExtended::getObjectInstance($sObject);
+    if(!$oSearch || !$sAction) {
+        echoJson(array());
+        exit;
+    } 
+
+    $sMethod = 'action' . bx_gen_method_name($sAction);
+    if(!method_exists($oSearch, $sMethod)) {
+        echoJson(array());
+        exit;
+    }
+
+    $oSearch->$sMethod();
+    exit;
+}
+
+if(!empty($sAction)) {
+    $sMethod = 'action' . bx_gen_method_name($sAction);
+    if(!method_exists('BxDolSearchExtended', $sMethod)) {
+        echoJson(array());
+        exit;
+    }
+
+    BxDolSearchExtended::$sMethod();
+    exit;
+}
+
+/** @} */

+ 152 - 0
template/scripts/BxBaseSearchExtended.php

@@ -0,0 +1,152 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaBaseView UNA Base Representation Classes
+ * @{
+ */
+
+/**
+ * Extended Search objects representation.
+ * 
+ * @see BxDolSearchExtended
+ */
+class BxBaseSearchExtended extends BxDolSearchExtended
+{
+    protected $_sFormClassName;
+    protected $_sFormClassPath;
+
+    protected $_oForm;
+    protected $_oTemplate;
+
+    public function __construct ($aObject, $oTemplate = null)
+    {
+        parent::__construct ($aObject);
+
+        if ($oTemplate)
+            $this->_oTemplate = $oTemplate;
+        else
+            $this->_oTemplate = BxDolTemplate::getInstance();
+
+        $this->_sFormClassName = '';
+        $this->_sFormClassPath = '';
+
+        $this->_oForm = null;
+    }
+
+    public function getForm()
+    {
+        if(!$this->isEnabled())
+            return '';
+
+        $oForm = $this->prepareForm();
+        return $oForm->getCode();
+    }
+
+    public function getResults()
+    {
+        if(!$this->isEnabled())
+            return '';
+
+        $oForm = $this->prepareForm();
+        if(!$oForm->isSubmittedAndValid()) 
+            return '';
+
+        $oContentInfo = BxDolContentInfo::getObjectInstance($this->_aObject['object_content_info']);
+        if(!$oContentInfo)
+            return '';
+
+        $aParams = array();
+        foreach($this->_aObject['fields'] as $aField) {
+            $sValue = $oForm->getCleanValue($aField['name']);
+            if(empty($sValue))
+                continue;
+
+            $aParams[$aField['name']] = array(
+                'type' => $aField['search_type'],
+            	'value' => $sValue,
+                'operator' => $aField['search_operator']
+            );
+        }
+
+        if(empty($aParams) || !is_array($aParams))
+            return '';
+
+        $aResults = false;
+        bx_alert('search', 'get_data', 0, false, array('object' => $this->_aObject, 'search_params' => $aParams, 'search_results' => &$aResults));
+    	if($aResults === false)
+    	    $aResults = $oContentInfo->getSearchResultExtended($aParams);
+
+    	if(empty($aResults) || !is_array($aResults))
+    	    return '';
+
+    	$sResults = '';
+    	foreach($aResults as $iId)
+    	    $sResults .= $oContentInfo->getContentSearchResultUnit($iId);   	
+
+        return $sResults;
+    }
+
+    protected function &prepareForm()
+    {
+        if(!empty($this->_oForm) && $this->_oForm instanceof BxDolForm)
+            return $this->_oForm;
+
+        $sForm = 'sys_search_extended_' . $this->_sObject;
+        $aForm = array(
+            'form_attrs' => array(
+                'id' => $sForm,
+                'name' => $sForm,
+                'action' => '',
+                'method' => 'post'
+            ),
+            'params' => array(
+                'db' => array(
+                    'table' => '',
+                    'key' => '',
+                    'uri' => '',
+                    'uri_title' => '',
+                    'submit_name' => 'search'
+                ),
+            ),
+            'inputs' => array()
+        );
+
+        foreach ($this->_aObject['fields'] as $aField) {
+            if((int)$aField['active'] == 0)
+                continue;
+
+            $aForm['inputs'][$aField['name']] = array(
+                'type' => $aField['search_type'],
+                'name' => $aField['name'],
+                'caption' => _t($aField['caption']),
+            	'values' => $aField['values'],
+                'value' => $aField['search_value'],
+            	'db' => array(
+                    'pass' => 'Xss'
+                )
+            );
+        }
+
+        $aForm['inputs']['search'] = array(
+            'type' => 'submit',
+            'name' => 'search',
+            'value' => _t('_Search')
+        );
+
+        $sClass = 'BxTemplSearchExtendedForm';
+        if(!empty($this->_sFormClassName)) {
+            $sClass = $this->_sFormClassName;
+            if(!empty($this->_sFormClassPath))
+                require_once(BX_DIRECTORY_PATH_ROOT . $this->_sFormClassPath);
+        }
+
+        $this->_oForm = new $sClass($aForm, $this->_oTemplate);
+        $this->_oForm->initChecker();
+
+        return $this->_oForm;
+    }
+}
+
+/** @} */

+ 26 - 0
template/scripts/BxBaseSearchExtendedCmts.php

@@ -0,0 +1,26 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaBaseView UNA Base Representation Classes
+ * @{
+ */
+
+/**
+ * Extended Search objects representation for Comments.
+ * 
+ * @see BxDolSearchExtendedCmts
+ */
+class BxBaseSearchExtendedCmts extends BxTemplSearchExtended
+{
+    
+    public function __construct ($aObject, $oTemplate = null)
+    {
+        parent::__construct ($aObject, $oTemplate);
+
+        $this->_sFormClassName = 'BxTemplSearchExtendedFormCmts';
+    }
+}
+
+/** @} */

+ 30 - 0
template/scripts/BxBaseSearchExtendedForm.php

@@ -0,0 +1,30 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaBaseView UNA Base Representation Classes
+ * @{
+ */
+
+/**
+ * Extended Search Form.
+ * 
+ * @see BxDolSearchExtended
+ */
+class BxBaseSearchExtendedForm extends BxTemplFormView
+{
+    public function __construct($aInfo, $oTemplate = false)
+    {
+        parent::__construct($aInfo, $oTemplate);
+    }
+
+	protected function genCustomInputAuthor($aInput)
+    {
+        $aInput['ajax_get_suggestions'] = BX_DOL_URL_ROOT . 'searchExtended.php?action=get_authors';
+
+        return $this->genCustomInputUsernamesSuggestions($aInput);
+    }
+}
+
+/** @} */

+ 28 - 0
template/scripts/BxBaseSearchExtendedFormCmts.php

@@ -0,0 +1,28 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaBaseView UNA Base Representation Classes
+ * @{
+ */
+
+/**
+ * Extended Search Form for Comments.
+ * 
+ * @see BxDolSearchExtendedCmts
+ */
+class BxBaseSearchExtendedFormCmts extends BxTemplSearchExtendedForm
+{
+    public function __construct($aInfo, $oTemplate = false)
+    {
+        parent::__construct($aInfo, $oTemplate);
+    }
+
+    protected function genCustomInputCmtAuthorId($aInput)
+    {
+        return parent::genCustomInputAuthor($aInput);
+    }
+}
+
+/** @} */

+ 51 - 0
template/scripts/BxBaseSearchExtendedServices.php

@@ -0,0 +1,51 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaBaseView UNA Base Representation Classes
+ * @{
+ */
+
+/**
+ * System services related to Extended Search.
+ * 
+ * @see BxDolSearchExtended
+ */
+class BxBaseSearchExtendedServices extends BxDol
+{
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    public function serviceGetForm($aParams)
+    {
+        if(empty($aParams['object']))
+            return '';
+
+        $oSearch = BxDolSearchExtended::getObjectInstance($aParams['object']);
+        if(!$oSearch || !$oSearch->isEnabled())
+            return '';
+
+        return $oSearch->getForm();
+    }
+
+    public function serviceGetResults($aParams)
+    {
+        if(empty($aParams['object']))
+            return '';
+
+        $oSearch = BxDolSearchExtended::getObjectInstance($aParams['object']);
+        if(!$oSearch || !$oSearch->isEnabled())
+            return '';
+
+        $bShowEmpty = isset($aParams['show_empty']) && (bool)$aParams['show_empty'];
+
+        $sResults = $oSearch->getResults();
+
+        return !empty($sResults) ? $sResults : ($bShowEmpty ? MsgBox(_t('_Empty')) : ''); 
+    }
+}
+
+/** @} */

Некоторые файлы не были показаны из-за большого количества измененных файлов