178 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			178 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * @package     FrameworkOnFramework
 | |
|  * @subpackage  hal
 | |
|  * @copyright   Copyright (C) 2010-2016 Nicholas K. Dionysopoulos / Akeeba Ltd. All rights reserved.
 | |
|  * @license     GNU General Public License version 2 or later; see LICENSE.txt
 | |
|  */
 | |
| defined('F0F_INCLUDED') or die;
 | |
| 
 | |
| /**
 | |
|  * Implements the HAL over JSON renderer
 | |
|  *
 | |
|  * @package  FrameworkOnFramework
 | |
|  * @since    2.1
 | |
|  */
 | |
| class F0FHalRenderJson implements F0FHalRenderInterface
 | |
| {
 | |
| 	/**
 | |
| 	 * When data is an array we'll output the list of data under this key
 | |
| 	 *
 | |
| 	 * @var   string
 | |
| 	 */
 | |
| 	private $_dataKey = '_list';
 | |
| 
 | |
| 	/**
 | |
| 	 * The document to render
 | |
| 	 *
 | |
| 	 * @var   F0FHalDocument
 | |
| 	 */
 | |
| 	protected $_document;
 | |
| 
 | |
| 	/**
 | |
| 	 * Public constructor
 | |
| 	 *
 | |
| 	 * @param   F0FHalDocument  &$document  The document to render
 | |
| 	 */
 | |
| 	public function __construct(&$document)
 | |
| 	{
 | |
| 		$this->_document = $document;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Render a HAL document in JSON format
 | |
| 	 *
 | |
| 	 * @param   array  $options  Rendering options. You can currently only set json_options (json_encode options)
 | |
| 	 *
 | |
| 	 * @return  string  The JSON representation of the HAL document
 | |
| 	 */
 | |
| 	public function render($options = array())
 | |
| 	{
 | |
| 		if (isset($options['data_key']))
 | |
| 		{
 | |
| 			$this->_dataKey = $options['data_key'];
 | |
| 		}
 | |
| 
 | |
| 		if (isset($options['json_options']))
 | |
| 		{
 | |
| 			$jsonOptions = $options['json_options'];
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			$jsonOptions = 0;
 | |
| 		}
 | |
| 
 | |
| 		$serialiseThis = new stdClass;
 | |
| 
 | |
| 		// Add links
 | |
| 		$collection = $this->_document->getLinks();
 | |
| 		$serialiseThis->_links = new stdClass;
 | |
| 
 | |
| 		foreach ($collection as $rel => $links)
 | |
| 		{
 | |
| 			if (!is_array($links))
 | |
| 			{
 | |
| 				$serialiseThis->_links->$rel = $this->_getLink($links);
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				$serialiseThis->_links->$rel = array();
 | |
| 
 | |
| 				foreach ($links as $link)
 | |
| 				{
 | |
| 					array_push($serialiseThis->_links->$rel, $this->_getLink($link));
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// Add embedded documents
 | |
| 
 | |
| 		$collection = $this->_document->getEmbedded();
 | |
| 
 | |
| 		if (!empty($collection))
 | |
| 		{
 | |
| 			$serialiseThis->_embedded->$rel = new stdClass;
 | |
| 
 | |
| 			foreach ($collection as $rel => $embeddeddocs)
 | |
| 			{
 | |
| 				if (!is_array($embeddeddocs))
 | |
| 				{
 | |
| 					$embeddeddocs = array($embeddeddocs);
 | |
| 				}
 | |
| 
 | |
| 				foreach ($embeddeddocs as $embedded)
 | |
| 				{
 | |
| 					$renderer = new F0FHalRenderJson($embedded);
 | |
| 					array_push($serialiseThis->_embedded->$rel, $renderer->render($options));
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// Add data
 | |
| 		$data = $this->_document->getData();
 | |
| 
 | |
| 		if (is_object($data))
 | |
| 		{
 | |
| 			if ($data instanceof F0FTable)
 | |
| 			{
 | |
| 				$data = $data->getData();
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				$data = (array) $data;
 | |
| 			}
 | |
| 
 | |
| 			if (!empty($data))
 | |
| 			{
 | |
| 				foreach ($data as $k => $v)
 | |
| 				{
 | |
| 					$serialiseThis->$k = $v;
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		elseif (is_array($data))
 | |
| 		{
 | |
| 			$serialiseThis->{$this->_dataKey} = $data;
 | |
| 		}
 | |
| 
 | |
| 		return json_encode($serialiseThis, $jsonOptions);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Converts a F0FHalLink object into a stdClass object which will be used
 | |
| 	 * for JSON serialisation
 | |
| 	 *
 | |
| 	 * @param   F0FHalLink  $link  The link you want converted
 | |
| 	 *
 | |
| 	 * @return  stdClass  The converted link object
 | |
| 	 */
 | |
| 	protected function _getLink(F0FHalLink $link)
 | |
| 	{
 | |
| 		$ret = array(
 | |
| 			'href'	=> $link->href
 | |
| 		);
 | |
| 
 | |
| 		if ($link->templated)
 | |
| 		{
 | |
| 			$ret['templated'] = 'true';
 | |
| 		}
 | |
| 
 | |
| 		if (!empty($link->name))
 | |
| 		{
 | |
| 			$ret['name'] = $link->name;
 | |
| 		}
 | |
| 
 | |
| 		if (!empty($link->hreflang))
 | |
| 		{
 | |
| 			$ret['hreflang'] = $link->hreflang;
 | |
| 		}
 | |
| 
 | |
| 		if (!empty($link->title))
 | |
| 		{
 | |
| 			$ret['title'] = $link->title;
 | |
| 		}
 | |
| 
 | |
| 		return (object) $ret;
 | |
| 	}
 | |
| }
 |