<?php
namespace Jaxon\Sentry\View;
class Facade
{
use \Jaxon\Utils\Traits\Config;
use \Jaxon\Utils\Traits\View;
protected $xStore;
protected $aViewData;
protected $aRenderers;
protected $sNamespace;
public function __construct($aRenderers, $sNamespace)
{
$this->xStore = null;
$this->aViewData = array();
$this->aRenderers = $aRenderers;
$this->sNamespace = $sNamespace; // The default view namespace
}
/**
* Get the current store or create a new store
*
* @return Store The current store
*/
protected function store()
{
if(!$this->xStore)
{
$this->xStore = new Store($this);
}
return $this->xStore;
}
/**
* Make a piece of data available for the rendered view
*
* @param string $name The data name
* @param string $value The data value
*
* @return void
*/
public function set($name, $value)
{
$this->store()->with($name, $value);
return $this;
}
/**
* Make a piece of data available for all views
*
* @param string $name The data name
* @param string $value The data value
*
* @return void
*/
public function share($name, $value)
{
$this->aViewData[$name] = $value;
return $this;
}
/**
* Render a view using a store
*
* The store returned by this function will later be used with the make() method to render the view.
*
* @param string $sViewName The view name
* @param array $aViewData The view data
*
* @return Store A store populated with the view data
*/
public function render($sViewName, array $aViewData = array())
{
// Get the store
$store = $this->store();
// Get the default view namespace
$sNamespace = $this->sNamespace;
// Get the namespace from the view name
$iSeparatorPosition = strrpos($sViewName, '::');
if($iSeparatorPosition !== false)
{
$sNamespace = substr($sViewName, 0, $iSeparatorPosition);
}
if(!key_exists($sNamespace, $this->aRenderers))
{
// Cannot render a view if there's no renderer corresponding to the namespace.
return null;
}
$sRenderer = $this->aRenderers[$sNamespace];
$store->setView($sRenderer, $sNamespace, $sViewName, array_merge($this->aViewData, $aViewData));
// Set the store to null so a new store will be created for the next view.
$this->xStore = null;
// Return the store
return $store;
}
}
|