Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 81
0.00% covered (danger)
0.00%
0 / 20
CRAP
0.00% covered (danger)
0.00%
0 / 5
DocumentIterator
0.00% covered (danger)
0.00%
0 / 31
0.00% covered (danger)
0.00%
0 / 7
506
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
2
 rewind
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 valid
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 next
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 key
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 current
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
12
 populate
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
210
FolderIterator
0.00% covered (danger)
0.00%
0 / 31
0.00% covered (danger)
0.00%
0 / 7
506
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
2
 rewind
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 valid
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 next
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 key
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 current
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
12
 populate
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
210
FolderFilterIterator
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 2
6
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 accept
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
RecursiveFolderIterator
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 2
20
0.00% covered (danger)
0.00%
0 / 1
 hasChildren
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
12
 getChildren
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
RecursiveFolderFilterIterator
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 2
20
0.00% covered (danger)
0.00%
0 / 1
 hasChildren
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
12
 getChildren
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2namespace SeedDMS\Core;
3
4/**
5 * Implementation of the document iterartor
6 *
7 * @category   DMS
8 * @package    SeedDMS_Core
9 * @license    GPL 2
10 * @version    @version@
11 * @author     Uwe Steinmann <uwe@steinmann.cx>
12 * @copyright  Copyright (C) 2010, Uwe Steinmann
13 * @version    Release: @package_version@
14 */
15
16class DocumentIterator implements \Iterator {
17    /**
18     * @var object folder
19     */
20    protected $_folder;
21
22    /**
23     * @var object dms
24     */
25    protected $_dms;
26
27    /**
28     * @var array documents
29     */
30    protected $_documents;
31
32    /**
33     * @var int $_pointer
34     */
35    protected $_pointer;
36
37    /**
38     * @var array $_cache
39     */
40    protected $_cache;
41
42    public function __construct($folder) {
43        $this->_folder = $folder;
44        $this->_dms = $folder->getDMS();
45        $this->_documents = array();
46        $this->_pointer = 0;
47        $this->_cache = array();
48        $this->populate();
49    }
50
51    public function rewind(): void {
52        $this->_pointer = 0;
53    }
54
55    public function valid(): bool {
56        return isset($this->_documents[$this->_pointer]);
57    }
58
59    public function next(): void {
60        $this->_pointer++;
61    }
62
63    public function key(): mixed {
64        return $this->_folders[$this->_pointer];
65    }
66
67    public function current(): mixed {
68        if($this->_documents[$this->_pointer]) {
69            $documentid = $this->_documents[$this->_pointer]['id'];
70            if(!isset($this->_cache[$documentid])) {
71//                echo $documentid." not cached<br />";
72                $this->_cache[$documentid] = $this->_dms->getdocument($documentid);
73            }
74            return $this->_cache[$documentid];
75        }
76        return null;
77    }
78
79    private function populate($orderby="", $dir="asc", $limit=0, $offset=0) { /* {{{ */
80        $db = $this->_dms->getDB();
81
82        $queryStr = "SELECT `id` FROM `tblDocuments` WHERE `folder` = " . $this->_folder->getID();
83
84        if ($orderby && $orderby[0]=="n") $queryStr .= " ORDER BY `name`";
85        elseif ($orderby && $orderby[0]=="s") $queryStr .= " ORDER BY `sequence`";
86        elseif ($orderby && $orderby[0]=="d") $queryStr .= " ORDER BY `date`";
87        if($dir == 'desc')
88            $queryStr .= " DESC";
89        if(is_int($limit) && $limit > 0) {
90            $queryStr .= " LIMIT ".$limit;
91            if(is_int($offset) && $offset > 0)
92                $queryStr .= " OFFSET ".$offset;
93        }
94
95        $resArr = $db->getResultArray($queryStr);
96        if (is_bool($resArr) && $resArr == false)
97            return false;
98
99        $this->_documents = $resArr;
100    } /* }}} */
101}
102
103class FolderIterator implements \Iterator { /* {{{ */
104    /**
105     * @var object folder
106     */
107    protected $_folder;
108
109    /**
110     * @var object dms
111     */
112    protected $_dms;
113
114    /**
115     * @var array documents
116     */
117    protected $_folders;
118
119    /**
120     * @var int $_pointer
121     */
122    protected $_pointer;
123
124    /**
125     * @var array $_cache
126     */
127    protected $_cache;
128
129    public function __construct($folder) { /* {{{ */
130        $this->_folder = $folder;
131        $this->_dms = $folder->getDMS();
132        $this->_folders = array();
133        $this->_pointer = 0;
134        $this->_cache = array();
135        $this->populate();
136    } /* }}} */
137
138    #[\ReturnTypeWillChange]
139    public function rewind() { /* {{{ */
140        $this->_pointer = 0;
141    } /* }}} */
142
143    #[\ReturnTypeWillChange]
144    public function valid() { /* {{{ */
145        return isset($this->_folders[$this->_pointer]);
146    } /* }}} */
147
148    #[\ReturnTypeWillChange]
149    public function next() { /* {{{ */
150        $this->_pointer++;
151    } /* }}} */
152
153    #[\ReturnTypeWillChange]
154    public function key() { /* {{{ */
155        return $this->_folders[$this->_pointer];
156    } /* }}} */
157
158    #[\ReturnTypeWillChange]
159    public function current() { /* {{{ */
160        if($this->_folders[$this->_pointer]) {
161            $folderid = $this->_folders[$this->_pointer]['id'];
162            if(!isset($this->_cache[$folderid])) {
163//                echo $folderid." not cached<br />";
164                $this->_cache[$folderid] = $this->_dms->getFolder($folderid);
165            }
166            return $this->_cache[$folderid];
167        }
168        return null;
169    } /* }}} */
170
171    private function populate($orderby="", $dir="asc", $limit=0, $offset=0) { /* {{{ */
172        $db = $this->_dms->getDB();
173
174        $queryStr = "SELECT `id` FROM `tblFolders` WHERE `parent` = " . $this->_folder->getID();
175
176        if ($orderby && $orderby[0]=="n") $queryStr .= " ORDER BY `name`";
177        elseif ($orderby && $orderby[0]=="s") $queryStr .= " ORDER BY `sequence`";
178        elseif ($orderby && $orderby[0]=="d") $queryStr .= " ORDER BY `date`";
179        if($dir == 'desc')
180            $queryStr .= " DESC";
181        if(is_int($limit) && $limit > 0) {
182            $queryStr .= " LIMIT ".$limit;
183            if(is_int($offset) && $offset > 0)
184                $queryStr .= " OFFSET ".$offset;
185        }
186
187        $resArr = $db->getResultArray($queryStr);
188        if (is_bool($resArr) && $resArr == false)
189            return false;
190
191        $this->_folders = $resArr;
192    } /* }}} */
193} /* }}} */
194
195/**
196 * The FolderFilterIterator checks if the given user has access on
197 * the current folder.
198 * FilterIterator uses an inner iterator passed to the constructor
199 * to iterate over the sub folders of a folder.
200 *
201        $iter = new FolderIterator($folder);
202        $iter2 = new FolderFilterIterator($iter, $user);
203        foreach($iter2 as $ff) {
204            echo $ff->getName()."<br />";
205        }
206 */
207class FolderFilterIterator extends \FilterIterator { /* {{{ */
208    public function __construct(Iterator $iterator , $filter ) {
209        parent::__construct($iterator);
210        $this->userFilter = $filter;
211    }
212    public function accept(): bool { /* {{{ */
213        $folder = $this->getInnerIterator()->current();
214        echo "accept() for ".$folder->getName()."<br />";
215        return true;
216    } /* }}} */
217} /* }}} */
218
219/**
220        $iter = new RecursiveFolderIterator($folder);
221        $iter2 = new RecursiveIteratorIterator($iter, RecursiveIteratorIterator::SELF_FIRST);
222        foreach($iter2 as $ff) {
223            echo $ff->getID().': '.$ff->getName()."<br />";
224        }
225 */
226class RecursiveFolderIterator extends FolderIterator implements \RecursiveIterator { /* {{{ */
227
228    #[\ReturnTypeWillChange]
229    public function hasChildren() { /* {{{ */
230        $db = $this->_dms->getDB();
231        $queryStr = "SELECT id FROM `tblFolders` WHERE `parent` = ".(int) $this->current()->getID();
232        $resArr = $db->getResultArray($queryStr);
233        if (is_bool($resArr) && !$resArr)
234            return false;
235        return true;
236    } /* }}} */
237
238    #[\ReturnTypeWillChange]
239    public function getChildren() { /* {{{ */
240        return new RecursiveFolderIterator($this->current());
241    } /* }}} */
242} /* }}} */
243
244class RecursiveFolderFilterIterator extends FolderFilterIterator { /* {{{ */
245    public function hasChildren() { /* {{{ */
246        $db = $this->_dms->getDB();
247        $queryStr = "SELECT id FROM `tblFolders` WHERE `parent` = ".(int) $this->current()->getID();
248        $resArr = $db->getResultArray($queryStr);
249        if (is_bool($resArr) && !$resArr)
250            return false;
251        return true;
252    } /* }}} */
253
254    public function getChildren() { /* {{{ */
255        return new RecursiveFolderIterator($this->current());
256    } /* }}} */
257
258} /* }}} */