141 lines
4.1 KiB
PHP
141 lines
4.1 KiB
PHP
<?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]));
|
|
}
|
|
} |