You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
231 lines
5.2 KiB
231 lines
5.2 KiB
<?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 \yii\web\AssetManager |
|
*/ |
|
public $assetManager; |
|
|
|
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 init() |
|
{ |
|
parent::init(); |
|
if ($this->assetManager === null) { |
|
$this->assetManager = Yii::$app->getAssets(); |
|
} |
|
} |
|
|
|
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 registerAssetBundle($name) |
|
{ |
|
if (!isset($this->assetBundles[$name])) { |
|
$bundle = $this->assetManager->getBundle($name); |
|
if ($bundle !== null) { |
|
$this->assetBundles[$name] = false; |
|
$bundle->registerAssets($this); |
|
$this->assetBundles[$name] = true; |
|
} else { |
|
throw new InvalidConfigException("Unknown asset bundle: $name"); |
|
} |
|
} elseif ($this->assetBundles[$name] === false) { |
|
throw new InvalidConfigException("A cyclic dependency is detected for bundle '$name'."); |
|
} |
|
} |
|
|
|
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, $options = array(), $key = null) |
|
{ |
|
$position = isset($options['position']) ? $options['position'] : self::POS_END; |
|
unset($options['position']); |
|
$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, $options = array(), $key = null) |
|
{ |
|
$position = isset($options['position']) ? $options['position'] : self::POS_END; |
|
unset($options['position']); |
|
$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) |
|
{ |
|
return strtr($content, array( |
|
self::TOKEN_HEAD => $this->getHeadHtml(), |
|
self::TOKEN_BODY_BEGIN => $this->getBodyBeginHtml(), |
|
self::TOKEN_BODY_END => $this->getBodyEndHtml(), |
|
)); |
|
} |
|
|
|
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); |
|
} |
|
} |