/** * 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 = new \stdClass(); foreach ($collection as $rel => $embeddeddocs) { $serialiseThis->_embedded->{$rel} = array(); if (!is_array($embeddeddocs)) { $embeddeddocs = array($embeddeddocs); } foreach ($embeddeddocs as $embedded) { $renderer = new static($embedded); array_push($serialiseThis->_embedded->{$rel}, $renderer->render($options)); } } } // Add data $data = $this->_document->getData(); if (is_object($data)) { if ($data instanceof DataModel) { $data = $data->toArray(); } 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); }
/** * Creates a \FOF30\Hal\Document using the provided data * * @param mixed|array $data The data to put in the document * @param DataModel $model The model of this view * * @return \FOF30\Hal\Document A HAL-enabled document */ protected function _createDocumentWithHypermedia($data, $model = null) { // Create a new HAL document if (is_array($data)) { $count = count($data); } else { $count = null; } if ($count == 1) { reset($data); $document = new Document(end($data)); } else { $document = new Document($data); } // Create a self link $uri = (string) \JUri::getInstance(); $uri = $this->_removeURIBase($uri); $uri = \JRoute::_($uri); $document->addLink('self', new Link($uri)); // Create relative links in a record list context if (is_array($data) && $model instanceof DataModel) { if (!isset($this->total)) { $this->total = $model->count(); } if (!isset($this->limitStart)) { $this->limitStart = $model->getState('limitstart', 0); } if (!isset($this->limit)) { $this->limit = $model->getState('limit', 0); } $pagination = new \JPagination($this->total, $this->limitStart, $this->limit); if ($pagination->pagesTotal > 1) { // Try to guess URL parameters and create a prototype URL // NOTE: You are better off specialising this method $protoUri = $this->_getPrototypeURIForPagination(); // The "first" link $uri = clone $protoUri; $uri->setVar('limitstart', 0); $uri = \JRoute::_($uri); $document->addLink('first', new Link($uri)); // Do we need a "prev" link? if ($pagination->pagesCurrent > 1) { $prevPage = $pagination->pagesCurrent - 1; $limitstart = ($prevPage - 1) * $pagination->limit; $uri = clone $protoUri; $uri->setVar('limitstart', $limitstart); $uri = \JRoute::_($uri); $document->addLink('prev', new Link($uri)); } // Do we need a "next" link? if ($pagination->pagesCurrent < $pagination->pagesTotal) { $nextPage = $pagination->pagesCurrent + 1; $limitstart = ($nextPage - 1) * $pagination->limit; $uri = clone $protoUri; $uri->setVar('limitstart', $limitstart); $uri = \JRoute::_($uri); $document->addLink('next', new Link($uri)); } // The "last" link? $lastPage = $pagination->pagesTotal; $limitstart = ($lastPage - 1) * $pagination->limit; $uri = clone $protoUri; $uri->setVar('limitstart', $limitstart); $uri = \JRoute::_($uri); $document->addLink('last', new Link($uri)); } } return $document; }
/** * @covers FOF30\Hal\Document::render */ public function testRender_success() { $data = array('test1' => 'one', 'test2' => 'two', 'testArray' => array('testUno' => 'uno', 'testDue' => 'Due')); $document = new Document($data); $data = $document->render('json'); $this->assertInternalType('string', $data, 'Line: ' . __LINE__ . '.'); }