Forráskód Böngészése

#3149 - Sorting for adv search more

RomanL 4 éve
szülő
commit
af6e0bc497

+ 5 - 0
inc/classes/BxDolContentInfo.php

@@ -296,6 +296,11 @@ class BxDolContentInfo extends BxDolFactory implements iBxDolFactoryObject
     {
         return $this->_call('get_searchable_fields_extended');
     }
+    
+    public function getSortableFieldsExtended ()
+    {
+        return $this->_call('get_sortable_fields_extended');
+    }
 
     public function getSearchResultExtended ($aParams, $iStart = 0, $iPerPage = 0, $bFilterMode = false)
     {

+ 4 - 3
inc/classes/BxDolFormQuery.php

@@ -346,10 +346,11 @@ class BxDolFormQuery extends BxDolDb
         $oDb->query("DELETE FROM `sys_form_fields_ids` WHERE  `module` = :module", $aBindings);
     }
 
-    public function getFormInputs()
+    static public function getFormInputs($sObject)
     {
-        $sQuery = $this->prepare("SELECT * FROM `sys_form_inputs` WHERE `object` = ? ORDER BY `order` ASC", $this->_aObject['object']);
-        return $this->getAll($sQuery);
+        $oDb = BxDolDb::getInstance();
+        $sQuery = $oDb->prepare("SELECT * FROM `sys_form_inputs` WHERE `object` = ?", $sObject);
+        return $oDb->getAll($sQuery);
     }
 }
 

+ 28 - 2
inc/classes/BxDolSearchExtended.php

@@ -142,18 +142,44 @@ class BxDolSearchExtended extends BxDolFactory implements iBxDolFactoryObject
     }
 
     public function clean()
+    {
+        return $this->cleanFields() & $this->cleanSortableFields();
+    }
+    
+    public function cleanFields()
     {
         return $this->_oDb->deleteFields(array('object' => $this->_sObject)) !== false;
     }
+    
+    public function cleanSortableFields()
+    {
+        return $this->_oDb->deleteSortableFields(array('object' => $this->_sObject)) !== false;
+    }
 
     public function reset()
+    {   
+        $this->resetFields();
+        $this->resetSortableFields();
+        return true;
+    }
+    
+    public function resetFields()
     {
-        if(!$this->clean())
+        if(!$this->cleanFields())
             return false;
-
+        
         $this->_aObject['fields'] = BxDolSearchExtendedQuery::getSearchFields($this->_aObject);
         return true;
     }
+    
+    public function resetSortableFields()
+    {
+        if(!$this->cleanSortableFields())
+            return false;
+        
+        $this->_aObject['fields'] = BxDolSearchExtendedQuery::getSearchSortableFields($this->_aObject);
+        return true;
+    }
 }
 
 /** @} */

+ 38 - 0
inc/classes/BxDolSearchExtendedQuery.php

@@ -25,9 +25,37 @@ class BxDolSearchExtendedQuery extends BxDolDb
             return false;
 
         $aObject['fields'] = self::getSearchFields($aObject);
+        $aObject['sortable_fields'] = self::getSearchSortableFields($aObject);
         return $aObject;
     }
 
+    static public function getSearchSortableFields($aObject)
+    {
+        $oDb = BxDolDb::getInstance();
+        
+        $sQueryFields = "SELECT * FROM `sys_search_extended_sorting_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'])->getSortableFieldsExtended();
+            $iOrder = 0;
+            foreach($aFields as $sField => $aField) {
+                $bResult = (int)$oDb->query("INSERT INTO `sys_search_extended_sorting_fields`(`object`, `name`, `direction`, `caption`, `active`, `order`) VALUES(:object, :name, :direction, :caption, :active, :order)", array(
+                        'object' => $aObject['object'], 
+                        'name' => $aField['name'],
+                        'direction' => $aField['direction'],
+                        'caption' => isset($aField['caption']) ? $aField['caption'] : 'none',
+                        'active' => 1,
+                        'order' => $iOrder++
+                    )) > 0;
+            }
+        }
+        return $aFields;
+    }
+    
     static public function getSearchFields($aObject)
     {
         $oDb = BxDolDb::getInstance();
@@ -143,6 +171,16 @@ class BxDolSearchExtendedQuery extends BxDolDb
 
         return $this->query("DELETE FROM `sys_search_extended_fields` WHERE " . $sWhereClause);
     }
+    
+    public function deleteSortableFields($aWhere)
+    {
+        if(empty($aWhere))
+    		return false;
+
+        $sWhereClause = $this->arrayToSQL($aWhere, ' AND ');
+        
+        return $this->query("DELETE FROM `sys_search_extended_sorting_fields` WHERE " . $sWhereClause);
+    }
 }
 
 /** @} */

+ 22 - 0
inc/js/functions.js

@@ -135,6 +135,24 @@ function loadDynamicBlockAutoPaginate (e, iStart, iPerPage, sAdditionalUrlParams
     return loadDynamicBlockAuto(e, sUrl);
 }
 
+function loadDynamicBlockAutoSort (e, sort, sAdditionalUrlParams) {
+
+    sUrl = location.href;
+    console.log(sort);
+
+    sUrl = sUrl.replace(/sort=\d+/, '').replace(/[&\?]+$/, '');
+    sUrl = bx_append_url_params(sUrl, 'sort' + '=' + sort);
+    if ('undefined' != typeof(sAdditionalUrlParams))
+        sUrl = bx_append_url_params(sUrl, sAdditionalUrlParams);
+
+    if ($(e).parents('.bx-search-result-block-pagination').length > 0){
+        $([document.documentElement, document.body]).animate({
+            scrollTop: $(e).parents('.bx-search-result-block-pagination').first().offset().top
+        }, 500);
+    }
+    return loadDynamicBlockAuto(e, sUrl);
+}
+
 /**
  * This function reloads page block automatically, 
  * just provide any element inside the block and this function will reload the block.
@@ -988,6 +1006,10 @@ function bx_append_url_params (sUrl, mixedParams) {
     return sUrl + sParams + sHash;
 }
 
+function bx_search_extnded_sort(obj, url){
+    location.href = url + '&sort=' +$(obj).val();
+}
+
 function bx_search_on_type (e, n, sFormSel, sResultsContSel, sLoadingContSel, bSortResults, iMinLen, onComplete) {
     var oForm = $(e.target).parents(sFormSel + ':first');
 

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
install/sql/system.sql


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

@@ -359,6 +359,49 @@ class BxBaseModGeneralModule extends BxDolModule
         return $this->_oDb->getEntriesByAuthor((int)$iProfileId);
     }
 
+    public function serviceGetSortableFieldsExtended($aInputsAdd = array())
+    {
+        $CNF = &$this->_oConfig->CNF;
+        if(empty($CNF['OBJECT_FORM_ENTRY']))
+            return array();
+        
+        $aResult = array();
+        
+        $aSortableFields = [];
+        
+        $aInputs = BxDolFormQuery::getFormInputs($CNF['OBJECT_FORM_ENTRY']);
+        foreach($aInputs as $aInput){
+            $aInputs[$aInput['name']] = $aInput;
+            if ($aInput['type'] == 'text'){
+                $aSortableFields[] = $aInput['name'];
+            }
+        }
+        
+        if(!empty($CNF['FIELD_ADDED'])){
+           $aSortableFields[] = $CNF['FIELD_ADDED'];
+        }
+        
+        if(!empty($CNF['FIELD_CHANGED'])){
+           $aSortableFields[] = $CNF['FIELD_CHANGED'];
+        }     
+        
+        foreach($aSortableFields as $sSortableField){
+             $aResult[$sSortableField . '_asc'] = [
+                'name' => $sSortableField,
+                'caption' => $aInputs[$sSortableField]['caption'],
+                'direction' => 'asc'
+            ];
+            
+            $aResult[$sSortableField . '_desc']  = [
+                'name' => $sSortableField,
+                'caption' => $aInputs[$sSortableField]['caption'],
+                'direction' => 'desc'
+            ];
+        }
+        
+        return $aResult;
+    }
+    
     public function serviceGetSearchableFieldsExtended($aInputsAdd = array())
     {
         $CNF = &$this->_oConfig->CNF;

+ 1 - 0
modules/base/profile/template/search_extended_results.html

@@ -1,4 +1,5 @@
 <div class="bx-search-result-block">
+    <div class="bx-def-margin-sec-bottom bx-clearfix">__sort__</div>
     <div class="bx-base-pofile-units-wrapper bx-def-margin-sec-lefttopright-neg bx-def-margin-sec-bottom-neg bx-clearfix">__code__</div>
     <bx_if:show_paginate>
         <div class="bx-search-result-paginate bx-def-margin-top">__paginate__</div>

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

@@ -754,6 +754,7 @@
 	<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_sortable_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>
@@ -822,6 +823,7 @@
 	<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_from_err_search_forms_sortable_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 than 3 characters]]></string>
 	<string name="_adm_form_txt_all_modules"><![CDATA[All Modules]]></string>
@@ -1043,12 +1045,15 @@
 	<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_sortable_fields"><![CDATA[Sortable 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_info"><![CDATA[Description]]></string>
     <string name="_adm_form_txt_search_forms_fields_search_type"><![CDATA[Search Type]]></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_sortable_fields_caption"><![CDATA[Caption]]></string>
+    <string name="_adm_form_txt_search_forms_sortable_fields_direction"><![CDATA[Direction]]></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>
@@ -1074,6 +1079,7 @@
 	<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_search_sortable_fields"><![CDATA[Search Sortable 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>
@@ -3455,6 +3461,10 @@ If it is not enabled then please consider implement this optimization, since it
         <string name="_sys_txt_share_popup_url"><![CDATA[URL]]></string>
         <string name="_sys_txt_share_popup_copy_to_clipboard_text"><![CDATA[Click for copy to the clipboard]]></string>
         <string name="_sys_txt_share_popup_embeded_code"><![CDATA[Embeded code]]></string>
+    
+        <string name="_sys_txt_search_sort_by"><![CDATA[Sort by]]></string>
+        <string name="_sys_txt_search_sort_by_default"><![CDATA[Default]]></string>
+    
         <string name="_sys_unconfirmed"><![CDATA[Unconfirmed]]></string>
 	<string name="_sys_upgrade_conclusion"><![CDATA[<h3>Important info:</h3><p>{0}</p>]]></string>
 	<string name="_sys_upgrade_db_and_files_versions_different"><![CDATA[Database and files versions are different, probably previous patch wasn't applied correctly.]]></string>

+ 1 - 0
studio/classes/BxDolStudioForms.php

@@ -14,6 +14,7 @@ define('BX_DOL_STUDIO_FORM_TYPE_PRE_LISTS', 'pre_lists');
 define('BX_DOL_STUDIO_FORM_TYPE_PRE_VALUES', 'pre_values');
 define('BX_DOL_STUDIO_FORM_TYPE_SEARCH_FORMS', 'search_forms');
 define('BX_DOL_STUDIO_FORM_TYPE_SEARCH_FIELDS', 'search_fields');
+define('BX_DOL_STUDIO_FORM_TYPE_SEARCH_SORTABLE_FIELDS', 'search_sortable_fields');
 define('BX_DOL_STUDIO_FORM_TYPE_LABELS', 'labels');
 define('BX_DOL_STUDIO_FORM_TYPE_CATEGORIES', 'categories');
 define('BX_DOL_STUDIO_FORM_TYPE_GROUPS_ROLES', 'groups_roles');

+ 51 - 0
studio/classes/BxDolStudioFormsQuery.php

@@ -746,6 +746,57 @@ class BxDolStudioFormsQuery extends BxDolDb
 
         return (int)$this->getOne("SELECT FOUND_ROWS()");
     }
+    
+    function getSortableFields($aParams, &$aItems, $bReturnCount = true)
+    {
+        $aMethod = array('name' => 'getAll', 'params' => array(0 => 'query'));
+        $sSelectClause = $sFromClause = $sJoinClause = $sWhereClause = $sGroupClause = $sOrderClause = $sLimitClause = "";
+
+        if(!isset($aParams['order']) || empty($aParams['order']))
+           $sOrderClause = "ORDER BY `tfld`.`order` ASC";
+
+        switch($aParams['type']) {
+            case 'by_id':
+                $aMethod['name'] = 'getRow';
+                $aMethod['params'][1] = array(
+                	'id' => $aParams['id']
+                );
+
+                $sWhereClause = " AND `tfld`.`id`=:id ";
+                break;
+
+            case 'by_object':
+            	$aMethod['params'][1] = array(
+                	'object' => $aParams['object']
+                );
+
+                $sWhereClause = "AND `tfld`.`object`=:object";
+                break;
+
+            case 'counter_by_modules':
+                $aMethod['name'] = 'getPairs';
+                $aMethod['params'][1] = 'module';
+                $aMethod['params'][2] = 'counter';
+                $sSelectClause = ", COUNT(*) AS `counter`";
+                $sGroupClause = "GROUP BY `tfld`.`module`";
+                $sOrderClause = "";
+                break;
+
+            case 'all':
+                break;
+        }
+
+        $aMethod['params'][0] = "SELECT " . ($bReturnCount ? "SQL_CALC_FOUND_ROWS" : "") . " 
+            	`tfld`.*" . $sSelectClause . "
+            FROM `sys_search_extended_sorting_fields` AS `tfld` " . $sJoinClause . "
+            WHERE 1 " . $sWhereClause . " " . $sGroupClause . " " . $sOrderClause . " " . $sLimitClause;
+        $aItems = call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
+
+        if(!$bReturnCount)
+            return !empty($aItems);
+
+        return (int)$this->getOne("SELECT FOUND_ROWS()");
+    }
 
     function alterAdd($sTable, $sField, $sType)
     {

+ 7 - 0
studio/template/scripts/BxBaseStudioForms.php

@@ -28,6 +28,7 @@ class BxBaseStudioForms extends BxDolStudioForms
             BX_DOL_STUDIO_FORM_TYPE_PRE_VALUES => array('icon' => 'indent'),
             BX_DOL_STUDIO_FORM_TYPE_SEARCH_FORMS => array('icon' => 'search'),
             BX_DOL_STUDIO_FORM_TYPE_SEARCH_FIELDS => array('icon' => 'check-square'),
+            BX_DOL_STUDIO_FORM_TYPE_SEARCH_SORTABLE_FIELDS => array('icon' => 'sort'),
             BX_DOL_STUDIO_FORM_TYPE_LABELS => array('icon' => 'tags'),
             BX_DOL_STUDIO_FORM_TYPE_CATEGORIES => array('icon' => 'folder'),
             BX_DOL_STUDIO_FORM_TYPE_GROUPS_ROLES => array('icon' => 'user'),
@@ -41,6 +42,7 @@ class BxBaseStudioForms extends BxDolStudioForms
             'pre_values' => 'sys_studio_forms_pre_values',
             'search_forms' => 'sys_studio_search_forms',
             'search_fields' => 'sys_studio_search_forms_fields',
+            'search_sortable_fields' => 'sys_studio_search_forms_sortable_fields',
             'labels' => 'sys_studio_labels',
             'categories' => 'sys_studio_categories',
             'groups_roles' => 'sys_studio_groups_roles',
@@ -183,6 +185,11 @@ class BxBaseStudioForms extends BxDolStudioForms
     {
         return $this->getGrid($this->aGridObjects['search_fields']);
     }
+    
+    protected function getSearchSortableFields()
+    {
+        return $this->getGrid($this->aGridObjects['search_sortable_fields']);
+    }
 
     protected function getSearchFieldsObject()
     {

+ 1 - 1
studio/template/scripts/BxBaseStudioFormsSearchFields.php

@@ -167,7 +167,7 @@ class BxBaseStudioFormsSearchFields extends BxDolStudioFormsSearchFields
 
     public function performActionReset()
     {
-        $mixedResult = BxDolSearchExtended::getObjectInstance($this->sForm)->reset();
+        $mixedResult = BxDolSearchExtended::getObjectInstance($this->sForm)->resetFields();
         if($mixedResult === false)
             return echoJson(array('msg' => _t('_adm_from_err_search_forms_fields_reset')));
 

+ 15 - 0
studio/template/scripts/BxBaseStudioFormsSearchForms.php

@@ -19,6 +19,8 @@ class BxBaseStudioFormsSearchForms extends BxDolStudioFormsSearchForms
         $this->_aOptions['actions_single']['edit']['attr']['title'] = _t('_adm_form_btn_search_forms_edit');
 
         $this->sUrlViewFields = BX_DOL_URL_STUDIO . 'builder_forms.php?page=search_fields&module=%s&form=%s';
+        
+        $this->sUrlViewSortableFields = BX_DOL_URL_STUDIO . 'builder_forms.php?page=search_sortable_fields&module=%s&form=%s';
     }
 
     public function performActionEdit()
@@ -173,6 +175,19 @@ class BxBaseStudioFormsSearchForms extends BxDolStudioFormsSearchForms
 
         return parent::_getCellDefault ($mixedValue, $sKey, $aField, $aRow);
     }
+    
+    protected function _getCellSortableFields ($mixedValue, $sKey, $aField, $aRow)
+    {
+        $aFields = array();
+        $this->oDb->getSortableFields(array('type' => 'by_object', 'object' => $aRow['object']), $aFields, false);
+
+        $sLink = sprintf($this->sUrlViewSortableFields, $aRow['module'], $aRow['object']);
+        $mixedValue = $this->_oTemplate->parseLink($sLink, _t('_adm_form_txt_search_forms_n_fields', count($aFields)), array(
+            'title' => _t('_adm_form_txt_search_forms_manage_fields')
+        ));
+
+        return parent::_getCellDefault ($mixedValue, $sKey, $aField, $aRow);
+    }
 
     protected function _getFilterControls ()
     {

+ 144 - 0
studio/template/scripts/BxBaseStudioFormsSearchSortableFields.php

@@ -0,0 +1,144 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+
+class BxBaseStudioFormsSearchSortableFields extends BxDolStudioFormsSearchFields
+{
+    protected $sUrlPage;
+
+    function __construct($aOptions, $oTemplate = false)
+    {
+        parent::__construct($aOptions, $oTemplate);
+
+        $this->sUrlPage = BX_DOL_URL_STUDIO . 'builder_forms.php?page=search_sortable_fields';
+    }
+
+
+    public function performActionReset()
+    {
+        $mixedResult = BxDolSearchExtended::getObjectInstance($this->sForm)->resetSortableFields();
+        if($mixedResult === false)
+            return echoJson(array('msg' => _t('_adm_from_err_search_forms_sortable_fields_reset')));
+
+        echoJson(array('grid' => $this->getCode(false)));
+    }
+
+    function getJsObject()
+    {
+        return 'oBxDolStudioFormsSearchFields';
+    }
+
+    function getFormsSelector($sModule = '')
+    {
+        $oForm = new BxTemplStudioFormView(array());
+
+        $aInputForms = array(
+            'type' => 'select',
+            'name' => 'form',
+            'attrs' => array(
+                'id' => 'bx-grid-form-' . $this->_sObject,
+                'onChange' => 'javascript:' . $this->getJsObject() . '.onChangeForm()'
+            ),
+            'value' => $this->sForm,
+            'values' => array(
+                '' => _t('_adm_form_txt_search_forms_fields_select_object'),
+            )
+        );
+
+        if(!empty($sModule)) {
+            $aForms = array();
+            $this->oDb->getSearchForms(array('type' => 'by_module', 'module' => $sModule), $aForms, false);
+
+            foreach($aForms as $aForm)
+                 $aInputForms['values'][] = array(
+                 	'key' => $aForm['object'], 
+                 	'value' => _t($aForm['title'])
+                 );
+        }
+        else
+            $aInputForms['attrs']['disabled'] = 'disabled';
+
+        return $oForm->genRow($aInputForms);
+    }
+
+    function getCode($isDisplayHeader = true)
+    {
+        return $this->_oTemplate->parseHtmlByName('forms_search_fields.html', array(
+            'content' => parent::getCode($isDisplayHeader),
+            'js_object' => $this->getJsObject(),
+            'page_url' => $this->sUrlPage,
+            'grid_object' => $this->_sObject,
+            'params_divider' => $this->sParamsDivider
+        ));
+    }
+
+    protected function _addJsCss()
+    {
+        parent::_addJsCss();
+        $this->_oTemplate->addCss(array('menu.css'));
+        $this->_oTemplate->addJs(array('jquery.form.min.js', 'forms_search_fields.js'));
+
+        $oForm = new BxTemplStudioFormView(array());
+        $oForm->addCssJs();
+    }
+
+    protected function _getCellSwitcher ($mixedValue, $sKey, $aField, $aRow)
+    {
+        if(!$this->_isEditable($aRow))
+            return parent::_getCellDefault('', $sKey, $aField, $aRow);
+
+        return parent::_getCellSwitcher($mixedValue, $sKey, $aField, $aRow);
+    }
+
+    protected function _getActionReset ($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array())
+    {
+        if(!$this->_isResetable($aRow))
+            return '';
+
+        if($this->sForm == '')
+            $isDisabled = true;
+
+        return  parent::_getActionDefault($sType, $sKey, $a, false, $isDisabled, $aRow);
+    }
+
+    protected function _getFilterControls ()
+    {
+        parent::_getFilterControls();
+
+        $sContent = $this->getModulesSelectOne('getSearchForms') . $this->getFormsSelector($this->sModule);
+
+        $oForm = new BxTemplStudioFormView(array());
+
+        $aInputSearch = array(
+            'type' => 'text',
+            'name' => 'keyword',
+            'attrs' => array(
+                'id' => 'bx-grid-search-' . $this->_sObject,
+            ),
+            'tr_attrs' => array(
+                'style' => empty($this->sModule) || empty($this->sForm) ? 'display:none;' : ''
+            )
+        );
+        $sContent .= $oForm->genRow($aInputSearch);
+
+        return  $sContent;
+    }
+
+    protected function _isEditable(&$aRow)
+    {
+    	return true;
+    }
+
+    protected function _isResetable(&$aRow)
+    {
+    	return true;
+    }
+}
+
+/** @} */

+ 19 - 0
studio/template/scripts_templ/BxTemplStudioFormsSearchSortableFields.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudioView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+defined('BX_DOL') or die('hack attempt');
+
+class BxTemplStudioFormsSearchSortableFields extends BxBaseStudioFormsSearchSortableFields
+{
+    function __construct($aOptions, $oTemplate = false)
+    {
+        parent::__construct($aOptions, $oTemplate);
+    }
+}
+/** @} */

+ 56 - 1
template/scripts/BxBaseSearchExtended.php

@@ -98,6 +98,7 @@ class BxBaseSearchExtended extends BxDolSearchExtended
             return '';
 
         $oContentInfo = BxDolContentInfo::getObjectInstance($this->_aObject['object_content_info']);
+        
         if(!$oContentInfo)
             return '';
 
@@ -144,7 +145,14 @@ class BxBaseSearchExtended extends BxDolSearchExtended
         }
 
         $aResults = false;
+        
+        if (bx_get('sort')){
+            $aTmp = explode(':', bx_get('sort'));
+            $aParamsSearch['order'] = [['field' => $aTmp[0], 'direction' => $aTmp[1]]];
+        }
+        
         bx_alert('search', 'get_data', 0, false, array('object' => $this->_aObject, 'search_params' => &$aParamsSearch, 'search_results' => &$aResults));
+
     	if($aResults === false)
     	    $aResults = $oContentInfo->getSearchResultExtended($aParamsSearch, $iStart, $iPerPage + 1, $this->_bFilterMode);
 
@@ -173,9 +181,56 @@ class BxBaseSearchExtended extends BxDolSearchExtended
 
     	$sResults = '';
     	foreach($aResults as $iId)
-    	    $sResults .= $oContentInfo->getContentSearchResultUnit($iId, $sUnitTemplate);   	
+    	    $sResults .= $oContentInfo->getContentSearchResultUnit($iId, $sUnitTemplate); 
+        
+        $sSort = '';
+        if ($sResults != ''){
+
+            $aData = $this->_aObject['sortable_fields'];
+            $aValues = [];
+            foreach($aData as $aField) {
+                if ($aField['active'] == 1)
+                    $aValues[$aField['name'] . ':' . $aField['direction']] = _t($aField['caption']) . ' ' . $aField['direction'];
+            }
+            
+            if (!empty($aValues)){
+                $aValues = array_merge(['' => _t('_sys_txt_search_sort_by_default')], $aValues);
+            }
+            $oForm = new BxTemplFormView(array());
+            
+            $sOnChange = '';
+            if(!$bJsMode) {
+                unset($aParams['start']);
+                unset($aParams['per_page']);
+                list($sPageLink, $aPageParams) = bx_get_base_url_inline($aParams);
+                $sOnChange = "bx_search_extnded_sort(this,'" . BxDolPermalinks::getInstance()->permalink(bx_append_url_params($sPageLink, $aPageParams)) . "')";
+            }
+            else{
+                $sOnChange = "return !loadDynamicBlockAutoSort(this, $(this).val()," . bx_js_string(json_encode($aParams)) . ");";
+            }
+            
+            $sSort = '';
+            if (!empty($aValues)){
+                $aInputSort = array(
+                    'type' => 'select',
+                    'name' => 'sort',
+                    'value' =>  bx_get('sort') ? bx_get('sort') : '',
+                    'values' => $aValues,
+                    'caption' => _t('_sys_txt_search_sort_by'),
+                    'attrs' => array(
+                        'onChange' => $sOnChange,
+                    ),
+                    'tr_attrs' => array(
+                        'class' => 'sort'
+                    )
+                );
+                $sSort = $oForm->genRow($aInputSort);
+            }
+            
+        }
 
         return $this->_oTemplate->parseHtmlByName('search_extended_results.html', array(
+            'sort' => $sSort,
             'code' => $sResults,
             'bx_if:show_paginate' => array(
                 'condition' => $bTmplVarsPaginate,

+ 1 - 0
template/search_extended_results.html

@@ -1,4 +1,5 @@
 <div class="bx-search-result-block">
+    <div class="bx-def-margin-sec-bottom bx-clearfix">__sort__</div>
     <div class="bx-def-margin-sec-bottom-neg bx-clearfix">__code__</div>
     <bx_if:show_paginate>
         <div class="bx-search-result-paginate bx-def-margin-top">__paginate__</div>

Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott