|  |  |  | <?php
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * @link http://www.yiiframework.com/
 | 
					
						
							|  |  |  |  * @copyright Copyright (c) 2008 Yii Software LLC
 | 
					
						
							|  |  |  |  * @license http://www.yiiframework.com/license/
 | 
					
						
							|  |  |  |  */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace yii\base;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use Yii;
 | 
					
						
							|  |  |  | use yii\helpers\Html;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * @author Qiang Xue <qiang.xue@gmail.com>
 | 
					
						
							|  |  |  |  * @since 2.0
 | 
					
						
							|  |  |  |  */
 | 
					
						
							|  |  |  | class ViewContent extends Component
 | 
					
						
							|  |  |  | {
 | 
					
						
							|  |  |  | 	const POS_HEAD = 1;
 | 
					
						
							|  |  |  | 	const POS_BEGIN = 2;
 | 
					
						
							|  |  |  | 	const POS_END = 3;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const TOKEN_HEAD = '<![CDATA[YII-BLOCK-HEAD]]>';
 | 
					
						
							|  |  |  | 	const TOKEN_BODY_BEGIN = '<![CDATA[YII-BLOCK-BODY-BEGIN]]>';
 | 
					
						
							|  |  |  | 	const TOKEN_BODY_END = '<![CDATA[YII-BLOCK-BODY-END]]>';
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * @var array
 | 
					
						
							|  |  |  | 	 *
 | 
					
						
							|  |  |  | 	 * Each asset bundle should be declared with the following structure:
 | 
					
						
							|  |  |  | 	 *
 | 
					
						
							|  |  |  | 	 * ~~~
 | 
					
						
							|  |  |  | 	 * array(
 | 
					
						
							|  |  |  | 	 *     'basePath' => '...',
 | 
					
						
							|  |  |  | 	 *     'baseUrl' => '...',  // if missing, the bundle will be published to the "www/assets" folder
 | 
					
						
							|  |  |  | 	 *     'js' => array(
 | 
					
						
							|  |  |  | 	 *         'js/main.js',
 | 
					
						
							|  |  |  | 	 *         'js/menu.js',
 | 
					
						
							|  |  |  | 	 *         'js/base.js' => self::POS_HEAD,
 | 
					
						
							|  |  |  | 	 *     'css' => array(
 | 
					
						
							|  |  |  | 	 *         'css/main.css',
 | 
					
						
							|  |  |  | 	 *         'css/menu.css',
 | 
					
						
							|  |  |  | 	 *     ),
 | 
					
						
							|  |  |  | 	 *     'depends' => array(
 | 
					
						
							|  |  |  | 	 *         'jquery',
 | 
					
						
							|  |  |  | 	 *         'yii',
 | 
					
						
							|  |  |  | 	 *         'yii/treeview',
 | 
					
						
							|  |  |  | 	 *     ),
 | 
					
						
							|  |  |  | 	 * )
 | 
					
						
							|  |  |  | 	 * ~~~
 | 
					
						
							|  |  |  | 	 */
 | 
					
						
							|  |  |  | 	public $assetBundles;
 | 
					
						
							|  |  |  | 	public $title;
 | 
					
						
							|  |  |  | 	public $metaTags;
 | 
					
						
							|  |  |  | 	public $linkTags;
 | 
					
						
							|  |  |  | 	public $css;
 | 
					
						
							|  |  |  | 	public $cssFiles;
 | 
					
						
							|  |  |  | 	public $js;
 | 
					
						
							|  |  |  | 	public $jsFiles;
 | 
					
						
							|  |  |  | 	public $jsInHead;
 | 
					
						
							|  |  |  | 	public $jsFilesInHead;
 | 
					
						
							|  |  |  | 	public $jsInBody;
 | 
					
						
							|  |  |  | 	public $jsFilesInBody;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function reset()
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		$this->title = null;
 | 
					
						
							|  |  |  | 		$this->metaTags = null;
 | 
					
						
							|  |  |  | 		$this->linkTags = null;
 | 
					
						
							|  |  |  | 		$this->css = null;
 | 
					
						
							|  |  |  | 		$this->cssFiles = null;
 | 
					
						
							|  |  |  | 		$this->js = null;
 | 
					
						
							|  |  |  | 		$this->jsFiles = null;
 | 
					
						
							|  |  |  | 		$this->jsInHead = null;
 | 
					
						
							|  |  |  | 		$this->jsFilesInHead = null;
 | 
					
						
							|  |  |  | 		$this->jsInBody = null;
 | 
					
						
							|  |  |  | 		$this->jsFilesInBody = null;
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function begin()
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		ob_start();
 | 
					
						
							|  |  |  | 		ob_implicit_flush(false);
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function end()
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		$content = ob_get_clean();
 | 
					
						
							|  |  |  | 		echo $this->populate($content);
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function beginBody()
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		echo self::TOKEN_BODY_BEGIN;
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function endBody()
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		echo self::TOKEN_BODY_END;
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function head()
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		echo self::TOKEN_HEAD;
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function requireAssetBundle($name)
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		if (!isset($this->assetBundles[$name])) {
 | 
					
						
							|  |  |  | 			$bundle = Yii::$app->assets->getBundle($name);
 | 
					
						
							|  |  |  | 			if ($bundle !== null) {
 | 
					
						
							|  |  |  | 				$this->assetBundles[$name] = $bundle;
 | 
					
						
							|  |  |  | 			} else {
 | 
					
						
							|  |  |  | 				throw new InvalidConfigException("Unknown asset bundle: $name");
 | 
					
						
							|  |  |  | 			}
 | 
					
						
							|  |  |  | 			foreach ($bundle->depends as $d) {
 | 
					
						
							|  |  |  | 				$this->requireAssetBundle($d);
 | 
					
						
							|  |  |  | 			}
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | 	public function registerMetaTag($options, $key = null)
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		if ($key === null) {
 | 
					
						
							|  |  |  | 			$this->metaTags[] = Html::tag('meta', '', $options);
 | 
					
						
							|  |  |  | 		} else {
 | 
					
						
							|  |  |  | 			$this->metaTags[$key] = Html::tag('meta', '', $options);
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | 	public function registerLinkTag($options, $key = null)
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		if ($key === null) {
 | 
					
						
							|  |  |  | 			$this->linkTags[] = Html::tag('link', '', $options);
 | 
					
						
							|  |  |  | 		} else {
 | 
					
						
							|  |  |  | 			$this->linkTags[$key] = Html::tag('link', '', $options);
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function registerCss($css, $options = array(), $key = null)
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		$key = $key ?: $css;
 | 
					
						
							|  |  |  | 		$this->css[$key] = Html::style($css, $options);
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function registerCssFile($url, $options = array(), $key = null)
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		$key = $key ?: $url;
 | 
					
						
							|  |  |  | 		$this->cssFiles[$key] = Html::cssFile($url, $options);
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function registerJs($js, $position = self::POS_END, $options = array(), $key = null)
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		$key = $key ?: $js;
 | 
					
						
							|  |  |  | 		$html = Html::script($js, $options);
 | 
					
						
							|  |  |  | 		if ($position == self::POS_END) {
 | 
					
						
							|  |  |  | 			$this->js[$key] = $html;
 | 
					
						
							|  |  |  | 		} elseif ($position == self::POS_HEAD) {
 | 
					
						
							|  |  |  | 			$this->jsInHead[$key] = $html;
 | 
					
						
							|  |  |  | 		} elseif ($position == self::POS_BEGIN) {
 | 
					
						
							|  |  |  | 			$this->jsInBody[$key] = $html;
 | 
					
						
							|  |  |  | 		} else {
 | 
					
						
							|  |  |  | 			throw new InvalidParamException("Unknown position: $position");
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function registerJsFile($url, $position = self::POS_END, $options = array(), $key = null)
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		$key = $key ?: $url;
 | 
					
						
							|  |  |  | 		$html = Html::jsFile($url, $options);
 | 
					
						
							|  |  |  | 		if ($position == self::POS_END) {
 | 
					
						
							|  |  |  | 			$this->jsFiles[$key] = $html;
 | 
					
						
							|  |  |  | 		} elseif ($position == self::POS_HEAD) {
 | 
					
						
							|  |  |  | 			$this->jsFilesInHead[$key] = $html;
 | 
					
						
							|  |  |  | 		} elseif ($position == self::POS_BEGIN) {
 | 
					
						
							|  |  |  | 			$this->jsFilesInBody[$key] = $html;
 | 
					
						
							|  |  |  | 		} else {
 | 
					
						
							|  |  |  | 			throw new InvalidParamException("Unknown position: $position");
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	protected function populate($content)
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		$this->expandAssetBundles();
 | 
					
						
							|  |  |  | 		return strtr($content, array(
 | 
					
						
							|  |  |  | 			self::TOKEN_HEAD => $this->getHeadHtml(),
 | 
					
						
							|  |  |  | 			self::TOKEN_BODY_BEGIN => $this->getBodyBeginHtml(),
 | 
					
						
							|  |  |  | 			self::TOKEN_BODY_END => $this->getBodyEndHtml(),
 | 
					
						
							|  |  |  | 		));
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	protected function expandAssetBundles()
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	protected function getHeadHtml()
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		$lines = array();
 | 
					
						
							|  |  |  | 		if (!empty($this->metaTags)) {
 | 
					
						
							|  |  |  | 			$lines[] = implode("\n", $this->cssFiles);
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		if (!empty($this->linkTags)) {
 | 
					
						
							|  |  |  | 			$lines[] = implode("\n", $this->cssFiles);
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		if (!empty($this->cssFiles)) {
 | 
					
						
							|  |  |  | 			$lines[] = implode("\n", $this->cssFiles);
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		if (!empty($this->css)) {
 | 
					
						
							|  |  |  | 			$lines[] = implode("\n", $this->css);
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		if (!empty($this->jsFilesInHead)) {
 | 
					
						
							|  |  |  | 			$lines[] = implode("\n", $this->jsFilesInHead);
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		if (!empty($this->jsInHead)) {
 | 
					
						
							|  |  |  | 			$lines[] = implode("\n", $this->jsInHead);
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		return implode("\n", $lines);
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	protected function getBodyBeginHtml()
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		$lines = array();
 | 
					
						
							|  |  |  | 		if (!empty($this->jsFilesInBody)) {
 | 
					
						
							|  |  |  | 			$lines[] = implode("\n", $this->jsFilesInBody);
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		if (!empty($this->jsInHead)) {
 | 
					
						
							|  |  |  | 			$lines[] = implode("\n", $this->jsInBody);
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		return implode("\n", $lines);
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	protected function getBodyEndHtml()
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		$lines = array();
 | 
					
						
							|  |  |  | 		if (!empty($this->jsFiles)) {
 | 
					
						
							|  |  |  | 			$lines[] = implode("\n", $this->jsFiles);
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		if (!empty($this->js)) {
 | 
					
						
							|  |  |  | 			$lines[] = implode("\n", $this->js);
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		return implode("\n", $lines);
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | }
 |