primo commit
This commit is contained in:
		
							
								
								
									
										271
									
								
								libraries/fof30/View/DataView/Json.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										271
									
								
								libraries/fof30/View/DataView/Json.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,271 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @package   FOF | ||||
|  * @copyright Copyright (c)2010-2021 Nicholas K. Dionysopoulos / Akeeba Ltd | ||||
|  * @license   GNU General Public License version 2, or later | ||||
|  */ | ||||
|  | ||||
| namespace FOF30\View\DataView; | ||||
|  | ||||
| defined('_JEXEC') || die; | ||||
|  | ||||
| use Exception; | ||||
| use FOF30\Model\DataModel; | ||||
| use Joomla\CMS\Document\Document; | ||||
| use Joomla\CMS\Document\JsonDocument as JDocumentJSON; | ||||
|  | ||||
| class Json extends Raw implements DataViewInterface | ||||
| { | ||||
| 	/** | ||||
| 	 * Set to true if your onBefore* methods have already populated the item, items, limitstart etc properties used to | ||||
| 	 * render a JSON document. | ||||
| 	 * | ||||
| 	 * @var bool | ||||
| 	 */ | ||||
| 	public $alreadyLoaded = false; | ||||
|  | ||||
| 	/** | ||||
| 	 * Record listing offset (how many records to skip before starting showing some) | ||||
| 	 * | ||||
| 	 * @var   int | ||||
| 	 */ | ||||
| 	protected $limitStart = 0; | ||||
|  | ||||
| 	/** | ||||
| 	 * Record listing limit (how many records to show) | ||||
| 	 * | ||||
| 	 * @var   int | ||||
| 	 */ | ||||
| 	protected $limit = 10; | ||||
|  | ||||
| 	/** | ||||
| 	 * Total number of records in the result set | ||||
| 	 * | ||||
| 	 * @var   int | ||||
| 	 */ | ||||
| 	protected $total = 0; | ||||
|  | ||||
| 	/** | ||||
| 	 * The record being displayed | ||||
| 	 * | ||||
| 	 * @var   DataModel | ||||
| 	 */ | ||||
| 	protected $item = null; | ||||
|  | ||||
| 	/** | ||||
| 	 * Overrides the default method to execute and display a template script. | ||||
| 	 * Instead of loadTemplate is uses loadAnyTemplate. | ||||
| 	 * | ||||
| 	 * @param   string  $tpl  The name of the template file to parse | ||||
| 	 * | ||||
| 	 * @return  boolean  True on success | ||||
| 	 * | ||||
| 	 * @throws  Exception  When the layout file is not found | ||||
| 	 */ | ||||
| 	public function display($tpl = null) | ||||
| 	{ | ||||
| 		$eventName = 'onBefore' . ucfirst($this->doTask); | ||||
| 		$this->triggerEvent($eventName, [$tpl]); | ||||
|  | ||||
| 		$eventName = 'onAfter' . ucfirst($this->doTask); | ||||
| 		$this->triggerEvent($eventName, [$tpl]); | ||||
|  | ||||
| 		return true; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * The event which runs when we are displaying the record list JSON view | ||||
| 	 * | ||||
| 	 * @param   string  $tpl  The sub-template to use | ||||
| 	 */ | ||||
| 	public function onBeforeBrowse($tpl = null) | ||||
| 	{ | ||||
| 		// Load the model | ||||
| 		/** @var DataModel $model */ | ||||
| 		$model = $this->getModel(); | ||||
|  | ||||
| 		$result = ''; | ||||
|  | ||||
| 		if (!$this->alreadyLoaded) | ||||
| 		{ | ||||
| 			$this->limitStart = $model->getState('limitstart', 0); | ||||
| 			$this->limit      = $model->getState('limit', 0); | ||||
| 			$this->items      = $model->get(true, $this->limitStart, $this->limit); | ||||
| 			$this->total      = $model->count(); | ||||
| 		} | ||||
|  | ||||
| 		$document = $this->container->platform->getDocument(); | ||||
|  | ||||
| 		/** @var JDocumentJSON $document */ | ||||
| 		if ($document instanceof Document) | ||||
| 		{ | ||||
| 			$document->setMimeEncoding('application/json'); | ||||
| 		} | ||||
|  | ||||
| 		if (is_null($tpl)) | ||||
| 		{ | ||||
| 			$tpl = 'json'; | ||||
| 		} | ||||
|  | ||||
| 		$hasFailed = false; | ||||
|  | ||||
| 		try | ||||
| 		{ | ||||
| 			$result = $this->loadTemplate($tpl, true); | ||||
|  | ||||
| 			if ($result instanceof Exception) | ||||
| 			{ | ||||
| 				$hasFailed = true; | ||||
| 			} | ||||
| 		} | ||||
| 		catch (Exception $e) | ||||
| 		{ | ||||
| 			$hasFailed = true; | ||||
| 		} | ||||
|  | ||||
| 		if ($hasFailed) | ||||
| 		{ | ||||
| 			// Default JSON behaviour in case the template isn't there! | ||||
| 			$result = []; | ||||
|  | ||||
| 			foreach ($this->items as $item) | ||||
| 			{ | ||||
| 				if (is_object($item) && method_exists($item, 'toArray')) | ||||
| 				{ | ||||
| 					$result[] = $item->toArray(); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$result[] = $item; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			$json = json_encode($result, JSON_PRETTY_PRINT); | ||||
|  | ||||
| 			// JSONP support | ||||
| 			$callback = $this->input->get('callback', null, 'raw'); | ||||
|  | ||||
| 			if (!empty($callback)) | ||||
| 			{ | ||||
| 				echo $callback . '(' . $json . ')'; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$defaultName = $this->input->get('view', 'main', 'cmd'); | ||||
| 				$filename    = $this->input->get('basename', $defaultName, 'cmd'); | ||||
|  | ||||
| 				$document->setName($filename); | ||||
| 				echo $json; | ||||
| 			} | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			echo $result; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * The event which runs when we are displaying a single item JSON view | ||||
| 	 * | ||||
| 	 * @param   string  $tpl  The view sub-template to use | ||||
| 	 */ | ||||
| 	protected function onBeforeRead($tpl = null) | ||||
| 	{ | ||||
| 		self::renderSingleItem($tpl); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * The event which runs when we are displaying a single item JSON view | ||||
| 	 * | ||||
| 	 * @param   string  $tpl  The view sub-template to use | ||||
| 	 */ | ||||
| 	protected function onAfterSave($tpl = null) | ||||
| 	{ | ||||
| 		self::renderSingleItem($tpl); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Renders a single item JSON view | ||||
| 	 * | ||||
| 	 * @param   string  $tpl  The view sub-template to use | ||||
| 	 */ | ||||
| 	protected function renderSingleItem($tpl) | ||||
| 	{ | ||||
| 		// Load the model | ||||
| 		/** @var DataModel $model */ | ||||
| 		$model = $this->getModel(); | ||||
|  | ||||
| 		$result = ''; | ||||
|  | ||||
| 		if (!$this->alreadyLoaded) | ||||
| 		{ | ||||
| 			$this->item = $model->find(); | ||||
| 		} | ||||
|  | ||||
|  | ||||
| 		$document = $this->container->platform->getDocument(); | ||||
|  | ||||
| 		/** @var JDocumentJSON $document */ | ||||
| 		if ($document instanceof Document) | ||||
| 		{ | ||||
| 			$document->setMimeEncoding('application/json'); | ||||
| 		} | ||||
|  | ||||
| 		if (is_null($tpl)) | ||||
| 		{ | ||||
| 			$tpl = 'json'; | ||||
| 		} | ||||
|  | ||||
| 		$hasFailed = false; | ||||
|  | ||||
| 		try | ||||
| 		{ | ||||
| 			$result = $this->loadTemplate($tpl, true); | ||||
|  | ||||
| 			if ($result instanceof Exception) | ||||
| 			{ | ||||
| 				$hasFailed = true; | ||||
| 			} | ||||
| 		} | ||||
| 		catch (Exception $e) | ||||
| 		{ | ||||
| 			$hasFailed = true; | ||||
| 		} | ||||
|  | ||||
| 		if ($hasFailed) | ||||
| 		{ | ||||
| 			// Default JSON behaviour in case the template isn't there! | ||||
|  | ||||
| 			if (is_object($this->item) && method_exists($this->item, 'toArray')) | ||||
| 			{ | ||||
| 				$data = $this->item->toArray(); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$data = $this->item; | ||||
| 			} | ||||
|  | ||||
| 			$json = json_encode($data, JSON_PRETTY_PRINT); | ||||
|  | ||||
| 			// JSONP support | ||||
| 			$callback = $this->input->get('callback', null); | ||||
|  | ||||
| 			if (!empty($callback)) | ||||
| 			{ | ||||
| 				echo $callback . '(' . $json . ')'; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$defaultName = $this->input->get('view', 'main', 'cmd'); | ||||
| 				$filename    = $this->input->get('basename', $defaultName, 'cmd'); | ||||
| 				$document->setName($filename); | ||||
|  | ||||
| 				echo $json; | ||||
| 			} | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			echo $result; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user