1: <?php
2: /**
3: * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
4: * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
5: *
6: * Licensed under The MIT License
7: * For full copyright and license information, please see the LICENSE.txt
8: * Redistributions of files must retain the above copyright notice.
9: *
10: * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
11: * @link https://cakephp.org CakePHP(tm) Project
12: * @since 3.0.0
13: * @license https://opensource.org/licenses/mit-license.php MIT License
14: */
15: namespace Cake\Collection\Iterator;
16:
17: use Cake\Collection\Collection;
18: use RecursiveIterator;
19: use Traversable;
20:
21: /**
22: * A type of collection that is aware of nested items and exposes methods to
23: * check or retrieve them
24: */
25: class NestIterator extends Collection implements RecursiveIterator
26: {
27: /**
28: * The name of the property that contains the nested items for each element
29: *
30: * @var string|callable
31: */
32: protected $_nestKey;
33:
34: /**
35: * Constructor
36: *
37: * @param array|\Traversable $items Collection items.
38: * @param string|callable $nestKey the property that contains the nested items
39: * If a callable is passed, it should return the childrens for the passed item
40: */
41: public function __construct($items, $nestKey)
42: {
43: parent::__construct($items);
44: $this->_nestKey = $nestKey;
45: }
46:
47: /**
48: * Returns a traversable containing the children for the current item
49: *
50: * @return \RecursiveIterator
51: */
52: public function getChildren()
53: {
54: $property = $this->_propertyExtractor($this->_nestKey);
55:
56: return new static($property($this->current()), $this->_nestKey);
57: }
58:
59: /**
60: * Returns true if there is an array or a traversable object stored under the
61: * configured nestKey for the current item
62: *
63: * @return bool
64: */
65: public function hasChildren()
66: {
67: $property = $this->_propertyExtractor($this->_nestKey);
68: $children = $property($this->current());
69:
70: if (is_array($children)) {
71: return !empty($children);
72: }
73:
74: return $children instanceof Traversable;
75: }
76: }
77: