AntonLV 7 лет назад
Родитель
Сommit
e5ba0271e5

+ 12 - 5
modules/boonex/directory/classes/BxDirConfig.php

@@ -39,7 +39,9 @@ class BxDirConfig extends BxBaseModTextConfig
             'FIELD_TITLE' => 'title',
             'FIELD_TEXT' => 'text',
             'FIELD_TEXT_ID' => 'ad-text',
-            'FIELD_CATEGORY' => 'cat',
+            'FIELD_CATEGORY' => 'category',
+            'FIELD_CATEGORY_VIEW' => 'category_view',
+            'FIELD_CATEGORY_SELECT' => 'category_select',
             'FIELD_ALLOW_VIEW_TO' => 'allow_view_to',
             'FIELD_COVER' => 'covers',
             'FIELD_PHOTO' => 'pictures',
@@ -56,7 +58,7 @@ class BxDirConfig extends BxBaseModTextConfig
             'FIELD_LABELS' => 'labels',
             'FIELD_ANONYMOUS' => 'anonymous',
             'FIELDS_WITH_KEYWORDS' => 'auto', // can be 'auto', array of fields or comma separated string of field names, works only when OBJECT_METATAGS is specified
-            
+
             // page URIs
             'URI_VIEW_ENTRY' => 'view-ad',
             'URI_AUTHOR_ENTRIES' => 'ads-author',
@@ -68,9 +70,12 @@ class BxDirConfig extends BxBaseModTextConfig
             'URL_HOME' => 'page.php?i=directory-home',
             'URL_POPULAR' => 'page.php?i=ads-popular',
             'URL_UPDATED' => 'page.php?i=ads-updated',
+            'URL_CATEGORIES' => 'page.php?i=ads-categories',
             'URL_MANAGE_COMMON' => 'page.php?i=ads-manage',
             'URL_MANAGE_ADMINISTRATION' => 'page.php?i=ads-administration',
 
+            'GET_PARAM_CATEGORY' => 'category',
+
             // some params
             'PARAM_CHARS_SUMMARY' => 'bx_directory_summary_chars',
             'PARAM_CHARS_SUMMARY_PLAIN' => 'bx_directory_plain_summary_chars',
@@ -108,7 +113,7 @@ class BxDirConfig extends BxBaseModTextConfig
             'OBJECT_FEATURED' => 'bx_directory',
             'OBJECT_METATAGS' => 'bx_directory',
             'OBJECT_COMMENTS' => 'bx_directory',
-            'OBJECT_CATEGORY' => 'bx_directory_cats',
+            'OBJECT_CATEGORY' => '',
             'OBJECT_PRIVACY_VIEW' => 'bx_directory_allow_view_to',
             'OBJECT_FORM_CATEGORY' => 'bx_directory_category',
             'OBJECT_FORM_CATEGORY_DISPLAY_ADD' => 'bx_directory_category_add',
@@ -173,12 +178,14 @@ class BxDirConfig extends BxBaseModTextConfig
         
         $this->_aJsClasses = array_merge($this->_aJsClasses, array(
             'manage_tools' => 'BxDirManageTools',
-            'studio' => 'BxDirStudio'
+            'studio' => 'BxDirStudio',
+            'entry' => 'BxDirEntry'
         ));
 
         $this->_aJsObjects = array_merge($this->_aJsObjects, array(
             'manage_tools' => 'oBxDirManageTools',
-            'studio' => 'oBxDirStudio'
+            'studio' => 'oBxDirStudio',
+            'entry' => 'oBxDirEntry'
         ));
 
         $this->_aGridObjects = array(

+ 74 - 13
modules/boonex/directory/classes/BxDirDb.php

@@ -39,7 +39,7 @@ class BxDirDb extends BxBaseModTextDb
         if(empty($aParamsWhere))
             return false;
 
-        return (int)$this->query("DELETE FROM `" . $CNF['TABLE_CATEGORIES_TYPES'] . "` WHERE " . $this->arrayToSQL($aParamsWhere, ' AND ')) <= 0;
+        return (int)$this->query("DELETE FROM `" . $CNF['TABLE_CATEGORIES_TYPES'] . "` WHERE " . $this->arrayToSQL($aParamsWhere, ' AND ')) > 0;
     }
 
     public function getCategoryTypes($aParams = array())
@@ -74,7 +74,17 @@ class BxDirDb extends BxBaseModTextDb
 
         return call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
     }
-    
+
+    public function updateCategory($aParamsSet, $aParamsWhere)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        if(empty($aParamsSet) || empty($aParamsWhere))
+            return false;
+
+        return $this->query("UPDATE `" . $CNF['TABLE_CATEGORIES'] . "` SET " . $this->arrayToSQL($aParamsSet) . " WHERE " . $this->arrayToSQL($aParamsWhere, ' AND ')) !== false;
+    }
+
     public function getCategories($aParams = array())
     {
         $CNF = &$this->_oConfig->CNF;
@@ -82,7 +92,7 @@ class BxDirDb extends BxBaseModTextDb
         $aMethod = array('name' => 'getAll', 'params' => array(0 => 'query'));
 
         $sSelectClause = "`tc`.*";
-        $sWhereClause = "";
+        $sJoinClause = $sWhereClause = $sGroupClause = "";
         $sOrderClause = "`tc`.`order` ASC";
 
         switch($aParams['type']) {
@@ -95,13 +105,26 @@ class BxDirDb extends BxBaseModTextDb
                 $sWhereClause = " AND `tc`.`id`=:id";
                 break;
 
+            case 'id_full':
+                $aMethod['name'] = 'getRow';
+                $aMethod['params'][1] = array(
+                    'id' => $aParams['id']
+                );
+
+                $sSelectClause .= ", `tct`.`name` AS `type_name`, `tct`.`display_add` AS `type_display_add`, `tct`.`display_edit` AS `type_display_edit`, `tct`.`display_view` AS `type_display_view`";
+                $sJoinClause = " LEFT JOIN `" . $CNF['TABLE_CATEGORIES_TYPES'] . "` AS `tct` ON `tc`.`type`=`tct`.`id`";
+                $sWhereClause = " AND `tc`.`id`=:id";
+                break;
+
             case 'parent_id':
                 $aMethod['params'][1] = array(
                     'parent_id' => $aParams['parent_id']
                 );
 
-            $sWhereClause = " AND `tc`.`parent_id`=:parent_id";
-            break;
+                $sWhereClause = " AND `tc`.`parent_id`=:parent_id";
+                if(isset($aParams['with_content']) && $aParams['with_content'] === true)
+                    $sWhereClause .= " AND `tc`.`items`>0";
+                break;
 
             case 'parent_id_count':
                 $aMethod['name'] = 'getOne';
@@ -109,9 +132,9 @@ class BxDirDb extends BxBaseModTextDb
                     'parent_id' => $aParams['parent_id']
                 );
 
-            $sSelectClause = "COUNT(`tc`.`id`)";
-            $sWhereClause = " AND `tc`.`parent_id`=:parent_id";
-            break;
+                $sSelectClause = "COUNT(`tc`.`id`)";
+                $sWhereClause = " AND `tc`.`parent_id`=:parent_id";
+                break;
         
             case 'parent_id_order':
                 $aMethod['name'] = 'getOne';
@@ -119,21 +142,59 @@ class BxDirDb extends BxBaseModTextDb
                     'parent_id' => $aParams['parent_id']
                 );
 
-            $sSelectClause = "MAX(`tc`.`order`)";
-            $sWhereClause = " AND `tc`.`parent_id`=:parent_id";
-            break;
+                $sSelectClause = "MAX(`tc`.`order`)";
+                $sWhereClause = " AND `tc`.`parent_id`=:parent_id";
+                break;
+
+            case 'collect_stats':
+                $sSelectClause = "`tc`.`id`, COUNT(`te`.`id`) AS `count`";
+                $sJoinClause = " LEFT JOIN `" . $CNF['TABLE_ENTRIES'] . "` AS `te` ON `tc`.`id`=`te`.`category`";
+                $sWhereClause = " AND `te`.`status`='active' AND `te`.`status_admin`='active' AND (`te`.`allow_view_to`='" . BX_DOL_PG_ALL . "' OR `te`.`allow_view_to`<0)";
+                $sGroupClause = "`tc`.`id`";
+                break;
         }
 
+        if(!empty($sGroupClause))
+            $sGroupClause = "GROUP BY " . $sGroupClause;
+
         if(!empty($sOrderClause))
             $sOrderClause = "ORDER BY " . $sOrderClause;
 
         $aMethod['params'][0] = "SELECT " . $sSelectClause . " 
-            FROM `" . $CNF['TABLE_CATEGORIES'] . "` AS `tc`
-            WHERE 1" . $sWhereClause . " " . $sOrderClause;
+            FROM `" . $CNF['TABLE_CATEGORIES'] . "` AS `tc`" . $sJoinClause . " 
+            WHERE 1" . $sWhereClause . " " . $sGroupClause . " " . $sOrderClause;
 
         return call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
     }
 
+    public function getDisplays($sDisplayPrefix = '', $mixedDisplayType = '')
+    {
+        $sWhereClause = "";
+        $aBindings = array(
+            'display_prefix' => '%' . (!empty($sDisplayPrefix) ? $sDisplayPrefix : $this->_oConfig->getName()) . '%'
+        );
+
+        if(!empty($mixedDisplayType)) {
+            if(is_string($mixedDisplayType)) {
+                $sWhereClause = " AND `display_name` LIKE :display_type";
+
+                $aBindings['display_type'] = '%' . $mixedDisplayType . '%';
+            }
+            else if(is_array($mixedDisplayType)) {
+                $aWhereClauseOr = array();
+                foreach($mixedDisplayType as $iIndex => $sValue) {
+                    $aWhereClauseOr[] = "`display_name` LIKE :display_type_" . $iIndex;
+
+                    $aBindings['display_type_' . $iIndex] = '%' . $sValue . '%';
+                }
+
+                $sWhereClause = " AND (" . implode(" OR ", $aWhereClauseOr) . ")";
+            }
+        }
+
+        return $this->getAll("SELECT * FROM `sys_form_displays` WHERE `display_name` LIKE :display_prefix" . $sWhereClause, $aBindings);
+    }
+
     public function cloneDisplay($sDisplayName, $sNewDisplayName, $sNewDisplayTitle)
     {
         $aDisplay = $this->getRow("SELECT * FROM `sys_form_displays` WHERE `display_name`=:display_name", array('display_name' => $sDisplayName));

+ 34 - 1
modules/boonex/directory/classes/BxDirFormEntry.php

@@ -22,6 +22,12 @@ class BxDirFormEntry extends BxBaseModTextFormEntry
         parent::__construct($aInfo, $oTemplate);
 
         $CNF = &$this->_oModule->_oConfig->CNF;
+        
+        $iCategory = 0;
+        if(bx_get('category') !== false)
+            $iCategory = (int)bx_get('category');
+
+        $this->_initCategoryFields($iCategory);
 
     	if(isset($CNF['FIELD_COVER']) && isset($this->aInputs[$CNF['FIELD_COVER']])) {
             if($this->_oModule->checkAllowedSetThumb() === CHECK_ACTION_RESULT_ALLOWED) {
@@ -79,6 +85,12 @@ class BxDirFormEntry extends BxBaseModTextFormEntry
         }
     }
 
+    function getCode($bDynamicMode = false)
+    {
+        $this->_oModule->_oTemplate->addJs('entry.js');
+        return $this->_oModule->_oTemplate->getJsCode('entry') . parent::getCode($bDynamicMode);
+    }
+
     function initChecker ($aValues = array (), $aSpecificValues = array())
     {
         $CNF = &$this->_oModule->_oConfig->CNF;
@@ -86,7 +98,9 @@ class BxDirFormEntry extends BxBaseModTextFormEntry
         $bValues = $aValues && !empty($aValues['id']);
         $aContentInfo = $bValues ? $this->_oModule->_oDb->getContentInfoById($aValues['id']) : false;
 
-        if (isset($CNF['FIELD_COVER']) && isset($this->aInputs[$CNF['FIELD_COVER']])) {
+        $this->_initCategoryFields($aContentInfo[$CNF['FIELD_CATEGORY']]);
+
+        if(isset($CNF['FIELD_COVER']) && isset($this->aInputs[$CNF['FIELD_COVER']])) {
             if($bValues)
                 $this->aInputs[$CNF['FIELD_COVER']]['content_id'] = $aValues['id'];
 
@@ -141,6 +155,25 @@ class BxDirFormEntry extends BxBaseModTextFormEntry
             'editor_id' => isset($CNF['FIELD_TEXT_ID']) ? $CNF['FIELD_TEXT_ID'] : ''
     	);
     }
+
+    protected function _initCategoryFields($iCategory)
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        if(isset($CNF['FIELD_CATEGORY']) && isset($this->aInputs[$CNF['FIELD_CATEGORY']]) && $iCategory != 0) {
+            $this->aInputs[$CNF['FIELD_CATEGORY']]['value'] = $iCategory;
+        }
+        
+        if(isset($CNF['FIELD_CATEGORY_VIEW']) && isset($this->aInputs[$CNF['FIELD_CATEGORY_VIEW']]) && $iCategory != 0) {
+            $aCategory = $this->_oModule->_oDb->getCategories(array('type' => 'id', 'id' => $iCategory));
+
+            $this->aInputs[$CNF['FIELD_CATEGORY_VIEW']]['value'] = !empty($aCategory['title']) ? _t($aCategory['title']) : '';
+        }
+
+        if(isset($CNF['FIELD_CATEGORY_SELECT']) && isset($this->aInputs[$CNF['FIELD_CATEGORY_SELECT']])) {
+            $this->aInputs[$CNF['FIELD_CATEGORY_SELECT']]['values'] = $this->_oModule->serviceGetCategoryOptions(0, true);
+        }
+    }
 }
 
 /** @} */

+ 28 - 6
modules/boonex/directory/classes/BxDirFormsEntryHelper.php

@@ -18,16 +18,38 @@ class BxDirFormsEntryHelper extends BxBaseModTextFormsEntryHelper
     {
         parent::__construct($oModule);
     }
+    
+    public function onDataAddAfter($iAccountId, $iContentId)
+    {
+        $s = parent::onDataAddAfter($iAccountId, $iContentId);
+        if(!empty($s))
+            return $s;
+
+        $this->_oModule->serviceUpdateCategoriesStats();
+
+        return '';
+    }
+
+    public function onDataEditAfter($iContentId, $aContentInfo, $aTrackTextFieldsChanges, $oProfile, $oForm)
+    {
+        $s = parent::onDataEditAfter($iContentId, $aContentInfo, $aTrackTextFieldsChanges, $oProfile, $oForm);
+        if(!empty($s))
+            return $s;
+
+        $this->_oModule->serviceUpdateCategoriesStats();
+
+        return '';
+    }
 
-    protected function _alertAfterAdd($aContentInfo)
+    public function onDataDeleteAfter ($iContentId, $aContentInfo, $oProfile)
     {
-        $CNF = &$this->_oModule->_oConfig->CNF;
+        $s = parent::onDataDeleteAfter ($iContentId, $aContentInfo, $oProfile);
+        if(!empty($s))
+            return $s;
 
-        $aParams = array('object_author_id' => $aContentInfo[$CNF['FIELD_AUTHOR']]);
-        if(isset($aContentInfo[$CNF['FIELD_ALLOW_VIEW_TO']]))
-        	$aParams['privacy_view'] = $aContentInfo[$CNF['FIELD_ALLOW_VIEW_TO']];
+        $this->_oModule->serviceUpdateCategoriesStats();
 
-        bx_alert($this->_oModule->getName(), ($aContentInfo[$CNF['FIELD_STATUS']] == 'awaiting' ? 'scheduled' : 'added'), $aContentInfo[$CNF['FIELD_ID']], $aContentInfo[$CNF['FIELD_AUTHOR']], $aParams);
+        return '';
     }
 }
 

+ 23 - 0
modules/boonex/directory/classes/BxDirMenuSnippetMeta.php

@@ -11,11 +11,34 @@
 
 class BxDirMenuSnippetMeta extends BxBaseModTextMenuSnippetMeta
 {
+    protected $_sCategoryUrl;
+    
     public function __construct($aObject, $oTemplate = false)
     {
         $this->_sModule = 'bx_directory';
 
         parent::__construct($aObject, $oTemplate);
+
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        $this->_sCategoryUrl = BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink($CNF['URL_CATEGORIES'], array($CNF['GET_PARAM_CATEGORY'] => ''));
+    }
+
+    protected function _getMenuItemCategory($aItem)
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        if(empty($CNF['FIELD_CATEGORY']) || empty($this->_aContentInfo[$CNF['FIELD_CATEGORY']]))
+            return false;
+
+        $iCategory = (int)$this->_aContentInfo[$CNF['FIELD_CATEGORY']];
+        $aCategory = $this->_oModule->_oDb->getCategories(array('type' => 'id', 'id' => $iCategory));
+        if(empty($aCategory) || !is_array($aCategory))
+            return false;
+
+        return $this->getUnitMetaItemLink(_t($aCategory['title']), array(
+            'href' => $this->_sCategoryUrl . $iCategory
+        ));
     }
 }
 

+ 172 - 1
modules/boonex/directory/classes/BxDirModule.php

@@ -17,11 +17,182 @@ class BxDirModule extends BxBaseModTextModule
     function __construct(&$aModule)
     {
         parent::__construct($aModule);
+
+        $CNF = &$this->_oConfig->CNF;
+
+        $this->_aSearchableNamesExcept = array_merge($this->_aSearchableNamesExcept, array(
+            $CNF['FIELD_CATEGORY_VIEW'],
+            $CNF['FIELD_CATEGORY_SELECT']
+        ));
+    }
+
+    public function serviceUpdateCategoriesStats()
+    {
+        $aStats = $this->_oDb->getCategories(array('type' => 'collect_stats'));
+        if(empty($aStats) || !is_array($aStats))
+            return true;
+
+        $iUpdated = 0;
+        foreach($aStats as $aStat)
+            if($this->_oDb->updateCategory(array('items' => $aStat['count']), array('id' => $aStat['id'])))
+                $iUpdated++;
+
+        return count($aStats) == $iUpdated;
+    }
+
+    public function serviceGetCategoryOptions($iParentId, $bPleaseSelect = false)
+    {
+        $aValues = array();
+        if($bPleaseSelect)
+            $aValues[] = array('key' => '', 'value' => _t('_sys_please_select'));
+
+        $this->_getCategoryOptions($iParentId, $aValues);
+
+        return $aValues;
+    }
+
+    public function serviceGetSearchableFields($aInputsAdd = array())
+    {
+        $aInputsAdd = array_merge($aInputsAdd, $this->_getSearchableFields());
+
+        return parent::serviceGetSearchableFields($aInputsAdd);
+    }
+
+    public function serviceGetSearchableFieldsExtended($aInputsAdd = array())
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $aInputsAdd = array_merge($aInputsAdd, $this->_getSearchableFields());
+
+        if(isset($aInputsAdd[$CNF['FIELD_CATEGORY']])) {
+            $aInputsAdd[$CNF['FIELD_CATEGORY']]['type'] = 'select';
+            $aInputsAdd[$CNF['FIELD_CATEGORY']]['values_src'] = BxDolService::getSerializedService($this->_oConfig->getName(), 'get_category_options', array(0));
+        }
+
+        return parent::serviceGetSearchableFieldsExtended($aInputsAdd);
+    }
+
+    public function serviceEntityCreate ($sParams = false)
+    {
+        if(($sDisplay = $this->_getCategoryDisplay('add')) !== false) {
+            if(empty($sParams) || !is_array($sParams))
+                $sParams = array();
+
+            $sParams['display'] = $sDisplay;
+        }
+
+        return parent::serviceEntityCreate($sParams);
     }
 
     public function serviceCategoriesList($aParams = array())
     {
-        return 'Categories would be here!';
+        return $this->_oTemplate->categoriesList();
+    }
+
+    public function serviceBrowseCategory($iCategoryId = 0, $aParams = array())
+    {
+        $sParamGet = 'category';
+
+        $bEmptyMessage = isset($aParams['empty_message']) ? (bool)$aParams['empty_message'] : true;
+
+        if(!$iCategoryId)
+            $iCategoryId = bx_process_input(bx_get($sParamGet), BX_DATA_INT);
+        if(!$iCategoryId)
+            return $bEmptyMessage ? MsgBox(_t('_Empty')) : '';
+
+        $aBlock = $this->_serviceBrowseWithParam('category', $sParamGet, $iCategoryId, $aParams);
+        if(!empty($aBlock['content'])) {
+            $aCategory = $this->_oDb->getCategories(array('type' => 'id', 'id' => $iCategoryId));
+            if(!empty($aCategory['title']))
+                $aBlock['title'] = _t('_bx_directory_page_block_title_entries_by_category_mask', _t($aCategory['title']));
+        }
+
+        return $aBlock;
+    }
+
+    /**
+     * Common methods.
+     */
+
+
+    /**
+     * Internal methods.
+     */
+    protected function _serviceEntityForm ($sFormMethod, $iContentId = 0, $sDisplay = false, $sCheckFunction = false, $bErrorMsg = true)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $mixedContent = $this->_getContent($iContentId, true);
+        if($mixedContent === false)
+            return false;
+
+        list($iContentId, $aContentInfo) = $mixedContent;
+
+        $sDisplayType = false;
+        switch($sFormMethod) {
+            case 'editDataForm':
+                $sDisplayType = 'edit';
+                break;
+            case 'viewDataForm':
+            case 'viewDataEntry':
+                $sDisplayType = 'view';
+                break;
+        }
+
+        if($sDisplayType !== false && ($sDisplayNew = $this->_getCategoryDisplay($sDisplayType, $aContentInfo[$CNF['FIELD_CATEGORY']])) !== false)
+            $sDisplay = $sDisplayNew;
+
+        return parent::_serviceEntityForm ($sFormMethod, $iContentId, $sDisplay, $sCheckFunction, $bErrorMsg);
+    }
+
+    protected function _getCategoryDisplay($sDisplayType, $iCategory = 0)
+    {
+        if(empty($iCategory) && bx_get('category') !== false)
+            $iCategory = (int)bx_get('category');
+
+        if(empty($iCategory))
+            return false;
+
+        $aCategory = $this->_oDb->getCategories(array('type' => 'id_full', 'id' => $iCategory));
+
+        $sKey = 'type_display_' . $sDisplayType;
+        if(empty($aCategory[$sKey]))
+            return false;
+
+        return $aCategory[$sKey];
+    }
+
+    protected function _getCategoryOptions($iParentId, &$aValues)
+    {
+        $aCategories = $this->_oDb->getCategories(array('type' => 'parent_id', 'parent_id' => $iParentId));
+        foreach($aCategories as $aCategory) {
+            $aValues[] = array('key' => $aCategory['id'], 'value' => str_repeat('--', (int)$aCategory['level']) . ' ' . _t($aCategory['title']));
+
+            $this->_getCategoryOptions($aCategory['id'], $aValues);
+        }
+    }
+
+    protected function _getSearchableFields($mixedDisplayType = '')
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        if(empty($mixedDisplayType))
+            $mixedDisplayType = array('add', 'edit');
+
+        $aResult = array();
+        $aDisplays = $this->_oDb->getDisplays($this->_oConfig->getName() . '_entry', $mixedDisplayType);
+        foreach($aDisplays as $aDisplay) {
+            if($aDisplay['display_name'] == $CNF['OBJECT_FORM_ENTRY_DISPLAY_ADD'])
+                continue;
+
+            $oForm = BxDolForm::getObjectInstance($CNF['OBJECT_FORM_ENTRY'], $aDisplay['display_name'], $this->_oTemplate);
+            if(!$oForm)
+                continue;
+
+            $aResult = array_merge($aResult, $oForm->aInputs);
+        }
+
+        return $aResult;
     }
 }
 

+ 9 - 0
modules/boonex/directory/classes/BxDirSearchResult.php

@@ -26,6 +26,7 @@ class BxDirSearchResult extends BxBaseModTextSearchResult
             'restriction' => array(
                 'author' => array('value' => '', 'field' => 'author', 'operator' => '='),
                 'featured' => array('value' => '', 'field' => 'featured', 'operator' => '<>'),
+                'category' => array('value' => '', 'field' => 'category', 'operator' => '='),
                 'status' => array('value' => 'active', 'field' => 'status', 'operator' => '='),
                 'statusAdmin' => array('value' => 'active', 'field' => 'status_admin', 'operator' => '='),
             ),
@@ -102,6 +103,14 @@ class BxDirSearchResult extends BxBaseModTextSearchResult
                 $this->aCurrent['sorting'] = 'updated';
                 break;
 
+            case 'category':
+                $this->sBrowseUrl = BxDolPermalinks::getInstance()->permalink($CNF['URL_CATEGORIES']);
+                $this->aCurrent['restriction']['category']['value'] = $aParams['category'];
+                $this->aCurrent['title'] = _t('_bx_directory_page_title_browse_category');
+                $this->aCurrent['rss']['link'] = 'modules/?r=ads/rss/' . $sMode;
+                $this->aCurrent['sorting'] = 'last';
+                break;
+
             case '': // search results
                 $this->sBrowseUrl = BX_DOL_SEARCH_KEYWORD_PAGE;
                 $this->aCurrent['title'] = _t('_bx_directory');

+ 49 - 0
modules/boonex/directory/classes/BxDirTemplate.php

@@ -19,6 +19,55 @@ class BxDirTemplate extends BxBaseModTextTemplate
         $this->MODULE = 'bx_directory';
 
         parent::__construct($oConfig, $oDb);
+
+        $this->aMethodsToCallAddJsCss[] = 'categories';
+    }
+
+    public function categoriesList()
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        return $this->_categoriesList(0, array(
+            'url' => BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink($CNF['URL_CATEGORIES'], array('category' => ''))
+        ));
+    }
+
+    protected function _categoriesList($iParentId, $aParams = array())
+    {
+        $aCategories = $this->_oDb->getCategories(array('type' => 'parent_id', 'parent_id' => $iParentId));
+
+        $aTmplVars = array();
+        foreach($aCategories as $aCategory) {
+            $iItems = (int)$aCategory['items'];
+
+            $sSibcategories = $this->_categoriesList($aCategory['id'], $aParams);
+            if($iItems == 0 && empty($sSibcategories))
+                continue;
+
+            $aTmplVars[] = array(
+                'url' => $aParams['url'] . $aCategory['id'],
+                'title' => _t($aCategory['title']),
+                'bx_if:show_counter' => array(
+                    'condition' => $iItems != 0,
+                    'content' => array(
+                        'items' => $iItems,
+                    )
+                ),
+                'bx_if:show_subcategories' => array(
+                    'condition' => !empty($sSibcategories),
+                    'content' => array(
+                        'subcategories' => $sSibcategories
+                    )
+                )
+            );
+        }
+
+        if(empty($aTmplVars))
+            return '';
+
+        return $this->parseHtmlByName('categories.html', array(
+            'bx_repeat:categories' => $aTmplVars
+        ));
     }
 
     /**

+ 44 - 39
modules/boonex/directory/install/langs/en.xml

@@ -64,8 +64,10 @@
     <string name="_bx_directory_form_entry_input_sys_year"><![CDATA[Year]]></string>
     <string name="_bx_directory_form_entry_input_year"><![CDATA[Year]]></string>
     <string name="_bx_directory_form_entry_input_sys_category"><![CDATA[Category]]></string>
-    <string name="_bx_directory_form_entry_input_category"><![CDATA[Category]]></string>
-    <string name="_bx_directory_form_entry_input_category_err"><![CDATA[Please select category]]></string>
+    <string name="_bx_directory_form_entry_input_sys_category_view"><![CDATA[Category]]></string>
+    <string name="_bx_directory_form_entry_input_category_view"><![CDATA[Category]]></string>
+    <string name="_bx_directory_form_entry_input_sys_category_select"><![CDATA[Category]]></string>
+    <string name="_bx_directory_form_entry_input_category_select"><![CDATA[Category]]></string>
     <string name="_bx_directory_form_entry_input_sys_text"><![CDATA[Text]]></string>
     <string name="_bx_directory_form_entry_input_text"><![CDATA[Text]]></string>
     <string name="_bx_directory_form_entry_input_text_err"><![CDATA[Text field can't be empty]]></string>
@@ -131,6 +133,7 @@
     <string name="_bx_directory_page_title_browse_recent"><![CDATA[Latest Ads]]></string>
     <string name="_bx_directory_page_title_browse_popular"><![CDATA[Popular Ads]]></string>
     <string name="_bx_directory_page_title_browse_updated"><![CDATA[Updated Ads]]></string>
+    <string name="_bx_directory_page_title_browse_category"><![CDATA[Ads in {display_name}]]]]></string>
     <string name="_bx_directory_page_title_sys_home"><![CDATA[Directory Home]]></string>
     <string name="_bx_directory_page_title_home"><![CDATA[Directory]]></string>
     <string name="_bx_directory_page_block_title_featured_entries_view_extended"><![CDATA[Featured Ads]]></string>
@@ -181,7 +184,7 @@
     <string name="_bx_directory_page_block_title_system_manage_administration"><![CDATA[Manage All]]></string>
     <string name="_bx_directory_page_block_title_manage"><![CDATA[Manage]]></string>    
     <string name="_bx_directory_page_block_title_popular_keywords"><![CDATA[Popular Hashtags]]></string>
-    <string name="_bx_directory_page_block_title_cats"><![CDATA[Ads Categories]]></string>
+    <string name="_bx_directory_page_block_title_categories"><![CDATA[Ads Categories]]></string>
     <string name="_bx_directory_page_block_title_entry_info"><![CDATA[Info]]></string>
     <string name="_bx_directory_page_block_title_my_entries"><![CDATA[My Ads]]></string>
     <string name="_bx_directory_page_block_title_sys_recent_entries_view_showcase"><![CDATA[Latest Ads (Showcase View)]]></string>
@@ -192,6 +195,10 @@
     <string name="_bx_directory_page_block_title_featured_entries_view_showcase"><![CDATA[Featured Ads]]></string>
     <string name="_bx_directory_page_block_title_sys_entry_context"><![CDATA[Posted in]]></string>
     <string name="_bx_directory_page_block_title_entry_context"><![CDATA[Posted in]]></string>
+    <string name="_bx_directory_page_title_sys_entries_categories"><![CDATA[Ads Categories]]></string>
+    <string name="_bx_directory_page_title_entries_categories"><![CDATA[Ads Categories]]></string>
+    <string name="_bx_directory_page_block_title_entries_by_category"><![CDATA[Ads]]></string>
+    <string name="_bx_directory_page_block_title_entries_by_category_mask"><![CDATA[Ads in: {0}]]></string>
 
     <string name="_bx_directory_menu_title_entry_attachments"><![CDATA[Form Attachments]]></string>
     <string name="_bx_directory_menu_set_title_entry_attachments"><![CDATA[Form Attachments]]></string>
@@ -249,10 +256,12 @@
     <string name="_bx_directory_menu_item_title_system_manage_account"><![CDATA[Manage account]]></string>
     <string name="_bx_directory_menu_item_title_manage_account"><![CDATA[Manage account]]></string>
     <string name="_bx_directory_menu_item_title_system_admt_posts"><![CDATA[Ads]]></string>
-    <string name="_bx_directory_menu_item_title_admt_posts"><![CDATA[Ads]]></string>
+    <string name="_bx_directory_menu_item_title_admt_posts"><![CDATA[Ads - {addon} hidden]]></string>
     <string name="_bx_directory_menu_item_title_manage_my"><![CDATA[My Ads]]></string>
     <string name="_bx_directory_menu_item_title_manage_all"><![CDATA[All Ads]]></string>
     <string name="_bx_directory_menu_item_title_categories"><![CDATA[Categories]]></string>
+    <string name="_bx_directory_menu_item_title_system_entries_categories"><![CDATA[Categories]]></string>
+    <string name="_bx_directory_menu_item_title_entries_categories"><![CDATA[Categories]]></string>
 
     <string name="_bx_directory_grid_column_title_icon"><![CDATA[Icon]]></string>
     <string name="_bx_directory_grid_column_title_title"><![CDATA[Title]]></string>
@@ -290,54 +299,50 @@
     <string name="_bx_directory_cat_type_price_year"><![CDATA[With price and year]]></string>
 
     <string name="_bx_directory_cat_title_job"><![CDATA[Jobs]]></string>
-    <string name="_bx_directory_cat_title_accounting_finance"><![CDATA[accounting / finance]]></string>
-    <string name="_bx_directory_cat_title_education_nonprofit"><![CDATA[education / nonprofit]]></string>
-    <string name="_bx_directory_cat_title_government_legal"><![CDATA[government / legal]]></string>
-    <string name="_bx_directory_cat_title_programming_web_design"><![CDATA[programming / web design]]></string>
-    <string name="_bx_directory_cat_title_other_jobs"><![CDATA[other]]></string>
+    <string name="_bx_directory_cat_title_accounting_finance"><![CDATA[Accounting / finance jobs]]></string>
+    <string name="_bx_directory_cat_title_education_nonprofit"><![CDATA[Education / nonprofit jobs]]></string>
+    <string name="_bx_directory_cat_title_government_legal"><![CDATA[Government / legal jobs]]></string>
+    <string name="_bx_directory_cat_title_programming_web_design"><![CDATA[Programming / web design jobs]]></string>
 
     <string name="_bx_directory_cat_title_music"><![CDATA[Music Exchange]]></string>
-    <string name="_bx_directory_cat_title_instrument_sale"><![CDATA[instruments for sale]]></string>
-    <string name="_bx_directory_cat_title_instrument_wanted"><![CDATA[instruments wanted]]></string>
-    <string name="_bx_directory_cat_title_other"><![CDATA[other]]></string>
-
+    <string name="_bx_directory_cat_title_instrument_sale"><![CDATA[Music instruments for sale]]></string>
+    <string name="_bx_directory_cat_title_instrument_wanted"><![CDATA[Music instruments wanted]]></string>
+    
     <string name="_bx_directory_cat_title_housing"><![CDATA[Housing & Rentals]]></string>
-    <string name="_bx_directory_cat_title_apartments_housing"><![CDATA[apartments / housing]]></string>
-    <string name="_bx_directory_cat_title_office_commercial"><![CDATA[office / commercial]]></string>
-    <string name="_bx_directory_cat_title_real_estate_sale"><![CDATA[real estate for sale]]></string>
-    <string name="_bx_directory_cat_title_roommate"><![CDATA[roommates]]></string>
-    <string name="_bx_directory_cat_title_temporary_rental"><![CDATA[temporary rental]]></string>
+    <string name="_bx_directory_cat_title_apartments_housing"><![CDATA[Apartments / housing]]></string>
+    <string name="_bx_directory_cat_title_office_commercial"><![CDATA[Office / commercial]]></string>
+    <string name="_bx_directory_cat_title_real_estate_sale"><![CDATA[Real estate for sale]]></string>
+    <string name="_bx_directory_cat_title_roommate"><![CDATA[Roommates]]></string>
+    <string name="_bx_directory_cat_title_temporary_rental"><![CDATA[Temporary rental]]></string>
     
     <string name="_bx_directory_cat_title_service"><![CDATA[Services]]></string>
-    <string name="_bx_directory_cat_title_automotive"><![CDATA[automotive]]></string>
-    <string name="_bx_directory_cat_title_educational"><![CDATA[educational]]></string>
-    <string name="_bx_directory_cat_title_financial"><![CDATA[financial]]></string>
-    <string name="_bx_directory_cat_title_labor_move"><![CDATA[labor / move]]></string>
-    <string name="_bx_directory_cat_title_legal"><![CDATA[legal]]></string>
+    <string name="_bx_directory_cat_title_automotive"><![CDATA[Automotive services]]></string>
+    <string name="_bx_directory_cat_title_educational"><![CDATA[Educational services]]></string>
+    <string name="_bx_directory_cat_title_financial"><![CDATA[Financial services]]></string>
+    <string name="_bx_directory_cat_title_labor_move"><![CDATA[Labor / move services]]></string>
+    <string name="_bx_directory_cat_title_legal"><![CDATA[Legal services]]></string>
 
     <string name="_bx_directory_cat_title_casting"><![CDATA[Casting Calls]]></string>
-    <string name="_bx_directory_cat_title_acting"><![CDATA[acting]]></string>
-    <string name="_bx_directory_cat_title_dance"><![CDATA[dance]]></string>
-    <string name="_bx_directory_cat_title_modeling"><![CDATA[modeling]]></string>
-    <string name="_bx_directory_cat_title_musician"><![CDATA[musicians]]></string>
-    <string name="_bx_directory_cat_title_reality_show"><![CDATA[reality shows]]></string>
+    <string name="_bx_directory_cat_title_acting"><![CDATA[Acting castings]]></string>
+    <string name="_bx_directory_cat_title_dance"><![CDATA[Dance castings]]></string>
+    <string name="_bx_directory_cat_title_modeling"><![CDATA[Modeling castings]]></string>
+    <string name="_bx_directory_cat_title_musician"><![CDATA[Musicians castings]]></string>
+    <string name="_bx_directory_cat_title_reality_show"><![CDATA[Reality shows castings]]></string>
 
     <string name="_bx_directory_cat_title_personal"><![CDATA[Personals]]></string>
-    <string name="_bx_directory_cat_title_men_women"><![CDATA[men seeking women]]></string>
-    <string name="_bx_directory_cat_title_women_men"><![CDATA[women seeking men]]></string>
-    <string name="_bx_directory_cat_title_missed_connection"><![CDATA[missed connections]]></string>
-    <string name="_bx_directory_cat_title_personal_other"><![CDATA[other]]></string>
+    <string name="_bx_directory_cat_title_men_women"><![CDATA[Men seeking women]]></string>
+    <string name="_bx_directory_cat_title_women_men"><![CDATA[Women seeking men]]></string>
+    <string name="_bx_directory_cat_title_missed_connection"><![CDATA[Missed connections]]></string>
 
     <string name="_bx_directory_cat_title_sale"><![CDATA[For Sale]]></string>
-    <string name="_bx_directory_cat_title_barter"><![CDATA[barter]]></string>
-    <string name="_bx_directory_cat_title_clothing"><![CDATA[clothing]]></string>
-    <string name="_bx_directory_cat_title_collectible"><![CDATA[collectibles]]></string>
-    <string name="_bx_directory_cat_title_miscellaneous"><![CDATA[miscellaneous]]></string>
+    <string name="_bx_directory_cat_title_barter"><![CDATA[Barter]]></string>
+    <string name="_bx_directory_cat_title_clothing"><![CDATA[Sale clothing]]></string>
+    <string name="_bx_directory_cat_title_collectible"><![CDATA[Sale collectibles]]></string>
 
     <string name="_bx_directory_cat_title_sale_car"><![CDATA[Cars For Sale]]></string>
-    <string name="_bx_directory_cat_title_auto_part"><![CDATA[auto parts]]></string>
-    <string name="_bx_directory_cat_title_auto_truck"><![CDATA[autos / trucks]]></string>
-    <string name="_bx_directory_cat_title_motorcycle"><![CDATA[motorcycles]]></string>
+    <string name="_bx_directory_cat_title_auto_part"><![CDATA[Sale auto parts]]></string>
+    <string name="_bx_directory_cat_title_auto_truck"><![CDATA[Sale autos / trucks]]></string>
+    <string name="_bx_directory_cat_title_motorcycle"><![CDATA[Sale motorcycles]]></string>
 
 
     <string name="_bx_directory_txt_all_entries_in"><![CDATA[<a href="{0}">All Ads in {1} ({2})</a>]]></string>

+ 1 - 1
modules/boonex/directory/install/sql/disable.sql

@@ -8,7 +8,7 @@ DELETE FROM `sys_options_types` WHERE `id` = @iTypeId;
 
 -- PAGES
 DELETE FROM `sys_objects_page` WHERE `module` = 'bx_directory';
-DELETE FROM `sys_pages_blocks` WHERE `module` = 'bx_directory' OR `object` IN ('bx_directory_create_entry', 'bx_directory_edit_entry', 'bx_directory_delete_entry', 'bx_directory_view_entry', 'bx_directory_view_entry_comments', 'bx_directory_home', 'bx_directory_popular', 'bx_directory_updated', 'bx_directory_author', 'bx_directory_context', 'bx_directory_search', 'bx_directory_manage');
+DELETE FROM `sys_pages_blocks` WHERE `module` = 'bx_directory' OR `object` IN ('bx_directory_create_entry', 'bx_directory_edit_entry', 'bx_directory_delete_entry', 'bx_directory_view_entry', 'bx_directory_view_entry_comments', 'bx_directory_home', 'bx_directory_popular', 'bx_directory_updated', 'bx_directory_categories', 'bx_directory_author', 'bx_directory_context', 'bx_directory_search', 'bx_directory_manage');
 
 -- MENU
 DELETE FROM `sys_objects_menu` WHERE `module` = 'bx_directory';

+ 18 - 38
modules/boonex/directory/install/sql/enable.sql

@@ -19,35 +19,29 @@ INSERT INTO `sys_options` (`name`, `value`, `category_id`, `caption`, `type`, `c
 ('bx_directory_searchable_fields', 'title,text', @iCategId, '_bx_directory_option_searchable_fields', 'list', '', '', 'a:2:{s:6:"module";s:12:"bx_directory";s:6:"method";s:21:"get_searchable_fields";}', 30),
 ('bx_directory_labels', '', @iCategId, '_sys_option_labels', 'text', '', '', '', 40);
 
--- PAGE: create entry
 
+-- PAGE: create entry
 INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
 ('bx_directory_create_entry', '_bx_directory_page_title_sys_create_entry', '_bx_directory_page_title_create_entry', 'bx_directory', 5, 2147483647, 1, 'create-ad', 'page.php?i=create-ad', '', '', '', 0, 1, 0, 'BxDirPageBrowse', 'modules/boonex/directory/classes/BxDirPageBrowse.php');
 
 INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES
 ('bx_directory_create_entry', 1, 'bx_directory', '_bx_directory_page_block_title_create_entry', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:12:"bx_directory";s:6:"method";s:13:"entity_create";}', 0, 1, 1);
 
-
 -- PAGE: edit entry
-
 INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
 ('bx_directory_edit_entry', '_bx_directory_page_title_sys_edit_entry', '_bx_directory_page_title_edit_entry', 'bx_directory', 5, 2147483647, 1, 'edit-ad', '', '', '', '', 0, 1, 0, 'BxDirPageEntry', 'modules/boonex/directory/classes/BxDirPageEntry.php');
 
 INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES
 ('bx_directory_edit_entry', 1, 'bx_directory', '_bx_directory_page_block_title_edit_entry', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:12:"bx_directory";s:6:"method";s:11:"entity_edit";}', 0, 0, 0);
 
-
 -- PAGE: delete entry
-
 INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
 ('bx_directory_delete_entry', '_bx_directory_page_title_sys_delete_entry', '_bx_directory_page_title_delete_entry', 'bx_directory', 5, 2147483647, 1, 'delete-ad', '', '', '', '', 0, 1, 0, 'BxDirPageEntry', 'modules/boonex/directory/classes/BxDirPageEntry.php');
 
 INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES
 ('bx_directory_delete_entry', 1, 'bx_directory', '_bx_directory_page_block_title_delete_entry', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:12:"bx_directory";s:6:"method";s:13:"entity_delete";}', 0, 0, 0);
 
-
 -- PAGE: view entry
-
 INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
 ('bx_directory_view_entry', '_bx_directory_page_title_sys_view_entry', '_bx_directory_page_title_view_entry', 'bx_directory', 12, 2147483647, 1, 'view-ad', '', '', '', '', 0, 1, 0, 'BxDirPageEntry', 'modules/boonex/directory/classes/BxDirPageEntry.php');
 
@@ -66,36 +60,36 @@ INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `t
 ('bx_directory_view_entry', 3, 'bx_directory', '', '_bx_directory_page_block_title_entry_location', 3, 2147483647, 'service', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:13:"locations_map";s:6:"params";a:2:{i:0;s:12:"bx_directory";i:1;s:4:"{id}";}s:5:"class";s:20:"TemplServiceMetatags";}', 0, 0, 1, 3),
 ('bx_directory_view_entry', 3, 'bx_directory', '', '_bx_directory_page_block_title_featured_entries_view_extended', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:12:"bx_directory";s:6:"method";s:15:"browse_featured";s:6:"params";a:1:{i:0;s:8:"extended";}}', 0, 0, 1, 4);
 
-
 -- PAGE: view entry comments
-
 INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
 ('bx_directory_view_entry_comments', '_bx_directory_page_title_sys_view_entry_comments', '_bx_directory_page_title_view_entry_comments', 'bx_directory', 5, 2147483647, 1, 'view-ad-comments', '', '', '', '', 0, 1, 0, 'BxDirPageEntry', 'modules/boonex/directory/classes/BxDirPageEntry.php');
 
 INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
 ('bx_directory_view_entry_comments', 1, 'bx_directory', '_bx_directory_page_block_title_entry_comments', '_bx_directory_page_block_title_entry_comments_link', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:12:"bx_directory";s:6:"method";s:15:"entity_comments";}', 0, 0, 1);
 
-
 -- PAGE: popular entries
-
 INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
 ('bx_directory_popular', '_bx_directory_page_title_sys_entries_popular', '_bx_directory_page_title_entries_popular', 'bx_directory', 5, 2147483647, 1, 'ads-popular', 'page.php?i=ads-popular', '', '', '', 0, 1, 0, 'BxDirPageBrowse', 'modules/boonex/directory/classes/BxDirPageBrowse.php');
 
 INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
 ('bx_directory_popular', 1, 'bx_directory', '_bx_directory_page_block_title_popular_entries', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:12:"bx_directory";s:6:"method";s:14:"browse_popular";s:6:"params";a:3:{s:9:"unit_view";s:7:"gallery";s:13:"empty_message";b:1;s:13:"ajax_paginate";b:0;}}', 0, 1, 1);
 
-
 -- PAGE: recently updated entries
-
 INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
 ('bx_directory_updated', '_bx_directory_page_title_sys_entries_updated', '_bx_directory_page_title_entries_updated', 'bx_directory', 5, 2147483647, 1, 'ads-updated', 'page.php?i=ads-updated', '', '', '', 0, 1, 0, 'BxDirPageBrowse', 'modules/boonex/directory/classes/BxDirPageBrowse.php');
 
 INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
 ('bx_directory_updated', 1, 'bx_directory', '_bx_directory_page_block_title_updated_entries', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:12:"bx_directory";s:6:"method";s:14:"browse_updated";s:6:"params";a:3:{s:9:"unit_view";s:7:"gallery";s:13:"empty_message";b:1;s:13:"ajax_paginate";b:0;}}', 0, 1, 1);
 
+-- PAGE:  entries' categories 
+INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_directory_categories', '_bx_directory_page_title_sys_entries_categories', '_bx_directory_page_title_entries_categories', 'bx_directory', 1, 2147483647, 1, 'ads-categories', 'page.php?i=ads-categories', '', '', '', 0, 1, 0, 'BxDirPageBrowse', 'modules/boonex/directory/classes/BxDirPageBrowse.php');
 
--- PAGE: entries of author
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('bx_directory_categories', 1, 'bx_directory', '', '_bx_directory_page_block_title_categories', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:12:"bx_directory";s:6:"method";s:15:"categories_list";s:6:"params";a:1:{i:0;a:1:{s:10:"show_empty";b:1;}}}', 0, 0, 1, 1),
+('bx_directory_categories', 2, 'bx_directory', '', '_bx_directory_page_block_title_entries_by_category', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:12:"bx_directory";s:6:"method";s:15:"browse_category";s:6:"params";a:2:{i:0;i:0;i:1;a:3:{s:9:"unit_view";s:7:"gallery";s:13:"empty_message";b:1;s:13:"ajax_paginate";b:0;}}}', 0, 1, 1, 1);
 
+-- PAGE: entries of author
 INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
 ('bx_directory_author', 'ads-author', '_bx_directory_page_title_sys_entries_of_author', '_bx_directory_page_title_entries_of_author', 'bx_directory', 5, 2147483647, 1, '', '', '', '', 0, 1, 0, 'BxDirPageAuthor', 'modules/boonex/directory/classes/BxDirPageAuthor.php');
 
@@ -105,7 +99,6 @@ INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `t
 ('bx_directory_author', 1, 'bx_directory', '_bx_directory_page_block_title_sys_entries_of_author', '_bx_directory_page_block_title_entries_of_author', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:12:"bx_directory";s:6:"method";s:13:"browse_author";}', 0, 0, 1, 3);
 
 -- PAGE: entries in context
-
 INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
 ('bx_directory_context', 'ads-context', '_bx_directory_page_title_sys_entries_in_context', '_bx_directory_page_title_entries_in_context', 'bx_directory', 5, 2147483647, 1, '', '', '', '', 0, 1, 0, 'BxDirPageAuthor', 'modules/boonex/directory/classes/BxDirPageAuthor.php');
 
@@ -113,7 +106,6 @@ INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `t
 ('bx_directory_context', 1, 'bx_directory', '_bx_directory_page_block_title_sys_entries_in_context', '_bx_directory_page_block_title_entries_in_context', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:12:"bx_directory";s:6:"method";s:14:"browse_context";}', 0, 0, 1, 1);
 
 -- PAGE: module home
-
 INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
 ('bx_directory_home', 'directory-home', '_bx_directory_page_title_sys_home', '_bx_directory_page_title_home', 'bx_directory', 2, 2147483647, 1, 'page.php?i=directory-home', '', '', '', 0, 1, 0, 'BxDirPageBrowse', 'modules/boonex/directory/classes/BxDirPageBrowse.php');
 
@@ -121,11 +113,10 @@ INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `t
 ('bx_directory_home', 1, 'bx_directory', '', '_bx_directory_page_block_title_featured_entries_view_extended', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:12:"bx_directory";s:6:"method";s:15:"browse_featured";s:6:"params";a:1:{i:0;s:8:"extended";}}', 0, 1, 1, 0),
 ('bx_directory_home', 1, 'bx_directory', '', '_bx_directory_page_block_title_recent_entries_view_extended', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:12:"bx_directory";s:6:"method";s:13:"browse_public";s:6:"params";a:1:{i:0;s:8:"extended";}}', 0, 1, 1, 1),
 ('bx_directory_home', 2, 'bx_directory', '', '_bx_directory_page_block_title_popular_keywords', 11, 2147483647, 'service', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:14:"keywords_cloud";s:6:"params";a:2:{i:0;s:12:"bx_directory";i:1;s:12:"bx_directory";}s:5:"class";s:20:"TemplServiceMetatags";}', 0, 1, 1, 0),
-('bx_directory_home', 2, 'bx_directory', '', '_bx_directory_page_block_title_cats', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:12:"bx_directory";s:6:"method";s:15:"categories_list";s:6:"params";a:1:{i:0;a:1:{s:10:"show_empty";b:1;}}}', 0, 1, 1, 1);
+('bx_directory_home', 2, 'bx_directory', '', '_bx_directory_page_block_title_categories', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:12:"bx_directory";s:6:"method";s:15:"categories_list";s:6:"params";a:1:{i:0;a:1:{s:10:"show_empty";b:1;}}}', 0, 1, 1, 1);
 
 
 -- PAGE: search for entries
-
 INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
 ('bx_directory_search', '_bx_directory_page_title_sys_entries_search', '_bx_directory_page_title_entries_search', 'bx_directory', 5, 2147483647, 1, 'ads-search', 'page.php?i=ads-search', '', '', '', 0, 1, 0, 'BxDirPageBrowse', 'modules/boonex/directory/classes/BxDirPageBrowse.php');
 
@@ -135,7 +126,6 @@ INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbo
 ('bx_directory_search', 1, 'bx_directory', '_bx_directory_page_block_title_search_form_cmts', 11, 2147483647, 'service', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:8:"get_form";s:6:"params";a:1:{i:0;a:1:{s:6:"object";s:17:"bx_directory_cmts";}}s:5:"class";s:27:"TemplSearchExtendedServices";}', 0, 1, 0, 3),
 ('bx_directory_search', 1, 'bx_directory', '_bx_directory_page_block_title_search_results_cmts', 11, 2147483647, 'service', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:11:"get_results";s:6:"params";a:1:{i:0;a:2:{s:6:"object";s:17:"bx_directory_cmts";s:10:"show_empty";b:1;}}s:5:"class";s:27:"TemplSearchExtendedServices";}', 0, 1, 0, 4);
 
-
 -- PAGE: module manage own
 INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
 ('bx_directory_manage', '_bx_directory_page_title_sys_manage', '_bx_directory_page_title_manage', 'bx_directory', 5, 2147483647, 1, 'ads-manage', 'page.php?i=ads-manage', '', '', '', 0, 1, 0, 'BxDirPageBrowse', 'modules/boonex/directory/classes/BxDirPageBrowse.php');
@@ -151,7 +141,6 @@ INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `t
 ('bx_directory_administration', 1, 'bx_directory', '_bx_directory_page_block_title_system_manage_administration', '_bx_directory_page_block_title_manage', 11, 192, 'service', 'a:3:{s:6:"module";s:12:"bx_directory";s:6:"method";s:12:"manage_tools";s:6:"params";a:1:{i:0;s:14:"administration";}}', 0, 1, 0);
 
 -- PAGE: add block to homepage
-
 SET @iBlockOrder = (SELECT `order` FROM `sys_pages_blocks` WHERE `object` = 'sys_home' AND `cell_id` = 1 ORDER BY `order` DESC LIMIT 1);
 INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
 ('sys_home', 1, 'bx_directory', '_bx_directory_page_block_title_recent_entries', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:12:"bx_directory";s:6:"method";s:13:"browse_public";s:6:"params";a:2:{i:0;b:0;i:1;b:0;}}', 1, 0, 0, IFNULL(@iBlockOrder, 0) + 1);
@@ -162,7 +151,6 @@ INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title`, `designb
 ('trigger_page_profile_view_entry', @iPBCellProfile, 'bx_directory', '_bx_directory_page_block_title_my_entries', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:12:"bx_directory";s:6:"method";s:13:"browse_author";s:6:"params";a:2:{i:0;s:12:"{profile_id}";i:1;a:2:{s:8:"per_page";s:29:"bx_directory_per_page_profile";s:13:"empty_message";b:0;}}}', 0, 0, 0);
 
 -- PAGE: service blocks
-
 SET @iBlockOrder = (SELECT `order` FROM `sys_pages_blocks` WHERE `object` = '' AND `cell_id` = 0 ORDER BY `order` DESC LIMIT 1);
 INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system` , `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
 ('', 0, 'bx_directory', '', '_bx_directory_page_block_title_recent_entries', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:12:"bx_directory";s:6:"method";s:13:"browse_public";s:6:"params";a:3:{s:9:"unit_view";s:7:"gallery";s:13:"empty_message";b:1;s:13:"ajax_paginate";b:0;}}', 0, 1, IFNULL(@iBlockOrder, 0) + 1),
@@ -176,25 +164,21 @@ INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system` , `
 
 
 -- MENU: add to site menu
-
 SET @iSiteMenuOrder = (SELECT `order` FROM `sys_menu_items` WHERE `set_name` = 'sys_site' AND `active` = 1 ORDER BY `order` DESC LIMIT 1);
 INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
 ('sys_site', 'bx_directory', 'directory-home', '_bx_directory_menu_item_title_system_entries_home', '_bx_directory_menu_item_title_entries_home', 'page.php?i=directory-home', '', '', 'folder-open col-green3', 'bx_directory_submenu', 2147483647, 1, 1, IFNULL(@iSiteMenuOrder, 0) + 1);
 
 -- MENU: add to homepage menu
-
 SET @iHomepageMenuOrder = (SELECT `order` FROM `sys_menu_items` WHERE `set_name` = 'sys_homepage' AND `active` = 1 ORDER BY `order` DESC LIMIT 1);
 INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
 ('sys_homepage', 'bx_directory', 'directory-home', '_bx_directory_menu_item_title_system_entries_home', '_bx_directory_menu_item_title_entries_home', 'page.php?i=directory-home', '', '', 'folder-open col-green3', 'bx_directory_submenu', 2147483647, 1, 1, IFNULL(@iHomepageMenuOrder, 0) + 1);
 
 -- MENU: add to "add content" menu
-
 SET @iAddMenuOrder = (SELECT `order` FROM `sys_menu_items` WHERE `set_name` = 'sys_add_content_links' AND `active` = 1 ORDER BY `order` DESC LIMIT 1);
 INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
 ('sys_add_content_links', 'bx_directory', 'create-ad', '_bx_directory_menu_item_title_system_create_entry', '_bx_directory_menu_item_title_create_entry', 'page.php?i=create-ad', '', '', 'folder-open col-green3', '', 2147483647, 1, 1, IFNULL(@iAddMenuOrder, 0) + 1);
 
 -- MENU: create ad form attachments (link, photo, video, etc)
-
 INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
 ('bx_directory_entry_attachments', '_bx_directory_menu_title_entry_attachments', 'bx_directory_entry_attachments', 'bx_directory', 23, 0, 1, 'BxDirMenuAttachments', 'modules/boonex/directory/classes/BxDirMenuAttachments.php');
 
@@ -211,7 +195,6 @@ INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `titl
 ('bx_directory_entry_attachments', 'bx_directory', 'poll', '_bx_directory_menu_item_title_system_cpa_poll', '_bx_directory_menu_item_title_cpa_poll', 'javascript:void(0)', 'javascript:{js_object}.showPollForm(this);', '_self', 'tasks', '', '', 2147483647, '', 1, 0, 1, 7);
 
 -- MENU: actions menu for view entry 
-
 INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
 ('bx_directory_view', '_bx_directory_menu_title_view_entry', 'bx_directory_view', 'bx_directory', 9, 0, 1, 'BxDirMenuView', 'modules/boonex/directory/classes/BxDirMenuView.php');
 
@@ -222,9 +205,7 @@ INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `titl
 ('bx_directory_view', 'bx_directory', 'edit-ad', '_bx_directory_menu_item_title_system_edit_entry', '_bx_directory_menu_item_title_edit_entry', 'page.php?i=edit-ad&id={content_id}', '', '', 'pencil-alt', '', 2147483647, 1, 0, 1),
 ('bx_directory_view', 'bx_directory', 'delete-ad', '_bx_directory_menu_item_title_system_delete_entry', '_bx_directory_menu_item_title_delete_entry', 'page.php?i=delete-ad&id={content_id}', '', '', 'remove', '', 2147483647, 1, 0, 2);
 
-
 -- MENU: all actions menu for view entry 
-
 INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
 ('bx_directory_view_actions', '_sys_menu_title_view_actions', 'bx_directory_view_actions', 'bx_directory', 15, 0, 1, 'BxDirMenuViewActions', 'modules/boonex/directory/classes/BxDirMenuViewActions.php');
 
@@ -248,9 +229,7 @@ INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `titl
 ('bx_directory_view_actions', 'bx_directory', 'social-sharing-pinterest', '_sys_menu_item_title_system_social_sharing_pinterest', '', '', '', '', '', '', '', 0, 2147483647, 1, 0, 330),
 ('bx_directory_view_actions', 'bx_directory', 'more-auto', '_sys_menu_item_title_system_va_more_auto', '_sys_menu_item_title_va_more_auto', 'javascript:void(0)', '', '', 'ellipsis-v', '', '', 0, 2147483647, 1, 0, 9999);
 
-
 -- MENU: actions menu for my entries
-
 INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
 ('bx_directory_my', '_bx_directory_menu_title_entries_my', 'bx_directory_my', 'bx_directory', 9, 0, 1, 'BxDirMenu', 'modules/boonex/directory/classes/BxDirMenu.php');
 
@@ -262,7 +241,6 @@ INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `titl
 
 
 -- MENU: module sub-menu
-
 INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
 ('bx_directory_submenu', '_bx_directory_menu_title_submenu', 'bx_directory_submenu', 'bx_directory', 8, 0, 1, '', '');
 
@@ -272,8 +250,9 @@ INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES
 INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
 ('bx_directory_submenu', 'bx_directory', 'directory-home', '_bx_directory_menu_item_title_system_entries_public', '_bx_directory_menu_item_title_entries_public', 'page.php?i=directory-home', '', '', '', '', 2147483647, 1, 1, 1),
 ('bx_directory_submenu', 'bx_directory', 'ads-popular', '_bx_directory_menu_item_title_system_entries_popular', '_bx_directory_menu_item_title_entries_popular', 'page.php?i=ads-popular', '', '', '', '', 2147483647, 1, 1, 2),
-('bx_directory_submenu', 'bx_directory', 'ads-search', '_bx_directory_menu_item_title_system_entries_search', '_bx_directory_menu_item_title_entries_search', 'page.php?i=ads-search', '', '', '', '', 2147483647, 1, 1, 3),
-('bx_directory_submenu', 'bx_directory', 'ads-manage', '_bx_directory_menu_item_title_system_entries_manage', '_bx_directory_menu_item_title_entries_manage', 'page.php?i=ads-manage', '', '', '', '', 2147483646, 1, 1, 4);
+('bx_directory_submenu', 'bx_directory', 'ads-categories', '_bx_directory_menu_item_title_system_entries_categories', '_bx_directory_menu_item_title_entries_categories', 'page.php?i=ads-categories', '', '', '', '', 2147483647, 1, 1, 3),
+('bx_directory_submenu', 'bx_directory', 'ads-search', '_bx_directory_menu_item_title_system_entries_search', '_bx_directory_menu_item_title_entries_search', 'page.php?i=ads-search', '', '', '', '', 2147483647, 1, 1, 4),
+('bx_directory_submenu', 'bx_directory', 'ads-manage', '_bx_directory_menu_item_title_system_entries_manage', '_bx_directory_menu_item_title_entries_manage', 'page.php?i=ads-manage', '', '', '', '', 2147483646, 1, 1, 5);
 
 -- MENU: sub-menu for view entry
 INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
@@ -296,7 +275,7 @@ INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES
 INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `editable`, `order`) VALUES 
 ('bx_directory_snippet_meta', 'bx_directory', 'date', '_sys_menu_item_title_system_sm_date', '_sys_menu_item_title_sm_date', '', '', '', '', '', 2147483647, 1, 0, 1, 1),
 ('bx_directory_snippet_meta', 'bx_directory', 'author', '_sys_menu_item_title_system_sm_author', '_sys_menu_item_title_sm_author', '', '', '', '', '', 2147483647, 1, 0, 1, 2),
-('bx_directory_snippet_meta', 'bx_directory', 'category', '_sys_menu_item_title_system_sm_category', '_sys_menu_item_title_sm_category', '', '', '', '', '', 2147483647, 0, 0, 1, 3),
+('bx_directory_snippet_meta', 'bx_directory', 'category', '_sys_menu_item_title_system_sm_category', '_sys_menu_item_title_sm_category', '', '', '', '', '', 2147483647, 1, 0, 1, 3),
 ('bx_directory_snippet_meta', 'bx_directory', 'tags', '_sys_menu_item_title_system_sm_tags', '_sys_menu_item_title_sm_tags', '', '', '', '', '', 2147483647, 0, 0, 1, 4),
 ('bx_directory_snippet_meta', 'bx_directory', 'views', '_sys_menu_item_title_system_sm_views', '_sys_menu_item_title_sm_views', '', '', '', '', '', 2147483647, 0, 0, 1, 5),
 ('bx_directory_snippet_meta', 'bx_directory', 'comments', '_sys_menu_item_title_system_sm_comments', '_sys_menu_item_title_sm_comments', '', '', '', '', '', 2147483647, 0, 0, 1, 6);
@@ -322,20 +301,17 @@ INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `titl
 ('sys_account_dashboard_manage_tools', 'bx_directory', 'ads-administration', '_bx_directory_menu_item_title_system_admt_ads', '_bx_directory_menu_item_title_admt_ads', 'page.php?i=ads-administration', '', '_self', 'folder-open', 'a:2:{s:6:"module";s:12:"bx_directory";s:6:"method";s:27:"get_menu_addon_manage_tools";}', '', 192, 1, 0, @iManageMenuOrder + 1);
 
 -- MENU: add menu item to profiles modules (trigger* menu sets are processed separately upon modules enable/disable)
-
 INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
 ('trigger_profile_view_submenu', 'bx_directory', 'ads-author', '_bx_directory_menu_item_title_system_view_entries_author', '_bx_directory_menu_item_title_view_entries_author', 'page.php?i=ads-author&profile_id={profile_id}', '', '', 'folder-open col-green3', '', 2147483647, 1, 0, 0),
 ('trigger_group_view_submenu', 'bx_directory', 'ads-context', '_bx_directory_menu_item_title_system_view_entries_in_context', '_bx_directory_menu_item_title_view_entries_in_context', 'page.php?i=ads-context&profile_id={profile_id}', '', '', 'folder-open col-green3', '', 2147483647, 1, 0, 0);
 
 
 -- PRIVACY 
-
 INSERT INTO `sys_objects_privacy` (`object`, `module`, `action`, `title`, `default_group`, `table`, `table_field_id`, `table_field_author`, `override_class_name`, `override_class_file`) VALUES
 ('bx_directory_allow_view_to', 'bx_directory', 'view', '_bx_directory_form_entry_input_allow_view_to', '3', 'bx_directory_entries', 'id', 'author', '', '');
 
 
 -- ACL
-
 INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
 ('bx_directory', 'create entry', NULL, '_bx_directory_acl_action_create_entry', '', 1, 3);
 SET @iIdActionEntryCreate = LAST_INSERT_ID();
@@ -407,21 +383,25 @@ INSERT INTO `sys_objects_search` (`ObjectName`, `Title`, `Order`, `ClassName`, `
 ('bx_directory', '_bx_directory', @iSearchOrder + 1, 'BxDirSearchResult', 'modules/boonex/directory/classes/BxDirSearchResult.php'),
 ('bx_directory_cmts', '_bx_directory_cmts', @iSearchOrder + 2, 'BxDirCmtsSearchResult', 'modules/boonex/directory/classes/BxDirCmtsSearchResult.php');
 
+
 -- METATAGS
 INSERT INTO `sys_objects_metatags` (`object`, `table_keywords`, `table_locations`, `table_mentions`, `override_class_name`, `override_class_file`) VALUES
 ('bx_directory', 'bx_directory_meta_keywords', 'bx_directory_meta_locations', 'bx_directory_meta_mentions', '', '');
 
+
 -- STATS
 SET @iMaxOrderStats = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_statistics`);
 INSERT INTO `sys_statistics` (`module`, `name`, `title`, `link`, `icon`, `query`, `order`) VALUES 
 ('bx_directory', 'bx_directory', '_bx_directory', 'page.php?i=ads-home', 'folder-open col-green3', 'SELECT COUNT(*) FROM `bx_directory_entries` WHERE 1 AND `status` = ''active'' AND `status_admin` = ''active''', @iMaxOrderStats + 1);
 
+
 -- CHARTS
 SET @iMaxOrderCharts = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_objects_chart`);
 INSERT INTO `sys_objects_chart` (`object`, `title`, `table`, `field_date_ts`, `field_date_dt`, `field_status`, `query`, `active`, `order`, `class_name`, `class_file`) VALUES
 ('bx_directory_growth', '_bx_directory_chart_growth', 'bx_directory_entries', 'added', '', 'status,status_admin', '', 1, @iMaxOrderCharts + 1, 'BxDolChartGrowth', ''),
 ('bx_directory_growth_speed', '_bx_directory_chart_growth_speed', 'bx_directory_entries', 'added', '', 'status,status_admin', '', 1, @iMaxOrderCharts + 2, 'BxDolChartGrowthSpeed', '');
 
+
 -- GRIDS: moderation tools
 INSERT INTO `sys_objects_grid` (`object`, `source_type`, `source`, `table`, `field_id`, `field_order`, `field_active`, `paginate_url`, `paginate_per_page`, `paginate_simple`, `paginate_get_start`, `paginate_get_per_page`, `filter_fields`, `filter_fields_translatable`, `filter_mode`, `sorting_fields`, `sorting_fields_translatable`, `visible_for_levels`, `override_class_name`, `override_class_file`) VALUES
 ('bx_directory_administration', 'Sql', 'SELECT * FROM `bx_directory_entries` WHERE 1 ', 'bx_directory_entries', 'id', 'added', 'status_admin', '', 20, NULL, 'start', '', 'title,text', '', 'like', 'reports', '', 192, 'BxDirGridAdministration', 'modules/boonex/directory/classes/BxDirGridAdministration.php'),
@@ -482,8 +462,8 @@ INSERT INTO `sys_objects_uploader` (`object`, `active`, `override_class_name`, `
 ('bx_directory_files_simple', 1, 'BxDirUploaderSimpleAttach', 'modules/boonex/directory/classes/BxDirUploaderSimpleAttach.php'),
 ('bx_directory_files_html5', 1, 'BxDirUploaderHTML5Attach', 'modules/boonex/directory/classes/BxDirUploaderHTML5Attach.php');
 
--- ALERTS
 
+-- ALERTS
 INSERT INTO `sys_alerts_handlers` (`name`, `class`, `file`, `service_call`) VALUES 
 ('bx_directory', 'BxDirAlertsResponse', 'modules/boonex/directory/classes/BxDirAlertsResponse.php', '');
 SET @iHandler := LAST_INSERT_ID();

+ 77 - 71
modules/boonex/directory/install/sql/install.sql

@@ -4,9 +4,11 @@ CREATE TABLE IF NOT EXISTS `bx_directory_entries` (
   `author` int(11) NOT NULL,
   `added` int(11) NOT NULL,
   `changed` int(11) NOT NULL,
+  `category` int(11) NOT NULL,
   `thumb` int(11) NOT NULL,
   `title` varchar(255) NOT NULL,
-  `category` int(11) NOT NULL,
+  `price` varchar(255) NOT NULL,
+  `year` varchar(255) NOT NULL,
   `text` mediumtext NOT NULL,
   `views` int(11) NOT NULL default '0',
   `rate` float NOT NULL default '0',
@@ -53,6 +55,7 @@ CREATE TABLE IF NOT EXISTS `bx_directory_categories` (
   `title` varchar(255) NOT NULL DEFAULT '',
   `text` text NOT NULL,
   `icon` varchar(255) NOT NULL DEFAULT '',
+  `items` int(11) NOT NULL DEFAULT '0',
   `active` tinyint(4) NOT NULL DEFAULT '1',
   `order` int(11) NOT NULL DEFAULT '0',
   PRIMARY KEY (`id`),
@@ -68,8 +71,7 @@ INSERT INTO `bx_directory_categories` (`parent_id`, `level`, `type`, `name`, `ti
 (@iParentId, 1, 1, 'job_finance', '_bx_directory_cat_title_accounting_finance', '', '', 1, 1),
 (@iParentId, 1, 1, 'job_education', '_bx_directory_cat_title_education_nonprofit', '', '', 1, 2),
 (@iParentId, 1, 1, 'job_legal', '_bx_directory_cat_title_government_legal', '', '', 1, 3),
-(@iParentId, 1, 1, 'job_programming', '_bx_directory_cat_title_programming_web_design', '', '', 1, 4),
-(@iParentId, 1, 1, 'job_other', '_bx_directory_cat_title_other_jobs', '', '', 1, 5);
+(@iParentId, 1, 1, 'job_programming', '_bx_directory_cat_title_programming_web_design', '', '', 1, 4);
 
 INSERT INTO `bx_directory_categories` (`parent_id`, `level`, `type`, `name`, `title`, `text`, `icon`, `active`, `order`) VALUES 
 (0, 0, 2, 'music', '_bx_directory_cat_title_music', '', 'music', 1, 2);
@@ -77,8 +79,7 @@ SET @iParentId = LAST_INSERT_ID();
 
 INSERT INTO `bx_directory_categories` (`parent_id`, `level`, `type`, `name`, `title`, `text`, `icon`, `active`, `order`) VALUES 
 (@iParentId, 1, 2, 'music_isale', '_bx_directory_cat_title_instrument_sale', '', '', 1, 1),
-(@iParentId, 1, 2, 'music_iwanted', '_bx_directory_cat_title_instrument_wanted', '', '', 1, 2),
-(@iParentId, 1, 2, 'music_other', '_bx_directory_cat_title_other', '', '', 1, 3);
+(@iParentId, 1, 2, 'music_iwanted', '_bx_directory_cat_title_instrument_wanted', '', '', 1, 2);
 
 INSERT INTO `bx_directory_categories` (`parent_id`, `level`, `type`, `name`, `title`, `text`, `icon`, `active`, `order`) VALUES 
 (0, 0, 1, 'housing', '_bx_directory_cat_title_housing', '', 'home', 1, 3);
@@ -120,8 +121,7 @@ SET @iParentId = LAST_INSERT_ID();
 INSERT INTO `bx_directory_categories` (`parent_id`, `level`, `type`, `name`, `title`, `text`, `icon`, `active`, `order`) VALUES 
 (@iParentId, 1, 2, 'personal_mw', '_bx_directory_cat_title_men_women', '', '', 1, 1),
 (@iParentId, 1, 2, 'personal_wm', '_bx_directory_cat_title_women_men', '', '', 1, 2),
-(@iParentId, 1, 2, 'personal_missed', '_bx_directory_cat_title_missed_connection', '', '', 1, 3),
-(@iParentId, 1, 2, 'personal_other', '_bx_directory_cat_title_personal_other', '', '', 1, 4);
+(@iParentId, 1, 2, 'personal_missed', '_bx_directory_cat_title_missed_connection', '', '', 1, 3);
 
 INSERT INTO `bx_directory_categories` (`parent_id`, `level`, `type`, `name`, `title`, `text`, `icon`, `active`, `order`) VALUES 
 (0, 0, 2, 'sale', '_bx_directory_cat_title_sale', '', 'shopping-cart', 1, 7);
@@ -130,8 +130,7 @@ SET @iParentId = LAST_INSERT_ID();
 INSERT INTO `bx_directory_categories` (`parent_id`, `level`, `type`, `name`, `title`, `text`, `icon`, `active`, `order`) VALUES 
 (@iParentId, 1, 2, 'sale_barter', '_bx_directory_cat_title_barter', '', '', 1, 1),
 (@iParentId, 1, 2, 'sale_clothing', '_bx_directory_cat_title_clothing', '', '', 1, 1),
-(@iParentId, 1, 2, 'sale_collectible', '_bx_directory_cat_title_collectible', '', '', 1, 1),
-(@iParentId, 1, 2, 'sale_misc', '_bx_directory_cat_title_miscellaneous', '', '', 1, 1);
+(@iParentId, 1, 2, 'sale_collectible', '_bx_directory_cat_title_collectible', '', '', 1, 1);
 
 INSERT INTO `bx_directory_categories` (`parent_id`, `level`, `type`, `name`, `title`, `text`, `icon`, `active`, `order`) VALUES 
 (0, 0, 2, 'sale_car', '_bx_directory_cat_title_sale_car', '', 'truck', 1, 8);
@@ -544,79 +543,86 @@ INSERT INTO `sys_form_inputs`(`object`, `module`, `name`, `value`, `values`, `ch
 ('bx_directory', 'bx_directory', 'title', '', '', 0, 'text', '_bx_directory_form_entry_input_sys_title', '_bx_directory_form_entry_input_title', '', 1, 0, 0, '', '', '', 'Avail', '', '_bx_directory_form_entry_input_title_err', 'Xss', '', 1, 0),
 ('bx_directory', 'bx_directory', 'price', '', '', 0, 'text', '_bx_directory_form_entry_input_sys_price', '_bx_directory_form_entry_input_price', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 1, 0),
 ('bx_directory', 'bx_directory', 'year', '', '', 0, 'text', '_bx_directory_form_entry_input_sys_year', '_bx_directory_form_entry_input_year', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 1, 0),
-('bx_directory', 'bx_directory', 'category', '', '', 0, 'select', '_bx_directory_form_entry_input_sys_category', '_bx_directory_form_entry_input_category', '', 1, 0, 0, '', '', '', 'avail', '', '_bx_directory_form_entry_input_category_err', 'Xss', '', 1, 0),
+('bx_directory', 'bx_directory', 'category', '', '', 0, 'hidden', '_bx_directory_form_entry_input_sys_category', '', '', 0, 0, 0, '', '', '', '', '', '', 'Int', '', 0, 0),
+('bx_directory', 'bx_directory', 'category_view', '', '', 0, 'text', '_bx_directory_form_entry_input_sys_category_view', '_bx_directory_form_entry_input_category_view', '', 0, 0, 0, 'a:1:{s:8:"disabled";s:8:"disabled";}', '', '', '', '', '', '', '', 1, 0),
+('bx_directory', 'bx_directory', 'category_select', '', '', 0, 'select', '_bx_directory_form_entry_input_sys_category_select', '_bx_directory_form_entry_input_category_select', '', 1, 0, 0, 'a:1:{s:8:"onchange";s:35:"oBxDirEntry.onChangeCategory(this);";}', '', '', '', '', '', '', '', 0, 0),
 ('bx_directory', 'bx_directory', 'added', '', '', 0, 'datetime', '_bx_directory_form_entry_input_sys_date_added', '_bx_directory_form_entry_input_date_added', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
 ('bx_directory', 'bx_directory', 'changed', '', '', 0, 'datetime', '_bx_directory_form_entry_input_sys_date_changed', '_bx_directory_form_entry_input_date_changed', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
 ('bx_directory', 'bx_directory', 'attachments', '', '', 0, 'custom', '_bx_directory_form_entry_input_sys_attachments', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
 ('bx_directory', 'bx_directory', 'labels', '', '', 0, 'custom', '_sys_form_input_sys_labels', '_sys_form_input_labels', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0);
 
 INSERT INTO `sys_form_display_inputs`(`display_name`, `input_name`, `visible_for_levels`, `active`, `order`) VALUES 
-('bx_directory_entry_add', 'category', 2147483647, 1, 1),
-('bx_directory_entry_add', 'do_submit', 2147483647, 1, 2),
+('bx_directory_entry_add', 'category_select', 2147483647, 1, 1),
 
 ('bx_directory_entry_delete', 'delete_confirm', 2147483647, 1, 1),
 ('bx_directory_entry_delete', 'do_submit', 2147483647, 1, 2),
 
-('bx_directory_entry_price_add', 'title', 2147483647, 1, 1),
-('bx_directory_entry_price_add', 'price', 2147483647, 1, 2),
-('bx_directory_entry_price_add', 'text', 2147483647, 1, 3),
-('bx_directory_entry_price_add', 'attachments', 2147483647, 1, 4),
-('bx_directory_entry_price_add', 'pictures', 2147483647, 1, 5),
-('bx_directory_entry_price_add', 'videos', 2147483647, 1, 6),
-('bx_directory_entry_price_add', 'files', 2147483647, 1, 7),
-('bx_directory_entry_price_add', 'polls', 2147483647, 1, 8),
-('bx_directory_entry_price_add', 'covers', 2147483647, 1, 9),
-('bx_directory_entry_price_add', 'allow_view_to', 2147483647, 1, 10),
-('bx_directory_entry_price_add', 'location', 2147483647, 1, 11),
-('bx_directory_entry_price_add', 'do_submit', 2147483647, 1, 12),
-
-('bx_directory_entry_price_edit', 'title', 2147483647, 1, 1),
-('bx_directory_entry_price_edit', 'price', 2147483647, 1, 2),
-('bx_directory_entry_price_edit', 'text', 2147483647, 1, 3),
-('bx_directory_entry_price_edit', 'attachments', 2147483647, 1, 4),
-('bx_directory_entry_price_edit', 'pictures', 2147483647, 1, 5),
-('bx_directory_entry_price_edit', 'videos', 2147483647, 1, 6),
-('bx_directory_entry_price_edit', 'files', 2147483647, 1, 7),
-('bx_directory_entry_price_edit', 'polls', 2147483647, 1, 8),
-('bx_directory_entry_price_edit', 'covers', 2147483647, 1, 9),
-('bx_directory_entry_price_edit', 'allow_view_to', 2147483647, 1, 10),
-('bx_directory_entry_price_edit', 'location', 2147483647, 1, 11),
-('bx_directory_entry_price_edit', 'do_submit', 2147483647, 1, 12),
-
-('bx_directory_entry_price_view', 'category', 2147483647, 1, 1),
+('bx_directory_entry_price_add', 'category', 2147483647, 1, 1),
+('bx_directory_entry_price_add', 'category_view', 2147483647, 1, 2),
+('bx_directory_entry_price_add', 'title', 2147483647, 1, 3),
+('bx_directory_entry_price_add', 'price', 2147483647, 1, 4),
+('bx_directory_entry_price_add', 'text', 2147483647, 1, 5),
+('bx_directory_entry_price_add', 'attachments', 2147483647, 1, 6),
+('bx_directory_entry_price_add', 'pictures', 2147483647, 1, 7),
+('bx_directory_entry_price_add', 'videos', 2147483647, 1, 8),
+('bx_directory_entry_price_add', 'files', 2147483647, 1, 9),
+('bx_directory_entry_price_add', 'polls', 2147483647, 1, 10),
+('bx_directory_entry_price_add', 'covers', 2147483647, 1, 11),
+('bx_directory_entry_price_add', 'allow_view_to', 2147483647, 1, 12),
+('bx_directory_entry_price_add', 'location', 2147483647, 1, 13),
+('bx_directory_entry_price_add', 'do_submit', 2147483647, 1, 14),
+
+('bx_directory_entry_price_edit', 'category_view', 2147483647, 1, 1),
+('bx_directory_entry_price_edit', 'title', 2147483647, 1, 2),
+('bx_directory_entry_price_edit', 'price', 2147483647, 1, 3),
+('bx_directory_entry_price_edit', 'text', 2147483647, 1, 4),
+('bx_directory_entry_price_edit', 'attachments', 2147483647, 1, 5),
+('bx_directory_entry_price_edit', 'pictures', 2147483647, 1, 6),
+('bx_directory_entry_price_edit', 'videos', 2147483647, 1, 7),
+('bx_directory_entry_price_edit', 'files', 2147483647, 1, 8),
+('bx_directory_entry_price_edit', 'polls', 2147483647, 1, 9),
+('bx_directory_entry_price_edit', 'covers', 2147483647, 1, 10),
+('bx_directory_entry_price_edit', 'allow_view_to', 2147483647, 1, 11),
+('bx_directory_entry_price_edit', 'location', 2147483647, 1, 12),
+('bx_directory_entry_price_edit', 'do_submit', 2147483647, 1, 13),
+
+('bx_directory_entry_price_view', 'category_view', 2147483647, 1, 1),
 ('bx_directory_entry_price_view', 'price', 2147483647, 1, 2),
-('bx_directory_entry_price_view', 'added', 2147483647, 1, 2),
-('bx_directory_entry_price_view', 'changed', 2147483647, 1, 3),
-
-('bx_directory_entry_price_year_add', 'title', 2147483647, 1, 1),
-('bx_directory_entry_price_year_add', 'price', 2147483647, 1, 2),
-('bx_directory_entry_price_year_add', 'year', 2147483647, 1, 3),
-('bx_directory_entry_price_year_add', 'text', 2147483647, 1, 4),
-('bx_directory_entry_price_year_add', 'attachments', 2147483647, 1, 5),
-('bx_directory_entry_price_year_add', 'pictures', 2147483647, 1, 6),
-('bx_directory_entry_price_year_add', 'videos', 2147483647, 1, 7),
-('bx_directory_entry_price_year_add', 'files', 2147483647, 1, 8),
-('bx_directory_entry_price_year_add', 'polls', 2147483647, 1, 9),
-('bx_directory_entry_price_year_add', 'covers', 2147483647, 1, 10),
-('bx_directory_entry_price_year_add', 'allow_view_to', 2147483647, 1, 11),
-('bx_directory_entry_price_year_add', 'location', 2147483647, 1, 12),
-('bx_directory_entry_price_year_add', 'do_submit', 2147483647, 1, 13),
-
-('bx_directory_entry_price_year_edit', 'title', 2147483647, 1, 1),
-('bx_directory_entry_price_year_edit', 'price', 2147483647, 1, 2),
-('bx_directory_entry_price_year_edit', 'year', 2147483647, 1, 3),
-('bx_directory_entry_price_year_edit', 'text', 2147483647, 1, 4),
-('bx_directory_entry_price_year_edit', 'attachments', 2147483647, 1, 5),
-('bx_directory_entry_price_year_edit', 'pictures', 2147483647, 1, 6),
-('bx_directory_entry_price_year_edit', 'videos', 2147483647, 1, 7),
-('bx_directory_entry_price_year_edit', 'files', 2147483647, 1, 8),
-('bx_directory_entry_price_year_edit', 'polls', 2147483647, 1, 9),
-('bx_directory_entry_price_year_edit', 'covers', 2147483647, 1, 10),
-('bx_directory_entry_price_year_edit', 'allow_view_to', 2147483647, 1, 11),
-('bx_directory_entry_price_year_edit', 'location', 2147483647, 1, 12),
-('bx_directory_entry_price_year_edit', 'do_submit', 2147483647, 1, 13),
-
-('bx_directory_entry_price_year_view', 'category', 2147483647, 1, 1),
+('bx_directory_entry_price_view', 'added', 2147483647, 1, 3),
+('bx_directory_entry_price_view', 'changed', 2147483647, 1, 4),
+
+('bx_directory_entry_price_year_add', 'category', 2147483647, 1, 1),
+('bx_directory_entry_price_year_add', 'category_view', 2147483647, 1, 2),
+('bx_directory_entry_price_year_add', 'title', 2147483647, 1, 3),
+('bx_directory_entry_price_year_add', 'price', 2147483647, 1, 4),
+('bx_directory_entry_price_year_add', 'year', 2147483647, 1, 5),
+('bx_directory_entry_price_year_add', 'text', 2147483647, 1, 6),
+('bx_directory_entry_price_year_add', 'attachments', 2147483647, 1, 7),
+('bx_directory_entry_price_year_add', 'pictures', 2147483647, 1, 8),
+('bx_directory_entry_price_year_add', 'videos', 2147483647, 1, 9),
+('bx_directory_entry_price_year_add', 'files', 2147483647, 1, 10),
+('bx_directory_entry_price_year_add', 'polls', 2147483647, 1, 11),
+('bx_directory_entry_price_year_add', 'covers', 2147483647, 1, 12),
+('bx_directory_entry_price_year_add', 'allow_view_to', 2147483647, 1, 13),
+('bx_directory_entry_price_year_add', 'location', 2147483647, 1, 14),
+('bx_directory_entry_price_year_add', 'do_submit', 2147483647, 1, 15),
+
+('bx_directory_entry_price_year_edit', 'category_view', 2147483647, 1, 1),
+('bx_directory_entry_price_year_edit', 'title', 2147483647, 1, 2),
+('bx_directory_entry_price_year_edit', 'price', 2147483647, 1, 3),
+('bx_directory_entry_price_year_edit', 'year', 2147483647, 1, 4),
+('bx_directory_entry_price_year_edit', 'text', 2147483647, 1, 5),
+('bx_directory_entry_price_year_edit', 'attachments', 2147483647, 1, 6),
+('bx_directory_entry_price_year_edit', 'pictures', 2147483647, 1, 7),
+('bx_directory_entry_price_year_edit', 'videos', 2147483647, 1, 8),
+('bx_directory_entry_price_year_edit', 'files', 2147483647, 1, 9),
+('bx_directory_entry_price_year_edit', 'polls', 2147483647, 1, 10),
+('bx_directory_entry_price_year_edit', 'covers', 2147483647, 1, 11),
+('bx_directory_entry_price_year_edit', 'allow_view_to', 2147483647, 1, 12),
+('bx_directory_entry_price_year_edit', 'location', 2147483647, 1, 13),
+('bx_directory_entry_price_year_edit', 'do_submit', 2147483647, 1, 14),
+
+('bx_directory_entry_price_year_view', 'category_view', 2147483647, 1, 1),
 ('bx_directory_entry_price_year_view', 'price', 2147483647, 1, 2),
 ('bx_directory_entry_price_year_view', 'year', 2147483647, 1, 3),
 ('bx_directory_entry_price_year_view', 'added', 2147483647, 1, 4),

+ 0 - 5
modules/boonex/directory/install/sql/uninstall.sql

@@ -16,11 +16,6 @@ DELETE FROM `sys_form_displays` WHERE `module` = 'bx_directory';
 DELETE FROM `sys_form_inputs` WHERE `module` = 'bx_directory';
 DELETE FROM `sys_form_display_inputs` WHERE `display_name` LIKE 'bx_directory_%';
 
--- PRE-VALUES
-DELETE FROM `sys_form_pre_lists` WHERE `module` = 'bx_directory';
-
-DELETE FROM `sys_form_pre_values` WHERE `Key` IN('bx_directory_cats');
-
 -- COMMENTS
 DELETE FROM `sys_objects_cmts` WHERE `Name` = 'bx_directory';
 

+ 48 - 0
modules/boonex/directory/js/entry.js

@@ -0,0 +1,48 @@
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Directory Directory
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+function BxDirEntry(oOptions) {
+    this._sActionsUri = oOptions.sActionUri;
+    this._sActionsUrl = oOptions.sActionUrl;
+    this._sObjName = oOptions.sObjName == undefined ? 'oBxDirEntry' : oOptions.sObjName;
+    this._sAnimationEffect = oOptions.sAnimationEffect == undefined ? 'slide' : oOptions.sAnimationEffect;
+    this._iAnimationSpeed = oOptions.iAnimationSpeed == undefined ? 'slow' : oOptions.iAnimationSpeed;
+    this._aHtmlIds = oOptions.aHtmlIds == undefined ? {} : oOptions.aHtmlIds;
+}
+
+BxDirEntry.prototype.onChangeCategory = function(oElement) {
+    this.loadingInBlock(oElement, true);
+
+    document.location = bx_append_url_params(document.location.href, {category: $(oElement).val()});
+};
+
+BxDirEntry.prototype.loadingInButton = function(e, bShow) {
+    if($(e).length)
+        bx_loading_btn($(e), bShow);
+    else
+        bx_loading($('body'), bShow);	
+};
+
+BxDirEntry.prototype.loadingInBox = function(e, bShow) {
+    var oParent = $(e).length ? $(e).parents('.bx-base-text-poll:first') : $('body'); 
+    bx_loading(oParent, bShow);
+};
+
+BxDirEntry.prototype.loadingInBlock = function(e, bShow) {
+    var oParent = $(e).length ? $(e).parents('.bx-db-container:first') : $('body'); 
+    bx_loading(oParent, bShow);
+};
+
+BxDirEntry.prototype._getDefaultData = function() {
+    var oDate = new Date();
+    return jQuery.extend({}, this._oRequestParams, {_t:oDate.getTime()});
+};
+
+/** @} */

+ 13 - 0
modules/boonex/directory/template/categories.html

@@ -0,0 +1,13 @@
+<div class="bx-dir-categories">
+    <div class="bx-dir-categories-cnt">
+        <bx_repeat:categories>
+            <div class="bx-dir-category bx-def-padding-thd-topbottom">
+                <a href="__url__">__title__</a>
+                <bx_if:show_counter><span class="bx-def-padding-sec-left">(__items__)</span></bx_if:show_counter>
+            </div>
+            <bx_if:show_subcategories>
+                <div class="bx-dir-subcategories bx-def-padding-left">__subcategories__</div>
+            </bx_if:show_subcategories>
+        </bx_repeat:categories>
+    </div>
+</div>

+ 6 - 1
modules/boonex/directory/template/css/main.css

@@ -1 +1,6 @@
-@import url(../../../../base/text/template/css/main.css);
+@import url(../../../../base/text/template/css/main.css);
+
+/*--- Categories ---*/
+.bx-dir-subcategories .bx-dir-category:first-child {
+    padding-top: 0;
+}