Files
scattport-web/application/datamapper/array.php
2011-05-29 14:57:33 +02:00

195 lines
5.0 KiB
PHP

<?php
/**
* Array Extension for DataMapper classes.
*
* Quickly convert DataMapper models to-and-from PHP arrays.
*
* @license MIT License
* @package DMZ-Included-Extensions
* @category DMZ
* @author Phil DeJarnett
* @link http://www.overzealous.com/dmz/pages/extensions/array.html
* @version 1.0
*/
// --------------------------------------------------------------------------
/**
* DMZ_Array Class
*
* @package DMZ-Included-Extensions
*/
class DMZ_Array {
/**
* Convert a DataMapper model into an associative array.
* If the specified fields includes a related object, the ids from the
* objects are collected into an array and stored on that key.
* This method does not recursively add objects.
*
* @param DataMapper $object The DataMapper Object to convert
* @param array $fields Array of fields to include. If empty, includes all database columns.
* @return array An associative array of the requested fields and related object ids.
*/
function to_array($object, $fields = '')
{
// assume all database columns if $fields is not provided.
if(empty($fields))
{
$fields = $object->fields;
}
$result = array();
foreach($fields as $f)
{
// handle related fields
if(array_key_exists($f, $object->has_one) || array_key_exists($f, $object->has_many))
{
// each related item is stored as an array of ids
// Note: this method will NOT get() the related object.
$rels = array();
foreach($object->{$f} as $item)
{
$rels[] = $item->id;
}
$result[$f] = $rels;
}
else
{
// just the field.
$result[$f] = $object->{$f};
}
}
return $result;
}
/**
* Convert the entire $object->all array result set into an array of
* associative arrays.
*
* @see to_array
* @param DataMapper $object The DataMapper Object to convert
* @param array $fields Array of fields to include. If empty, includes all database columns.
* @return array An array of associative arrays.
*/
function all_to_array($object, $fields = '')
{
// loop through each object in the $all array, convert them to
// an array, and add them to a new array.
$result = array();
foreach($object as $o)
{
$result[] = $o->to_array($fields);
}
return $result;
}
/**
* Convert an associative array back into a DataMapper model.
*
* If $fields is provided, missing fields are assumed to be empty checkboxes.
*
* @param DataMapper $object The DataMapper Object to save to.
* @param array $data A an associative array of fields to convert.
* @param array $fields Array of 'safe' fields. If empty, only includes the database columns.
* @param bool $save If TRUE, then attempt to save the object automatically.
* @return array|bool A list of newly related objects, or the result of the save if $save is TRUE
*/
function from_array($object, $data, $fields = '', $save = FALSE)
{
// keep track of newly related objects
$new_related_objects = array();
// Assume all database columns.
// In this case, simply store $fields that are in the $data array.
if(empty($fields))
{
$fields = $object->fields;
foreach($data as $k => $v) {
if(in_array($k, $fields))
{
$object->{$k} = $v;
}
}
}
else
{
// If $fields is provided, assume all $fields should exist.
foreach($fields as $f)
{
if(array_key_exists($f, $object->has_one))
{
// Store $has_one relationships
$c = get_class($object->{$f});
$rel = new $c();
$id = isset($data[$f]) ? $data[$f] : 0;
$rel->get_by_id($id);
if($rel->exists())
{
// The new relationship exists, save it.
$new_related_objects[$f] = $rel;
}
else
{
// The new relationship does not exist, delete the old one.
$object->delete($object->{$f}->get());
}
}
else if(array_key_exists($f, $object->has_many))
{
// Store $has_many relationships
$c = get_class($object->{$f});
$rels = new $c();
$ids = isset($data[$f]) ? $data[$f] : FALSE;
if(empty($ids))
{
// if no IDs were provided, delete all old relationships.
$object->delete($object->{$f}->select('id')->get()->all);
}
else
{
// Otherwise, get the new ones...
$rels->where_in('id', $ids)->select('id')->get();
// Store them...
$new_related_objects[$f] = $rels->all;
// And delete any old ones that do not exist.
$old_rels = $object->{$f}->where_not_in('id', $ids)->select('id')->get();
$object->delete($old_rels->all);
}
}
else
{
// Otherwise, if the $data was set, store it...
if(isset($data[$f]))
{
$v = $data[$f];
}
else
{
// Or assume it was an unchecked checkbox, and clear it.
$v = FALSE;
}
$object->{$f} = $v;
}
}
}
if($save)
{
// Auto save
return $object->save($new_related_objects);
}
else
{
// return new objects
return $new_related_objects;
}
}
}
/* End of file array.php */
/* Location: ./application/datamapper/array.php */