1: <?php
2: /**
3: * Created by PhpStorm.
4: * User: manus
5: * Date: 13/1/16
6: * Time: 21:07
7: */
8:
9: namespace GLFramework;
10:
11:
12: use Traversable;
13:
14: class ModelResult implements \IteratorAggregate
15: {
16: var $model_class;
17: var $models;
18: var $model;
19:
20: /**
21: * ModelResult constructor.
22: * @param $model_class
23: */
24: public function __construct($model_class)
25: {
26: $rf = new \ReflectionClass($model_class);
27: $this->model_class = $rf;
28: }
29:
30:
31: /**
32: * Obtiene el primer modelo disponible
33: * @return Model
34: */
35: public function getModel()
36: {
37: return $this->model_class->newInstance($this->model);
38: }
39:
40: /**
41: * @param null $size
42: * @return Model[]
43: * @deprecated
44: */
45: public function getModelsInstanced($size = null)
46: {
47: $instances = array();
48: if($size === null)
49: {
50: foreach($this->models as $model)
51: {
52: $instances[] = $this->model_class->newInstance($model);
53: }
54: }
55: else
56: {
57: for($i = 0; $i < $size; $i++)
58: {
59: if(isset($this->models[$i]))
60: {
61: $instances[] = $this->model_class->newInstance($this->models[$i]);
62: }
63: else
64: {
65: $instances[] = $this->model_class->newInstance();
66: }
67: }
68: }
69: return $instances;
70: }
71:
72: /**
73: * Obtener una lista con los modelos disponibles
74: * @param null $size
75: * @return Model[]
76: */
77: public function getModels($size = null)
78: {
79: return $this->getModelsInstanced($size);
80: }
81:
82: /**
83: * Obtiene el modelo en la posicion $count
84: * @param $count
85: * @return null
86: */
87: public function offset($count)
88: {
89: if(count($this->models) < $count)
90: {
91: return $this->models[$count];
92: }
93: return null;
94: }
95:
96: /**
97: * Devuelve el numero de elementos devueltos
98: * @return int
99: */
100: public function count()
101: {
102: return count($this->models);
103: }
104:
105: /**
106: * Obtiene el ultimo modelo de la lista
107: * @return Model|null
108: */
109: public function last()
110: {
111: if($this->count())
112: {
113: $models = $this->getModels();
114: return $models[$this->count() - 1];
115: }
116: return null;
117: }
118:
119: /**
120: * Genera una array lista para usar con json_encode
121: * @return array
122: */
123: public function json()
124: {
125: $list = array();
126: foreach($this->getModels() as $model)
127: {
128: $list[] = $model->json();
129: }
130: return $list;
131: }
132:
133: /**
134: * Devuelve la lista al reves
135: * @param null $size
136: * @return array
137: */
138: public function reverse($size = null)
139: {
140: return array_reverse($this->getModels($size));
141: }
142:
143: /**
144: * Ordena de menor a mayor en funcion del campo indicado
145: * @param $field
146: * @return $this
147: */
148: public function order($field)
149: {
150: usort($this->models, function($a, $b) use($field)
151: {
152: return $a[$field] - $b[$field];
153:
154: });
155: return $this;
156: }
157:
158: /**
159: * Retrieve an external iterator
160: * @link http://php.net/manual/en/iteratoraggregate.getiterator.php
161: * @return Traversable An instance of an object implementing <b>Iterator</b> or
162: * <b>Traversable</b>
163: * @since 5.0.0
164: */
165: public function getIterator()
166: {
167: return new \ArrayIterator( $this->getModels());
168: }
169: }