RomanL 7 سال پیش
والد
کامیت
f53d3f3f28
4فایلهای تغییر یافته به همراه258 افزوده شده و 7 حذف شده
  1. 56 0
      inc/classes/BxDolCategories.php
  2. 146 0
      inc/classes/BxDolCategoriesQuery.php
  3. 19 4
      inc/classes/BxDolSearch.php
  4. 37 3
      install/sql/system.sql

+ 56 - 0
inc/classes/BxDolCategories.php

@@ -0,0 +1,56 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaCore UNA Core
+ * @{
+ */
+
+class BxDolCategories extends BxDolFactory implements iBxDolSingleton
+{
+    protected $_oDb;
+
+    protected function __construct()
+    {
+        parent::__construct();
+
+        $this->_oDb = new BxDolCategoriesQuery();
+    }
+
+    public function __clone()
+    {
+        if (isset($GLOBALS['bxDolClasses'][get_class($this)]))
+            trigger_error('Clone is not allowed for the class: ' . get_class($this), E_USER_ERROR);
+    }
+
+    public static function getInstance()
+    {
+        if(!isset($GLOBALS['bxDolClasses'][__CLASS__]))
+            $GLOBALS['bxDolClasses'][__CLASS__] = new BxDolCategories();
+
+        return $GLOBALS['bxDolClasses'][__CLASS__];
+    }
+
+    public function getData($aParams = array())
+    {
+        return $this->_oDb->getData($aParams);
+    }
+    
+    public function delete($sModule, $iObject)
+    {
+        return $this->_oDb->delete($sModule, $iObject);
+    }
+    
+    public function add($sModule, $iProfileId, $sValue, $iObject, $bAutoActivation)
+    {
+        return $this->_oDb->add($sModule, $iProfileId, $sValue, $iObject, $bAutoActivation);
+    }
+    
+    public function getUrl ($sModule, $sValue)
+    {
+        return  BX_DOL_URL_ROOT . 'searchKeyword.php?keyword=' . rawurlencode($sValue) . '&cat=multi&section=' . $sModule;
+    }
+}
+
+/** @} */

+ 146 - 0
inc/classes/BxDolCategoriesQuery.php

@@ -0,0 +1,146 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaCore UNA Core
+ * @{
+ */
+
+/**
+ * @see BxDolCategories
+ */
+class BxDolCategoriesQuery extends BxDolDb
+{
+    protected $_sTableCategories;
+
+    public function __construct()
+    {
+    	parent::__construct();
+
+        $this->_sTableCategories = 'sys_categories';
+    }
+
+    public function getData($aParams = array())
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $aMethod = array('name' => 'getAll', 'params' => array(0 => 'query'));
+
+        $sSelectClause = "`sc`.*";
+        $sJoinClause = $sWhereClause = $sGroupClause = "";
+        $sOrderClause = "`sc`.`added` ASC";
+
+        if(isset($aParams['count_only']) && $aParams['count_only'] === true) {
+            $aMethod['name'] = 'getOne';
+            $sSelectClause = "COUNT(`sc`.`id`)";
+        }
+
+        switch($aParams['type']) {
+            case 'by_module':
+                $aMethod['name'] = 'getAllWithKey';
+                $aMethod['params'][1] = 'value';
+                $aMethod['params'][2] = array(
+                    'module' => $aParams['module']
+                );
+
+                $sSelectClause = "`sc`.*, `sc`.`value` as `key`, `sc`.`Value` as `value`";
+                $sWhereClause = " AND `sc`.`module` = :module AND (`sc`.`status` = 'active')";
+                $sOrderClause = "`sc`.`Value` ASC";
+                break;
+                
+            case 'by_module_and_author':
+                $aMethod['name'] = 'getAllWithKey';
+                $aMethod['params'][1] = 'value';
+                $aMethod['params'][2] = array(
+                    'module' => $aParams['module'],
+                    'author' => $aParams['author'],
+                );
+                
+                $sSelectClause = "`sc`.*, `sc`.`value` as `key`, `sc`.`Value` as `value`";
+                $sWhereClause = " AND `sc`.`module` = :module AND (`sc`.`author` = 0 OR `sc`.`author` = :author) AND (`sc`.`status` = 'active')";
+                $sOrderClause = "`sc`.`Value` ASC";
+                break;    
+                
+            case 'by_module_with_num':
+                $aMethod['name'] = 'getAll';
+                $aMethod['params'][1] = array(
+                    'module' => $aParams['module'],
+
+                );
+                
+                $sSelectClause = "`sc`.`value`, COUNT(`sc`.`id`) as `num`";
+                $sJoinClause = "INNER JOIN `sys_categories2objects` `soc` ON `sc`.`id` =  `soc`.`category_id`";
+                $sWhereClause = " AND `sc`.`status` = 'active' AND `soc`.`module` = :module";
+                $sGroupClause = "`sc`.`id`";
+                $sOrderClause = "`num` DESC";
+                break;
+                
+            case 'by_module_and_object':
+                $aMethod['name'] = 'getColumn';
+                $aMethod['params'][1] = array(
+                    'module' => $aParams['module'],
+                    'object_id' => $aParams['object_id']
+                );
+                
+                $sSelectClause = "`sc`.`value`";
+                $sJoinClause = "INNER JOIN `sys_categories2objects` `soc` ON `sc`.`id` =  `soc`.`category_id`";
+                $sWhereClause = " AND `sc`.`status` = 'active' AND `soc`.`module` = :module AND `soc`.`object_id` = :object_id";
+                $sOrderClause = "`added` DESC";
+                break;
+        }
+
+        if(!empty($sGroupClause))
+            $sGroupClause = "GROUP BY " . $sGroupClause;
+
+        if(!empty($sOrderClause))
+            $sOrderClause = "ORDER BY " . $sOrderClause;
+
+        $aMethod['params'][0] = "SELECT " . $sSelectClause . " 
+            FROM `" . $this->_sTableCategories . "` AS `sc`" . $sJoinClause . " 
+            WHERE 1" . $sWhereClause . " " . $sGroupClause . " " . $sOrderClause;
+        return call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
+    }
+    
+    public function delete($sModule, $iObject)
+    {
+        $sQuery = "DELETE FROM `sys_categories2objects` WHERE `module` = :module AND `object_id` = :object_id";
+        $aBindings = array(
+           'module' => $sModule,
+           'object_id' => $iObject,
+        );
+        $this->query($sQuery, $aBindings);
+    }
+    
+    public function add($sModule, $iProfileId, $sValue, $iObject, $bAutoActivation)
+    {
+        $sStatus = $bAutoActivation ? 'active' : 'hidden';
+        $aBindings = array(
+            'value' => $sValue,
+            'module' => $sModule,
+            'author' => $iProfileId 
+        );
+        $sQuery = "SELECT id FROM `sys_categories` WHERE `value` = :value AND `module` = :module AND (`author` = 0 OR `author` = :author)";
+        $iCategoryId = (int)$this->getOne($sQuery, $aBindings);
+        
+        if($iCategoryId == 0){   
+            $aBindings['status'] = $sStatus;
+            $aBindings['added'] = time();
+            $sQuery = "INSERT INTO `sys_categories` (`value`, `module`, `status`, `added`, `author`) VALUES(:value, :module, :status, :added, :author)";
+            $this->query($sQuery, $aBindings);
+            $iCategoryId = $this->lastId();
+        }
+
+        $sQuery = "INSERT INTO `sys_categories2objects` (`module`, `object_id`, `category_id`) VALUES(:module, :object_id, :category_id)";
+        $aBindings = array(
+           'module' => $sModule,
+           'object_id' => $iObject,
+           'category_id' => $iCategoryId,
+        );
+        $this->query($sQuery, $aBindings);
+        
+        return $iCategoryId;
+    }
+}
+
+/** @} */

+ 19 - 4
inc/classes/BxDolSearch.php

@@ -43,7 +43,7 @@ class BxDolSearch extends BxDol
 
     protected $_bLiveSearch = false;
     protected $_sMetaType = '';
-    protected $_sCategoryObject = '';
+    protected $_sCategoryObject = ''; ///< by default = object from sys_objects_category table, for multicategories set to 'multi' string 
     protected $_aCustomSearchCondition = array();
     protected $_aCustomCurrentCondition = array();
     protected $_sUnitTemplate = '';
@@ -391,9 +391,24 @@ class BxDolSearchResult implements iBxDolReplaceable
         $this->_aCustomSearchCondition = $a;
     }
     
-    public function setMultiCategoryCondition($sKeyword)
+    public function setCategoriesCondition($sKeyword)
     {
-        $this->aCurrent['restriction']['multicat'] = array('value' => $sKeyword, 'field' => 'multicat', 'operator' => 'like');
+        $this->aCurrent['join']['multicat'] = array(
+            'type' => 'INNER',
+            'table' => 'sys_categories2objects',
+            'mainField' => 'id',
+            'onField' => 'object_id',
+            'joinFields' => array(),
+        );
+        $this->aCurrent['join']['multicat2'] = array(
+           'type' => 'INNER',
+           'table' => 'sys_categories',
+           'mainField' => 'category_id',
+           'mainTable' => 'sys_categories2objects',
+           'onField' => 'id',
+           'joinFields' => array(),
+       );
+       $this->aCurrent['restriction']['multicat'] = array('value' => $sKeyword, 'field' => 'value', 'operator' => '=', 'table' => 'sys_categories');
     }
     
     /**
@@ -763,7 +778,7 @@ class BxDolSearchResult implements iBxDolReplaceable
             }
             if ($this->_sCategoryObject == 'multi'){
                 unset($this->aCurrent['restriction']['keyword']);
-                $this->setMultiCategoryCondition($sKeyword);
+                $this->setCategoriesCondition($sKeyword);
             }
         }
 

+ 37 - 3
install/sql/system.sql

@@ -3887,7 +3887,8 @@ INSERT INTO `sys_objects_grid` (`object`, `source_type`, `source`, `table`, `fie
 ('sys_studio_search_forms', 'Sql', 'SELECT * FROM `sys_objects_search_extended` WHERE 1 ', 'sys_objects_search_extended', 'id', 'module,title', 'active', '', 100, NULL, 'start', '', 'module', 'title', 'like', 'module', 'title', 'BxTemplStudioFormsSearchForms', ''),
 ('sys_studio_search_forms_fields', 'Sql', 'SELECT * FROM `sys_search_extended_fields` WHERE 1 AND `object`=?', 'sys_search_extended_fields', 'id', 'order', 'active', '', 100, NULL, 'start', '', 'type', 'caption', 'like', '', '', 'BxTemplStudioFormsSearchFields', ''),
 
-('sys_studio_labels', 'Sql', 'SELECT * FROM `sys_labels` WHERE 1 ', 'sys_labels', 'id', 'order', '', '', 100, NULL, 'start', '', 'value', '', 'like', 'value', '', 'BxTemplStudioFormsLabels', '');
+('sys_studio_labels', 'Sql', 'SELECT * FROM `sys_labels` WHERE 1 ', 'sys_labels', 'id', 'order', '', '', 100, NULL, 'start', '', 'value', '', 'like', 'value', '', 'BxTemplStudioFormsLabels', ''),
+('sys_studio_categories', 'Sql', 'SELECT * FROM `sys_categories` WHERE 1 ', 'sys_categories', 'id', 'added', 'status', '', 20, NULL, 'start', '', 'value', '', 'like', '', '', 'BxTemplStudioFormsCategories', '');
 
 CREATE TABLE IF NOT EXISTS `sys_grid_fields` (
   `object` varchar(64) NOT NULL,
@@ -4004,7 +4005,15 @@ INSERT INTO `sys_grid_fields` (`object`, `name`, `title`, `width`, `translatable
 ('sys_studio_labels', 'order', '', '1%', 0, 0, '', 1),
 ('sys_studio_labels', 'value', '_adm_form_txt_labels_value', '70%', 0, 38, '', 2),
 ('sys_studio_labels', 'items', '_adm_form_txt_labels_items', '10%', 0, 0, '', 3),
-('sys_studio_labels', 'actions', '', '19%', 0, 0, '', 4);
+('sys_studio_labels', 'actions', '', '19%', 0, 0, '', 4),
+
+('sys_studio_categories', 'checkbox', '_sys_select', '2%', 0, 0, '', 1),
+('sys_studio_categories', 'switcher', '_adm_prm_txt_enable', '8%', 0, 0, '', 2),
+('sys_studio_categories', 'value', '_adm_form_txt_categories_value', '25%', 0, 35, '', 3),
+('sys_studio_categories', 'module', '_adm_form_txt_categories_module', '15%', 0, 35, '', 4),
+('sys_studio_categories', 'author', '_adm_form_txt_categories_author', '15%', 0, 35, '', 5),
+('sys_studio_categories', 'added', '_adm_form_txt_categories_added', '15%', 1, 25, '', 6),
+('sys_studio_categories', 'actions', '', '20%', 0, 0, '', 7);
 
 
 CREATE TABLE IF NOT EXISTS `sys_grid_actions` (
@@ -4076,7 +4085,12 @@ INSERT INTO `sys_grid_actions` (`object`, `type`, `name`, `title`, `icon`, `conf
 ('sys_studio_labels', 'independent', 'back', '_adm_form_btn_labels_back', '', 0, 1),
 ('sys_studio_labels', 'independent', 'add', '_adm_form_btn_labels_add', '', 0, 2),
 ('sys_studio_labels', 'single', 'edit', '', 'pencil-alt', 0, 1),
-('sys_studio_labels', 'single', 'delete', '', 'remove', 1, 2);
+('sys_studio_labels', 'single', 'delete', '', 'remove', 1, 2),
+
+('sys_studio_categories', 'bulk', 'delete', '_adm_form_btn_categories_delete', '', 1, 1),
+('sys_studio_categories', 'single', 'edit', '', 'pencil-alt', 0, 1),
+('sys_studio_categories', 'single', 'delete', '', 'remove', 1, 2),
+('sys_studio_categories', 'independent', 'add', '_adm_form_btn_categories_add', '', 0, 1);
 
 -- 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
@@ -4639,6 +4653,26 @@ CREATE TABLE `sys_objects_category` (
 
 -- --------------------------------------------------------
 
+CREATE TABLE IF NOT EXISTS `sys_categories` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `author` int(11) NOT NULL,
+  `added` int(11) NOT NULL,
+  `module` varchar(32) NOT NULL,
+  `value` varchar(100) NOT NULL,
+  `status` enum ('active', 'hidden') NOT NULL DEFAULT 'active',
+  PRIMARY KEY (`id`)
+);
+
+CREATE TABLE IF NOT EXISTS `sys_categories2objects` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `module` varchar(32) NOT NULL,
+  `object_id` int(11) NOT NULL,
+  `category_id` int(11) NOT NULL,
+  PRIMARY KEY (`id`)
+);
+
+-- --------------------------------------------------------
+
 --
 -- Table structure for table `sys_objects_live_updates`
 --