* @since 2.0 */ class ViewContent extends Component { const POS_HEAD = 1; const POS_BEGIN = 2; const POS_END = 3; const TOKEN_HEAD = ''; const TOKEN_BODY_BEGIN = ''; const TOKEN_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); } }