<?php␊ |
/* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */␊ |
/*␊ |
# ***** BEGIN LICENSE BLOCK *****␊ |
# This file is part of Plume Framework, a simple PHP Application Framework.␊ |
# Copyright (C) 2001-2007 Loic d'Anterroches and contributors.␊ |
#␊ |
# Plume Framework is free software; you can redistribute it and/or modify␊ |
# it under the terms of the GNU Lesser General Public License as published by␊ |
# the Free Software Foundation; either version 2.1 of the License, or␊ |
# (at your option) any later version.␊ |
#␊ |
# Plume Framework is distributed in the hope that it will be useful,␊ |
# but WITHOUT ANY WARRANTY; without even the implied warranty of␊ |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the␊ |
# GNU Lesser General Public License for more details.␊ |
#␊ |
# You should have received a copy of the GNU Lesser General Public License␊ |
# along with this program; if not, write to the Free Software␊ |
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA␊ |
#␊ |
# ***** END LICENSE BLOCK ***** */␊ |
␊ |
/**␊ |
* Allow to iterate over an array of standard classes with␊ |
* 'model_class' and 'model_id' properties set.␊ |
*␊ |
* Optional properties from the classses can also be extracted and␊ |
* added as properties to the model.␊ |
*␊ |
* Suppose you have a $data array with:␊ |
* array(␊ |
* (object) array('model_class' => 'MyApp_Item',␊ |
* 'model_id' => 32,␊ |
* 'foo' => 'bingo plus'),␊ |
* (object) array('model_class' => 'MyApp_Bong',␊ |
* 'model_id' => 12,␊ |
* 'foo' => 'youpla'),␊ |
* (object) array('model_class' => 'MyApp_Item',␊ |
* 'model_id' => 14,␊ |
* 'foo' => 'bingo'),␊ |
* );␊ |
*␊ |
* You can do:␊ |
* $set = new Pluf_Model_Set($data, array('foo' => '_Foo'));␊ |
* foreach ($set as $res) {␊ |
* echo $res; // Will be the loaded model based on the class and id.␊ |
* echo $res->_Foo; // will contain the value foo of the $data array.␊ |
* }␊ |
*␊ |
*/␊ |
class Pluf_Model_Set implements Iterator, ArrayAccess␊ |
{␊ |
protected $data = array();␊ |
protected $keys = array();␊ |
␊ |
public function __construct($data, $keys=array())␊ |
{␊ |
$this->data = $data;␊ |
$this->keys = $keys;␊ |
reset($this->data);␊ |
}␊ |
␊ |
/**␊ |
* Get the current item.␊ |
*/␊ |
␉public function current()␊ |
{␊ |
$i = current($this->data);␊ |
$item = Pluf::factory($i->model_class, $i->model_id);␊ |
foreach ($this->keys as $key => $val) {␊ |
$item->$val = $i->$key;␊ |
}␊ |
return $item;␊ |
}␊ |
␊ |
␉public function key()␊ |
{␊ |
return key($this->data);␊ |
}␊ |
␊ |
␉public function next()␊ |
{␊ |
next($this->data);␊ |
}␊ |
␊ |
␉public function rewind()␊ |
{␊ |
reset($this->data);␊ |
}␊ |
␊ |
␉public function valid()␊ |
{␊ |
// We know that the boolean false will not be stored as a␊ |
// field, so we can test against false to check if valid or␊ |
// not.␊ |
return (false !== current($this->data));␊ |
}␊ |
␊ |
␉public function count()␊ |
{␊ |
return count($this->data);␊ |
}␊ |
␊ |
public function offsetUnset($index) ␊ |
{␊ |
unset($this->data[$index]);␊ |
}␊ |
␊ |
public function offsetSet($index, $value) ␊ |
{␊ |
if (!is_object($value) or␊ |
is_subclass_of($value, 'Pluf_Model')) {␊ |
throw new Exception('Must be a subclass of Pluf_Model: '.$value);␊ |
}␊ |
$res = array('model_class' => $value->_model,␊ |
'model_id' => $value->id);␊ |
foreach ($this->keys as $key => $name) {␊ |
$res[$key] = (isset($value->$name)) ? $value->$name : null;␊ |
}␊ |
$this->data[$index] = (object) $res;␊ |
}␊ |
␊ |
public function offsetGet($index) ␊ |
{␊ |
if (!isset($this->data[$index])) {␊ |
throw new Exception('Undefined index: '.$index);␊ |
}␊ |
$i = $this->data[$index];␊ |
$item = Pluf::factory($i->model_class, $i->model_id);␊ |
foreach ($this->keys as $key => $val) {␊ |
$item->$val = $i->$key;␊ |
}␊ |
return $item;␊ |
}␊ |
␊ |
public function offsetExists($index) ␊ |
{␊ |
return (isset($this->data[$index]));␊ |
}␊ |
} |