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