221 lines
4.5 KiB
PHP
221 lines
4.5 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Json Extension for DataMapper classes.
|
|
*
|
|
* Quickly convert DataMapper models to-and-from JSON syntax.
|
|
*
|
|
* @license MIT License
|
|
* @package DMZ-Included-Extensions
|
|
* @category DMZ
|
|
* @author Phil DeJarnett
|
|
* @link http://www.overzealous.com/dmz/pages/extensions/json.html
|
|
* @version 1.1
|
|
*/
|
|
|
|
// --------------------------------------------------------------------------
|
|
|
|
/**
|
|
* DMZ_Json Class
|
|
*
|
|
* @package DMZ-Included-Extensions
|
|
*/
|
|
class DMZ_Json {
|
|
|
|
/**
|
|
* Convert a DataMapper model into JSON code.
|
|
*
|
|
* @param DataMapper $object The DataMapper Object to convert
|
|
* @param array $fields Array of fields to include. If empty, includes all database columns.
|
|
* @param boolean $pretty_print Format the JSON code for legibility.
|
|
* @return string A JSON formatted String, or FALSE if an error occurs.
|
|
*/
|
|
public function to_json($object, $fields = '', $pretty_print = FALSE)
|
|
{
|
|
if(empty($fields))
|
|
{
|
|
$fields = $object->fields;
|
|
}
|
|
$result = array();
|
|
foreach($fields as $f)
|
|
{
|
|
$result[$f] = $object->{$f};
|
|
}
|
|
$json = json_encode($result);
|
|
if($json === FALSE)
|
|
{
|
|
return FALSE;
|
|
}
|
|
if($pretty_print)
|
|
{
|
|
$json = $this->_json_format($json);
|
|
}
|
|
return $json;
|
|
}
|
|
|
|
/**
|
|
* Convert the entire $object->all array result set into JSON code.
|
|
*
|
|
* @param DataMapper $object The DataMapper Object to convert
|
|
* @param array $fields Array of fields to include. If empty, includes all database columns.
|
|
* @param boolean $pretty_print Format the JSON code for legibility.
|
|
* @return string A JSON formatted String, or FALSE if an error occurs.
|
|
*/
|
|
public function all_to_json($object, $fields = '', $pretty_print = FALSE)
|
|
{
|
|
if(empty($fields))
|
|
{
|
|
$fields = $object->fields;
|
|
}
|
|
$result = array();
|
|
foreach($object as $o)
|
|
{
|
|
$temp = array();
|
|
foreach($fields as $f)
|
|
{
|
|
$temp[$f] = $o->{$f};
|
|
}
|
|
$result[] = $temp;
|
|
}
|
|
$json = json_encode($result);
|
|
if($json === FALSE)
|
|
{
|
|
return FALSE;
|
|
}
|
|
if($pretty_print)
|
|
{
|
|
$json = $this->_json_format($json);
|
|
}
|
|
return $json;
|
|
}
|
|
|
|
/**
|
|
* Convert a JSON object back into a DataMapper model.
|
|
*
|
|
* @param DataMapper $object The DataMapper Object to save to.
|
|
* @param string $json_code A string that contains JSON code.
|
|
* @param array $fields Array of 'safe' fields. If empty, only include the database columns.
|
|
* @return bool TRUE or FALSE on success or failure of converting the JSON string.
|
|
*/
|
|
public function from_json($object, $json_code, $fields = '')
|
|
{
|
|
if(empty($fields))
|
|
{
|
|
$fields = $object->fields;
|
|
}
|
|
$data = json_decode($json_code);
|
|
if($data === FALSE)
|
|
{
|
|
return FALSE;
|
|
}
|
|
foreach($data as $k => $v) {
|
|
if(in_array($k, $fields))
|
|
{
|
|
$object->{$k} = $v;
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/**
|
|
* Sets the HTTP Content-Type header to application/json
|
|
*
|
|
* @param DataMapper $object
|
|
*/
|
|
public function set_json_content_type($object)
|
|
{
|
|
$CI =& get_instance();
|
|
$CI->output->set_header('Content-Type: application/json');
|
|
}
|
|
|
|
/**
|
|
* Formats a JSON string for readability.
|
|
*
|
|
* From @link http://php.net/manual/en/function.json-encode.php
|
|
*
|
|
* @param string $json Unformatted JSON
|
|
* @return string Formatted JSON
|
|
*/
|
|
private function _json_format($json)
|
|
{
|
|
$tab = " ";
|
|
$new_json = "";
|
|
$indent_level = 0;
|
|
$in_string = false;
|
|
|
|
$json_obj = json_decode($json);
|
|
|
|
if($json_obj === false)
|
|
return false;
|
|
|
|
$json = json_encode($json_obj);
|
|
$len = strlen($json);
|
|
|
|
for($c = 0; $c < $len; $c++)
|
|
{
|
|
$char = $json[$c];
|
|
switch($char)
|
|
{
|
|
case '{':
|
|
case '[':
|
|
if(!$in_string)
|
|
{
|
|
$new_json .= $char . "\n" . str_repeat($tab, $indent_level+1);
|
|
$indent_level++;
|
|
}
|
|
else
|
|
{
|
|
$new_json .= $char;
|
|
}
|
|
break;
|
|
case '}':
|
|
case ']':
|
|
if(!$in_string)
|
|
{
|
|
$indent_level--;
|
|
$new_json .= "\n" . str_repeat($tab, $indent_level) . $char;
|
|
}
|
|
else
|
|
{
|
|
$new_json .= $char;
|
|
}
|
|
break;
|
|
case ',':
|
|
if(!$in_string)
|
|
{
|
|
$new_json .= ",\n" . str_repeat($tab, $indent_level);
|
|
}
|
|
else
|
|
{
|
|
$new_json .= $char;
|
|
}
|
|
break;
|
|
case ':':
|
|
if(!$in_string)
|
|
{
|
|
$new_json .= ": ";
|
|
}
|
|
else
|
|
{
|
|
$new_json .= $char;
|
|
}
|
|
break;
|
|
case '"':
|
|
if($c > 0 && $json[$c-1] != '\\')
|
|
{
|
|
$in_string = !$in_string;
|
|
}
|
|
default:
|
|
$new_json .= $char;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return $new_json;
|
|
}
|
|
|
|
}
|
|
|
|
/* End of file json.php */
|
|
/* Location: ./application/datamapper/json.php */
|