File indexing completed on 2024-10-13 13:29:13

0001 <?php
0002 
0003 /**
0004  *  ocs-apiserver
0005  *
0006  *  Copyright 2016 by pling GmbH.
0007  *
0008  *    This file is part of ocs-apiserver.
0009  *
0010  *    This program is free software: you can redistribute it and/or modify
0011  *    it under the terms of the GNU Affero General Public License as
0012  *    published by the Free Software Foundation, either version 3 of the
0013  *    License, or (at your option) any later version.
0014  *
0015  *    This program is distributed in the hope that it will be useful,
0016  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
0017  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0018  *    GNU Affero General Public License for more details.
0019  *
0020  *    You should have received a copy of the GNU Affero General Public License
0021  *    along with this program.  If not, see <http://www.gnu.org/licenses/>.
0022  **/
0023 class Application_Model_ProjectCategory
0024 {
0025     const CACHE_TREE_STORE = 'store_cat_tree';
0026 
0027     /** @var string */
0028     protected $_dataTableName;
0029     /** @var  Application_Model_DbTable_ProjectCategory */
0030     protected $_dataTable;
0031 
0032     /**
0033      * PHP 5 allows developers to declare constructor methods for classes.
0034      * Classes which have a constructor method call this method on each newly-created object,
0035      * so it is suitable for any initialization that the object may need before it is used.
0036      *
0037      * Note: Parent constructors are not called implicitly if the child class defines a constructor.
0038      * In order to run a parent constructor, a call to parent::__construct() within the child constructor is required.
0039      *
0040      * param [ mixed $args [, $... ]]
0041      *
0042      * @param string $_dataTableName
0043      *
0044      * @link http://php.net/manual/en/language.oop5.decon.php
0045      */
0046     public function __construct($_dataTableName = 'Application_Model_DbTable_ProjectCategory')
0047     {
0048         $this->_dataTableName = $_dataTableName;
0049         $this->_dataTable = new $this->_dataTableName;
0050     }
0051 
0052     private function buildTree($list, $parent_id = null, $store_id = null)
0053     {
0054         if (false === is_array($list)) {
0055             $list = array($list);
0056         }
0057         $modelCategories = new Application_Model_DbTable_ProjectCategory();
0058         $result = array();
0059         foreach ($list as $cat_id) {
0060             $currentCategory = $modelCategories->fetchElement($cat_id);
0061 
0062             $result_element = array(
0063                 'id'            => $cat_id,
0064                 'title'         => $currentCategory['title'],
0065                 'xdg_type'      => $currentCategory['xdg_type'],
0066                 'name_legacy'   => $currentCategory['name_legacy'],
0067                 'has_children'  => false
0068             );
0069 
0070             if (isset($parent_id)) {
0071                 $result_element['parent_id'] = $parent_id;
0072             }
0073 
0074             //has children?
0075             if (($currentCategory['rgt'] - $currentCategory['lft']) > 1) {
0076                 $result_element['has_children'] = true;
0077                 $ids = $modelCategories->fetchImmediateChildrenIds($currentCategory['project_category_id'],
0078                     $modelCategories::ORDERED_TITLE);
0079                 $result_element['children'] = $this->buildTree($ids, $currentCategory['project_category_id'], $store_id);
0080             }
0081             $result[] = $result_element;
0082         }
0083 
0084         return $result;
0085     }
0086 
0087     public function fetchCategoryTreeCurrentStore($clearCache = false)
0088     {
0089         $store_config = Zend_Registry::get('store_config');
0090         $store_id = $store_config->store_id;
0091 
0092         /** @var Zend_Cache_Core $cache */
0093         $cache = Zend_Registry::get('cache');
0094         $cache_id = self::CACHE_TREE_STORE . "_{$store_id}";
0095 
0096         if ($clearCache) {
0097             $cache->remove($cache_id);
0098         }
0099 
0100         if (false === ($tree = $cache->load($cache_id))) {
0101             $list_cat_id = self::fetchCatIdsForCurrentStore();
0102             $tree = $this->buildTree($list_cat_id);
0103             $cache->save($tree, $cache_id, array(), 120);
0104         }
0105 
0106         return $tree;
0107     }
0108 
0109     public static function fetchCatIdsForCurrentStore()
0110     {
0111         return Zend_Registry::isRegistered('store_category_list') ? Zend_Registry::get('store_category_list') : null;
0112     }
0113 
0114 }