Admin - searchQuotaNodes
[tine20] / tine20 / Tinebase / Model / Tree / Node / PathFilter.php
1 <?php
2 /**
3  * Tine 2.0
4  * 
5  * @package     Tinebase
6  * @subpackage  Filter
7  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
8  * @copyright   Copyright (c) 2011-2017 Metaways Infosystems GmbH (http://www.metaways.de)
9  * @author      Philipp Schüle <p.schuele@metaways.de>
10  */
11
12 /**
13  * Tinebase_Model_Tree_Node_PathFilter
14  * 
15  * @package     Tinebase
16  * @subpackage  Filter
17  * 
18  */
19 class Tinebase_Model_Tree_Node_PathFilter extends Tinebase_Model_Filter_Text 
20 {
21     /**
22      * @var array list of allowed operators
23      */
24     protected $_operators = array(
25         0 => 'equals',
26     );
27     
28     /**
29      * the parsed path record
30      * 
31      * @var Tinebase_Model_Tree_Node_Path
32      */
33     protected $_path = NULL;
34     
35     /**
36      * set options 
37      *
38      * @param  array $_options
39      * @throws Tinebase_Exception_Record_NotDefined
40      */
41     protected function _setOptions(array $_options)
42     {
43         $_options['ignoreAcl'] = isset($_options['ignoreAcl']) ? $_options['ignoreAcl'] : false;
44         
45         $this->_options = $_options;
46     }
47     
48     /**
49      * returns array with the filter settings of this filter
50      *
51      * @param  bool $_valueToJson resolve value for json api?
52      * @return array
53      */
54     public function toArray($_valueToJson = false)
55     {
56         $result = parent::toArray($_valueToJson);
57         
58         if (! $this->_path && '/' !== $this->_value) {
59             $this->_path = Tinebase_Model_Tree_Node_Path::createFromPath($this->_value);
60         }
61         
62         if ('/' === $this->_value || $this->_path->containerType === Tinebase_Model_Tree_Node_Path::TYPE_ROOT) {
63             $node = new Tinebase_Model_Tree_Node(array(
64                 'name' => 'root',
65                 'path' => '/',
66             ), true);
67         } else {
68             $node = Tinebase_FileSystem::getInstance()->stat($this->_path->statpath);
69             $node->path = $this->_path->flatpath;
70         }
71
72         $result['value'] = $node->toArray();
73         
74         return $result;
75     }
76     
77     /**
78      * appends sql to given select statement
79      *
80      * @param  Zend_Db_Select                    $_select
81      * @param  Tinebase_Backend_Sql_Abstract     $_backend
82      */
83     public function appendFilterSql($_select, $_backend)
84     {
85         $this->_parsePath();
86         
87         $this->_addParentIdFilter($_select, $_backend);
88     }
89     
90     /**
91      * parse given path (filter value): check validity, set container type, do replacements
92      */
93     protected function _parsePath()
94     {
95         if ('/' === $this->_value) {
96             if (! Tinebase_Core::getUser()->hasRight('Admin', Admin_Acl_Rights::VIEW_QUOTA_USAGE)) {
97                 throw new Tinebase_Exception_AccessDenied('You don\'t have the right to run this application');
98             }
99             return;
100         }
101
102         $this->_path = Tinebase_Model_Tree_Node_Path::createFromPath($this->_value);
103         
104         if (! $this->_options['ignoreAcl'] && ! Tinebase_Core::getUser()->hasRight($this->_path->application->name, Tinebase_Acl_Rights_Abstract::RUN)) {
105             throw new Tinebase_Exception_AccessDenied('You don\'t have the right to run this application');
106         }
107     }
108
109     /**
110      * adds parent id filter sql
111      *
112      * @param  Zend_Db_Select                    $_select
113      * @param  Tinebase_Backend_Sql_Abstract     $_backend
114      */
115     protected function _addParentIdFilter($_select, $_backend)
116     {
117         if ('/' === $this->_value) {
118             $parentIdFilter = new Tinebase_Model_Filter_Text('parent_id', 'isnull', '');
119         } else {
120             $node = Tinebase_FileSystem::getInstance()->stat($this->_path->statpath);
121             $parentIdFilter = new Tinebase_Model_Filter_Text('parent_id', 'equals', $node->getId());
122         }
123         $parentIdFilter->appendFilterSql($_select, $_backend);
124     }
125 }